15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/command_line.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/run_loop.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_thread_impl.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/media_stream_manager.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/media/media_stream_options.h"
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/common/content_switches.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/test_browser_thread_bundle.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_manager_base.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "media/audio/fake_audio_log_factory.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "media/base/media_switches.h"
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_ALSA)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/audio/alsa/audio_manager_alsa.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif defined(OS_ANDROID)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/android/audio_manager_android.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/mac/audio_manager_mac.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/win/audio_manager_win.h"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/audio/fake_audio_manager.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_ALSA)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef media::AudioManagerAlsa AudioManagerPlatform;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef media::AudioManagerMac AudioManagerPlatform;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef media::AudioManagerWin AudioManagerPlatform;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef media::AudioManagerAndroid AudioManagerPlatform;
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef media::FakeAudioManager AudioManagerPlatform;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class mocks the audio manager and overrides the
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetAudioInputDeviceNames() method to ensure that we can run our tests on
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the buildbots. media::AudioManagerBase
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockAudioManager : public AudioManagerPlatform {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MockAudioManager() : AudioManagerPlatform(&fake_audio_log_factory_) {}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockAudioManager() {}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetAudioInputDeviceNames(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media::AudioDeviceNames* device_names) OVERRIDE {
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(device_names->empty());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasAudioInputDevices()) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AudioManagerBase::GetAudioInputDeviceNames(device_names);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_names->push_back(media::AudioDeviceName("fake_device_name",
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     "fake_device_id"));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  media::FakeAudioLogFactory fake_audio_log_factory_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockAudioManager);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaStreamManagerTest : public ::testing::Test {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MediaStreamManagerTest()
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        message_loop_(base::MessageLoopProxy::current()) {
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Create our own MediaStreamManager. Use fake devices to run on the bots.
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::CommandLine::ForCurrentProcess()->AppendSwitch(
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        switches::kUseFakeDeviceForMediaStream);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    audio_manager_.reset(new MockAudioManager());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get()));
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~MediaStreamManagerTest() {
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MOCK_METHOD1(Response, void(int index));
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ResponseCallback(int index,
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        const MediaStreamDevices& devices,
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        scoped_ptr<MediaStreamUIProxy> ui_proxy) {
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Response(index);
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    message_loop_->PostTask(FROM_HERE, run_loop_.QuitClosure());
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string MakeMediaAccessRequest(int index) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int render_process_id = 1;
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const int render_frame_id = 1;
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const int page_request_id = 1;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL security_origin;
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    MediaStreamManager::MediaRequestResponseCallback callback =
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&MediaStreamManagerTest::ResponseCallback,
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   base::Unretained(this), index);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StreamOptions options(true, true);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return media_stream_manager_->MakeMediaAccessRequest(render_process_id,
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                         render_frame_id,
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                         page_request_id,
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                         options,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                         security_origin,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                         callback);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<media::AudioManager> audio_manager_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MediaStreamManager> media_stream_manager_;
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::TestBrowserThreadBundle thread_bundle_;
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<base::MessageLoopProxy> message_loop_;
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::RunLoop run_loop_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaStreamManagerTest);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamManagerTest, MakeMediaAccessRequest) {
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeMediaAccessRequest(0);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expecting the callback will be triggered and quit the test.
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*this, Response(0));
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  run_loop_.Run();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamManagerTest, MakeAndCancelMediaAccessRequest) {
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string label = MakeMediaAccessRequest(0);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No callback is expected.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_stream_manager_->CancelRequest(label);
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  run_loop_.RunUntilIdle();
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  media_stream_manager_->WillDestroyCurrentMessageLoop();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamManagerTest, MakeMultipleRequests) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First request.
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string label1 =  MakeMediaAccessRequest(0);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second request.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_process_id = 2;
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int render_frame_id = 2;
1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int page_request_id = 2;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL security_origin;
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StreamOptions options(true, true);
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaStreamManager::MediaRequestResponseCallback callback =
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MediaStreamManagerTest::ResponseCallback,
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this), 1);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string label2 = media_stream_manager_->MakeMediaAccessRequest(
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_process_id,
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_frame_id,
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      page_request_id,
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      security_origin,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expecting the callbackS from requests will be triggered and quit the test.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note, the callbacks might come in a different order depending on the
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value of labels.
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*this, Response(0));
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*this, Response(1));
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  run_loop_.Run();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamManagerTest, MakeAndCancelMultipleRequests) {
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string label1 = MakeMediaAccessRequest(0);
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string label2 = MakeMediaAccessRequest(1);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_stream_manager_->CancelRequest(label1);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expecting the callback from the second request will be triggered and
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // quit the test.
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*this, Response(1));
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  run_loop_.Run();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
184