Index: content/renderer/media/media_stream_video_renderer_sink_unittest.cc |
diff --git a/content/renderer/media/media_stream_video_renderer_sink_unittest.cc b/content/renderer/media/media_stream_video_renderer_sink_unittest.cc |
index 79c91c3c69fe53a3facbe15213c723d048457adc..0655645845a0c2f8552075e2c188a1d39c08f481 100644 |
--- a/content/renderer/media/media_stream_video_renderer_sink_unittest.cc |
+++ b/content/renderer/media/media_stream_video_renderer_sink_unittest.cc |
@@ -8,7 +8,9 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "content/child/child_process.h" |
#include "content/renderer/media/media_stream_video_renderer_sink.h" |
+#include "content/renderer/media/media_stream_video_track.h" |
#include "content/renderer/media/mock_media_stream_registry.h" |
+#include "content/renderer/media/mock_media_stream_video_source.h" |
#include "media/base/video_frame.h" |
#include "media/renderers/gpu_video_accelerator_factories.h" |
#include "media/renderers/mock_gpu_memory_buffer_video_frame_pool.h" |
@@ -29,72 +31,96 @@ ACTION_P(RunClosure, closure) { |
closure.Run(); |
} |
-static const std::string kTestStreamUrl = "stream_url"; |
-static const std::string kTestVideoTrackId = "video_track_id"; |
- |
class MediaStreamVideoRendererSinkTest : public testing::Test { |
public: |
- MediaStreamVideoRendererSinkTest() { |
- registry_.Init(kTestStreamUrl); |
- registry_.AddVideoTrack(kTestVideoTrackId); |
- |
- // Extract the Blink Video Track for the MSVRSink. |
- registry_.test_stream().videoTracks(video_tracks_); |
- EXPECT_EQ(1u, video_tracks_.size()); |
+ MediaStreamVideoRendererSinkTest() |
+ : child_process_(new ChildProcess()), |
+ mock_source_(new MockMediaStreamVideoSource(false)) { |
+ blink_source_.initialize(base::UTF8ToUTF16("dummy_source_id"), |
+ blink::WebMediaStreamSource::TypeVideo, |
+ base::UTF8ToUTF16("dummy_source_name"), |
+ false /* remote */); |
+ blink_source_.setExtraData(mock_source_); |
+ blink::WebMediaConstraints constraints; |
+ constraints.initialize(); |
+ blink_track_ = MediaStreamVideoTrack::CreateVideoTrack( |
+ mock_source_, constraints, MediaStreamSource::ConstraintsCallback(), |
+ true); |
+ mock_source_->StartMockedSource(); |
+ base::RunLoop().RunUntilIdle(); |
media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink( |
- video_tracks_[0], |
+ blink_track_, |
base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback, |
base::Unretained(this)), |
base::Bind(&MediaStreamVideoRendererSinkTest::RepaintCallback, |
base::Unretained(this)), |
- message_loop_.task_runner(), message_loop_.task_runner().get(), |
- nullptr /* gpu_factories */); |
+ message_loop_.task_runner(), message_loop_.task_runner(), |
+ message_loop_.task_runner(), nullptr /* gpu_factories */); |
+ base::RunLoop().RunUntilIdle(); |
EXPECT_TRUE(IsInStoppedState()); |
} |
- ~MediaStreamVideoRendererSinkTest() { |
+ void TearDown() override { |
media_stream_video_renderer_sink_ = nullptr; |
- registry_.reset(); |
+ blink_source_.reset(); |
+ blink_track_.reset(); |
blink::WebHeap::collectAllGarbageForTesting(); |
// Let the message loop run to finish destroying the pool. |
base::RunLoop().RunUntilIdle(); |
} |
- MOCK_METHOD1(RepaintCallback, void(const scoped_refptr<media::VideoFrame>&)); |
+ MOCK_METHOD1(RepaintCallback, void(scoped_refptr<media::VideoFrame>)); |
MOCK_METHOD0(ErrorCallback, void(void)); |
bool IsInStartedState() const { |
- return media_stream_video_renderer_sink_->state_ == |
+ return media_stream_video_renderer_sink_->GetStateForTesting() == |
MediaStreamVideoRendererSink::STARTED; |
} |
bool IsInStoppedState() const { |
- return media_stream_video_renderer_sink_->state_ == |
+ return media_stream_video_renderer_sink_->GetStateForTesting() == |
MediaStreamVideoRendererSink::STOPPED; |
} |
bool IsInPausedState() const { |
- return media_stream_video_renderer_sink_->state_ == |
+ return media_stream_video_renderer_sink_->GetStateForTesting() == |
MediaStreamVideoRendererSink::PAUSED; |
} |
- void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame) { |
- media_stream_video_renderer_sink_->OnVideoFrame(frame, |
- base::TimeTicks::Now()); |
+ void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) { |
+ mock_source_->DeliverVideoFrame(frame); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // |blink_track_| uses IO thread to send frames to sinks. Make sure that |
+ // tasks on IO thread are completed before moving on. |
+ base::RunLoop run_loop; |
+ child_process_->io_task_runner()->PostTaskAndReply( |
+ FROM_HERE, base::Bind([] {}), run_loop.QuitClosure()); |
+ run_loop.Run(); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ void SetGpuMemoryBufferVideoForTesting( |
+ media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) { |
+ media_stream_video_renderer_sink_->SetGpuMemoryBufferVideoForTesting( |
+ gpu_memory_buffer_pool); |
} |
scoped_refptr<MediaStreamVideoRendererSink> media_stream_video_renderer_sink_; |
+ protected: |
// A ChildProcess and a MessageLoopForUI are both needed to fool the Tracks |
// and Sources in |registry_| into believing they are on the right threads. |
base::MessageLoopForUI message_loop_; |
- const ChildProcess child_process_; |
+ const std::unique_ptr<ChildProcess> child_process_; |
- blink::WebVector<blink::WebMediaStreamTrack> video_tracks_; |
- MockMediaStreamRegistry registry_; |
+ blink::WebMediaStreamTrack blink_track_; |
private: |
+ blink::WebMediaStreamSource blink_source_; |
+ MockMediaStreamVideoSource* mock_source_; |
+ |
DISALLOW_COPY_AND_ASSIGN(MediaStreamVideoRendererSinkTest); |
}; |
@@ -103,15 +129,19 @@ TEST_F(MediaStreamVideoRendererSinkTest, StartStop) { |
EXPECT_TRUE(IsInStoppedState()); |
media_stream_video_renderer_sink_->Start(); |
+ base::RunLoop().RunUntilIdle(); |
EXPECT_TRUE(IsInStartedState()); |
media_stream_video_renderer_sink_->Pause(); |
+ base::RunLoop().RunUntilIdle(); |
EXPECT_TRUE(IsInPausedState()); |
media_stream_video_renderer_sink_->Resume(); |
+ base::RunLoop().RunUntilIdle(); |
EXPECT_TRUE(IsInStartedState()); |
media_stream_video_renderer_sink_->Stop(); |
+ base::RunLoop().RunUntilIdle(); |
EXPECT_TRUE(IsInStoppedState()); |
} |
@@ -133,8 +163,10 @@ class MediaStreamVideoRendererSinkAsyncAddFrameReadyTest |
: public MediaStreamVideoRendererSinkTest { |
public: |
MediaStreamVideoRendererSinkAsyncAddFrameReadyTest() { |
- media_stream_video_renderer_sink_->SetGpuMemoryBufferVideoForTesting( |
+ media_stream_video_renderer_sink_->Start(); |
+ SetGpuMemoryBufferVideoForTesting( |
new media::MockGpuMemoryBufferVideoFramePool(&frame_ready_cbs_)); |
+ base::RunLoop().RunUntilIdle(); |
} |
protected: |
@@ -143,13 +175,10 @@ class MediaStreamVideoRendererSinkAsyncAddFrameReadyTest |
TEST_F(MediaStreamVideoRendererSinkAsyncAddFrameReadyTest, |
CreateHardwareFrames) { |
- media_stream_video_renderer_sink_->Start(); |
- |
InSequence s; |
const scoped_refptr<media::VideoFrame> video_frame = |
media::VideoFrame::CreateBlackFrame(gfx::Size(160, 80)); |
OnVideoFrame(video_frame); |
- base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, frame_ready_cbs_.size()); |
EXPECT_CALL(*this, RepaintCallback(video_frame)).Times(1); |
@@ -164,17 +193,17 @@ class MediaStreamVideoRendererSinkTransparencyTest |
public: |
MediaStreamVideoRendererSinkTransparencyTest() { |
media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink( |
- video_tracks_[0], |
+ blink_track_, |
base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback, |
base::Unretained(this)), |
base::Bind(&MediaStreamVideoRendererSinkTransparencyTest:: |
VerifyTransparentFrame, |
base::Unretained(this)), |
- message_loop_.task_runner(), message_loop_.task_runner().get(), |
- nullptr /* gpu_factories */); |
+ message_loop_.task_runner(), message_loop_.task_runner(), |
+ message_loop_.task_runner(), nullptr /* gpu_factories */); |
} |
- void VerifyTransparentFrame(const scoped_refptr<media::VideoFrame>& frame) { |
+ void VerifyTransparentFrame(scoped_refptr<media::VideoFrame> frame) { |
EXPECT_EQ(media::PIXEL_FORMAT_YV12A, frame->format()); |
} |
}; |