15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_thread_impl.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/audio_input_device_manager.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/media_stream_request.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_manager_base.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::SaveArg;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockAudioInputDeviceManagerListener
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public MediaStreamProviderListener {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockAudioInputDeviceManagerListener() {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockAudioInputDeviceManagerListener() {}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(Opened, void(MediaStreamType, const int));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(Closed, void(MediaStreamType, const int));
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(DevicesEnumerated, void(MediaStreamType,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       const StreamDeviceInfoArray&));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3(Error, void(MediaStreamType, int, MediaStreamProviderError));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StreamDeviceInfoArray devices_;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockAudioInputDeviceManagerListener);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioInputDeviceManagerTest : public testing::Test {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AudioInputDeviceManagerTest() {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true iff machine has an audio input device.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CanRunAudioInputDeviceTests() {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return audio_manager_->HasAudioInputDevices();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The test must run on Browser::IO.
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_IO));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_.reset(new BrowserThreadImpl(BrowserThread::IO,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           message_loop_.get()));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    audio_manager_.reset(media::AudioManager::Create());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_ = new AudioInputDeviceManager(audio_manager_.get());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    audio_input_listener_.reset(new MockAudioInputDeviceManagerListener());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Register(audio_input_listener_.get(),
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       message_loop_->message_loop_proxy().get());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets the enumerated device list from the AudioInputDeviceManager.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->EnumerateDevices(MEDIA_DEVICE_AUDIO_CAPTURE);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                DevicesEnumerated(MEDIA_DEVICE_AUDIO_CAPTURE, _))
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .Times(1)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillOnce(SaveArg<1>(&devices_));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait until we get the list.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Unregister();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_.reset();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::MessageLoop> message_loop_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserThreadImpl> io_thread_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<AudioInputDeviceManager> manager_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockAudioInputDeviceManagerListener> audio_input_listener_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<media::AudioManager> audio_manager_;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StreamDeviceInfoArray devices_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AudioInputDeviceManagerTest);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens and closes the devices.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioInputDeviceManagerTest, OpenAndCloseDevice) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CanRunAudioInputDeviceTests())
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(devices_.empty());
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (StreamDeviceInfoArray::const_iterator iter = devices_.begin();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != devices_.end(); ++iter) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Opens/closes the devices.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int session_id = manager_->Open(*iter);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected mock call with expected return value.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Waits for the callback.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_->RunUntilIdle();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->Close(session_id);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Closed(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Waits for the callback.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens multiple devices at one time and closes them later.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioInputDeviceManagerTest, OpenMultipleDevices) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CanRunAudioInputDeviceTests())
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(devices_.empty());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = 0;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<int[]> session_id(new int[devices_.size()]);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens the devices in a loop.
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (StreamDeviceInfoArray::const_iterator iter = devices_.begin();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != devices_.end(); ++iter, ++index) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Opens the devices.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    session_id[index] = manager_->Open(*iter);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected mock call with expected returned value.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id[index]))
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Waits for the callback.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks if the session_ids are unique.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < devices_.size() - 1; ++i) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t k = i + 1; k < devices_.size(); ++k) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(session_id[i] != session_id[k]);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < devices_.size(); ++i) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Closes the devices.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Close(session_id[i]);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Closed(MEDIA_DEVICE_AUDIO_CAPTURE, session_id[i]))
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Waits for the callback.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens a non-existing device.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioInputDeviceManagerTest, OpenNotExistingDevice) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CanRunAudioInputDeviceTests())
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaStreamType stream_type = MEDIA_DEVICE_AUDIO_CAPTURE;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string device_name("device_doesnt_exist");
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string device_id("id_doesnt_exist");
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int sample_rate(0);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int channel_config(0);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StreamDeviceInfo dummy_device(
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      stream_type, device_name, device_id, sample_rate, channel_config, false);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int session_id = manager_->Open(dummy_device);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for the callback.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_->RunUntilIdle();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens default device twice.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioInputDeviceManagerTest, OpenDeviceTwice) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CanRunAudioInputDeviceTests())
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(devices_.empty());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens and closes the default device twice.
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int first_session_id = manager_->Open(devices_.front());
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int second_session_id = manager_->Open(devices_.front());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expected mock calls with expected returned values.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(first_session_id, second_session_id);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Opened(MEDIA_DEVICE_AUDIO_CAPTURE, first_session_id))
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Opened(MEDIA_DEVICE_AUDIO_CAPTURE, second_session_id))
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Waits for the callback.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_->RunUntilIdle();
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->Close(first_session_id);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->Close(second_session_id);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Closed(MEDIA_DEVICE_AUDIO_CAPTURE, first_session_id))
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Closed(MEDIA_DEVICE_AUDIO_CAPTURE, second_session_id))
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for the callback.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_->RunUntilIdle();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Accesses then closes the sessions after opening the devices.
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioInputDeviceManagerTest, AccessAndCloseSession) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CanRunAudioInputDeviceTests())
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(devices_.empty());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = 0;
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<int[]> session_id(new int[devices_.size()]);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loops through the devices and calls Open()/Close()/GetOpenedDeviceInfoById
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for each device.
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (StreamDeviceInfoArray::const_iterator iter = devices_.begin();
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != devices_.end(); ++iter, ++index) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note that no DeviceStopped() notification for Event Handler as we have
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // stopped the device before calling close.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    session_id[index] = manager_->Open(*iter);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id[index]))
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const StreamDeviceInfo* info = manager_->GetOpenedDeviceInfoById(
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        session_id[index]);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(info);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(iter->device.id, info->device.id);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Close(session_id[index]);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Closed(MEDIA_DEVICE_AUDIO_CAPTURE, session_id[index]))
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Access an invalid session.
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioInputDeviceManagerTest, AccessInvalidSession) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CanRunAudioInputDeviceTests())
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens the first device.
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StreamDeviceInfoArray::const_iterator iter = devices_.begin();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int session_id = manager_->Open(*iter);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_->RunUntilIdle();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Access a non-opened device.
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should fail and return an empty StreamDeviceInfo.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int invalid_session_id = session_id + 1;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const StreamDeviceInfo* info =
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager_->GetOpenedDeviceInfoById(invalid_session_id);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!info);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Close(session_id);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Closed(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_->RunUntilIdle();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
292