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