1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/basictypes.h" 6 #include "base/memory/scoped_ptr.h" 7 #include "base/message_loop/message_loop.h" 8 #include "base/run_loop.h" 9 #include "base/synchronization/waitable_event.h" 10 #include "media/audio/audio_io.h" 11 #include "media/audio/audio_manager.h" 12 #include "media/audio/mock_audio_source_callback.h" 13 #include "testing/gmock/include/gmock/gmock.h" 14 #include "testing/gtest/include/gtest/gtest.h" 15 16 using testing::_; 17 using testing::DoAll; 18 using testing::Return; 19 20 // TODO(crogers): Most of these tests can be made platform agnostic. 21 // http://crbug.com/223242 22 23 namespace media { 24 25 ACTION(ZeroBuffer) { 26 arg0->Zero(); 27 } 28 29 ACTION_P(SignalEvent, event) { 30 event->Signal(); 31 } 32 33 class AUHALStreamTest : public testing::Test { 34 public: 35 AUHALStreamTest() 36 : message_loop_(base::MessageLoop::TYPE_UI), 37 manager_(AudioManager::CreateForTesting()) { 38 // Wait for the AudioManager to finish any initialization on the audio loop. 39 base::RunLoop().RunUntilIdle(); 40 } 41 42 virtual ~AUHALStreamTest() { 43 base::RunLoop().RunUntilIdle(); 44 } 45 46 AudioOutputStream* Create() { 47 return manager_->MakeAudioOutputStream( 48 manager_->GetDefaultOutputStreamParameters(), ""); 49 } 50 51 bool CanRunAudioTests() { 52 return manager_->HasAudioOutputDevices(); 53 } 54 55 protected: 56 base::MessageLoop message_loop_; 57 scoped_ptr<AudioManager> manager_; 58 MockAudioSourceCallback source_; 59 60 private: 61 DISALLOW_COPY_AND_ASSIGN(AUHALStreamTest); 62 }; 63 64 TEST_F(AUHALStreamTest, HardwareSampleRate) { 65 if (!CanRunAudioTests()) 66 return; 67 const AudioParameters preferred_params = 68 manager_->GetDefaultOutputStreamParameters(); 69 EXPECT_GE(preferred_params.sample_rate(), 16000); 70 EXPECT_LE(preferred_params.sample_rate(), 192000); 71 } 72 73 TEST_F(AUHALStreamTest, CreateClose) { 74 if (!CanRunAudioTests()) 75 return; 76 Create()->Close(); 77 } 78 79 TEST_F(AUHALStreamTest, CreateOpenClose) { 80 if (!CanRunAudioTests()) 81 return; 82 AudioOutputStream* stream = Create(); 83 EXPECT_TRUE(stream->Open()); 84 stream->Close(); 85 } 86 87 TEST_F(AUHALStreamTest, CreateOpenStartStopClose) { 88 if (!CanRunAudioTests()) 89 return; 90 91 AudioOutputStream* stream = Create(); 92 EXPECT_TRUE(stream->Open()); 93 94 // Wait for the first data callback from the OS. 95 base::WaitableEvent event(false, false); 96 EXPECT_CALL(source_, OnMoreData(_, _)) 97 .WillOnce(DoAll(ZeroBuffer(), SignalEvent(&event), Return(0))); 98 EXPECT_CALL(source_, OnError(_)).Times(0); 99 stream->Start(&source_); 100 event.Wait(); 101 102 stream->Stop(); 103 stream->Close(); 104 } 105 106 } // namespace media 107