Index: chromecast/media/audio/cast_audio_mixer_unittest.cc |
diff --git a/chromecast/media/audio/cast_audio_mixer_unittest.cc b/chromecast/media/audio/cast_audio_mixer_unittest.cc |
index 947796759de59f0d006f79acd585f32d57ff5912..131c087419541c84af4758256a3ef01eb8dd60c3 100644 |
--- a/chromecast/media/audio/cast_audio_mixer_unittest.cc |
+++ b/chromecast/media/audio/cast_audio_mixer_unittest.cc |
@@ -17,6 +17,7 @@ |
#include "base/time/time.h" |
#include "chromecast/media/audio/cast_audio_manager.h" |
#include "chromecast/media/audio/cast_audio_output_stream.h" |
+#include "chromecast/media/cma/test/mock_media_pipeline_backend_factory.h" |
#include "media/audio/test_audio_thread.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -25,10 +26,12 @@ namespace chromecast { |
namespace media { |
namespace { |
-using ::testing::_; |
-using ::testing::Invoke; |
-using ::testing::Return; |
-using ::testing::StrictMock; |
+using testing::_; |
+using testing::Assign; |
+using testing::Invoke; |
+using testing::Return; |
+using testing::SaveArg; |
+using testing::StrictMock; |
// Utility functions |
::media::AudioParameters GetAudioParams() { |
@@ -87,11 +90,12 @@ class MockCastAudioOutputStream : public CastAudioOutputStream { |
class MockCastAudioManager : public CastAudioManager { |
public: |
- MockCastAudioManager(CastAudioMixer* audio_mixer) |
+ MockCastAudioManager() |
: CastAudioManager(base::MakeUnique<::media::TestAudioThread>(), |
nullptr, |
nullptr, |
- audio_mixer) { |
+ nullptr, |
+ true /* use_mixer */) { |
ON_CALL(*this, ReleaseOutputStream(_)) |
.WillByDefault( |
Invoke(this, &MockCastAudioManager::ReleaseOutputStreamConcrete)); |
@@ -108,69 +112,42 @@ class MockCastAudioManager : public CastAudioManager { |
} |
}; |
-class MockCastAudioMixer : public CastAudioMixer { |
- public: |
- explicit MockCastAudioMixer(const RealStreamFactory& real_stream_factory) |
- : CastAudioMixer(real_stream_factory) { |
- ON_CALL(*this, MakeStream(_, _)) |
- .WillByDefault(Invoke(this, &MockCastAudioMixer::MakeStreamConcrete)); |
- } |
- |
- MOCK_METHOD2( |
- MakeStream, |
- ::media::AudioOutputStream*(const ::media::AudioParameters& params, |
- CastAudioManager* audio_manager)); |
- |
- private: |
- ::media::AudioOutputStream* MakeStreamConcrete( |
- const ::media::AudioParameters& params, |
- CastAudioManager* audio_manager) { |
- return CastAudioMixer::MakeStream(params, audio_manager); |
- } |
-}; |
- |
// Generates StrictMocks of Mixer, Manager, and Mixer OutputStream. |
class CastAudioMixerTest : public ::testing::Test { |
public: |
- CastAudioMixerTest() {} |
+ CastAudioMixerTest() : source_callback_(nullptr) {} |
~CastAudioMixerTest() override {} |
protected: |
void SetUp() override { |
- // |this| will outlive |mock_mixer_| |
- mock_mixer_ = new StrictMock<MockCastAudioMixer>( |
- base::Bind(&CastAudioMixerTest::MakeMixerOutputStreamProxy, |
- base::Unretained(this))); |
- mock_manager_.reset(new StrictMock<MockCastAudioManager>(mock_mixer_)); |
+ mock_manager_.reset(new StrictMock<MockCastAudioManager>()); |
mock_mixer_stream_.reset(new StrictMock<MockCastAudioOutputStream>( |
GetAudioParams(), mock_manager_.get())); |
+ |
+ ON_CALL(*mock_manager_, MakeMixerOutputStream(_)) |
+ .WillByDefault(Return(mock_mixer_stream_.get())); |
+ ON_CALL(*mock_mixer_stream_, Start(_)) |
+ .WillByDefault(SaveArg<0>(&source_callback_)); |
+ ON_CALL(*mock_mixer_stream_, Stop()) |
+ .WillByDefault(Assign(&source_callback_, nullptr)); |
} |
void TearDown() override { mock_manager_->Shutdown(); } |
MockCastAudioManager& mock_manager() { return *mock_manager_; } |
- |
- MockCastAudioMixer& mock_mixer() { return *mock_mixer_; } |
- |
MockCastAudioOutputStream& mock_mixer_stream() { return *mock_mixer_stream_; } |
::media::AudioOutputStream* CreateMixerStream() { |
- EXPECT_CALL(*mock_mixer_, MakeStream(_, &mock_manager())); |
return mock_manager_->MakeAudioOutputStream( |
GetAudioParams(), "", ::media::AudioManager::LogCallback()); |
} |
- private: |
- ::media::AudioOutputStream* MakeMixerOutputStreamProxy( |
- const ::media::AudioParameters& audio_params) { |
- return mock_manager_ ? mock_manager_->MakeMixerOutputStream(audio_params) |
- : nullptr; |
- } |
- |
base::MessageLoop message_loop_; |
- MockCastAudioMixer* mock_mixer_; |
std::unique_ptr<MockCastAudioManager> mock_manager_; |
std::unique_ptr<MockCastAudioOutputStream> mock_mixer_stream_; |
+ |
+ // Saved params passed to |mock_mixer_stream_|. |
+ ::media::AudioOutputStream::AudioSourceCallback* source_callback_; |
}; |
TEST_F(CastAudioMixerTest, Volume) { |
@@ -234,7 +211,7 @@ TEST_F(CastAudioMixerTest, StreamControlOrderMisuse) { |
EXPECT_CALL(mock_mixer_stream(), Open()).WillOnce(Return(true)); |
ASSERT_TRUE(stream->Open()); |
- EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); |
+ EXPECT_CALL(mock_mixer_stream(), Start(_)); |
stream->Start(&source); |
stream->Start(&source); |
@@ -254,7 +231,7 @@ TEST_F(CastAudioMixerTest, SingleStreamCycle) { |
EXPECT_CALL(mock_mixer_stream(), Open()).WillOnce(Return(true)); |
ASSERT_TRUE(stream->Open()); |
- EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())).Times(2); |
+ EXPECT_CALL(mock_mixer_stream(), Start(_)).Times(2); |
EXPECT_CALL(mock_mixer_stream(), Stop()).Times(2); |
stream->Start(&source); |
stream->Stop(); |
@@ -283,7 +260,7 @@ TEST_F(CastAudioMixerTest, MultiStreamCycle) { |
for (auto* stream : streams) |
ASSERT_TRUE(stream->Open()); |
- EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); |
+ EXPECT_CALL(mock_mixer_stream(), Start(_)); |
for (unsigned int i = 0; i < streams.size(); i++) |
streams[i]->Start(sources[i].get()); |
@@ -296,7 +273,7 @@ TEST_F(CastAudioMixerTest, MultiStreamCycle) { |
for (auto& source : sources) |
EXPECT_CALL(*source, OnMoreData(_, _, _, _)); |
- mock_mixer_stream().SignalPull(&mock_mixer(), base::TimeDelta()); |
+ mock_mixer_stream().SignalPull(source_callback_, base::TimeDelta()); |
EXPECT_CALL(mock_manager(), ReleaseOutputStream(stream)); |
stream->Close(); |
@@ -324,7 +301,7 @@ TEST_F(CastAudioMixerTest, TwoStreamRestart) { |
ASSERT_TRUE(stream1->Open()); |
ASSERT_TRUE(stream2->Open()); |
- EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); |
+ EXPECT_CALL(mock_mixer_stream(), Start(_)); |
stream1->Start(&source); |
stream2->Start(&source); |
@@ -338,48 +315,7 @@ TEST_F(CastAudioMixerTest, TwoStreamRestart) { |
} |
} |
-TEST_F(CastAudioMixerTest, OnErrorRecovery) { |
- MockAudioSourceCallback source; |
- std::vector<::media::AudioOutputStream*> streams; |
- |
- streams.push_back(CreateMixerStream()); |
- streams.push_back(CreateMixerStream()); |
- for (auto* stream : streams) |
- ASSERT_TRUE(stream); |
- |
- EXPECT_CALL(mock_manager(), MakeMixerOutputStream(_)) |
- .WillOnce(Return(&mock_mixer_stream())); |
- EXPECT_CALL(mock_mixer_stream(), Open()).WillOnce(Return(true)); |
- for (auto* stream : streams) |
- ASSERT_TRUE(stream->Open()); |
- |
- EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); |
- streams.front()->Start(&source); |
- |
- EXPECT_CALL(mock_mixer_stream(), Stop()); |
- EXPECT_CALL(mock_mixer_stream(), Close()); |
- EXPECT_CALL(mock_manager(), MakeMixerOutputStream(_)) |
- .WillOnce(Return(&mock_mixer_stream())); |
- EXPECT_CALL(mock_mixer_stream(), Open()).WillOnce(Return(true)); |
- EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); |
- |
- // The MockAudioSourceCallback should not receive any call OnError. |
- mock_mixer_stream().SignalError(&mock_mixer()); |
- |
- // Try to add another stream. |
- streams.push_back(CreateMixerStream()); |
- ASSERT_TRUE(streams.back()); |
- ASSERT_TRUE(streams.back()->Open()); |
- |
- EXPECT_CALL(mock_mixer_stream(), Stop()); |
- EXPECT_CALL(mock_mixer_stream(), Close()); |
- for (auto* stream : streams) { |
- EXPECT_CALL(mock_manager(), ReleaseOutputStream(stream)); |
- stream->Close(); |
- } |
-} |
- |
-TEST_F(CastAudioMixerTest, OnErrorNoRecovery) { |
+TEST_F(CastAudioMixerTest, OnError) { |
MockAudioSourceCallback source; |
std::vector<::media::AudioOutputStream*> streams; |
@@ -394,38 +330,36 @@ TEST_F(CastAudioMixerTest, OnErrorNoRecovery) { |
for (auto* stream : streams) |
ASSERT_TRUE(stream->Open()); |
- EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); |
+ EXPECT_CALL(mock_mixer_stream(), Start(_)); |
streams.front()->Start(&source); |
- EXPECT_CALL(mock_mixer_stream(), Stop()); |
- EXPECT_CALL(mock_manager(), MakeMixerOutputStream(_)) |
- .WillOnce(Return(&mock_mixer_stream())); |
- EXPECT_CALL(mock_mixer_stream(), Open()).WillOnce(Return(false)); |
- EXPECT_CALL(mock_mixer_stream(), Close()).Times(2); |
+ // Note that error will only be triggered on the first stream because that |
+ // is the only stream that has been started. |
EXPECT_CALL(source, OnError()); |
- |
- // The MockAudioSourceCallback should receive an OnError call. |
- mock_mixer_stream().SignalError(&mock_mixer()); |
+ mock_mixer_stream().SignalError(source_callback_); |
+ base::RunLoop().RunUntilIdle(); |
// Try to add another stream. |
streams.push_back(CreateMixerStream()); |
ASSERT_TRUE(streams.back()); |
ASSERT_FALSE(streams.back()->Open()); |
+ EXPECT_CALL(mock_mixer_stream(), Stop()); |
+ EXPECT_CALL(mock_mixer_stream(), Close()); |
for (auto* stream : streams) { |
EXPECT_CALL(mock_manager(), ReleaseOutputStream(stream)); |
stream->Close(); |
} |
+ streams.clear(); |
// Now that the state has been refreshed, attempt to open a stream. |
- streams.clear(); |
streams.push_back(CreateMixerStream()); |
EXPECT_CALL(mock_manager(), MakeMixerOutputStream(_)) |
.WillOnce(Return(&mock_mixer_stream())); |
EXPECT_CALL(mock_mixer_stream(), Open()).WillOnce(Return(true)); |
ASSERT_TRUE(streams.front()->Open()); |
- EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); |
+ EXPECT_CALL(mock_mixer_stream(), Start(_)); |
streams.front()->Start(&source); |
EXPECT_CALL(mock_mixer_stream(), Stop()); |
@@ -443,14 +377,14 @@ TEST_F(CastAudioMixerTest, Delay) { |
EXPECT_CALL(mock_mixer_stream(), Open()).WillOnce(Return(true)); |
ASSERT_TRUE(stream->Open()); |
- EXPECT_CALL(mock_mixer_stream(), Start(&mock_mixer())); |
+ EXPECT_CALL(mock_mixer_stream(), Start(_)); |
stream->Start(&source); |
// |delay| is the same because the Mixer and stream are |
// using the same AudioParameters. |
base::TimeDelta delay = base::TimeDelta::FromMicroseconds(1000); |
EXPECT_CALL(source, OnMoreData(delay, _, 0, _)); |
- mock_mixer_stream().SignalPull(&mock_mixer(), delay); |
+ mock_mixer_stream().SignalPull(source_callback_, delay); |
EXPECT_CALL(mock_mixer_stream(), Stop()); |
EXPECT_CALL(mock_mixer_stream(), Close()); |