Index: media/base/composite_filter_unittest.cc |
diff --git a/media/base/composite_filter_unittest.cc b/media/base/composite_filter_unittest.cc |
deleted file mode 100644 |
index 44aeaadee7287c3d38c8ccdc64428889eaff87d3..0000000000000000000000000000000000000000 |
--- a/media/base/composite_filter_unittest.cc |
+++ /dev/null |
@@ -1,794 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// 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/callback_helpers.h" |
-#include "base/message_loop.h" |
-#include "media/base/composite_filter.h" |
-#include "media/base/mock_callback.h" |
-#include "media/base/mock_filter_host.h" |
-#include "media/base/mock_filters.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using ::testing::_; |
-using ::testing::InSequence; |
-using ::testing::Return; |
-using ::testing::SaveArg; |
-using ::testing::StrictMock; |
- |
-namespace media { |
- |
-class CompositeFilterTest : public testing::Test { |
- public: |
- CompositeFilterTest(); |
- virtual ~CompositeFilterTest(); |
- |
- // Sets up a new CompositeFilter in |composite_|, creates |filter_1_| and |
- // |filter_2_|, and adds these filters to |composite_|. |
- void SetupAndAdd2Filters(); |
- |
- // Helper enum that indicates what filter method to call. |
- enum MethodToCall { |
- PLAY, |
- PAUSE, |
- FLUSH, |
- STOP, |
- SEEK, |
- }; |
- |
- // Helper method that adds a filter method call expectation based on the value |
- // of |method_to_call|. |
- // |
- // |method_to_call| - Indicates which method we expect a call for. |
- // |filter| - The MockFilter to add the expectation to. |
- // |seek_time| - The time to pass to the Seek() call if |method_to_call| |
- // equals SEEK. |
- void ExpectFilterCall(MethodToCall method_to_call, MockFilter* filter, |
- base::TimeDelta seek_time); |
- |
- // Helper method that calls a filter method based on the value of |
- // |method_to_call|. |
- // |
- // |method_to_call| - Indicates which method to call. |
- // |filter| - The Filter to make the method call on. |
- // |seek_time| - The time to pass to the Seek() call if |method_to_call| |
- // equals SEEK. |
- // |callback| - The callback object to pass to the method. |
- // |expected_status| - Some filter methods use a PipelineStatusCB instead of |
- // a Closure. For these methods this function |
- // creates a PipelineStatusCB that makes sure the status |
- // passed to the callback matches |expected_status| and |
- // then calls |callback|. |
- void DoFilterCall(MethodToCall method_to_call, Filter* filter, |
- base::TimeDelta seek_time, |
- const base::Closure& callback, |
- PipelineStatus expected_status); |
- |
- // Creates an expectation sequence based on the value of method_to_call. |
- // |
- // |method_to_call| - Indicates which method we want a success sequence for. |
- // |seek_time| - The time to pass in the Seek() call if |method_to_call| |
- // equals SEEK. |
- void ExpectSuccess(MethodToCall method_to_call, |
- base::TimeDelta seek_time = base::TimeDelta()); |
- |
- // Issue a Play(), Pause(), Flush(), Stop(), or Seek() on the composite and |
- // verify all the expected calls on the filters. |
- void DoPlay(); |
- void DoPause(); |
- void DoFlush(); |
- void DoStop(); |
- void DoSeek(base::TimeDelta time); |
- |
- // Issue a Play(), Pause(), Flush(), or Seek() and expect the calls to fail |
- // with a PIPELINE_ERROR_INVALID_STATE error. |
- // |
- // |method_to_call| - Indicates whick method to call. |
- // |seek_time| - The time to pass to the Seek() call if |method_to_call| |
- // equals SEEK. |
- void ExpectInvalidStateFail(MethodToCall method_to_call, |
- base::TimeDelta seek_time = base::TimeDelta()); |
- |
- // Returns whether |filter_1_cb_| or |filter_1_status_cb_| is set. |
- bool HasFilter1Callback() const; |
- |
- // Run the callback stored in |filter_1_cb_| or |filter_2_status_cb_|. |
- void RunFilter1Callback(); |
- |
- // Returns whether |filter_2_cb_| or |filter_2_status_cb_| is set. |
- bool HasFilter2Callback() const; |
- |
- // Run the callback stored in |filter_2_cb_| or |filter_2_status_cb_|. |
- void RunFilter2Callback(); |
- |
- protected: |
- MessageLoop message_loop_; |
- |
- // The composite object being tested. |
- scoped_refptr<CompositeFilter> composite_; |
- |
- // First filter added to the composite. |
- scoped_refptr<StrictMock<MockFilter> > filter_1_; |
- |
- // Callback passed to |filter_1_| during last Play(), Pause(), Flush(), |
- // or Stop() call. |
- base::Closure filter_1_cb_; |
- |
- // Status to pass to |filter_1_status_cb_|. |
- PipelineStatus filter_1_status_; |
- |
- // Callback passed to |filter_1_| during last Seek() call. |
- PipelineStatusCB filter_1_status_cb_; |
- |
- // Second filter added to the composite. |
- scoped_refptr<StrictMock<MockFilter> > filter_2_; |
- |
- // Callback passed to |filter_2_| during last Play(), Pause(), Flush(), |
- // Stop(), or Seek() call. |
- base::Closure filter_2_cb_; |
- |
- // Status to pass to |filter_2_status_cb_|. |
- PipelineStatus filter_2_status_; |
- |
- // Callback passed to |filter_2_| during last Seek() call. |
- PipelineStatusCB filter_2_status_cb_; |
- |
- // FilterHost implementation passed to |composite_| via SetHost(). |
- scoped_ptr<StrictMock<MockFilterHost> > mock_filter_host_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CompositeFilterTest); |
-}; |
- |
-CompositeFilterTest::CompositeFilterTest() : |
- composite_(new CompositeFilter(message_loop_.message_loop_proxy())), |
- filter_1_status_(PIPELINE_OK), |
- filter_2_status_(PIPELINE_OK), |
- mock_filter_host_(new StrictMock<MockFilterHost>()) { |
-} |
- |
-CompositeFilterTest::~CompositeFilterTest() {} |
- |
-void CompositeFilterTest::SetupAndAdd2Filters() { |
- mock_filter_host_.reset(new StrictMock<MockFilterHost>()); |
- composite_ = new CompositeFilter(message_loop_.message_loop_proxy()); |
- composite_->SetHost(mock_filter_host_.get()); |
- |
- // Setup |filter_1_| and arrange for methods to set |
- // |filter_1_cb_| when they are called. |
- filter_1_ = new StrictMock<MockFilter>(); |
- filter_1_cb_.Reset(); |
- filter_1_status_ = PIPELINE_OK; |
- filter_1_status_cb_.Reset(); |
- ON_CALL(*filter_1_, Play(_)) |
- .WillByDefault(SaveArg<0>(&filter_1_cb_)); |
- ON_CALL(*filter_1_, Pause(_)) |
- .WillByDefault(SaveArg<0>(&filter_1_cb_)); |
- ON_CALL(*filter_1_, Flush(_)) |
- .WillByDefault(SaveArg<0>(&filter_1_cb_)); |
- ON_CALL(*filter_1_, Stop(_)) |
- .WillByDefault(SaveArg<0>(&filter_1_cb_)); |
- ON_CALL(*filter_1_, Seek(_,_)) |
- .WillByDefault(SaveArg<1>(&filter_1_status_cb_)); |
- |
- // Setup |filter_2_| and arrange for methods to set |
- // |filter_2_cb_| when they are called. |
- filter_2_ = new StrictMock<MockFilter>(); |
- filter_2_cb_.Reset(); |
- filter_2_status_ = PIPELINE_OK; |
- filter_2_status_cb_.Reset(); |
- ON_CALL(*filter_2_, Play(_)) |
- .WillByDefault(SaveArg<0>(&filter_2_cb_)); |
- ON_CALL(*filter_2_, Pause(_)) |
- .WillByDefault(SaveArg<0>(&filter_2_cb_)); |
- ON_CALL(*filter_2_, Flush(_)) |
- .WillByDefault(SaveArg<0>(&filter_2_cb_)); |
- ON_CALL(*filter_2_, Stop(_)) |
- .WillByDefault(SaveArg<0>(&filter_2_cb_)); |
- ON_CALL(*filter_2_, Seek(_,_)) |
- .WillByDefault(SaveArg<1>(&filter_2_status_cb_)); |
- |
- composite_->AddFilter(filter_1_); |
- composite_->AddFilter(filter_2_); |
-} |
- |
-void CompositeFilterTest::ExpectFilterCall(MethodToCall method_to_call, |
- MockFilter* filter, |
- base::TimeDelta seek_time) { |
- switch(method_to_call) { |
- case PLAY: |
- EXPECT_CALL(*filter, Play(_)); |
- break; |
- case PAUSE: |
- EXPECT_CALL(*filter, Pause(_)); |
- break; |
- case FLUSH: |
- EXPECT_CALL(*filter, Flush(_)); |
- break; |
- case STOP: |
- EXPECT_CALL(*filter, Stop(_)); |
- break; |
- case SEEK: |
- EXPECT_CALL(*filter, Seek(seek_time, _)); |
- break; |
- }; |
-} |
- |
-void OnStatusCB(PipelineStatus expected_status, const base::Closure& callback, |
- PipelineStatus status) { |
- EXPECT_EQ(status, expected_status); |
- callback.Run(); |
-} |
- |
-void CompositeFilterTest::DoFilterCall(MethodToCall method_to_call, |
- Filter* filter, |
- base::TimeDelta seek_time, |
- const base::Closure& callback, |
- PipelineStatus expected_status) { |
- filter_1_status_ = expected_status; |
- filter_2_status_ = expected_status; |
- |
- switch(method_to_call) { |
- case PLAY: |
- filter->Play(callback); |
- break; |
- case PAUSE: |
- filter->Pause(callback); |
- break; |
- case FLUSH: |
- filter->Flush(callback); |
- break; |
- case STOP: |
- filter->Stop(callback); |
- break; |
- case SEEK: |
- filter->Seek(seek_time, base::Bind(&OnStatusCB, expected_status, |
- callback)); |
- break; |
- }; |
-} |
- |
-void CompositeFilterTest::ExpectSuccess(MethodToCall method_to_call, |
- base::TimeDelta seek_time) { |
- InSequence seq; |
- |
- bool is_parallel_call = (method_to_call == FLUSH); |
- |
- ExpectFilterCall(method_to_call, filter_1_.get(), seek_time); |
- |
- if (is_parallel_call) { |
- ExpectFilterCall(method_to_call, filter_2_.get(), seek_time); |
- } |
- |
- // Make method call on the composite. |
- StrictMock<MockClosure>* callback = new StrictMock<MockClosure>(); |
- DoFilterCall(method_to_call, composite_.get(), seek_time, |
- base::Bind(&MockClosure::Run, callback), |
- PIPELINE_OK); |
- |
- if (is_parallel_call) { |
- // Make sure both filters have their callbacks set. |
- EXPECT_TRUE(HasFilter1Callback()); |
- EXPECT_TRUE(HasFilter2Callback()); |
- |
- RunFilter1Callback(); |
- } else { |
- // Make sure that only |filter_1_| has its callback set. |
- EXPECT_TRUE(HasFilter1Callback()); |
- EXPECT_FALSE(HasFilter2Callback()); |
- |
- ExpectFilterCall(method_to_call, filter_2_.get(), seek_time); |
- |
- RunFilter1Callback(); |
- |
- // Verify that |filter_2_| was called by checking the callback pointer. |
- EXPECT_TRUE(HasFilter2Callback()); |
- } |
- |
- EXPECT_CALL(*callback, Run()); |
- |
- RunFilter2Callback(); |
-} |
- |
-void CompositeFilterTest::DoPlay() { |
- ExpectSuccess(PLAY); |
-} |
- |
-void CompositeFilterTest::DoPause() { |
- ExpectSuccess(PAUSE); |
-} |
- |
-void CompositeFilterTest::DoFlush() { |
- ExpectSuccess(FLUSH); |
-} |
- |
-void CompositeFilterTest::DoStop() { |
- ExpectSuccess(STOP); |
-} |
- |
-void CompositeFilterTest::DoSeek(base::TimeDelta time) { |
- ExpectSuccess(SEEK, time); |
-} |
- |
-void CompositeFilterTest::ExpectInvalidStateFail(MethodToCall method_to_call, |
- base::TimeDelta seek_time) { |
- InSequence seq; |
- |
- if (method_to_call != SEEK) { |
- EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_INVALID_STATE)) |
- .WillOnce(Return()); |
- } |
- |
- DoFilterCall(method_to_call, composite_, seek_time, NewExpectedClosure(), |
- PIPELINE_ERROR_INVALID_STATE); |
- |
- // Make sure that neither of the filters were called by |
- // verifying that the callback pointers weren't set. |
- EXPECT_FALSE(HasFilter1Callback()); |
- EXPECT_FALSE(HasFilter2Callback()); |
-} |
- |
-bool CompositeFilterTest::HasFilter1Callback() const { |
- CHECK(filter_1_cb_.is_null() || filter_1_status_cb_.is_null()); |
- return !filter_1_cb_.is_null() || !filter_1_status_cb_.is_null(); |
-} |
- |
-void CompositeFilterTest::RunFilter1Callback() { |
- EXPECT_TRUE(HasFilter1Callback()); |
- |
- if (!filter_1_status_cb_.is_null()) { |
- base::ResetAndReturn(&filter_1_status_cb_).Run(filter_1_status_); |
- filter_1_status_ = PIPELINE_OK; |
- return; |
- } |
- |
- EXPECT_TRUE(!filter_1_cb_.is_null()); |
- base::Closure callback = filter_1_cb_; |
- filter_1_cb_.Reset(); |
- callback.Run(); |
-} |
- |
-bool CompositeFilterTest::HasFilter2Callback() const { |
- CHECK(filter_2_cb_.is_null() || filter_2_status_cb_.is_null()); |
- return !filter_2_cb_.is_null() || !filter_2_status_cb_.is_null(); |
-} |
- |
-void CompositeFilterTest::RunFilter2Callback() { |
- EXPECT_TRUE(HasFilter2Callback()); |
- |
- if (!filter_2_status_cb_.is_null()) { |
- base::ResetAndReturn(&filter_2_status_cb_).Run(filter_2_status_); |
- filter_2_status_ = PIPELINE_OK; |
- return; |
- } |
- |
- EXPECT_FALSE(filter_2_cb_.is_null()); |
- base::Closure callback = filter_2_cb_; |
- filter_2_cb_.Reset(); |
- callback.Run(); |
-} |
- |
-// Test successful AddFilter() cases. |
-TEST_F(CompositeFilterTest, TestAddFilter) { |
- composite_->SetHost(mock_filter_host_.get()); |
- |
- // Add a filter. |
- scoped_refptr<StrictMock<MockFilter> > filter = new StrictMock<MockFilter>(); |
- EXPECT_EQ(NULL, filter->host()); |
- |
- composite_->AddFilter(filter); |
- EXPECT_TRUE(filter->host() != NULL); |
-} |
- |
-class CompositeFilterDeathTest : public CompositeFilterTest { |
- public: |
- virtual void SetUp() { |
- // To avoid googletest warning in "fast" mode. |
- ::testing::FLAGS_gtest_death_test_style = "threadsafe"; |
- } |
-}; |
- |
-// Test AddFilter() failure cases. |
-TEST_F(CompositeFilterDeathTest, TestAddFilterFailCases) { |
- // Test adding a null pointer. |
- EXPECT_DEATH_IF_SUPPORTED(composite_->AddFilter(NULL), ""); |
- |
- scoped_refptr<StrictMock<MockFilter> > filter = new StrictMock<MockFilter>(); |
- EXPECT_EQ(NULL, filter->host()); |
- |
- // Test failing because SetHost() hasn't been called yet. |
- EXPECT_DEATH_IF_SUPPORTED(composite_->AddFilter(filter), ""); |
-} |
- |
-TEST_F(CompositeFilterTest, TestPlay) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- // Verify successful call to Play(). |
- DoPlay(); |
- |
- // At this point we are now in the kPlaying state. |
- |
- // Try calling Play() again to make sure that we simply get a callback. |
- // We are already in the Play() state so there is no point calling the |
- // filters. |
- composite_->Play(NewExpectedClosure()); |
- |
- // Verify that neither of the filter callbacks were set. |
- EXPECT_FALSE(HasFilter1Callback()); |
- EXPECT_FALSE(HasFilter2Callback()); |
- |
- // Stop playback. |
- DoStop(); |
- |
- // At this point we should be in the kStopped state. |
- |
- // Try calling Stop() again to make sure neither filter is called. |
- composite_->Stop(NewExpectedClosure()); |
- |
- // Verify that neither of the filter callbacks were set. |
- EXPECT_FALSE(HasFilter1Callback()); |
- EXPECT_FALSE(HasFilter2Callback()); |
- |
- // Try calling Play() again to make sure we get an error. |
- ExpectInvalidStateFail(PLAY); |
-} |
- |
-// Test errors in the middle of a serial call sequence like Play(). |
-TEST_F(CompositeFilterTest, TestPlayErrors) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- EXPECT_CALL(*filter_1_, Play(_)); |
- |
- // Call Play() on the composite. |
- StrictMock<MockClosure>* callback = new StrictMock<MockClosure>(); |
- composite_->Play(base::Bind(&MockClosure::Run, callback)); |
- |
- EXPECT_CALL(*filter_2_, Play(_)); |
- |
- // Run callback to indicate that |filter_1_|'s Play() has completed. |
- RunFilter1Callback(); |
- |
- // At this point Play() has been called on |filter_2_|. Simulate an |
- // error by calling SetError() on its FilterHost interface. |
- filter_2_->host()->SetError(PIPELINE_ERROR_DECODE); |
- |
- // Expect error to be reported and "play done" callback to be called. |
- EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_DECODE)); |
- EXPECT_CALL(*callback, Run()); |
- |
- // Run callback to indicate that |filter_2_|'s Play() has completed. |
- RunFilter2Callback(); |
- |
- // Verify that Play/Pause/Flush/Seek fail now that an error occured. |
- ExpectInvalidStateFail(PLAY); |
- ExpectInvalidStateFail(PAUSE); |
- ExpectInvalidStateFail(FLUSH); |
- ExpectInvalidStateFail(SEEK); |
- |
- // Make sure you can still Stop(). |
- DoStop(); |
-} |
- |
-TEST_F(CompositeFilterTest, TestPause) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- // Try calling Pause() to make sure we get an error because we aren't in |
- // the playing state. |
- ExpectInvalidStateFail(PAUSE); |
- |
- // Transition to playing state. |
- DoPlay(); |
- |
- // Issue a successful Pause(). |
- DoPause(); |
- |
- // At this point we are paused. |
- |
- // Try calling Pause() again to make sure that the filters aren't called |
- // because we are already in the paused state. |
- composite_->Pause(NewExpectedClosure()); |
- |
- // Verify that neither of the filter callbacks were set. |
- EXPECT_FALSE(HasFilter1Callback()); |
- EXPECT_FALSE(HasFilter2Callback()); |
- |
- // Verify that we can transition pack to the play state. |
- DoPlay(); |
- |
- // Go back to the pause state. |
- DoPause(); |
- |
- // Transition to the stop state. |
- DoStop(); |
- |
- // Try calling Pause() to make sure we get an error because we aren't in |
- // the playing state. |
- ExpectInvalidStateFail(PAUSE); |
-} |
- |
-// Test errors in the middle of a serial call sequence like Pause(). |
-TEST_F(CompositeFilterTest, TestPauseErrors) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- DoPlay(); |
- |
- EXPECT_CALL(*filter_1_, Pause(_)); |
- |
- // Call Pause() on the composite. |
- StrictMock<MockClosure>* callback = new StrictMock<MockClosure>(); |
- composite_->Pause(base::Bind(&MockClosure::Run, callback)); |
- |
- // Simulate an error by calling SetError() on |filter_1_|'s FilterHost |
- // interface. |
- filter_1_->host()->SetError(PIPELINE_ERROR_DECODE); |
- |
- // Expect error to be reported and "pause done" callback to be called. |
- EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_DECODE)); |
- EXPECT_CALL(*callback, Run()); |
- |
- RunFilter1Callback(); |
- |
- // Make sure |filter_2_cb_| was not set. |
- EXPECT_FALSE(HasFilter2Callback()); |
- |
- // Verify that Play/Pause/Flush/Seek fail now that an error occured. |
- ExpectInvalidStateFail(PLAY); |
- ExpectInvalidStateFail(PAUSE); |
- ExpectInvalidStateFail(FLUSH); |
- ExpectInvalidStateFail(SEEK); |
- |
- // Make sure you can still Stop(). |
- DoStop(); |
-} |
- |
-TEST_F(CompositeFilterTest, TestFlush) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- // Make sure Flush() works before calling Play(). |
- DoFlush(); |
- |
- // Transition to playing state. |
- DoPlay(); |
- |
- // Call Flush() to make sure we get an error because we are in |
- // the playing state. |
- ExpectInvalidStateFail(FLUSH); |
- |
- // Issue a successful Pause(). |
- DoPause(); |
- |
- // Make sure Flush() works after pausing. |
- DoFlush(); |
- |
- // Verify that we can transition back to the play state. |
- DoPlay(); |
- |
- // Transition to the stop state. |
- DoStop(); |
- |
- // Try calling Flush() to make sure we get an error because we are stopped. |
- ExpectInvalidStateFail(FLUSH); |
-} |
- |
-// Test errors in the middle of a parallel call sequence like Flush(). |
-TEST_F(CompositeFilterTest, TestFlushErrors) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- EXPECT_CALL(*filter_1_, Flush(_)); |
- EXPECT_CALL(*filter_2_, Flush(_)); |
- |
- // Call Flush() on the composite. |
- StrictMock<MockClosure>* callback = new StrictMock<MockClosure>(); |
- composite_->Flush(base::Bind(&MockClosure::Run, callback)); |
- |
- // Simulate an error by calling SetError() on |filter_1_|'s FilterHost |
- // interface. |
- filter_1_->host()->SetError(PIPELINE_ERROR_DECODE); |
- |
- RunFilter1Callback(); |
- |
- // Expect error to be reported and "pause done" callback to be called. |
- EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_DECODE)); |
- EXPECT_CALL(*callback, Run()); |
- |
- RunFilter2Callback(); |
- |
- // Verify that Play/Pause/Flush/Seek fail now that an error occured. |
- ExpectInvalidStateFail(PLAY); |
- ExpectInvalidStateFail(PAUSE); |
- ExpectInvalidStateFail(FLUSH); |
- ExpectInvalidStateFail(SEEK); |
- |
- // Make sure you can still Stop(). |
- DoStop(); |
-} |
- |
-TEST_F(CompositeFilterTest, TestSeek) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- // Verify that seek is allowed to be called before a Play() call. |
- DoSeek(base::TimeDelta::FromSeconds(5)); |
- |
- // Verify we can issue a Play() after the Seek(). |
- DoPlay(); |
- |
- // Try calling Seek() while playing to make sure we get an error. |
- ExpectInvalidStateFail(SEEK); |
- |
- // Transition to paused state. |
- DoPause(); |
- |
- // Verify that seek is allowed after pausing. |
- DoSeek(base::TimeDelta::FromSeconds(5)); |
- |
- // Verify we can still play again. |
- DoPlay(); |
- |
- // Stop playback. |
- DoStop(); |
- |
- // Try calling Seek() to make sure we get an error. |
- ExpectInvalidStateFail(SEEK); |
-} |
- |
-TEST_F(CompositeFilterTest, TestStop) { |
- InSequence sequence; |
- |
- // Test Stop() before any other call. |
- SetupAndAdd2Filters(); |
- DoStop(); |
- |
- // Test error during Stop() sequence. |
- SetupAndAdd2Filters(); |
- |
- EXPECT_CALL(*filter_1_, Stop(_)); |
- |
- StrictMock<MockClosure>* callback = new StrictMock<MockClosure>(); |
- composite_->Stop(base::Bind(&MockClosure::Run, callback)); |
- |
- // Have |filter_1_| signal an error. |
- filter_1_->host()->SetError(PIPELINE_ERROR_READ); |
- |
- EXPECT_CALL(*filter_2_, Stop(_)); |
- |
- RunFilter1Callback(); |
- |
- EXPECT_CALL(*callback, Run()); |
- |
- RunFilter2Callback(); |
-} |
- |
-// Test stopping in the middle of a serial call sequence. |
-TEST_F(CompositeFilterTest, TestStopWhilePlayPending) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- EXPECT_CALL(*filter_1_, Play(_)); |
- |
- StrictMock<MockClosure>* callback = new StrictMock<MockClosure>(); |
- composite_->Play(base::Bind(&MockClosure::Run, callback)); |
- |
- // Note: Play() is pending on |filter_1_| right now. |
- |
- callback = new StrictMock<MockClosure>(); |
- composite_->Stop(base::Bind(&MockClosure::Run, callback)); |
- |
- EXPECT_CALL(*filter_1_, Stop(_)); |
- |
- // Run |filter_1_|'s callback again to indicate Play() has completed. |
- RunFilter1Callback(); |
- |
- EXPECT_CALL(*filter_2_, Stop(_)); |
- |
- // Run |filter_1_|'s callback again to indicate Stop() has completed. |
- RunFilter1Callback(); |
- |
- EXPECT_CALL(*callback, Run()); |
- |
- // Run |filter_2_|'s callback to indicate Stop() has completed. |
- RunFilter2Callback(); |
-} |
- |
-// Test stopping in the middle of a parallel call sequence. |
-TEST_F(CompositeFilterTest, TestStopWhileFlushPending) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- EXPECT_CALL(*filter_1_, Flush(_)); |
- EXPECT_CALL(*filter_2_, Flush(_)); |
- |
- StrictMock<MockClosure>* callback = new StrictMock<MockClosure>(); |
- composite_->Flush(base::Bind(&MockClosure::Run, callback)); |
- |
- // Note: |filter_1_| and |filter_2_| have pending Flush() calls at this point. |
- |
- callback = new StrictMock<MockClosure>(); |
- composite_->Stop(base::Bind(&MockClosure::Run, callback)); |
- |
- // Run callback to indicate that |filter_1_|'s Flush() has completed. |
- RunFilter1Callback(); |
- |
- EXPECT_CALL(*filter_1_, Stop(_)); |
- |
- // Run callback to indicate that |filter_2_|'s Flush() has completed. |
- RunFilter2Callback(); |
- |
- EXPECT_CALL(*filter_2_, Stop(_)); |
- |
- // Run callback to indicate that |filter_1_|'s Stop() has completed. |
- RunFilter1Callback(); |
- |
- EXPECT_CALL(*callback, Run()); |
- |
- // Run callback to indicate that |filter_2_|'s Stop() has completed. |
- RunFilter2Callback(); |
-} |
- |
-TEST_F(CompositeFilterTest, TestErrorWhilePlaying) { |
- InSequence sequence; |
- |
- SetupAndAdd2Filters(); |
- |
- DoPlay(); |
- |
- // Simulate an error on |filter_2_| while playing. |
- EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_DECODE)); |
- filter_2_->host()->SetError(PIPELINE_ERROR_DECODE); |
- |
- DoPause(); |
- |
- // Simulate an error on |filter_2_| while paused. |
- EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_NETWORK)); |
- filter_2_->host()->SetError(PIPELINE_ERROR_NETWORK); |
- |
- DoStop(); |
- |
- // Verify that errors are not passed to |mock_filter_host_| |
- // after Stop() has been called. |
- filter_2_->host()->SetError(PIPELINE_ERROR_NETWORK); |
-} |
- |
-// Make sure that state transitions act as expected even |
-// if the composite doesn't contain any filters. |
-TEST_F(CompositeFilterTest, TestEmptyComposite) { |
- InSequence sequence; |
- |
- composite_->SetHost(mock_filter_host_.get()); |
- |
- // Issue a Play() and expect no errors. |
- composite_->Play(NewExpectedClosure()); |
- |
- // Issue a Pause() and expect no errors. |
- composite_->Pause(NewExpectedClosure()); |
- |
- // Issue a Flush() and expect no errors. |
- composite_->Flush(NewExpectedClosure()); |
- |
- // Issue a Seek() and expect no errors. |
- composite_->Seek(base::TimeDelta::FromSeconds(5), |
- NewExpectedStatusCB(PIPELINE_OK)); |
- |
- // Issue a Play() and expect no errors. |
- composite_->Play(NewExpectedClosure()); |
- |
- // Issue a Stop() and expect no errors. |
- composite_->Stop(NewExpectedClosure()); |
-} |
- |
-} // namespace media |