Index: media/audio/audio_input_controller_unittest.cc |
diff --git a/media/audio/audio_input_controller_unittest.cc b/media/audio/audio_input_controller_unittest.cc |
index ad3b04ef712e4b26f3266e74ff468f3c2367555b..fc290e655ee5b0dfcef543a210c84448e47d4f42 100644 |
--- a/media/audio/audio_input_controller_unittest.cc |
+++ b/media/audio/audio_input_controller_unittest.cc |
@@ -14,6 +14,7 @@ |
#include "base/threading/thread.h" |
#include "media/audio/audio_device_description.h" |
#include "media/audio/audio_thread_impl.h" |
+#include "media/audio/fake_audio_input_stream.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -32,6 +33,10 @@ static const int kBitsPerSample = 16; |
static const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO; |
static const int kSamplesPerPacket = kSampleRate / 10; |
+// AudioInputController will poll once every second, so wait at most a bit |
+// more than that for the callbacks. |
+static const int kOnMuteWaitTimeoutMs = 1500; |
+ |
ACTION_P(QuitRunLoop, run_loop) { |
run_loop->QuitWhenIdle(); |
} |
@@ -62,6 +67,7 @@ class MockAudioInputControllerEventHandler |
MOCK_METHOD2(OnLog, |
void(AudioInputController* controller, |
const std::string& message)); |
+ MOCK_METHOD2(OnMuted, void(AudioInputController* controller, bool is_muted)); |
private: |
DISALLOW_COPY_AND_ASSIGN(MockAudioInputControllerEventHandler); |
@@ -223,4 +229,84 @@ TEST_F(AudioInputControllerTest, CloseTwice) { |
base::RunLoop().Run(); |
} |
+namespace { |
+void RunLoopWithTimeout(base::RunLoop* run_loop, base::TimeDelta timeout) { |
+ base::OneShotTimer timeout_timer; |
+ timeout_timer.Start(FROM_HERE, timeout, run_loop->QuitClosure()); |
+ run_loop->Run(); |
+} |
+} |
+ |
+// Test that AudioInputController sends OnMute callbacks properly. |
+TEST_F(AudioInputControllerTest, TestOnmutedCallbackInitiallyUnmuted) { |
+ const auto timeout = base::TimeDelta::FromMilliseconds(kOnMuteWaitTimeoutMs); |
+ MockAudioInputControllerEventHandler event_handler; |
+ MockSyncWriter sync_writer; |
+ scoped_refptr<AudioInputController> controller; |
+ WaitableEvent callback_event(WaitableEvent::ResetPolicy::AUTOMATIC, |
+ WaitableEvent::InitialState::NOT_SIGNALED); |
+ |
+ AudioParameters params(AudioParameters::AUDIO_FAKE, kChannelLayout, |
+ kSampleRate, kBitsPerSample, kSamplesPerPacket); |
+ |
+ base::RunLoop unmute_run_loop; |
+ base::RunLoop mute_run_loop; |
+ base::RunLoop setup_run_loop; |
+ EXPECT_CALL(event_handler, OnCreated(_)).Times(Exactly(1)); |
+ EXPECT_CALL(event_handler, OnLog(_, _)).Times(Exactly(3)); |
+ EXPECT_CALL(sync_writer, Close()).Times(Exactly(1)); |
+ EXPECT_CALL(event_handler, OnMuted(_, true)) |
+ .WillOnce(InvokeWithoutArgs([&] { mute_run_loop.Quit(); })); |
+ EXPECT_CALL(event_handler, OnMuted(_, false)) |
+ .WillOnce(InvokeWithoutArgs([&] { unmute_run_loop.Quit(); })); |
+ |
+ FakeAudioInputStream::SetGlobalMutedState(false); |
+ controller = AudioInputController::Create( |
+ audio_manager_.get(), &event_handler, &sync_writer, nullptr, params, |
+ AudioDeviceDescription::kDefaultDeviceId, false); |
+ ASSERT_TRUE(controller.get()); |
+ setup_run_loop.RunUntilIdle(); |
+ |
+ FakeAudioInputStream::SetGlobalMutedState(true); |
+ RunLoopWithTimeout(&mute_run_loop, timeout); |
+ FakeAudioInputStream::SetGlobalMutedState(false); |
+ RunLoopWithTimeout(&unmute_run_loop, timeout); |
+ |
+ CloseAudioController(controller.get()); |
+} |
+ |
+TEST_F(AudioInputControllerTest, TestOnmutedCallbackInitiallyMuted) { |
+ const auto timeout = base::TimeDelta::FromMilliseconds(kOnMuteWaitTimeoutMs); |
+ MockAudioInputControllerEventHandler event_handler; |
+ MockSyncWriter sync_writer; |
+ scoped_refptr<AudioInputController> controller; |
+ WaitableEvent callback_event(WaitableEvent::ResetPolicy::AUTOMATIC, |
+ WaitableEvent::InitialState::NOT_SIGNALED); |
+ |
+ AudioParameters params(AudioParameters::AUDIO_FAKE, kChannelLayout, |
+ kSampleRate, kBitsPerSample, kSamplesPerPacket); |
+ |
+ base::RunLoop unmute_run_loop; |
+ base::RunLoop setup_run_loop; |
+ EXPECT_CALL(event_handler, OnCreated(_)).Times(Exactly(1)); |
+ EXPECT_CALL(event_handler, OnLog(_, _)).Times(Exactly(3)); |
+ EXPECT_CALL(sync_writer, Close()).Times(Exactly(1)); |
+ EXPECT_CALL(event_handler, OnMuted(_, true)) |
+ .WillOnce(InvokeWithoutArgs([&] { setup_run_loop.QuitWhenIdle(); })); |
+ EXPECT_CALL(event_handler, OnMuted(_, false)) |
+ .WillOnce(InvokeWithoutArgs([&] { unmute_run_loop.Quit(); })); |
+ |
+ FakeAudioInputStream::SetGlobalMutedState(true); |
+ controller = AudioInputController::Create( |
+ audio_manager_.get(), &event_handler, &sync_writer, nullptr, params, |
+ AudioDeviceDescription::kDefaultDeviceId, false); |
+ ASSERT_TRUE(controller.get()); |
+ RunLoopWithTimeout(&setup_run_loop, timeout); |
+ |
+ FakeAudioInputStream::SetGlobalMutedState(false); |
+ RunLoopWithTimeout(&unmute_run_loop, timeout); |
+ |
+ CloseAudioController(controller.get()); |
+} |
+ |
} // namespace media |