diff options
author | satish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-16 05:58:04 +0000 |
---|---|---|
committer | satish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-16 05:58:04 +0000 |
commit | 41bdde54e45a13ff9c9f34b34f8e4f0395e9183b (patch) | |
tree | 5da8b35681a91144827aa8cd38f93814b6c9e8c2 /media/audio/audio_input_controller_unittest.cc | |
parent | c60d64ec89c1a8eb5279c38c101ec710c8d931f9 (diff) | |
download | chromium_src-41bdde54e45a13ff9c9f34b34f8e4f0395e9183b.zip chromium_src-41bdde54e45a13ff9c9f34b34f8e4f0395e9183b.tar.gz chromium_src-41bdde54e45a13ff9c9f34b34f8e4f0395e9183b.tar.bz2 |
Add an AudioInputController to help with audio recording.
This is similar to the existing AudioOutputController class used for playback.
Also adds a unit test which uses the new fake audio input stream, so this patch is dependant on http://codereview.chromium.org/2909015
TEST=no new user visible change to test, just some backend recording additions which are unused at the moment.
BUG=none
Review URL: http://codereview.chromium.org/2905010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52617 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/audio_input_controller_unittest.cc')
-rw-r--r-- | media/audio/audio_input_controller_unittest.cc | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/media/audio/audio_input_controller_unittest.cc b/media/audio/audio_input_controller_unittest.cc new file mode 100644 index 0000000..5242398 --- /dev/null +++ b/media/audio/audio_input_controller_unittest.cc @@ -0,0 +1,128 @@ +// Copyright (c) 2010 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/env_var.h" +#include "base/basictypes.h" +#include "base/waitable_event.h" +#include "media/audio/audio_input_controller.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::AtLeast; +using ::testing::Exactly; +using ::testing::InvokeWithoutArgs; +using ::testing::NotNull; + +namespace { + +const int kSampleRate = AudioManager::kAudioCDSampleRate; +const int kBitsPerSample = 16; +const int kChannels = 2; +const int kSamplesPerPacket = kSampleRate / 10; + +ACTION_P3(CheckCountAndSignalEvent, count, limit, event) { + if (++*count >= limit) { + event->Signal(); + } +} + +// Test AudioInputController for create and close without recording audio. +} + +namespace media { + +class MockAudioInputControllerEventHandler + : public AudioInputController::EventHandler { + public: + MockAudioInputControllerEventHandler() {} + + MOCK_METHOD1(OnCreated, void(AudioInputController* controller)); + MOCK_METHOD1(OnRecording, void(AudioInputController* controller)); + MOCK_METHOD2(OnError, void(AudioInputController* controller, int error_code)); + MOCK_METHOD3(OnData, void(AudioInputController* controller, + const uint8* data, uint32 size)); + + private: + DISALLOW_COPY_AND_ASSIGN(MockAudioInputControllerEventHandler); +}; + +TEST(AudioInputControllerTest, CreateAndClose) { + MockAudioInputControllerEventHandler event_handler; + base::WaitableEvent event(false, false); + // If OnCreated is called then signal the event. + EXPECT_CALL(event_handler, OnCreated(NotNull())) + .WillOnce(InvokeWithoutArgs(&event, &base::WaitableEvent::Signal)); + + scoped_refptr<AudioInputController> controller = AudioInputController::Create( + &event_handler, AudioManager::AUDIO_MOCK, kChannels, + kSampleRate, kBitsPerSample, kSamplesPerPacket); + ASSERT_TRUE(controller.get()); + + // Wait for OnCreated() to be called. + event.Wait(); + + controller->Close(); +} + +// Test a normal call sequence of create, record and close. +TEST(AudioInputControllerTest, RecordAndClose) { + MockAudioInputControllerEventHandler event_handler; + base::WaitableEvent event(false, false); + int count = 0; + + // If OnCreated is called then signal the event. + EXPECT_CALL(event_handler, OnCreated(NotNull())) + .WillOnce(InvokeWithoutArgs(&event, &base::WaitableEvent::Signal)); + + // OnRecording() will be called only once. + EXPECT_CALL(event_handler, OnRecording(NotNull())) + .Times(Exactly(1)); + + // If OnData is called enough then signal the event. + EXPECT_CALL(event_handler, OnData(NotNull(), NotNull(), _)) + .Times(AtLeast(10)) + .WillRepeatedly(CheckCountAndSignalEvent(&count, 10, &event)); + + scoped_refptr<AudioInputController> controller = AudioInputController::Create( + &event_handler, AudioManager::AUDIO_MOCK, kChannels, + kSampleRate, kBitsPerSample, kSamplesPerPacket); + ASSERT_TRUE(controller.get()); + + // Wait for OnCreated() to be called. + event.Wait(); + event.Reset(); + + // Play and then wait for the event to be signaled. + controller->Record(); + event.Wait(); + + controller->Close(); +} + +// Test that AudioInputController rejects insanely large packet sizes. +TEST(AudioInputControllerTest, SamplesPerPacketTooLarge) { + // Create an audio device with a very large packet size. + MockAudioInputControllerEventHandler event_handler; + + scoped_refptr<AudioInputController> controller = AudioInputController::Create( + &event_handler, AudioManager::AUDIO_MOCK, kChannels, + kSampleRate, kBitsPerSample, kSamplesPerPacket * 1000); + ASSERT_FALSE(controller); +} + +// Test calling AudioInputController::Close multiple times. +TEST(AudioInputControllerTest, CloseTwice) { + MockAudioInputControllerEventHandler event_handler; + EXPECT_CALL(event_handler, OnCreated(NotNull())); + scoped_refptr<AudioInputController> controller = AudioInputController::Create( + &event_handler, AudioManager::AUDIO_MOCK, kChannels, + kSampleRate, kBitsPerSample, kSamplesPerPacket); + ASSERT_TRUE(controller.get()); + + controller->Close(); + controller->Close(); +} + +} // namespace media |