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( |