Chromium Code Reviews| Index: media/filters/pipeline_controller_unittest.cc |
| diff --git a/media/filters/pipeline_controller_unittest.cc b/media/filters/pipeline_controller_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d522ac8742b6f767576b6584c189b636621b0f34 |
| --- /dev/null |
| +++ b/media/filters/pipeline_controller_unittest.cc |
| @@ -0,0 +1,163 @@ |
| +// Copyright (c) 2016 The Chromium Authors. All rights reserved. |
|
DaleCurtis
2016/02/25 01:58:30
No (c) these days.
sandersd (OOO until July 31)
2016/02/25 20:33:46
Done.
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "base/bind.h" |
| +#include "base/bind_helpers.h" |
| +#include "base/logging.h" |
| +#include "base/macros.h" |
| +#include "base/memory/ref_counted.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "base/time/time.h" |
| +#include "media/base/mock_filters.h" |
| +#include "media/base/pipeline.h" |
| +#include "media/filters/pipeline_controller.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +using ::testing::_; |
|
DaleCurtis
2016/02/25 01:58:30
We generally elide the first ::
sandersd (OOO until July 31)
2016/02/25 20:33:46
That seems to be just you.
(And separately I have
DaleCurtis
2016/02/26 02:59:34
3652 hits
https://code.google.com/p/chromium/codes
sandersd (OOO until July 31)
2016/02/26 22:10:48
https://code.google.com/p/chromium/codesearch#sear
|
| +using ::testing::DoAll; |
| +using ::testing::Mock; |
| +using ::testing::Return; |
| +using ::testing::SaveArg; |
| +using ::testing::StrictMock; |
| + |
| +namespace media { |
| + |
| +class PipelineControllerTest : public ::testing::Test { |
| + public: |
| + PipelineControllerTest() |
| + : pipeline_controller_(&pipeline_, |
| + base::Bind(&PipelineControllerTest::CreateRenderer, |
| + base::Unretained(this)), |
| + base::Bind(&PipelineControllerTest::OnSeeked, |
| + base::Unretained(this)), |
| + base::Bind(&PipelineControllerTest::OnSuspended, |
| + base::Unretained(this)), |
| + base::Bind(&PipelineControllerTest::OnError, |
| + base::Unretained(this))) {} |
| + |
| + ~PipelineControllerTest() override {} |
| + |
| + PipelineStatusCB StartPipeline() { |
| + EXPECT_FALSE(pipeline_controller_.IsStable()); |
| + PipelineStatusCB start_cb; |
| + EXPECT_CALL(pipeline_, Start(_, _, _, _, _, _, _, _, _, _)) |
| + .WillOnce(SaveArg<4>(&start_cb)); |
| + pipeline_controller_.Start( |
| + nullptr, nullptr, false, base::Closure(), PipelineMetadataCB(), |
| + BufferingStateCB(), base::Closure(), AddTextTrackCB(), base::Closure()); |
| + Mock::VerifyAndClear(&pipeline_); |
| + EXPECT_FALSE(pipeline_controller_.IsStable()); |
| + return start_cb; |
| + } |
| + |
| + PipelineStatusCB SeekPipeline(base::TimeDelta time) { |
| + EXPECT_TRUE(pipeline_controller_.IsStable()); |
| + PipelineStatusCB seek_cb; |
| + EXPECT_CALL(pipeline_, Seek(time, _)).WillOnce(SaveArg<1>(&seek_cb)); |
| + pipeline_controller_.Seek(time, true); |
| + Mock::VerifyAndClear(&pipeline_); |
| + EXPECT_FALSE(pipeline_controller_.IsStable()); |
| + return seek_cb; |
| + } |
| + |
| + PipelineStatusCB SuspendPipeline() { |
| + EXPECT_TRUE(pipeline_controller_.IsStable()); |
| + PipelineStatusCB suspend_cb; |
| + EXPECT_CALL(pipeline_, Suspend(_)).WillOnce(SaveArg<0>(&suspend_cb)); |
| + pipeline_controller_.Suspend(); |
| + Mock::VerifyAndClear(&pipeline_); |
| + EXPECT_FALSE(pipeline_controller_.IsStable()); |
| + EXPECT_FALSE(pipeline_controller_.IsSuspended()); |
| + return suspend_cb; |
| + } |
| + |
| + PipelineStatusCB ResumePipeline() { |
| + EXPECT_TRUE(pipeline_controller_.IsSuspended()); |
| + PipelineStatusCB resume_cb; |
| + EXPECT_CALL(pipeline_, Resume(_, _, _)) |
| + .WillOnce( |
| + DoAll(SaveArg<1>(&last_resume_time_), SaveArg<2>(&resume_cb))); |
| + EXPECT_CALL(pipeline_, GetMediaTime()) |
| + .WillRepeatedly(Return(base::TimeDelta())); |
| + pipeline_controller_.Resume(); |
| + Mock::VerifyAndClear(&pipeline_); |
| + EXPECT_FALSE(pipeline_controller_.IsStable()); |
| + EXPECT_FALSE(pipeline_controller_.IsSuspended()); |
| + return resume_cb; |
| + } |
| + |
| + protected: |
| + scoped_ptr<Renderer> CreateRenderer() { return scoped_ptr<Renderer>(); } |
| + |
| + void OnSeeked(bool time_updated) {} |
|
DaleCurtis
2016/02/25 01:58:30
Seems you might want to verify these two?
sandersd (OOO until July 31)
2016/02/25 20:33:46
Done.
|
| + |
| + void OnSuspended() {} |
| + |
| + void OnError(PipelineStatus status) { NOTREACHED(); } |
| + |
| + StrictMock<MockPipeline> pipeline_; |
| + PipelineController pipeline_controller_; |
| + base::TimeDelta last_resume_time_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(PipelineControllerTest); |
| +}; |
| + |
| +TEST_F(PipelineControllerTest, SuspendResume) { |
| + StartPipeline().Run(PIPELINE_OK); |
| + SuspendPipeline().Run(PIPELINE_OK); |
| + EXPECT_FALSE(pipeline_controller_.IsStable()); |
| + ResumePipeline().Run(PIPELINE_OK); |
| + EXPECT_TRUE(pipeline_controller_.IsStable()); |
| +} |
| + |
| +TEST_F(PipelineControllerTest, PendingSuspend) { |
| + StartPipeline().Run(PIPELINE_OK); |
| + |
| + // Start a seek, but do not complete it yet. |
| + base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); |
| + PipelineStatusCB seek_cb = SeekPipeline(seek_time); |
| + |
| + // Request a suspend. It will be a mock failure it happens immediately. |
| + pipeline_controller_.Suspend(); |
| + |
| + // Expect the suspend to trigger when the seek is completed. |
| + EXPECT_CALL(pipeline_, Suspend(_)); |
| + seek_cb.Run(PIPELINE_OK); |
| +} |
| + |
| +TEST_F(PipelineControllerTest, SeekMergesWithResume) { |
| + StartPipeline().Run(PIPELINE_OK); |
| + SuspendPipeline().Run(PIPELINE_OK); |
| + |
| + // Request a seek. It will be a mock failure it happens. |
| + base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); |
| + pipeline_controller_.Seek(seek_time, true); |
| + |
| + // Resume and verify the resume time. |
| + ResumePipeline().Run(PIPELINE_OK); |
| + EXPECT_EQ(seek_time, last_resume_time_); |
| +} |
| + |
| +TEST_F(PipelineControllerTest, SeekMergesWithSeek) { |
| + StartPipeline().Run(PIPELINE_OK); |
| + |
| + // Start a seek, but do not complete it yet. |
| + base::TimeDelta seek_time_1 = base::TimeDelta::FromSeconds(5); |
| + PipelineStatusCB seek_cb_1 = SeekPipeline(seek_time_1); |
| + |
| + // Request another seek. It will be a mock failure it happens. |
| + base::TimeDelta seek_time_2 = base::TimeDelta::FromSeconds(10); |
| + pipeline_controller_.Seek(seek_time_2, true); |
| + |
| + // Request a third seek. (It should replace the second.) |
| + base::TimeDelta seek_time_3 = base::TimeDelta::FromSeconds(15); |
| + pipeline_controller_.Seek(seek_time_3, true); |
| + |
| + // Expect that the third seek triggers when the first seek completes. |
| + EXPECT_CALL(pipeline_, Seek(seek_time_3, _)); |
| + seek_cb_1.Run(PIPELINE_OK); |
| +} |
| + |
| +} // namespace media |