4279435ee9e58d963db56ba0d8d340bf6d0d9891
[platform/framework/web/crosswalk.git] / src / media / audio / mac / audio_auhal_mac_unittest.cc
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 "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 using testing::_;
16 using testing::DoAll;
17 using testing::Return;
18
19 // TODO(crogers): Most of these tests can be made platform agnostic.
20 // http://crbug.com/223242
21
22 namespace media {
23
24 ACTION(ZeroBuffer) {
25   arg1->Zero();
26 }
27
28 ACTION_P(SignalEvent, event) {
29   event->Signal();
30 }
31
32 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback {
33  public:
34   MOCK_METHOD2(OnMoreData, int(AudioBus* audio_bus,
35                                AudioBuffersState buffers_state));
36   MOCK_METHOD3(OnMoreIOData, int(AudioBus* source,
37                                  AudioBus* dest,
38                                  AudioBuffersState buffers_state));
39   MOCK_METHOD1(OnError, void(AudioOutputStream* stream));
40 };
41
42 class AUHALStreamTest : public testing::Test {
43  public:
44   AUHALStreamTest()
45       : message_loop_(base::MessageLoop::TYPE_UI),
46         manager_(AudioManager::CreateForTesting()) {
47     // Wait for the AudioManager to finish any initialization on the audio loop.
48     base::RunLoop().RunUntilIdle();
49   }
50
51   virtual ~AUHALStreamTest() {
52     base::RunLoop().RunUntilIdle();
53   }
54
55   AudioOutputStream* Create() {
56     return manager_->MakeAudioOutputStream(
57         manager_->GetDefaultOutputStreamParameters(), "", "");
58   }
59
60   bool CanRunAudioTests() {
61     return manager_->HasAudioOutputDevices();
62   }
63
64  protected:
65   base::MessageLoop message_loop_;
66   scoped_ptr<AudioManager> manager_;
67   MockAudioSourceCallback source_;
68
69  private:
70   DISALLOW_COPY_AND_ASSIGN(AUHALStreamTest);
71 };
72
73 TEST_F(AUHALStreamTest, HardwareSampleRate) {
74   if (!CanRunAudioTests())
75     return;
76   const AudioParameters preferred_params =
77       manager_->GetDefaultOutputStreamParameters();
78   EXPECT_GE(preferred_params.sample_rate(), 16000);
79   EXPECT_LE(preferred_params.sample_rate(), 192000);
80 }
81
82 TEST_F(AUHALStreamTest, CreateClose) {
83   if (!CanRunAudioTests())
84     return;
85   Create()->Close();
86 }
87
88 TEST_F(AUHALStreamTest, CreateOpenClose) {
89   if (!CanRunAudioTests())
90     return;
91   AudioOutputStream* stream = Create();
92   EXPECT_TRUE(stream->Open());
93   stream->Close();
94 }
95
96 TEST_F(AUHALStreamTest, CreateOpenStartStopClose) {
97   if (!CanRunAudioTests())
98     return;
99
100   AudioOutputStream* stream = Create();
101   EXPECT_TRUE(stream->Open());
102
103   // Wait for the first data callback from the OS.
104   base::WaitableEvent event(false, false);
105   EXPECT_CALL(source_, OnMoreIOData(_, _, _))
106       .WillOnce(DoAll(ZeroBuffer(), SignalEvent(&event), Return(0)));
107   EXPECT_CALL(source_, OnError(_)).Times(0);
108   stream->Start(&source_);
109   event.Wait();
110
111   stream->Stop();
112   stream->Close();
113 }
114
115 }  // namespace media