| 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..5e65b52804bda7e625fc6484c95d23a67fdc0c44 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,13 +37,22 @@ using ::testing::StrictMock;
|
|
|
| namespace media {
|
|
|
| +namespace {
|
| const int64_t kStartPlayingTimeInMs = 100;
|
| const char kClearKeyKeySystem[] = "org.w3.clearkey";
|
|
|
| -ACTION_P2(SetError, renderer_client, error) {
|
| - renderer_client->OnError(error);
|
| +ACTION_P2(GetMediaTime, start_time, elapsed_timer) {
|
| + return start_time + elapsed_timer->Elapsed();
|
| }
|
|
|
| +void WaitFor(base::TimeDelta duration) {
|
| + 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() {
|
| @@ -326,15 +336,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(GetMediaTime(kStartTime, elapsed_timer.get()));
|
| + 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 +403,7 @@ TEST_F(MojoRendererTest, Destroy_PendingFlush) {
|
|
|
| TEST_F(MojoRendererTest, Destroy_PendingSetCdm) {
|
| Initialize();
|
| +
|
| EXPECT_CALL(*mock_renderer_, Flush(_)).WillRepeatedly(RunClosure<0>());
|
| EXPECT_CALL(*this, OnFlushed());
|
| mojo_renderer_->Flush(
|
|
|