Chromium Code Reviews| Index: media/mojo/clients/mojo_renderer_unittest.cc |
| diff --git a/media/mojo/clients/mojo_renderer_unittest.cc b/media/mojo/clients/mojo_renderer_unittest.cc |
| index 173db36668bc42e97bf16aec155e55443926e31b..e52808e45d4c7c608b09b80a0177462941449756 100644 |
| --- a/media/mojo/clients/mojo_renderer_unittest.cc |
| +++ b/media/mojo/clients/mojo_renderer_unittest.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/message_loop/message_loop.h" |
| #include "base/run_loop.h" |
| #include "base/threading/platform_thread.h" |
| +#include "base/timer/elapsed_timer.h" |
| #include "media/base/audio_renderer_sink.h" |
| #include "media/base/cdm_config.h" |
| #include "media/base/cdm_context.h" |
| @@ -36,6 +37,7 @@ using ::testing::StrictMock; |
| namespace media { |
| +namespace { |
| const int64_t kStartPlayingTimeInMs = 100; |
| const char kClearKeyKeySystem[] = "org.w3.clearkey"; |
| @@ -43,6 +45,14 @@ ACTION_P2(SetError, renderer_client, error) { |
| renderer_client->OnError(error); |
| } |
| +void WaitFor(base::TimeDelta duration) { |
|
DaleCurtis
2016/09/06 19:21:25
Does RunLoop().RunUntilIdle() not suffice?
alokp
2016/09/07 16:46:21
I want a few of the time-update tasks to be posted
|
| + base::RunLoop run_loop; |
| + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| + FROM_HERE, run_loop.QuitClosure(), duration); |
| + run_loop.Run(); |
| +} |
| +} // namespace |
| + |
| class MojoRendererTest : public ::testing::Test { |
| public: |
| MojoRendererTest() { |
| @@ -235,6 +245,7 @@ TEST_F(MojoRendererTest, Initialize_AfterConnectionError) { |
| TEST_F(MojoRendererTest, Flush_Success) { |
| Initialize(); |
| + Play(); |
|
alokp
2016/09/02 22:51:18
It is illegal to call Flush when Renderer is not p
DaleCurtis
2016/09/06 19:21:25
Add DCHECK in Mojo renderer?
alokp
2016/09/07 16:46:21
I was wrong about Flush being illegal. RendererImp
|
| EXPECT_CALL(*mock_renderer_, Flush(_)).WillOnce(RunClosure<0>()); |
| Flush(); |
| @@ -242,6 +253,7 @@ TEST_F(MojoRendererTest, Flush_Success) { |
| TEST_F(MojoRendererTest, Flush_ConnectionError) { |
| Initialize(); |
| + Play(); |
|
alokp
2016/09/02 22:51:17
ditto.
|
| // Upon connection error, OnError() should be called once and only once. |
| EXPECT_CALL(renderer_client_, OnError(PIPELINE_ERROR_DECODE)).Times(1); |
| @@ -326,15 +338,37 @@ TEST_F(MojoRendererTest, GetMediaTime) { |
| Initialize(); |
| EXPECT_EQ(base::TimeDelta(), mojo_renderer_->GetMediaTime()); |
| - Play(); |
| + const base::TimeDelta kSleepTime = base::TimeDelta::FromMilliseconds(500); |
| + const base::TimeDelta kStartTime = |
| + base::TimeDelta::FromMilliseconds(kStartPlayingTimeInMs); |
| - // Time is updated periodically with a short delay. |
| - const base::TimeDelta kUpdatedTime = base::TimeDelta::FromMilliseconds(500); |
| + // Media time should not advance since playback rate is 0. |
| + EXPECT_CALL(*mock_renderer_, SetPlaybackRate(0)); |
| + EXPECT_CALL(*mock_renderer_, StartPlayingFrom(kStartTime)); |
| EXPECT_CALL(*mock_renderer_, GetMediaTime()) |
| - .WillRepeatedly(Return(kUpdatedTime)); |
| - base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); |
| - base::RunLoop().RunUntilIdle(); |
| - EXPECT_EQ(kUpdatedTime, mojo_renderer_->GetMediaTime()); |
| + .WillRepeatedly(Return(kStartTime)); |
| + mojo_renderer_->SetPlaybackRate(0); |
| + mojo_renderer_->StartPlayingFrom(kStartTime); |
| + WaitFor(kSleepTime); |
| + EXPECT_EQ(kStartTime, mojo_renderer_->GetMediaTime()); |
| + |
| + // Media time should now advance since playback rate is > 0. |
| + std::unique_ptr<base::ElapsedTimer> elapsed_timer(new base::ElapsedTimer); |
| + EXPECT_CALL(*mock_renderer_, SetPlaybackRate(1.0)); |
| + EXPECT_CALL(*mock_renderer_, GetMediaTime()) |
| + .WillRepeatedly(Return(elapsed_timer->Elapsed())); |
| + mojo_renderer_->SetPlaybackRate(1.0); |
| + WaitFor(kSleepTime); |
| + EXPECT_GT(mojo_renderer_->GetMediaTime(), kStartTime); |
| + |
| + // Flushing should pause media-time updates. |
| + EXPECT_CALL(*mock_renderer_, Flush(_)).WillOnce(RunClosure<0>()); |
| + Flush(); |
| + base::TimeDelta pause_time = mojo_renderer_->GetMediaTime(); |
| + EXPECT_GT(pause_time, kStartTime); |
| + WaitFor(kSleepTime); |
| + EXPECT_EQ(pause_time, mojo_renderer_->GetMediaTime()); |
| + Destroy(); |
| } |
| TEST_F(MojoRendererTest, OnEnded) { |
| @@ -371,6 +405,8 @@ TEST_F(MojoRendererTest, Destroy_PendingFlush) { |
| TEST_F(MojoRendererTest, Destroy_PendingSetCdm) { |
| Initialize(); |
| + Play(); |
|
alokp
2016/09/02 22:51:17
ditto
|
| + |
| EXPECT_CALL(*mock_renderer_, Flush(_)).WillRepeatedly(RunClosure<0>()); |
| EXPECT_CALL(*this, OnFlushed()); |
| mojo_renderer_->Flush( |