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"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/run_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_thread_impl.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/media_stream_manager.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/media/media_stream_options.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/test_browser_thread_bundle.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_manager_base.h"
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "media/audio/fake_audio_log_factory.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_ALSA)
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/audio/alsa/audio_manager_alsa.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif defined(OS_ANDROID)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/android/audio_manager_android.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/mac/audio_manager_mac.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/win/audio_manager_win.h"
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/audio/fake_audio_manager.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_ALSA)
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef media::AudioManagerAlsa AudioManagerPlatform;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef media::AudioManagerMac AudioManagerPlatform;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef media::AudioManagerWin AudioManagerPlatform;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef media::AudioManagerAndroid AudioManagerPlatform;
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef media::FakeAudioManager AudioManagerPlatform;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class mocks the audio manager and overrides the
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetAudioInputDeviceNames() method to ensure that we can run our tests on
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the buildbots. media::AudioManagerBase
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockAudioManager : public AudioManagerPlatform {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MockAudioManager() : AudioManagerPlatform(&fake_audio_log_factory_) {}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockAudioManager() {}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetAudioInputDeviceNames(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media::AudioDeviceNames* device_names) OVERRIDE {
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(device_names->empty());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasAudioInputDevices()) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AudioManagerBase::GetAudioInputDeviceNames(device_names);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_names->push_back(media::AudioDeviceName("fake_device_name",
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     "fake_device_id"));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  media::FakeAudioLogFactory fake_audio_log_factory_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockAudioManager);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaStreamManagerTest : public ::testing::Test {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MediaStreamManagerTest()
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        message_loop_(base::MessageLoopProxy::current()) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create our own MediaStreamManager.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    audio_manager_.reset(new MockAudioManager());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get()));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use fake devices in order to run on the bots.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    media_stream_manager_->UseFakeDevice();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~MediaStreamManagerTest() {
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MOCK_METHOD1(Response, void(int index));
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ResponseCallback(int index,
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        const MediaStreamDevices& devices,
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        scoped_ptr<MediaStreamUIProxy> ui_proxy) {
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Response(index);
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    message_loop_->PostTask(FROM_HERE, run_loop_.QuitClosure());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string MakeMediaAccessRequest(int index) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int render_process_id = 1;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int render_view_id = 1;
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const int page_request_id = 1;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL security_origin;
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    MediaStreamManager::MediaRequestResponseCallback callback =
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&MediaStreamManagerTest::ResponseCallback,
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   base::Unretained(this), index);
106d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    StreamOptions options(true, true);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return media_stream_manager_->MakeMediaAccessRequest(render_process_id,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                         render_view_id,
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                         page_request_id,
110d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                                                         options,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                         security_origin,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                         callback);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<media::AudioManager> audio_manager_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MediaStreamManager> media_stream_manager_;
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::TestBrowserThreadBundle thread_bundle_;
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<base::MessageLoopProxy> message_loop_;
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::RunLoop run_loop_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaStreamManagerTest);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamManagerTest, MakeMediaAccessRequest) {
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeMediaAccessRequest(0);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expecting the callback will be triggered and quit the test.
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*this, Response(0));
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  run_loop_.Run();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamManagerTest, MakeAndCancelMediaAccessRequest) {
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string label = MakeMediaAccessRequest(0);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No callback is expected.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_stream_manager_->CancelRequest(label);
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  run_loop_.RunUntilIdle();
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  media_stream_manager_->WillDestroyCurrentMessageLoop();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamManagerTest, MakeMultipleRequests) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First request.
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string label1 =  MakeMediaAccessRequest(0);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second request.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_process_id = 2;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_view_id = 2;
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int page_request_id = 2;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL security_origin;
150d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  StreamOptions options(true, true);
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaStreamManager::MediaRequestResponseCallback callback =
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MediaStreamManagerTest::ResponseCallback,
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this), 1);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string label2 = media_stream_manager_->MakeMediaAccessRequest(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_process_id,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_id,
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      page_request_id,
158d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      options,
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      security_origin,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expecting the callbackS from requests will be triggered and quit the test.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note, the callbacks might come in a different order depending on the
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value of labels.
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*this, Response(0));
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*this, Response(1));
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  run_loop_.Run();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamManagerTest, MakeAndCancelMultipleRequests) {
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string label1 = MakeMediaAccessRequest(0);
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string label2 = MakeMediaAccessRequest(1);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_stream_manager_->CancelRequest(label1);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expecting the callback from the second request will be triggered and
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // quit the test.
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*this, Response(1));
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  run_loop_.Run();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
182