media_stream_manager_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 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 <string>
6
7#include "base/bind.h"
8#include "base/message_loop/message_loop.h"
9#include "base/run_loop.h"
10#include "content/browser/browser_thread_impl.h"
11#include "content/browser/renderer_host/media/media_stream_manager.h"
12#include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
13#include "content/common/media/media_stream_options.h"
14#include "content/public/test/test_browser_thread_bundle.h"
15#include "media/audio/audio_manager_base.h"
16#include "media/audio/fake_audio_log_factory.h"
17#include "testing/gmock/include/gmock/gmock.h"
18#include "testing/gtest/include/gtest/gtest.h"
19
20#if defined(USE_ALSA)
21#include "media/audio/alsa/audio_manager_alsa.h"
22#elif defined(OS_ANDROID)
23#include "media/audio/android/audio_manager_android.h"
24#elif defined(OS_MACOSX)
25#include "media/audio/mac/audio_manager_mac.h"
26#elif defined(OS_WIN)
27#include "media/audio/win/audio_manager_win.h"
28#else
29#include "media/audio/fake_audio_manager.h"
30#endif
31
32using testing::_;
33
34namespace content {
35
36#if defined(USE_ALSA)
37typedef media::AudioManagerAlsa AudioManagerPlatform;
38#elif defined(OS_MACOSX)
39typedef media::AudioManagerMac AudioManagerPlatform;
40#elif defined(OS_WIN)
41typedef media::AudioManagerWin AudioManagerPlatform;
42#elif defined(OS_ANDROID)
43typedef media::AudioManagerAndroid AudioManagerPlatform;
44#else
45typedef media::FakeAudioManager AudioManagerPlatform;
46#endif
47
48
49// This class mocks the audio manager and overrides the
50// GetAudioInputDeviceNames() method to ensure that we can run our tests on
51// the buildbots. media::AudioManagerBase
52class MockAudioManager : public AudioManagerPlatform {
53 public:
54  MockAudioManager() : AudioManagerPlatform(&fake_audio_log_factory_) {}
55  virtual ~MockAudioManager() {}
56
57  virtual void GetAudioInputDeviceNames(
58      media::AudioDeviceNames* device_names) OVERRIDE {
59    DCHECK(device_names->empty());
60    if (HasAudioInputDevices()) {
61      AudioManagerBase::GetAudioInputDeviceNames(device_names);
62    } else {
63      device_names->push_back(media::AudioDeviceName("fake_device_name",
64                                                     "fake_device_id"));
65    }
66  }
67
68 private:
69  media::FakeAudioLogFactory fake_audio_log_factory_;
70  DISALLOW_COPY_AND_ASSIGN(MockAudioManager);
71};
72
73class MediaStreamManagerTest : public ::testing::Test {
74 public:
75  MediaStreamManagerTest()
76      : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
77        message_loop_(base::MessageLoopProxy::current()) {
78    // Create our own MediaStreamManager.
79    audio_manager_.reset(new MockAudioManager());
80    media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get()));
81
82    // Use fake devices in order to run on the bots.
83    media_stream_manager_->UseFakeDevice();
84  }
85
86  virtual ~MediaStreamManagerTest() {
87  }
88
89  MOCK_METHOD1(Response, void(int index));
90  void ResponseCallback(int index,
91                        const MediaStreamDevices& devices,
92                        scoped_ptr<MediaStreamUIProxy> ui_proxy) {
93    Response(index);
94    message_loop_->PostTask(FROM_HERE, run_loop_.QuitClosure());
95  }
96
97 protected:
98  std::string MakeMediaAccessRequest(int index) {
99    const int render_process_id = 1;
100    const int render_view_id = 1;
101    const int page_request_id = 1;
102    const GURL security_origin;
103    MediaStreamManager::MediaRequestResponseCallback callback =
104        base::Bind(&MediaStreamManagerTest::ResponseCallback,
105                   base::Unretained(this), index);
106    StreamOptions options(true, true);
107    return media_stream_manager_->MakeMediaAccessRequest(render_process_id,
108                                                         render_view_id,
109                                                         page_request_id,
110                                                         options,
111                                                         security_origin,
112                                                         callback);
113  }
114
115  scoped_ptr<media::AudioManager> audio_manager_;
116  scoped_ptr<MediaStreamManager> media_stream_manager_;
117  content::TestBrowserThreadBundle thread_bundle_;
118  scoped_refptr<base::MessageLoopProxy> message_loop_;
119  base::RunLoop run_loop_;
120
121 private:
122  DISALLOW_COPY_AND_ASSIGN(MediaStreamManagerTest);
123};
124
125TEST_F(MediaStreamManagerTest, MakeMediaAccessRequest) {
126  MakeMediaAccessRequest(0);
127
128  // Expecting the callback will be triggered and quit the test.
129  EXPECT_CALL(*this, Response(0));
130  run_loop_.Run();
131}
132
133TEST_F(MediaStreamManagerTest, MakeAndCancelMediaAccessRequest) {
134  std::string label = MakeMediaAccessRequest(0);
135  // No callback is expected.
136  media_stream_manager_->CancelRequest(label);
137  run_loop_.RunUntilIdle();
138  media_stream_manager_->WillDestroyCurrentMessageLoop();
139}
140
141TEST_F(MediaStreamManagerTest, MakeMultipleRequests) {
142  // First request.
143  std::string label1 =  MakeMediaAccessRequest(0);
144
145  // Second request.
146  int render_process_id = 2;
147  int render_view_id = 2;
148  int page_request_id = 2;
149  GURL security_origin;
150  StreamOptions options(true, true);
151  MediaStreamManager::MediaRequestResponseCallback callback =
152      base::Bind(&MediaStreamManagerTest::ResponseCallback,
153                 base::Unretained(this), 1);
154  std::string label2 = media_stream_manager_->MakeMediaAccessRequest(
155      render_process_id,
156      render_view_id,
157      page_request_id,
158      options,
159      security_origin,
160      callback);
161
162  // Expecting the callbackS from requests will be triggered and quit the test.
163  // Note, the callbacks might come in a different order depending on the
164  // value of labels.
165  EXPECT_CALL(*this, Response(0));
166  EXPECT_CALL(*this, Response(1));
167  run_loop_.Run();
168}
169
170TEST_F(MediaStreamManagerTest, MakeAndCancelMultipleRequests) {
171  std::string label1 = MakeMediaAccessRequest(0);
172  std::string label2 = MakeMediaAccessRequest(1);
173  media_stream_manager_->CancelRequest(label1);
174
175  // Expecting the callback from the second request will be triggered and
176  // quit the test.
177  EXPECT_CALL(*this, Response(1));
178  run_loop_.Run();
179}
180
181}  // namespace content
182