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"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_thread_impl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/audio_input_device_manager.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/media_stream_request.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_manager_base.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::SaveArg;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockAudioInputDeviceManagerListener
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public MediaStreamProviderListener {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockAudioInputDeviceManagerListener() {}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockAudioInputDeviceManagerListener() {}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(Opened, void(MediaStreamType, const int));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(Closed, void(MediaStreamType, const int));
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(DevicesEnumerated, void(MediaStreamType,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       const StreamDeviceInfoArray&));
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MOCK_METHOD2(Aborted, void(MediaStreamType, int));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StreamDeviceInfoArray devices_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockAudioInputDeviceManagerListener);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(henrika): there are special restrictions for Android since
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// AudioInputDeviceManager::Open() must be called on the audio thread.
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This test suite must be modified to run on Android.
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_ANDROID)
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define MAYBE_AudioInputDeviceManagerTest DISABLED_AudioInputDeviceManagerTest
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define MAYBE_AudioInputDeviceManagerTest AudioInputDeviceManagerTest
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class MAYBE_AudioInputDeviceManagerTest : public testing::Test {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MAYBE_AudioInputDeviceManagerTest() {}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The test must run on Browser::IO.
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    message_loop_.reset(new base::MessageLoopForIO);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_.reset(new BrowserThreadImpl(BrowserThread::IO,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           message_loop_.get()));
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    audio_manager_.reset(media::AudioManager::CreateForTesting());
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Wait for audio thread initialization to complete.  Otherwise the
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // enumeration type may not have been set yet.
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::WaitableEvent event(false, false);
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    audio_manager_->GetTaskRunner()->PostTask(FROM_HERE, base::Bind(
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        &base::WaitableEvent::Signal, base::Unretained(&event)));
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    event.Wait();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_ = new AudioInputDeviceManager(audio_manager_.get());
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    manager_->UseFakeDevice();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    audio_input_listener_.reset(new MockAudioInputDeviceManagerListener());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Register(audio_input_listener_.get(),
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       message_loop_->message_loop_proxy().get());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets the enumerated device list from the AudioInputDeviceManager.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->EnumerateDevices(MEDIA_DEVICE_AUDIO_CAPTURE);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                DevicesEnumerated(MEDIA_DEVICE_AUDIO_CAPTURE, _))
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .Times(1)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillOnce(SaveArg<1>(&devices_));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait until we get the list.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Unregister();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_.reset();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::MessageLoop> message_loop_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserThreadImpl> io_thread_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<AudioInputDeviceManager> manager_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockAudioInputDeviceManagerListener> audio_input_listener_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<media::AudioManager> audio_manager_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StreamDeviceInfoArray devices_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MAYBE_AudioInputDeviceManagerTest);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens and closes the devices.
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenAndCloseDevice) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(devices_.empty());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (StreamDeviceInfoArray::const_iterator iter = devices_.begin();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != devices_.end(); ++iter) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Opens/closes the devices.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int session_id = manager_->Open(*iter);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected mock call with expected return value.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Waits for the callback.
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_->RunUntilIdle();
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->Close(session_id);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Closed(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Waits for the callback.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens multiple devices at one time and closes them later.
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenMultipleDevices) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(devices_.empty());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = 0;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<int[]> session_id(new int[devices_.size()]);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens the devices in a loop.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (StreamDeviceInfoArray::const_iterator iter = devices_.begin();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != devices_.end(); ++iter, ++index) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Opens the devices.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    session_id[index] = manager_->Open(*iter);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected mock call with expected returned value.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id[index]))
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Waits for the callback.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks if the session_ids are unique.
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < devices_.size() - 1; ++i) {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t k = i + 1; k < devices_.size(); ++k) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(session_id[i] != session_id[k]);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < devices_.size(); ++i) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Closes the devices.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Close(session_id[i]);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Closed(MEDIA_DEVICE_AUDIO_CAPTURE, session_id[i]))
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Waits for the callback.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens a non-existing device.
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenNotExistingDevice) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaStreamType stream_type = MEDIA_DEVICE_AUDIO_CAPTURE;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string device_name("device_doesnt_exist");
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string device_id("id_doesnt_exist");
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int sample_rate(0);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int channel_config(0);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StreamDeviceInfo dummy_device(
1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      stream_type, device_name, device_id, sample_rate, channel_config, 2048);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int session_id = manager_->Open(dummy_device);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for the callback.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_->RunUntilIdle();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens default device twice.
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenDeviceTwice) {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(devices_.empty());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens and closes the default device twice.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int first_session_id = manager_->Open(devices_.front());
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int second_session_id = manager_->Open(devices_.front());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expected mock calls with expected returned values.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(first_session_id, second_session_id);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Opened(MEDIA_DEVICE_AUDIO_CAPTURE, first_session_id))
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Opened(MEDIA_DEVICE_AUDIO_CAPTURE, second_session_id))
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Waits for the callback.
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_->RunUntilIdle();
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->Close(first_session_id);
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->Close(second_session_id);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Closed(MEDIA_DEVICE_AUDIO_CAPTURE, first_session_id))
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Closed(MEDIA_DEVICE_AUDIO_CAPTURE, second_session_id))
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for the callback.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_->RunUntilIdle();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Accesses then closes the sessions after opening the devices.
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MAYBE_AudioInputDeviceManagerTest, AccessAndCloseSession) {
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(devices_.empty());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = 0;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<int[]> session_id(new int[devices_.size()]);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loops through the devices and calls Open()/Close()/GetOpenedDeviceInfoById
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for each device.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (StreamDeviceInfoArray::const_iterator iter = devices_.begin();
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != devices_.end(); ++iter, ++index) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note that no DeviceStopped() notification for Event Handler as we have
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // stopped the device before calling close.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    session_id[index] = manager_->Open(*iter);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id[index]))
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const StreamDeviceInfo* info = manager_->GetOpenedDeviceInfoById(
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        session_id[index]);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(info);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(iter->device.id, info->device.id);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Close(session_id[index]);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*audio_input_listener_,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Closed(MEDIA_DEVICE_AUDIO_CAPTURE, session_id[index]))
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->RunUntilIdle();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Access an invalid session.
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MAYBE_AudioInputDeviceManagerTest, AccessInvalidSession) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens the first device.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StreamDeviceInfoArray::const_iterator iter = devices_.begin();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int session_id = manager_->Open(*iter);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Opened(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_->RunUntilIdle();
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Access a non-opened device.
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should fail and return an empty StreamDeviceInfo.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int invalid_session_id = session_id + 1;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const StreamDeviceInfo* info =
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager_->GetOpenedDeviceInfoById(invalid_session_id);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!info);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Close(session_id);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*audio_input_listener_,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Closed(MEDIA_DEVICE_AUDIO_CAPTURE, session_id))
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_->RunUntilIdle();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
289