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