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> 68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include <queue> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/callback_helpers.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/command_line.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/run_loop.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_thread_impl.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/renderer_host/media/audio_input_device_manager.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/media_stream_dispatcher_host.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/media_stream_manager.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/renderer_host/media/media_stream_ui_proxy.h" 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/renderer_host/media/video_capture_manager.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/media/media_stream_messages.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/media/media_stream_options.h" 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/media_device_id.h" 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/common/content_switches.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_resource_context.h" 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/test/test_browser_context.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/test_browser_thread_bundle.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/test_content_browser_client.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/test_content_client.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_macros.h" 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "media/audio/mock_audio_manager.h" 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "media/base/media_switches.h" 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "media/video/capture/fake_video_capture_device_factory.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/audio/cras_audio_handler.h" 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DeleteArg; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll; 436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)using ::testing::InSequence; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::SaveArg; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kProcessId = 5; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRenderId = 6; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPageRequestId = 7; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockMediaStreamDispatcherHost : public MediaStreamDispatcherHost, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public TestContentBrowserClient { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockMediaStreamDispatcherHost( 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ResourceContext::SaltCallback salt_callback, 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::MessageLoopProxy>& message_loop, 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MediaStreamManager* manager) 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : MediaStreamDispatcherHost(kProcessId, salt_callback, manager), 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message_loop_(message_loop), 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_ipc_(NULL) {} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A list of mock methods. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD4(OnStreamGenerated, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(int routing_id, int request_id, int audio_array_size, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int video_array_size)); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MOCK_METHOD3(OnStreamGenerationFailed, void(int routing_id, 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int request_id, 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaStreamRequestResult result)); 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MOCK_METHOD1(OnDeviceStopped, void(int routing_id)); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MOCK_METHOD2(OnDeviceOpened, void(int routing_id, int request_id)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessor to private functions. 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnGenerateStream(int render_frame_id, 768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int page_request_id, 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const StreamOptions& components, 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& security_origin, 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Closure& quit_closure) { 808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) quit_closures_.push(quit_closure); 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MediaStreamDispatcherHost::OnGenerateStream( 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_id, page_request_id, components, security_origin, false); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnStopStreamDevice(int render_frame_id, 868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& device_id) { 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MediaStreamDispatcherHost::OnStopStreamDevice(render_frame_id, device_id); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnOpenDevice(int render_frame_id, 918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int page_request_id, 928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& device_id, 938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MediaStreamType type, 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& security_origin, 958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const base::Closure& quit_closure) { 968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) quit_closures_.push(quit_closure); 978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MediaStreamDispatcherHost::OnOpenDevice( 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_id, page_request_id, device_id, type, security_origin); 998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnEnumerateDevices(int render_frame_id, 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_request_id, 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MediaStreamType type, 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& security_origin, 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::Closure& quit_closure) { 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) quit_closures_.push(quit_closure); 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MediaStreamDispatcherHost::OnEnumerateDevices( 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) render_frame_id, page_request_id, type, security_origin); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string label_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamDeviceInfoArray audio_devices_; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamDeviceInfoArray video_devices_; 1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StreamDeviceInfo opened_device_; 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StreamDeviceInfoArray enumerated_devices_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockMediaStreamDispatcherHost() {} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method is used to dispatch IPC messages to the renderer. We intercept 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these messages here and dispatch to our mock methods to verify the 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // conversation between this object and the renderer. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Send(IPC::Message* message) OVERRIDE { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(message); 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_ipc_ = message; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In this method we dispatch the messages to the according handlers as if 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we are the renderer. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(MockMediaStreamDispatcherHost, *message) 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerated, 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnStreamGeneratedInternal) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerationFailed, 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnStreamGenerationFailedInternal) 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceStopped, OnDeviceStoppedInternal) 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpened, OnDeviceOpenedInternal) 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_DevicesEnumerated, OnDevicesEnumerated) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(handled); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_ipc_ = NULL; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These handler methods do minimal things and delegate to the mock methods. 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnStreamGeneratedInternal( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string label, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamDeviceInfoArray audio_device_list, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamDeviceInfoArray video_device_list) { 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnStreamGenerated(current_ipc_->routing_id(), request_id, 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) audio_device_list.size(), video_device_list.size()); 1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Notify that the event have occurred. 1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Closure quit_closure = quit_closures_.front(); 1578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) quit_closures_.pop(); 1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) message_loop_->PostTask(FROM_HERE, base::ResetAndReturn(&quit_closure)); 1598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_ = label; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_devices_ = audio_device_list; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_devices_ = video_device_list; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnStreamGenerationFailedInternal( 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int request_id, 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::MediaStreamRequestResult result) { 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnStreamGenerationFailed(current_ipc_->routing_id(), request_id, result); 1698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!quit_closures_.empty()) { 1708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Closure quit_closure = quit_closures_.front(); 1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) quit_closures_.pop(); 1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) message_loop_->PostTask(FROM_HERE, base::ResetAndReturn(&quit_closure)); 1738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_= ""; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnDeviceStoppedInternal(const std::string& label, 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::StreamDeviceInfo& device) { 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (IsVideoMediaType(device.device.type)) 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(StreamDeviceInfo::IsEqual(device, video_devices_[0])); 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (IsAudioInputMediaType(device.device.type)) 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(StreamDeviceInfo::IsEqual(device, audio_devices_[0])); 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnDeviceStopped(current_ipc_->routing_id()); 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnDeviceOpenedInternal(int request_id, 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& label, 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const StreamDeviceInfo& device) { 1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Closure quit_closure = quit_closures_.front(); 1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) quit_closures_.pop(); 1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) message_loop_->PostTask(FROM_HERE, base::ResetAndReturn(&quit_closure)); 1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) label_ = label; 1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) opened_device_ = device; 1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnDevicesEnumerated(int request_id, 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const StreamDeviceInfoArray& devices) { 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Closure quit_closure = quit_closures_.front(); 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) quit_closures_.pop(); 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) message_loop_->PostTask(FROM_HERE, base::ResetAndReturn(&quit_closure)); 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) enumerated_devices_ = devices; 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::MessageLoopProxy> message_loop_; 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC::Message* current_ipc_; 2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::queue<base::Closure> quit_closures_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MockMediaStreamUIProxy : public FakeMediaStreamUIProxy { 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MOCK_METHOD2( 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OnStarted, 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void(const base::Closure& stop, 216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const MediaStreamUIProxy::WindowIdCallback& window_id_callback)); 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaStreamDispatcherHostTest : public testing::Test { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MediaStreamDispatcherHostTest() 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : old_browser_client_(NULL), 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) origin_("https://test.com") { 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) audio_manager_.reset( 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new media::MockAudioManager(base::MessageLoopProxy::current())); 2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Make sure we use fake devices to avoid long delays. 2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::CommandLine::ForCurrentProcess()->AppendSwitch( 2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu switches::kUseFakeDeviceForMediaStream); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create our own MediaStreamManager. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get())); 2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_device_factory_ = 2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static_cast<media::FakeVideoCaptureDeviceFactory*>( 2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu media_stream_manager_->video_capture_manager() 2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ->video_capture_device_factory()); 2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(video_capture_device_factory_); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MockResourceContext* mock_resource_context = 23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static_cast<MockResourceContext*>( 24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) browser_context_.GetResourceContext()); 24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) host_ = new MockMediaStreamDispatcherHost( 24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) mock_resource_context->GetMediaDeviceIDSalt(), 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoopProxy::current(), 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_stream_manager_.get()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the fake content client and browser. 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content_client_.reset(new TestContentClient()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetContentClient(content_client_.get()); 250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) old_browser_client_ = SetBrowserClientForTesting(host_.get()); 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chromeos::CrasAudioHandler::InitializeForTesting(); 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~MediaStreamDispatcherHostTest() { 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chromeos::CrasAudioHandler::Shutdown(); 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUp() OVERRIDE { 2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_device_factory_->GetDeviceNames(&physical_video_devices_); 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_GT(physical_video_devices_.size(), 0u); 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) media_stream_manager_->audio_input_device_manager()->GetFakeDeviceNames( 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &physical_audio_devices_); 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_GT(physical_audio_devices_.size(), 0u); 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void TearDown() OVERRIDE { 2738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) host_->OnChannelClosing(); 2748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetupFakeUI(bool expect_started) { 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stream_ui_ = new MockMediaStreamUIProxy(); 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (expect_started) { 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*stream_ui_, OnStarted(_, _)); 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) media_stream_manager_->UseFakeUI( 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<FakeMediaStreamUIProxy>(stream_ui_)); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void GenerateStreamAndWaitForResult(int render_frame_id, 2878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int page_request_id, 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const StreamOptions& options) { 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop run_loop; 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int expected_audio_array_size = 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (options.audio_requested && 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) physical_audio_devices_.size() > 0) ? 1 : 0; 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int expected_video_array_size = 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (options.video_requested && 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) physical_video_devices_.size() > 0) ? 1 : 0; 296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*host_.get(), OnStreamGenerated(render_frame_id, 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch page_request_id, 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_audio_array_size, 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_video_array_size)); 300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_->OnGenerateStream(render_frame_id, page_request_id, options, origin_, 3018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) run_loop.QuitClosure()); 3028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) run_loop.Run(); 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(DoesContainRawIds(host_->audio_devices_)); 304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(DoesContainRawIds(host_->video_devices_)); 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(DoesEveryDeviceMapToRawId(host_->audio_devices_, origin_)); 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(DoesEveryDeviceMapToRawId(host_->video_devices_, origin_)); 307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void GenerateStreamAndWaitForFailure( 310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int render_frame_id, 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int page_request_id, 312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StreamOptions& options, 313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaStreamRequestResult expected_result) { 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop run_loop; 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_CALL(*host_.get(), 316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnStreamGenerationFailed(render_frame_id, 317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) page_request_id, 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) expected_result)); 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_->OnGenerateStream(render_frame_id, page_request_id, options, 320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch origin_, run_loop.QuitClosure()); 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop.Run(); 3228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 3238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OpenVideoDeviceAndWaitForResult(int render_frame_id, 3258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int page_request_id, 3268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& device_id) { 3278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::RunLoop run_loop; 328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_->OnOpenDevice(render_frame_id, page_request_id, device_id, 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MEDIA_DEVICE_VIDEO_CAPTURE, origin_, 3308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) run_loop.QuitClosure()); 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch run_loop.Run(); 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(DoesContainRawIds(host_->video_devices_)); 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(DoesEveryDeviceMapToRawId(host_->video_devices_, origin_)); 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void EnumerateDevicesAndWaitForResult(int render_frame_id, 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_request_id, 3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MediaStreamType type) { 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop run_loop; 340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_->OnEnumerateDevices(render_frame_id, page_request_id, type, origin_, 3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) run_loop.QuitClosure()); 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop.Run(); 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_FALSE(host_->enumerated_devices_.empty()); 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(DoesContainRawIds(host_->enumerated_devices_)); 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(DoesEveryDeviceMapToRawId(host_->enumerated_devices_, origin_)); 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool DoesContainRawIds(const StreamDeviceInfoArray& devices) { 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < devices.size(); ++i) { 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media::AudioDeviceNames::const_iterator audio_it = 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) physical_audio_devices_.begin(); 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (; audio_it != physical_audio_devices_.end(); ++audio_it) { 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (audio_it->unique_id == devices[i].device.id) 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media::VideoCaptureDevice::Names::const_iterator video_it = 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) physical_video_devices_.begin(); 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (; video_it != physical_video_devices_.end(); ++video_it) { 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (video_it->id() == devices[i].device.id) 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool DoesEveryDeviceMapToRawId(const StreamDeviceInfoArray& devices, 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& origin) { 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < devices.size(); ++i) { 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool found_match = false; 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media::AudioDeviceNames::const_iterator audio_it = 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) physical_audio_devices_.begin(); 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (; audio_it != physical_audio_devices_.end(); ++audio_it) { 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (content::DoesMediaDeviceIDMatchHMAC( 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin, 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) devices[i].device.id, 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_it->unique_id)) { 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(found_match); 379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) found_match = true; 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media::VideoCaptureDevice::Names::const_iterator video_it = 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) physical_video_devices_.begin(); 384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (; video_it != physical_video_devices_.end(); ++video_it) { 385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (content::DoesMediaDeviceIDMatchHMAC( 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin, 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) devices[i].device.id, 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_it->id())) { 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(found_match); 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) found_match = true; 392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!found_match) 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Returns true if all devices have labels, false otherwise. 40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool DoesContainLabels(const StreamDeviceInfoArray& devices) { 40246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (size_t i = 0; i < devices.size(); ++i) { 40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (devices[i].device.name.empty()) 40446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 40546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 40646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 40946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Returns true if no devices have labels, false otherwise. 41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool DoesNotContainLabels(const StreamDeviceInfoArray& devices) { 41146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (size_t i = 0; i < devices.size(); ++i) { 41246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!devices[i].device.name.empty()) 41346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 41446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 41646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 41746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddSourceIdConstraint(const std::string& source_id, 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions::Constraints* constraints) { 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) constraints->push_back(StreamOptions::Constraint(kMediaStreamSourceInfoId, 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_id)); 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockMediaStreamDispatcherHost> host_; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<media::AudioManager> audio_manager_; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MediaStreamManager> media_stream_manager_; 4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockMediaStreamUIProxy* stream_ui_; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentBrowserClient* old_browser_client_; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ContentClient> content_client_; 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::TestBrowserThreadBundle thread_bundle_; 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::TestBrowserContext browser_context_; 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media::AudioDeviceNames physical_audio_devices_; 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media::VideoCaptureDevice::Names physical_video_devices_; 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GURL origin_; 4355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu media::FakeVideoCaptureDeviceFactory* video_capture_device_factory_; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithVideoOnly) { 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetupFakeUI(true); 4428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 0u); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithAudioOnly) { 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, false); 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetupFakeUI(true); 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 1u); 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 0u); 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This test simulates a shutdown scenario: we don't setup a fake UI proxy for 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// MediaStreamManager, so it will create an ordinary one which will not find 4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// a RenderFrameHostDelegate. This normally should only be the case at shutdown. 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithNothing) { 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, false); 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GenerateStreamAndWaitForFailure( 465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kRenderId, 466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kPageRequestId, 467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) options, 4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN); 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithAudioAndVideo) { 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetupFakeUI(true); 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 1u); 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This test generates two streams with video only using the same render frame 482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// id. The same capture device with the same device and session id is expected 4838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// to be used. 4848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsFromSameRenderId) { 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate first stream. 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetupFakeUI(true); 4898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the latest generated stream. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 0u); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 4948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string label1 = host_->label_; 4958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string device_id1 = host_->video_devices_.front().device.id; 4968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const int session_id1 = host_->video_devices_.front().session_id; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate second stream. 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetupFakeUI(true); 5008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId + 1, options); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the latest generated stream. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 0u); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 5058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string label2 = host_->label_; 5068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string device_id2 = host_->video_devices_.front().device.id; 5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int session_id2 = host_->video_devices_.front().session_id; 5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(device_id1, device_id2); 5098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(session_id1, session_id2); 5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NE(label1, label2); 5118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, 5148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndOpenDeviceFromSameRenderId) { 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Generate first stream. 5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SetupFakeUI(true); 5198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 5208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 0u); 5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string label1 = host_->label_; 5248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string device_id1 = host_->video_devices_.front().device.id; 5258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const int session_id1 = host_->video_devices_.front().session_id; 5268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Generate second stream. 5288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) OpenVideoDeviceAndWaitForResult(kRenderId, kPageRequestId, device_id1); 5298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string device_id2 = host_->opened_device_.device.id; 5318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const int session_id2 = host_->opened_device_.session_id; 5328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string label2 = host_->label_; 5338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(device_id1, device_id2); 5358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NE(session_id1, session_id2); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(label1, label2); 5378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// This test generates two streams with video only using two separate render 541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// frame ids. The same device id but different session ids are expected. 5428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsDifferentRenderId) { 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 5448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Generate first stream. 5468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SetupFakeUI(true); 5478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 5488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Check the latest generated stream. 5508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 0u); 5518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 5528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string label1 = host_->label_; 5538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string device_id1 = host_->video_devices_.front().device.id; 5548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const int session_id1 = host_->video_devices_.front().session_id; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Generate second stream from another render frame. 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetupFakeUI(true); 5588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId+1, kPageRequestId + 1, options); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the latest generated stream. 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 0u); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 5638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string label2 = host_->label_; 5648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string device_id2 = host_->video_devices_.front().device.id; 5658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const int session_id2 = host_->video_devices_.front().session_id; 5668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(device_id1, device_id2); 5678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NE(session_id1, session_id2); 5688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NE(label1, label2); 5698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// This test request two streams with video only without waiting for the first 5728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// stream to be generated before requesting the second. 5738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// The same device id and session ids are expected. 5748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithoutWaiting) { 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 5768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Generate first stream. 5788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SetupFakeUI(true); 5796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) { 5806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) InSequence s; 5816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_CALL(*host_.get(), 5826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OnStreamGenerated(kRenderId, kPageRequestId, 0, 1)); 5836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 5846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Generate second stream. 5856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_CALL(*host_.get(), 5866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OnStreamGenerated(kRenderId, kPageRequestId + 1, 0, 1)); 5876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 5888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::RunLoop run_loop1; 5898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::RunLoop run_loop2; 590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) host_->OnGenerateStream(kRenderId, kPageRequestId, options, origin_, 5918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) run_loop1.QuitClosure()); 592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) host_->OnGenerateStream(kRenderId, kPageRequestId + 1, options, origin_, 5938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) run_loop2.QuitClosure()); 5948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) run_loop1.Run(); 5968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) run_loop2.Run(); 5978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that we can generate streams where a mandatory sourceId is specified in 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the request. 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithMandatorySourceId) { 602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_GE(physical_audio_devices_.size(), 1u); 603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_GE(physical_video_devices_.size(), 1u); 604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media::AudioDeviceNames::const_iterator audio_it = 606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) physical_audio_devices_.begin(); 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (; audio_it != physical_audio_devices_.end(); ++audio_it) { 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string source_id = content::GetHMACForMediaDeviceID( 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), 610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) origin_, 611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) audio_it->unique_id); 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(source_id.empty()); 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddSourceIdConstraint(source_id, &options.mandatory_audio); 615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetupFakeUI(true); 617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(host_->audio_devices_[0].device.id, source_id); 619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media::VideoCaptureDevice::Names::const_iterator video_it = 622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) physical_video_devices_.begin(); 623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (; video_it != physical_video_devices_.end(); ++video_it) { 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string source_id = content::GetHMACForMediaDeviceID( 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), 626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) origin_, 627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) video_it->id()); 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(source_id.empty()); 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddSourceIdConstraint(source_id, &options.mandatory_video); 631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetupFakeUI(true); 633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(host_->video_devices_[0].device.id, source_id); 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that we can generate streams where a optional sourceId is specified in 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the request. 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithOptionalSourceId) { 6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_GE(physical_audio_devices_.size(), 1u); 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_GE(physical_video_devices_.size(), 1u); 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::AudioDeviceNames::const_iterator audio_it = 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) physical_audio_devices_.begin(); 6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (; audio_it != physical_audio_devices_.end(); ++audio_it) { 6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string source_id = content::GetHMACForMediaDeviceID( 6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin_, 6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_it->unique_id); 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(source_id.empty()); 6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddSourceIdConstraint(source_id, &options.optional_audio); 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetupFakeUI(true); 6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(host_->audio_devices_[0].device.id, source_id); 6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoCaptureDevice::Names::const_iterator video_it = 6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) physical_video_devices_.begin(); 6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (; video_it != physical_video_devices_.end(); ++video_it) { 6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string source_id = content::GetHMACForMediaDeviceID( 6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), 6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin_, 6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_it->id()); 6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(source_id.empty()); 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddSourceIdConstraint(source_id, &options.optional_video); 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetupFakeUI(true); 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(host_->video_devices_[0].device.id, source_id); 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that generating a stream with an invalid mandatory video source id fail. 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStreamsWithInvalidMandatoryVideoSourceId) { 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddSourceIdConstraint("invalid source id", &options.mandatory_video); 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GenerateStreamAndWaitForFailure( 684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kRenderId, 685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kPageRequestId, 686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) options, 68723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MEDIA_DEVICE_NO_HARDWARE); 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that generating a stream with an invalid mandatory audio source id fail. 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStreamsWithInvalidMandatoryAudioSourceId) { 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddSourceIdConstraint("invalid source id", &options.mandatory_audio); 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 696a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GenerateStreamAndWaitForFailure( 697a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kRenderId, 698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kPageRequestId, 699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) options, 70023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MEDIA_DEVICE_NO_HARDWARE); 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that generating a stream with an invalid optional video source id 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// succeed. 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStreamsWithInvalidOptionalVideoSourceId) { 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddSourceIdConstraint("invalid source id", &options.optional_video); 709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetupFakeUI(true); 711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that generating a stream with an invalid optional audio source id 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// succeed. 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStreamsWithInvalidOptionalAudioSourceId) { 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddSourceIdConstraint("invalid source id", &options.optional_audio); 720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetupFakeUI(true); 722a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsNoAvailableVideoDevice) { 7265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu physical_video_devices_.clear(); 7275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_device_factory_->set_number_of_devices(0); 7285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_device_factory_->GetDeviceNames(&physical_video_devices_); 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 731effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetupFakeUI(false); 73223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) GenerateStreamAndWaitForFailure(kRenderId, kPageRequestId, options, 73323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MEDIA_DEVICE_NO_HARDWARE); 734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Test that if a OnStopStreamDevice message is received for a device that has 737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// been opened in a MediaStream and by pepper, the device is only stopped for 738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// the MediaStream. 7398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, StopDeviceInStream) { 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 7418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SetupFakeUI(true); 7438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 7448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string stream_request_label = host_->label_; 746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StreamDeviceInfo video_device_info = host_->video_devices_.front(); 747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_EQ(1u, media_stream_manager_->GetDevicesOpenedByRequest( 748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) stream_request_label).size()); 749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Open the same device by Pepper. 751a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OpenVideoDeviceAndWaitForResult(kRenderId, kPageRequestId, 752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) video_device_info.device.id); 753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string open_device_request_label = host_->label_; 754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Stop the device in the MediaStream. 756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) host_->OnStopStreamDevice(kRenderId, video_device_info.device.id); 757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0u, media_stream_manager_->GetDevicesOpenedByRequest( 759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) stream_request_label).size()); 760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(1u, media_stream_manager_->GetDevicesOpenedByRequest( 761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) open_device_request_label).size()); 762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, StopDeviceInStreamAndRestart) { 7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetupFakeUI(true); 768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string request_label1 = host_->label_; 771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StreamDeviceInfo video_device_info = host_->video_devices_.front(); 772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Expect that 1 audio and 1 video device has been opened. 773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(2u, media_stream_manager_->GetDevicesOpenedByRequest( 774a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request_label1).size()); 775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) host_->OnStopStreamDevice(kRenderId, video_device_info.device.id); 777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(1u, media_stream_manager_->GetDevicesOpenedByRequest( 778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request_label1).size()); 779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string request_label2 = host_->label_; 782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StreamDeviceInfoArray request1_devices = 784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media_stream_manager_->GetDevicesOpenedByRequest(request_label1); 785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StreamDeviceInfoArray request2_devices = 786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media_stream_manager_->GetDevicesOpenedByRequest(request_label2); 787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_EQ(1u, request1_devices.size()); 789a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_EQ(2u, request2_devices.size()); 790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 791a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Test that the same audio device has been opened in both streams. 792a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(StreamDeviceInfo::IsEqual(request1_devices[0], 793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request2_devices[0]) || 794a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StreamDeviceInfo::IsEqual(request1_devices[0], 795a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request2_devices[1])); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateTwoStreamsAndStopDeviceWhileWaitingForSecondStream) { 8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetupFakeUI(true); 8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Generate a second stream. 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*host_.get(), 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnStreamGenerated(kRenderId, kPageRequestId + 1, 0, 1)); 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop run_loop1; 8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_->OnGenerateStream(kRenderId, kPageRequestId + 1, options, origin_, 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) run_loop1.QuitClosure()); 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Stop the video stream device from stream 1 while waiting for the 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // second stream to be generated. 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_->OnStopStreamDevice(kRenderId, host_->video_devices_[0].device.id); 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) run_loop1.Run(); 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, CancelPendingStreamsOnChannelClosing) { 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop run_loop; 826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create multiple GenerateStream requests. 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t streams = 5; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 1; i <= streams; ++i) { 830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) host_->OnGenerateStream(kRenderId, kPageRequestId + i, options, origin_, 8318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) run_loop.QuitClosure()); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling OnChannelClosing() to cancel all the pending requests. 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnChannelClosing(); 836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch run_loop.RunUntilIdle(); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, StopGeneratedStreamsOnChannelClosing) { 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create first group of streams. 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t generated_streams = 3; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < generated_streams; ++i) { 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetupFakeUI(true); 8468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId + i, options); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling OnChannelClosing() to cancel all the pending/generated streams. 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnChannelClosing(); 851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop().RunUntilIdle(); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, CloseFromUI) { 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(false, true); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Closure close_callback; 858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<MockMediaStreamUIProxy> stream_ui(new MockMediaStreamUIProxy()); 859effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_CALL(*stream_ui, OnStarted(_, _)) 860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch .WillOnce(SaveArg<0>(&close_callback)); 861868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) media_stream_manager_->UseFakeUI(stream_ui.PassAs<FakeMediaStreamUIProxy>()); 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 0u); 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(close_callback.is_null()); 869a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_CALL(*host_.get(), OnDeviceStopped(kRenderId)); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_callback.Run(); 871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop().RunUntilIdle(); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Test that the dispatcher is notified if a video device that is in use is 875a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// being unplugged. 876a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, VideoDeviceUnplugged) { 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StreamOptions options(true, true); 878a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetupFakeUI(true); 879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, options); 880a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(host_->audio_devices_.size(), 1u); 881a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(host_->video_devices_.size(), 1u); 882a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 8835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_device_factory_->set_number_of_devices(0); 884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop run_loop; 886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_CALL(*host_.get(), OnDeviceStopped(kRenderId)) 887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) .WillOnce(testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); 888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) media_stream_manager_->OnDevicesChanged( 889a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE); 890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop.Run(); 892a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 893a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 894a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, EnumerateAudioDevices) { 8951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetupFakeUI(false); 896a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EnumerateDevicesAndWaitForResult(kRenderId, kPageRequestId, 8976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MEDIA_DEVICE_AUDIO_CAPTURE); 89846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(DoesContainLabels(host_->enumerated_devices_)); 899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 901a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, EnumerateVideoDevices) { 9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetupFakeUI(false); 903a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EnumerateDevicesAndWaitForResult(kRenderId, kPageRequestId, 9046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MEDIA_DEVICE_VIDEO_CAPTURE); 90546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(DoesContainLabels(host_->enumerated_devices_)); 90646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 90746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, EnumerateAudioDevicesNoAccess) { 9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetupFakeUI(false); 9101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stream_ui_->SetMicAccess(false); 91146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EnumerateDevicesAndWaitForResult(kRenderId, kPageRequestId, 9126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MEDIA_DEVICE_AUDIO_CAPTURE); 91346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(DoesNotContainLabels(host_->enumerated_devices_)); 91446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 91546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(MediaStreamDispatcherHostTest, EnumerateVideoDevicesNoAccess) { 9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetupFakeUI(false); 9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stream_ui_->SetCameraAccess(false); 91946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EnumerateDevicesAndWaitForResult(kRenderId, kPageRequestId, 9206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MEDIA_DEVICE_VIDEO_CAPTURE); 92146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(DoesNotContainLabels(host_->enumerated_devices_)); 922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; // namespace content 925