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

Unified Diff: content/renderer/media/media_stream_video_capturer_source_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 side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/media_stream_video_capturer_source_unittest.cc
diff --git a/content/renderer/media/media_stream_video_capturer_source_unittest.cc b/content/renderer/media/media_stream_video_capturer_source_unittest.cc
index bdae3481b36f5b0c3e77428376dcffc2bbbc142e..b33d5e2cb725a0c3d04a722eaac331d22f475710 100644
--- a/content/renderer/media/media_stream_video_capturer_source_unittest.cc
+++ b/content/renderer/media/media_stream_video_capturer_source_unittest.cc
@@ -31,6 +31,8 @@ using ::testing::WithArgs;
namespace content {
+namespace {
+
class MockVideoCapturerSource : public media::VideoCapturerSource {
public:
MockVideoCapturerSource() {
@@ -64,13 +66,51 @@ class MockVideoCapturerSource : public media::VideoCapturerSource {
}
};
+class FakeMediaStreamVideoSink : public MediaStreamVideoSink {
+ public:
+ FakeMediaStreamVideoSink(base::TimeTicks* capture_time,
+ media::VideoFrameMetadata* metadata,
+ base::Closure got_frame_cb)
+ : capture_time_(capture_time),
+ metadata_(metadata),
+ got_frame_cb_(got_frame_cb) {}
+
+ void ConnectToTrack(const blink::WebMediaStreamTrack& track) {
+ MediaStreamVideoSink::ConnectToTrack(
+ track,
+ base::Bind(&FakeMediaStreamVideoSink::OnVideoFrame,
+ base::Unretained(this)),
+ true);
+ }
+
+ void DisconnectFromTrack() { MediaStreamVideoSink::DisconnectFromTrack(); }
+
+ void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame,
+ base::TimeTicks capture_time) {
+ *capture_time_ = capture_time;
+ metadata_->Clear();
+ metadata_->MergeMetadataFrom(frame->metadata());
+ base::ResetAndReturn(&got_frame_cb_).Run();
+ }
+
+ private:
+ base::TimeTicks* const capture_time_;
+ media::VideoFrameMetadata* const metadata_;
+ base::Closure got_frame_cb_;
+};
+
+} // namespace
+
class MediaStreamVideoCapturerSourceTest : public testing::Test {
public:
MediaStreamVideoCapturerSourceTest()
: child_process_(new ChildProcess()),
source_(nullptr),
delegate_(nullptr),
- source_stopped_(false) {}
+ source_stopped_(false) {
+ scoped_feature_list_.InitAndDisableFeature(
+ features::kMediaStreamOldVideoConstraints);
+ }
void TearDown() override {
webkit_source_.reset();
@@ -150,15 +190,197 @@ class MediaStreamVideoCapturerSourceTest : public testing::Test {
blink::WebString webkit_source_id_;
bool source_stopped_;
MockConstraintFactory constraint_factory_;
+ base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+TEST_F(MediaStreamVideoCapturerSourceTest, StartAndStop) {
+ std::unique_ptr<MockVideoCapturerSource> delegate(
+ new MockVideoCapturerSource());
+ delegate_ = delegate.get();
+ EXPECT_CALL(*delegate_, GetPreferredFormats());
+ source_ = new MediaStreamVideoCapturerSource(
+ base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped,
+ base::Unretained(this)),
+ std::move(delegate));
+ webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"),
+ blink::WebMediaStreamSource::TypeVideo,
+ blink::WebString::fromASCII("dummy_source_name"),
+ false /* remote */);
+ webkit_source_.setExtraData(source_);
+ webkit_source_id_ = webkit_source_.id();
+
+ InSequence s;
+ EXPECT_CALL(mock_delegate(), StartCapture(_, _, _));
+ blink::WebMediaStreamTrack track = StartSource(
+ VideoTrackAdapterSettings(), base::Optional<bool>(), false, 0.0);
+ base::RunLoop().RunUntilIdle();
+
+ OnStarted(true);
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
+ webkit_source_.getReadyState());
+
+ EXPECT_FALSE(source_stopped_);
+
+ EXPECT_CALL(mock_delegate(), StopCapture());
+ OnStarted(false);
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
+ webkit_source_.getReadyState());
+ // Verify that MediaStreamSource::SourceStoppedCallback has been triggered.
+ EXPECT_TRUE(source_stopped_);
+}
+
+TEST_F(MediaStreamVideoCapturerSourceTest, CaptureTimeAndMetadataPlumbing) {
+ std::unique_ptr<MockVideoCapturerSource> delegate(
+ new MockVideoCapturerSource());
+ delegate_ = delegate.get();
+ EXPECT_CALL(*delegate_, GetPreferredFormats());
+ source_ = new MediaStreamVideoCapturerSource(
+ base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped,
+ base::Unretained(this)),
+ std::move(delegate));
+ webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"),
+ blink::WebMediaStreamSource::TypeVideo,
+ blink::WebString::fromASCII("dummy_source_name"),
+ false /* remote */);
+ webkit_source_.setExtraData(source_);
+ webkit_source_id_ = webkit_source_.id();
+
+ VideoCaptureDeliverFrameCB deliver_frame_cb;
+ media::VideoCapturerSource::RunningCallback running_cb;
+
+ InSequence s;
+ // EXPECT_CALL(mock_delegate(), GetCurrentSupportedFormats(_, _, _, _));
+ EXPECT_CALL(mock_delegate(), StartCapture(_, _, _))
+ .WillOnce(testing::DoAll(testing::SaveArg<1>(&deliver_frame_cb),
+ testing::SaveArg<2>(&running_cb)));
+ EXPECT_CALL(mock_delegate(), RequestRefreshFrame());
+ EXPECT_CALL(mock_delegate(), StopCapture());
+ blink::WebMediaStreamTrack track = StartSource(
+ VideoTrackAdapterSettings(), base::Optional<bool>(), false, 0.0);
+ running_cb.Run(true);
+
+ base::RunLoop run_loop;
+ base::TimeTicks reference_capture_time =
+ base::TimeTicks::FromInternalValue(60013);
+ base::TimeTicks capture_time;
+ media::VideoFrameMetadata metadata;
+ FakeMediaStreamVideoSink fake_sink(
+ &capture_time, &metadata,
+ media::BindToCurrentLoop(run_loop.QuitClosure()));
+ fake_sink.ConnectToTrack(track);
+ const scoped_refptr<media::VideoFrame> frame =
+ media::VideoFrame::CreateBlackFrame(gfx::Size(2, 2));
+ frame->metadata()->SetDouble(media::VideoFrameMetadata::FRAME_RATE, 30.0);
+ child_process_->io_task_runner()->PostTask(
+ FROM_HERE, base::Bind(deliver_frame_cb, frame, reference_capture_time));
+ run_loop.Run();
+ fake_sink.DisconnectFromTrack();
+ EXPECT_EQ(reference_capture_time, capture_time);
+ double metadata_value;
+ EXPECT_TRUE(metadata.GetDouble(media::VideoFrameMetadata::FRAME_RATE,
+ &metadata_value));
+ EXPECT_EQ(30.0, metadata_value);
+}
+
+class MediaStreamVideoCapturerSourceOldConstraintsTest : public testing::Test {
+ public:
+ MediaStreamVideoCapturerSourceOldConstraintsTest()
+ : child_process_(new ChildProcess()),
+ source_(nullptr),
+ delegate_(nullptr),
+ source_stopped_(false) {
+ scoped_feature_list_.InitAndEnableFeature(
+ features::kMediaStreamOldVideoConstraints);
+ }
+
+ void TearDown() override {
+ webkit_source_.reset();
+ blink::WebHeap::collectAllGarbageForTesting();
+ }
+
+ void InitWithDeviceInfo(const StreamDeviceInfo& device_info) {
+ std::unique_ptr<MockVideoCapturerSource> delegate(
+ new MockVideoCapturerSource());
+ delegate_ = delegate.get();
+ source_ = new MediaStreamVideoCapturerSource(
+ base::Bind(
+ &MediaStreamVideoCapturerSourceOldConstraintsTest::OnSourceStopped,
+ base::Unretained(this)),
+ std::move(delegate));
+ source_->SetDeviceInfo(device_info);
+
+ webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"),
+ blink::WebMediaStreamSource::TypeVideo,
+ blink::WebString::fromASCII("dummy_source_name"),
+ false /* remote */);
+ webkit_source_.setExtraData(source_);
+ webkit_source_id_ = webkit_source_.id();
+ }
+
+ MockConstraintFactory* constraint_factory() { return &constraint_factory_; }
+
+ blink::WebMediaStreamTrack StartSource() {
+ bool enabled = true;
+ // CreateVideoTrack will trigger OnConstraintsApplied.
+ return MediaStreamVideoTrack::CreateVideoTrack(
+ source_, constraint_factory_.CreateWebMediaConstraints(),
+ base::Bind(&MediaStreamVideoCapturerSourceOldConstraintsTest::
+ OnConstraintsApplied,
+ base::Unretained(this)),
+ enabled);
+ }
+
+ blink::WebMediaStreamTrack StartSource(
+ const VideoTrackAdapterSettings& adapter_settings,
+ const base::Optional<bool>& noise_reduction,
+ bool is_screencast,
+ double min_frame_rate) {
+ bool enabled = true;
+ // CreateVideoTrack will trigger OnConstraintsApplied.
+ return MediaStreamVideoTrack::CreateVideoTrack(
+ source_, adapter_settings, noise_reduction, is_screencast,
+ min_frame_rate,
+ base::Bind(&MediaStreamVideoCapturerSourceOldConstraintsTest::
+ OnConstraintsApplied,
+ base::Unretained(this)),
+ enabled);
+ }
+
+ MockVideoCapturerSource& mock_delegate() { return *delegate_; }
+
+ const char* GetPowerLineFrequencyForTesting() const {
+ return source_->GetPowerLineFrequencyForTesting();
+ }
+
+ void OnSourceStopped(const blink::WebMediaStreamSource& source) {
+ source_stopped_ = true;
+ EXPECT_EQ(source.id(), webkit_source_id_);
+ }
+ void OnStarted(bool result) { source_->OnRunStateChanged(result); }
+
+ protected:
+ void OnConstraintsApplied(MediaStreamSource* source,
+ MediaStreamRequestResult result,
+ const blink::WebString& result_name) {}
+
+ // A ChildProcess and a MessageLoopForUI are both needed to fool the Tracks
+ // and Sources below into believing they are on the right threads.
+ base::MessageLoopForUI message_loop_;
+ std::unique_ptr<ChildProcess> child_process_;
+
+ blink::WebMediaStreamSource webkit_source_;
+ MediaStreamVideoCapturerSource* source_; // owned by |webkit_source_|.
+ MockVideoCapturerSource* delegate_; // owned by |source|.
+ blink::WebString webkit_source_id_;
+ bool source_stopped_;
+ MockConstraintFactory constraint_factory_;
+ base::test::ScopedFeatureList scoped_feature_list_;
};
-// This test does not apply with spec-compliant constraints.
-// TODO(guidou): Remove this test. http://crbug.com/706408
-TEST_F(MediaStreamVideoCapturerSourceTest,
- TabCaptureFixedResolutionByDefaultOldConstraints) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kMediaStreamOldVideoConstraints);
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest,
+ TabCaptureFixedResolutionByDefault) {
StreamDeviceInfo device_info;
device_info.device.type = MEDIA_TAB_VIDEO_CAPTURE;
InitWithDeviceInfo(device_info);
@@ -183,13 +405,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest,
EXPECT_CALL(mock_delegate(), StopCapture());
}
-// This test does not apply with spec-compliant constraints.
-// TODO(guidou): Remove this test. http://crbug.com/706408
-TEST_F(MediaStreamVideoCapturerSourceTest,
- DesktopCaptureAllowAnyResolutionChangeByDefaultOldConstraints) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kMediaStreamOldVideoConstraints);
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest,
+ DesktopCaptureAllowAnyResolutionChangeByDefault) {
StreamDeviceInfo device_info;
device_info.device.type = MEDIA_DESKTOP_VIDEO_CAPTURE;
InitWithDeviceInfo(device_info);
@@ -214,13 +431,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest,
EXPECT_CALL(mock_delegate(), StopCapture());
}
-// This test does not apply with spec-compliant constraints.
-// TODO(guidou): Remove this test. http://crbug.com/706408
-TEST_F(MediaStreamVideoCapturerSourceTest,
- TabCaptureConstraintsImplyFixedAspectRatioOldConstraints) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kMediaStreamOldVideoConstraints);
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest,
+ TabCaptureConstraintsImplyFixedAspectRatio) {
StreamDeviceInfo device_info;
device_info.device.type = MEDIA_TAB_VIDEO_CAPTURE;
InitWithDeviceInfo(device_info);
@@ -252,13 +464,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest,
EXPECT_CALL(mock_delegate(), StopCapture());
}
-// This test does not apply with spec-compliant constraints.
-// TODO(guidou): Remove this test. http://crbug.com/706408
-TEST_F(MediaStreamVideoCapturerSourceTest,
- TabCaptureConstraintsImplyAllowingAnyResolutionChangeOldConstraints) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kMediaStreamOldVideoConstraints);
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest,
+ TabCaptureConstraintsImplyAllowingAnyResolutionChange) {
StreamDeviceInfo device_info;
device_info.device.type = MEDIA_TAB_VIDEO_CAPTURE;
InitWithDeviceInfo(device_info);
@@ -290,13 +497,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest,
EXPECT_CALL(mock_delegate(), StopCapture());
}
-// This test does not apply with spec-compliant constraints.
-// TODO(guidou): Remove this test. http://crbug.com/706408
-TEST_F(MediaStreamVideoCapturerSourceTest,
- DeviceCaptureConstraintsSupportPowerLineFrequencyOldConstraints) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kMediaStreamOldVideoConstraints);
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest,
+ DeviceCaptureConstraintsSupportPowerLineFrequency) {
for (int frequency = -100; frequency < 100; ++frequency) {
StreamDeviceInfo device_info;
device_info.device.type = MEDIA_DEVICE_VIDEO_CAPTURE;
@@ -335,17 +537,14 @@ TEST_F(MediaStreamVideoCapturerSourceTest,
}
}
-// TODO(guidou): Remove this test. http://crbug.com/706408
-TEST_F(MediaStreamVideoCapturerSourceTest, EndedOldConstraints) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kMediaStreamOldVideoConstraints);
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest, Ended) {
std::unique_ptr<MockVideoCapturerSource> delegate(
new MockVideoCapturerSource());
delegate_ = delegate.get();
source_ = new MediaStreamVideoCapturerSource(
- base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped,
- base::Unretained(this)),
+ base::Bind(
+ &MediaStreamVideoCapturerSourceOldConstraintsTest::OnSourceStopped,
+ base::Unretained(this)),
std::move(delegate));
webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"),
blink::WebMediaStreamSource::TypeVideo,
@@ -376,86 +575,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest, EndedOldConstraints) {
EXPECT_TRUE(source_stopped_);
}
-TEST_F(MediaStreamVideoCapturerSourceTest, StartAndStop) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndDisableFeature(
- features::kMediaStreamOldVideoConstraints);
- std::unique_ptr<MockVideoCapturerSource> delegate(
- new MockVideoCapturerSource());
- delegate_ = delegate.get();
- EXPECT_CALL(*delegate_, GetPreferredFormats());
- source_ = new MediaStreamVideoCapturerSource(
- base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped,
- base::Unretained(this)),
- std::move(delegate));
- webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"),
- blink::WebMediaStreamSource::TypeVideo,
- blink::WebString::fromASCII("dummy_source_name"),
- false /* remote */);
- webkit_source_.setExtraData(source_);
- webkit_source_id_ = webkit_source_.id();
-
- InSequence s;
- EXPECT_CALL(mock_delegate(), StartCapture(_, _, _));
- blink::WebMediaStreamTrack track = StartSource(
- VideoTrackAdapterSettings(), base::Optional<bool>(), false, 0.0);
- base::RunLoop().RunUntilIdle();
-
- OnStarted(true);
- base::RunLoop().RunUntilIdle();
- EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
- webkit_source_.getReadyState());
-
- EXPECT_FALSE(source_stopped_);
-
- EXPECT_CALL(mock_delegate(), StopCapture());
- OnStarted(false);
- base::RunLoop().RunUntilIdle();
- EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
- webkit_source_.getReadyState());
- // Verify that MediaStreamSource::SourceStoppedCallback has been triggered.
- EXPECT_TRUE(source_stopped_);
-}
-
-class FakeMediaStreamVideoSink : public MediaStreamVideoSink {
- public:
- FakeMediaStreamVideoSink(base::TimeTicks* capture_time,
- media::VideoFrameMetadata* metadata,
- base::Closure got_frame_cb)
- : capture_time_(capture_time),
- metadata_(metadata),
- got_frame_cb_(got_frame_cb) {}
-
- void ConnectToTrack(const blink::WebMediaStreamTrack& track) {
- MediaStreamVideoSink::ConnectToTrack(
- track, base::Bind(&FakeMediaStreamVideoSink::OnVideoFrame,
- base::Unretained(this)),
- true);
- }
-
- void DisconnectFromTrack() {
- MediaStreamVideoSink::DisconnectFromTrack();
- }
-
- void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame,
- base::TimeTicks capture_time) {
- *capture_time_ = capture_time;
- metadata_->Clear();
- metadata_->MergeMetadataFrom(frame->metadata());
- base::ResetAndReturn(&got_frame_cb_).Run();
- }
-
- private:
- base::TimeTicks* const capture_time_;
- media::VideoFrameMetadata* const metadata_;
- base::Closure got_frame_cb_;
-};
-
-TEST_F(MediaStreamVideoCapturerSourceTest,
- CaptureTimeAndMetadataPlumbingOldConstraints) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kMediaStreamOldVideoConstraints);
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest,
+ CaptureTimeAndMetadataPlumbing) {
StreamDeviceInfo device_info;
device_info.device.type = MEDIA_DESKTOP_VIDEO_CAPTURE;
InitWithDeviceInfo(device_info);
@@ -496,60 +617,4 @@ TEST_F(MediaStreamVideoCapturerSourceTest,
EXPECT_EQ(30.0, metadata_value);
}
-TEST_F(MediaStreamVideoCapturerSourceTest, CaptureTimeAndMetadataPlumbing) {
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndDisableFeature(
- features::kMediaStreamOldVideoConstraints);
- std::unique_ptr<MockVideoCapturerSource> delegate(
- new MockVideoCapturerSource());
- delegate_ = delegate.get();
- EXPECT_CALL(*delegate_, GetPreferredFormats());
- source_ = new MediaStreamVideoCapturerSource(
- base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped,
- base::Unretained(this)),
- std::move(delegate));
- webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"),
- blink::WebMediaStreamSource::TypeVideo,
- blink::WebString::fromASCII("dummy_source_name"),
- false /* remote */);
- webkit_source_.setExtraData(source_);
- webkit_source_id_ = webkit_source_.id();
-
- VideoCaptureDeliverFrameCB deliver_frame_cb;
- media::VideoCapturerSource::RunningCallback running_cb;
-
- InSequence s;
- // EXPECT_CALL(mock_delegate(), GetCurrentSupportedFormats(_, _, _, _));
- EXPECT_CALL(mock_delegate(), StartCapture(_, _, _))
- .WillOnce(testing::DoAll(testing::SaveArg<1>(&deliver_frame_cb),
- testing::SaveArg<2>(&running_cb)));
- EXPECT_CALL(mock_delegate(), RequestRefreshFrame());
- EXPECT_CALL(mock_delegate(), StopCapture());
- blink::WebMediaStreamTrack track = StartSource(
- VideoTrackAdapterSettings(), base::Optional<bool>(), false, 0.0);
- running_cb.Run(true);
-
- base::RunLoop run_loop;
- base::TimeTicks reference_capture_time =
- base::TimeTicks::FromInternalValue(60013);
- base::TimeTicks capture_time;
- media::VideoFrameMetadata metadata;
- FakeMediaStreamVideoSink fake_sink(
- &capture_time, &metadata,
- media::BindToCurrentLoop(run_loop.QuitClosure()));
- fake_sink.ConnectToTrack(track);
- const scoped_refptr<media::VideoFrame> frame =
- media::VideoFrame::CreateBlackFrame(gfx::Size(2, 2));
- frame->metadata()->SetDouble(media::VideoFrameMetadata::FRAME_RATE, 30.0);
- child_process_->io_task_runner()->PostTask(
- FROM_HERE, base::Bind(deliver_frame_cb, frame, reference_capture_time));
- run_loop.Run();
- fake_sink.DisconnectFromTrack();
- EXPECT_EQ(reference_capture_time, capture_time);
- double metadata_value;
- EXPECT_TRUE(metadata.GetDouble(media::VideoFrameMetadata::FRAME_RATE,
- &metadata_value));
- EXPECT_EQ(30.0, metadata_value);
-}
-
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698