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/bind.h"
7#include "base/bind_helpers.h"
8#include "base/compiler_specific.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/message_loop/message_loop.h"
11#include "base/run_loop.h"
12#include "media/audio/audio_io.h"
13#include "media/audio/audio_manager.h"
14#include "media/audio/simple_sources.h"
15#include "media/audio/sounds/audio_stream_handler.h"
16#include "media/audio/sounds/test_data.h"
17#include "media/base/channel_layout.h"
18#include "testing/gtest/include/gtest/gtest.h"
19
20namespace media {
21
22class AudioStreamHandlerTest : public testing::Test {
23 public:
24  AudioStreamHandlerTest() {}
25  virtual ~AudioStreamHandlerTest() {}
26
27  virtual void SetUp() OVERRIDE {
28    audio_manager_.reset(AudioManager::CreateForTesting());
29
30    base::StringPiece data(kTestAudioData, arraysize(kTestAudioData));
31    audio_stream_handler_.reset(new AudioStreamHandler(data));
32  }
33
34  virtual void TearDown() OVERRIDE {
35    audio_stream_handler_.reset();
36    audio_manager_.reset();
37  }
38
39  AudioStreamHandler* audio_stream_handler() {
40    return audio_stream_handler_.get();
41  }
42
43  void SetObserverForTesting(AudioStreamHandler::TestObserver* observer) {
44    AudioStreamHandler::SetObserverForTesting(observer);
45  }
46
47  void SetAudioSourceForTesting(
48      AudioOutputStream::AudioSourceCallback* source) {
49    AudioStreamHandler::SetAudioSourceForTesting(source);
50  }
51
52 private:
53  scoped_ptr<AudioManager> audio_manager_;
54  scoped_ptr<AudioStreamHandler> audio_stream_handler_;
55
56  base::MessageLoop message_loop_;
57};
58
59TEST_F(AudioStreamHandlerTest, Play) {
60  base::RunLoop run_loop;
61  TestObserver observer(run_loop.QuitClosure());
62
63  SetObserverForTesting(&observer);
64
65  ASSERT_TRUE(audio_stream_handler()->IsInitialized());
66  ASSERT_TRUE(audio_stream_handler()->Play());
67
68  run_loop.Run();
69
70  SetObserverForTesting(NULL);
71
72  ASSERT_EQ(1, observer.num_play_requests());
73  ASSERT_EQ(1, observer.num_stop_requests());
74  ASSERT_EQ(4, observer.cursor());
75}
76
77TEST_F(AudioStreamHandlerTest, ConsecutivePlayRequests) {
78  base::RunLoop run_loop;
79  TestObserver observer(run_loop.QuitClosure());
80  SineWaveAudioSource source(CHANNEL_LAYOUT_STEREO, 200.0, 8000);
81
82  SetObserverForTesting(&observer);
83  SetAudioSourceForTesting(&source);
84
85  ASSERT_TRUE(audio_stream_handler()->IsInitialized());
86
87  ASSERT_TRUE(audio_stream_handler()->Play());
88  base::MessageLoop::current()->PostDelayedTask(
89      FROM_HERE,
90      base::Bind(base::IgnoreResult(&AudioStreamHandler::Play),
91                 base::Unretained(audio_stream_handler())),
92      base::TimeDelta::FromSeconds(1));
93  base::MessageLoop::current()->PostDelayedTask(
94      FROM_HERE,
95      base::Bind(&AudioStreamHandler::Stop,
96                 base::Unretained(audio_stream_handler())),
97      base::TimeDelta::FromSeconds(2));
98
99  run_loop.Run();
100
101  SetObserverForTesting(NULL);
102  SetAudioSourceForTesting(NULL);
103
104  ASSERT_EQ(1, observer.num_play_requests());
105  ASSERT_EQ(1, observer.num_stop_requests());
106}
107
108}  // namespace media
109