Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(822)

Unified Diff: device/bluetooth/bluetooth_audio_sink_chromeos_unittest.cc

Issue 1415573014: Reland "Add Linux support for the Bluetooth API" (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: build fix. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: device/bluetooth/bluetooth_audio_sink_chromeos_unittest.cc
diff --git a/device/bluetooth/bluetooth_audio_sink_chromeos_unittest.cc b/device/bluetooth/bluetooth_audio_sink_chromeos_unittest.cc
deleted file mode 100644
index 5f51cb8a0f88ba421aa7c1eee6baeee2fc259421..0000000000000000000000000000000000000000
--- a/device/bluetooth/bluetooth_audio_sink_chromeos_unittest.cc
+++ /dev/null
@@ -1,960 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "dbus/object_path.h"
-#include "device/bluetooth/bluetooth_adapter.h"
-#include "device/bluetooth/bluetooth_adapter_factory.h"
-#include "device/bluetooth/bluetooth_audio_sink.h"
-#include "device/bluetooth/bluetooth_audio_sink_chromeos.h"
-#include "device/bluetooth/dbus/bluetooth_media_client.h"
-#include "device/bluetooth/dbus/bluetooth_media_endpoint_service_provider.h"
-#include "device/bluetooth/dbus/bluetooth_media_transport_client.h"
-#include "device/bluetooth/dbus/bluez_dbus_manager.h"
-#include "device/bluetooth/dbus/fake_bluetooth_media_client.h"
-#include "device/bluetooth/dbus/fake_bluetooth_media_endpoint_service_provider.h"
-#include "device/bluetooth/dbus/fake_bluetooth_media_transport_client.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using bluez::FakeBluetoothMediaTransportClient;
-using dbus::ObjectPath;
-using device::BluetoothAdapter;
-using device::BluetoothAdapterFactory;
-using device::BluetoothAudioSink;
-
-namespace chromeos {
-
-class TestAudioSinkObserver : public BluetoothAudioSink::Observer {
- public:
- explicit TestAudioSinkObserver(scoped_refptr<BluetoothAudioSink> audio_sink)
- : state_changed_count_(0),
- volume_changed_count_(0),
- total_read_(0),
- state_(audio_sink->GetState()),
- audio_sink_(audio_sink) {
- audio_sink_->AddObserver(this);
- }
-
- ~TestAudioSinkObserver() override { audio_sink_->RemoveObserver(this); }
-
- void BluetoothAudioSinkStateChanged(
- BluetoothAudioSink* audio_sink,
- BluetoothAudioSink::State state) override {
- if (state == BluetoothAudioSink::STATE_IDLE)
- total_read_ = 0;
-
- ++state_changed_count_;
- }
-
- void BluetoothAudioSinkVolumeChanged(BluetoothAudioSink* audio_sink,
- uint16_t volume) override {
- ++volume_changed_count_;
- }
-
- void BluetoothAudioSinkDataAvailable(BluetoothAudioSink* audio_sink,
- char* data,
- size_t size,
- uint16_t read_mtu) override {
- total_read_ += size;
- data_.clear();
- data_.insert(data_.begin(), data, data + size);
- read_mtu_ = read_mtu;
- }
-
- int state_changed_count_;
- int volume_changed_count_;
- int data_available_count_;
- size_t total_read_;
- std::vector<char> data_;
- uint16_t read_mtu_;
- BluetoothAudioSink::State state_;
-
- private:
- scoped_refptr<BluetoothAudioSink> audio_sink_;
-};
-
-class BluetoothAudioSinkChromeOSTest : public testing::Test {
- public:
- void SetUp() override {
- bluez::BluezDBusManager::Initialize(NULL, true);
-
- callback_count_ = 0;
- error_callback_count_ = 0;
-
- fake_media_ = static_cast<bluez::FakeBluetoothMediaClient*>(
- bluez::BluezDBusManager::Get()->GetBluetoothMediaClient());
- fake_transport_ = static_cast<FakeBluetoothMediaTransportClient*>(
- bluez::BluezDBusManager::Get()->GetBluetoothMediaTransportClient());
-
- // Initiates Delegate::TransportProperties with default values.
- properties_.device =
- ObjectPath(FakeBluetoothMediaTransportClient::kTransportDevicePath);
- properties_.uuid = bluez::BluetoothMediaClient::kBluetoothAudioSinkUUID;
- properties_.codec = FakeBluetoothMediaTransportClient::kTransportCodec;
- properties_.configuration = std::vector<uint8_t>(
- FakeBluetoothMediaTransportClient::kTransportConfiguration,
- FakeBluetoothMediaTransportClient::kTransportConfiguration +
- FakeBluetoothMediaTransportClient::kTransportConfigurationLength);
- properties_.state = bluez::BluetoothMediaTransportClient::kStateIdle;
- properties_.delay.reset(
- new uint16_t(FakeBluetoothMediaTransportClient::kTransportDelay));
- properties_.volume.reset(
- new uint16_t(FakeBluetoothMediaTransportClient::kTransportVolume));
-
- GetAdapter();
- }
-
- void TearDown() override {
- callback_count_ = 0;
- error_callback_count_ = 0;
- observer_.reset();
-
- fake_media_->SetVisible(true);
-
- // The adapter should outlive audio sink.
- audio_sink_ = nullptr;
- adapter_ = nullptr;
- bluez::BluezDBusManager::Shutdown();
- }
-
- // Gets the existing Bluetooth adapter.
- void GetAdapter() {
- BluetoothAdapterFactory::GetAdapter(
- base::Bind(&BluetoothAudioSinkChromeOSTest::GetAdapterCallback,
- base::Unretained(this)));
- }
-
- // Called whenever BluetoothAdapter is retrieved successfully.
- void GetAdapterCallback(scoped_refptr<BluetoothAdapter> adapter) {
- adapter_ = adapter;
-
- ASSERT_NE(adapter_.get(), nullptr);
- ASSERT_TRUE(adapter_->IsInitialized());
- adapter_->SetPowered(
- true,
- base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::ErrorCallback,
- base::Unretained(this)));
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(callback_count_, 1);
- EXPECT_EQ(error_callback_count_, 0);
-
- // Resets callback_count_.
- --callback_count_;
- }
-
- // Registers BluetoothAudioSinkChromeOS with default codec and capabilities.
- // If the audio sink is retrieved successfully, the state changes to
- // STATE_DISCONNECTED.
- void GetAudioSink() {
- // Sets up valid codec and capabilities.
- BluetoothAudioSink::Options options;
- ASSERT_EQ(options.codec, 0x00);
- ASSERT_EQ(options.capabilities,
- std::vector<uint8_t>({0x3f, 0xff, 0x12, 0x35}));
-
- // Registers |audio_sink_| with valid codec and capabilities
- adapter_->RegisterAudioSink(
- options,
- base::Bind(&BluetoothAudioSinkChromeOSTest::RegisterCallback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::RegisterErrorCallback,
- base::Unretained(this)));
-
- observer_.reset(new TestAudioSinkObserver(audio_sink_));
- EXPECT_EQ(callback_count_, 1);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
- }
-
- void GetFakeMediaEndpoint() {
- BluetoothAudioSinkChromeOS* audio_sink_chromeos =
- static_cast<BluetoothAudioSinkChromeOS*>(audio_sink_.get());
- ASSERT_NE(audio_sink_chromeos, nullptr);
-
- media_endpoint_ =
- static_cast<bluez::FakeBluetoothMediaEndpointServiceProvider*>(
- audio_sink_chromeos->GetEndpointServiceProvider());
- }
-
- // Called whenever RegisterAudioSink is completed successfully.
- void RegisterCallback(
- scoped_refptr<BluetoothAudioSink> audio_sink) {
- ++callback_count_;
- audio_sink_ = audio_sink;
-
- GetFakeMediaEndpoint();
- ASSERT_NE(media_endpoint_, nullptr);
- fake_media_->SetEndpointRegistered(media_endpoint_, true);
-
- ASSERT_NE(audio_sink_.get(), nullptr);
- ASSERT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- }
-
- // Called whenever RegisterAudioSink failed.
- void RegisterErrorCallback(BluetoothAudioSink::ErrorCode error_code) {
- ++error_callback_count_;
- EXPECT_EQ(error_code, BluetoothAudioSink::ERROR_NOT_REGISTERED);
- }
-
- // Called whenever there capabilities are returned from SelectConfiguration.
- void SelectConfigurationCallback(const std::vector<uint8_t>& capabilities) {
- ++callback_count_;
-
- // |capabilities| should be the same as the capabilities for registering an
- // audio sink in GetAudioSink().
- EXPECT_EQ(capabilities, std::vector<uint8_t>({0x3f, 0xff, 0x12, 0x35}));
- }
-
- void UnregisterErrorCallback(BluetoothAudioSink::ErrorCode error_code) {
- ++error_callback_count_;
- EXPECT_EQ(error_code, BluetoothAudioSink::ERROR_NOT_UNREGISTERED);
- }
-
- // Generic callbacks.
- void Callback() {
- ++callback_count_;
- }
-
- void ErrorCallback() {
- ++error_callback_count_;
- }
-
- protected:
- int callback_count_;
- int error_callback_count_;
-
- base::MessageLoopForIO message_loop_;
-
- bluez::FakeBluetoothMediaClient* fake_media_;
- FakeBluetoothMediaTransportClient* fake_transport_;
- bluez::FakeBluetoothMediaEndpointServiceProvider* media_endpoint_;
- scoped_ptr<TestAudioSinkObserver> observer_;
- scoped_refptr<BluetoothAdapter> adapter_;
- scoped_refptr<BluetoothAudioSink> audio_sink_;
-
- // The default property set used while calling SetConfiguration on a media
- // endpoint object.
- bluez::BluetoothMediaEndpointServiceProvider::Delegate::TransportProperties
- properties_;
-};
-
-TEST_F(BluetoothAudioSinkChromeOSTest, RegisterSucceeded) {
- GetAudioSink();
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, RegisterFailedWithInvalidOptions) {
- // Sets options with an invalid codec and valid capabilities.
- BluetoothAudioSink::Options options;
- options.codec = 0xff;
- options.capabilities = std::vector<uint8_t>({0x3f, 0xff, 0x12, 0x35});
-
- adapter_->RegisterAudioSink(
- options,
- base::Bind(&BluetoothAudioSinkChromeOSTest::RegisterCallback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::RegisterErrorCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(callback_count_, 0);
- EXPECT_EQ(error_callback_count_, 1);
-
- // Sets options with a valid codec and invalid capabilities.
- options.codec = 0x00;
- options.capabilities.clear();
- adapter_->RegisterAudioSink(
- options,
- base::Bind(&BluetoothAudioSinkChromeOSTest::RegisterCallback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::RegisterErrorCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(callback_count_, 0);
- EXPECT_EQ(error_callback_count_, 2);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, SelectConfiguration) {
- GetAudioSink();
-
- // Simulates calling SelectConfiguration on the media endpoint object owned by
- // |audio_sink_| with some fake capabilities.
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, SetConfiguration) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- // Simulates calling SetConfiguration on the media endpoint object owned by
- // |audio_sink_| with a fake transport path and a
- // Delegate::TransportProperties structure.
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, SetConfigurationWithUnexpectedState) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- // Set state of Delegate::TransportProperties with an unexpected value.
- properties_.state = "pending";
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-}
-
-// Checks if the observer is notified on media-removed event when the state of
-// |audio_sink_| is STATE_DISCONNECTED. Once the media object is removed, the
-// audio sink is no longer valid.
-TEST_F(BluetoothAudioSinkChromeOSTest, MediaRemovedDuringDisconnectedState) {
- GetAudioSink();
-
- // Gets the media object and makes it invisible to see if the state of the
- // audio sink changes accordingly.
- fake_media_->SetVisible(false);
-
- GetFakeMediaEndpoint();
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
- EXPECT_EQ(media_endpoint_, nullptr);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-}
-
-// Checks if the observer is notified on media-removed event when the state of
-// |audio_sink_| is STATE_IDLE. Once the media object is removed, the audio sink
-// is no longer valid.
-TEST_F(BluetoothAudioSinkChromeOSTest, MediaRemovedDuringIdleState) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- // Gets the media object and makes it invisible to see if the state of the
- // audio sink changes accordingly.
- fake_media_->SetVisible(false);
-
- GetFakeMediaEndpoint();
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
- EXPECT_EQ(media_endpoint_, nullptr);
-
- // The state becomes disconnted and then invalid, since the removal of
- // transport object should happend before media becomes invisible.
- // State: STATE_IDLE -> STATE_DISCONNECTED -> STATE_INVALID
- EXPECT_EQ(observer_->state_changed_count_, 3);
- EXPECT_EQ(observer_->volume_changed_count_, 2);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, MediaRemovedDuringActiveState) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- fake_transport_->SetState(media_endpoint_->object_path(), "pending");
-
- message_loop_.RunUntilIdle();
-
- // Acquire is called when the state of |audio_sink_| becomes STATE_PENDING,
- // and Acquire will trigger state change. Therefore, the state will be
- // STATE_ACTIVE right after STATE_PENDING.
- // State: STATE_IDLE -> STATE_PENDING -> STATE_ACTIVE
- EXPECT_EQ(observer_->state_changed_count_, 3);
-
- // Gets the media object and makes it invisible to see if the state of the
- // audio sink changes accordingly.
- fake_media_->SetVisible(false);
-
- GetFakeMediaEndpoint();
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
- EXPECT_EQ(media_endpoint_, nullptr);
-
- // The state becomes disconnted and then invalid, since the removal of
- // transport object should happend before media becomes invisible.
- // State: STATE_ACTIVE -> STATE_DISCONNECTED -> STATE_INVALID
- EXPECT_EQ(observer_->state_changed_count_, 5);
- EXPECT_EQ(observer_->volume_changed_count_, 2);
-}
-
-// Checks if the observer is notified on transport-removed event when the state
-// of |audio_sink_| is STATE_IDEL. Once the media transport object is removed,
-// the audio sink is disconnected.
-TEST_F(BluetoothAudioSinkChromeOSTest, TransportRemovedDuringIdleState) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- // Makes the transport object invalid to see if the state of the audio sink
- // changes accordingly.
- fake_transport_->SetValid(media_endpoint_, false);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_NE(media_endpoint_, nullptr);
- EXPECT_EQ(observer_->state_changed_count_, 2);
- EXPECT_EQ(observer_->volume_changed_count_, 2);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, TransportRemovedDuringActiveState) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- fake_transport_->SetState(media_endpoint_->object_path(), "pending");
-
- message_loop_.RunUntilIdle();
-
- // Acquire is called when the state of |audio_sink_| becomes STATE_PENDING,
- // and Acquire will trigger state change. Therefore, the state will be
- // STATE_ACTIVE right after STATE_PENDING.
- // State: STATE_IDLE -> STATE_PENDING -> STATE_ACTIVE
- EXPECT_EQ(observer_->state_changed_count_, 3);
-
- // Makes the transport object invalid to see if the state of the audio sink
- // changes accordingly.
- fake_transport_->SetValid(media_endpoint_, false);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_NE(media_endpoint_, nullptr);
- EXPECT_EQ(observer_->state_changed_count_, 4);
- EXPECT_EQ(observer_->volume_changed_count_, 2);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest,
- AdapterPoweredChangedDuringDisconnectedState) {
- GetAudioSink();
-
- adapter_->SetPowered(
- false,
- base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::ErrorCallback,
- base::Unretained(this)));
-
- EXPECT_TRUE(adapter_->IsPresent());
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- adapter_->SetPowered(
- true,
- base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::ErrorCallback,
- base::Unretained(this)));
-
- EXPECT_TRUE(adapter_->IsPresent());
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 3);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, AdapterPoweredChangedDuringIdleState) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- adapter_->SetPowered(
- false,
- base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::ErrorCallback,
- base::Unretained(this)));
- GetFakeMediaEndpoint();
-
- EXPECT_TRUE(adapter_->IsPresent());
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_NE(media_endpoint_, nullptr);
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 3);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 2);
- EXPECT_EQ(observer_->volume_changed_count_, 2);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest,
- UnregisterAudioSinkDuringDisconnectedState) {
- GetAudioSink();
-
- audio_sink_->Unregister(
- base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::UnregisterErrorCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, UnregisterAudioSinkDuringIdleState) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- audio_sink_->Unregister(
- base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::UnregisterErrorCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
- EXPECT_EQ(callback_count_, 3);
- EXPECT_EQ(error_callback_count_, 0);
-
- // The state becomes disconnted and then invalid, since the removal of
- // transport object should happend before the unregistration of endpoint.
- // State: STATE_IDLE -> STATE_DISCONNECTED -> STATE_INVALID
- EXPECT_EQ(observer_->state_changed_count_, 3);
- EXPECT_EQ(observer_->volume_changed_count_, 2);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, UnregisterAudioSinkDuringActiveState) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- fake_transport_->SetState(media_endpoint_->object_path(), "pending");
-
- message_loop_.RunUntilIdle();
-
- // Acquire is called when the state of |audio_sink_| becomes STATE_PENDING,
- // and Acquire will trigger state change. Therefore, the state will be
- // STATE_ACTIVE right after STATE_PENDING.
- // State: STATE_IDLE -> STATE_PENDING -> STATE_ACTIVE
- EXPECT_EQ(observer_->state_changed_count_, 3);
-
- audio_sink_->Unregister(
- base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
- base::Unretained(this)),
- base::Bind(&BluetoothAudioSinkChromeOSTest::UnregisterErrorCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
- EXPECT_EQ(callback_count_, 3);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 5);
- EXPECT_EQ(observer_->volume_changed_count_, 2);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, StateChanged) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- // Changes the current state of transport to pending.
- fake_transport_->SetState(media_endpoint_->object_path(), "pending");
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_PENDING);
- EXPECT_EQ(observer_->state_changed_count_, 3);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, VolumeChanged) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- // |kTransportVolume| is the initial volume of the transport, and this
- // value is propagated to the audio sink via SetConfiguration.
- EXPECT_EQ(audio_sink_->GetVolume(),
- FakeBluetoothMediaTransportClient::kTransportVolume);
-
- // Changes volume to a valid level.
- fake_transport_->SetVolume(media_endpoint_->object_path(), 100);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 2);
- EXPECT_EQ(audio_sink_->GetVolume(), 100);
-
- // Changes volume to an invalid level.
- fake_transport_->SetVolume(media_endpoint_->object_path(), 200);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 3);
- EXPECT_EQ(audio_sink_->GetVolume(), BluetoothAudioSink::kInvalidVolume);
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, AcquireFD) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- fake_transport_->SetState(media_endpoint_->object_path(), "pending");
-
- std::vector<char> data_one(16, 0x12);
- fake_transport_->WriteData(media_endpoint_->object_path(), data_one);
-
- message_loop_.RunUntilIdle();
-
- // Acquire is called when the state of |audio_sink_| becomes STATE_PENDING,
- // and Acquire will trigger state change. Therefore, the state will be
- // STATE_ACTIVE right after STATE_PENDING.
- // State: STATE_IDLE -> STATE_PENDING -> STATE_ACTIVE
- EXPECT_EQ(observer_->state_changed_count_, 3);
- EXPECT_EQ(observer_->total_read_, data_one.size());
- EXPECT_EQ(observer_->data_, data_one);
- EXPECT_EQ(observer_->read_mtu_,
- FakeBluetoothMediaTransportClient::kDefaultReadMtu);
-}
-
-// Tests the case where the remote device pauses and resume audio streaming.
-TEST_F(BluetoothAudioSinkChromeOSTest, PauseAndResume) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- fake_transport_->SetState(media_endpoint_->object_path(), "pending");
-
- std::vector<char> data_one(16, 0x12);
- fake_transport_->WriteData(media_endpoint_->object_path(), data_one);
-
- message_loop_.RunUntilIdle();
-
- EXPECT_EQ(observer_->data_, data_one);
- EXPECT_EQ(observer_->read_mtu_,
- FakeBluetoothMediaTransportClient::kDefaultReadMtu);
- EXPECT_EQ(observer_->state_changed_count_, 3);
- EXPECT_EQ(observer_->total_read_, data_one.size());
-
- // Simulates the situation where the remote device pauses and resume audio
- // streaming.
- fake_transport_->SetState(media_endpoint_->object_path(), "idle");
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(observer_->state_changed_count_, 4);
-
- fake_transport_->SetState(media_endpoint_->object_path(), "pending");
-
- std::vector<char> data_two(8, 0x10);
- fake_transport_->WriteData(media_endpoint_->object_path(), data_two);
-
- message_loop_.RunUntilIdle();
-
- EXPECT_EQ(observer_->data_, data_two);
- EXPECT_EQ(observer_->read_mtu_,
- FakeBluetoothMediaTransportClient::kDefaultReadMtu);
- EXPECT_EQ(observer_->state_changed_count_, 6);
- EXPECT_EQ(observer_->total_read_, data_two.size());
-}
-
-TEST_F(BluetoothAudioSinkChromeOSTest, ContinuouslyStreaming) {
- GetAudioSink();
-
- media_endpoint_->SelectConfiguration(
- std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
- base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
- base::Unretained(this)));
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 0);
- EXPECT_EQ(observer_->volume_changed_count_, 0);
-
- media_endpoint_->SetConfiguration(
- fake_transport_->GetTransportPath(media_endpoint_->object_path()),
- properties_);
-
- EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
- EXPECT_EQ(callback_count_, 2);
- EXPECT_EQ(error_callback_count_, 0);
- EXPECT_EQ(observer_->state_changed_count_, 1);
- EXPECT_EQ(observer_->volume_changed_count_, 1);
-
- fake_transport_->SetState(media_endpoint_->object_path(), "pending");
-
- std::vector<char> data_one(16, 0x12);
- fake_transport_->WriteData(media_endpoint_->object_path(), data_one);
-
- message_loop_.RunUntilIdle();
-
- EXPECT_EQ(observer_->data_, data_one);
- EXPECT_EQ(observer_->read_mtu_,
- FakeBluetoothMediaTransportClient::kDefaultReadMtu);
- EXPECT_EQ(observer_->state_changed_count_, 3);
- EXPECT_EQ(observer_->total_read_, data_one.size());
-
- std::vector<char> data_two(8, 0x10);
- fake_transport_->WriteData(media_endpoint_->object_path(), data_two);
-
- message_loop_.RunUntilIdle();
-
- EXPECT_EQ(observer_->data_, data_two);
- EXPECT_EQ(observer_->read_mtu_,
- FakeBluetoothMediaTransportClient::kDefaultReadMtu);
- EXPECT_EQ(observer_->state_changed_count_, 3);
- EXPECT_EQ(observer_->total_read_, data_one.size() + data_two.size());
-}
-
-} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698