| Index: device/bluetooth/bluetooth_advertisement_chromeos_unittest.cc
|
| diff --git a/device/bluetooth/bluetooth_advertisement_chromeos_unittest.cc b/device/bluetooth/bluetooth_advertisement_chromeos_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..02fe1e4a574799a6c5624dd9666badc025b4db58
|
| --- /dev/null
|
| +++ b/device/bluetooth/bluetooth_advertisement_chromeos_unittest.cc
|
| @@ -0,0 +1,242 @@
|
| +// 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/memory/scoped_ptr.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "chromeos/dbus/dbus_thread_manager.h"
|
| +#include "chromeos/dbus/fake_bluetooth_le_advertisement_service_provider.h"
|
| +#include "device/bluetooth/bluetooth_adapter.h"
|
| +#include "device/bluetooth/bluetooth_adapter_factory.h"
|
| +#include "device/bluetooth/bluetooth_advertisement.h"
|
| +#include "device/bluetooth/bluetooth_advertisement_chromeos.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using device::BluetoothAdapter;
|
| +using device::BluetoothAdapterFactory;
|
| +using device::BluetoothAdvertisement;
|
| +
|
| +namespace chromeos {
|
| +
|
| +class TestAdvertisementObserver : public BluetoothAdvertisement::Observer {
|
| + public:
|
| + explicit TestAdvertisementObserver(
|
| + scoped_refptr<BluetoothAdvertisement> advertisement)
|
| + : released_(false), advertisement_(advertisement) {
|
| + advertisement_->AddObserver(this);
|
| + }
|
| +
|
| + ~TestAdvertisementObserver() override {
|
| + advertisement_->RemoveObserver(this);
|
| + }
|
| +
|
| + // BluetoothAdvertisement::Observer overrides:
|
| + void AdvertisementReleased(BluetoothAdvertisement* advertisement) override {
|
| + released_ = true;
|
| + }
|
| +
|
| + bool released() { return released_; }
|
| +
|
| + private:
|
| + bool released_;
|
| + scoped_refptr<BluetoothAdvertisement> advertisement_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestAdvertisementObserver);
|
| +};
|
| +
|
| +class BluetoothAdvertisementChromeOSTest : public testing::Test {
|
| + public:
|
| + void SetUp() override {
|
| + DBusThreadManager::Initialize();
|
| +
|
| + callback_count_ = 0;
|
| + error_callback_count_ = 0;
|
| +
|
| + last_callback_count_ = 0;
|
| + last_error_callback_count_ = 0;
|
| +
|
| + last_error_code_ = BluetoothAdvertisement::INVALID_ADVERTISEMENT_ERROR_CODE;
|
| +
|
| + GetAdapter();
|
| + }
|
| +
|
| + void TearDown() override {
|
| + observer_.reset();
|
| + // The adapter should outlive the advertisement.
|
| + advertisement_ = nullptr;
|
| + adapter_ = nullptr;
|
| + DBusThreadManager::Shutdown();
|
| + }
|
| +
|
| + // Gets the existing Bluetooth adapter.
|
| + void GetAdapter() {
|
| + BluetoothAdapterFactory::GetAdapter(
|
| + base::Bind(&BluetoothAdvertisementChromeOSTest::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());
|
| + }
|
| +
|
| + scoped_ptr<BluetoothAdvertisement::Data> CreateAdvertisementData() {
|
| + scoped_ptr<BluetoothAdvertisement::Data> data =
|
| + make_scoped_ptr(new BluetoothAdvertisement::Data(
|
| + BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST));
|
| + data->set_service_uuids(
|
| + make_scoped_ptr(new BluetoothAdvertisement::UUIDList()).Pass());
|
| + data->set_manufacturer_data(
|
| + make_scoped_ptr(new BluetoothAdvertisement::ManufacturerData()).Pass());
|
| + data->set_solicit_uuids(
|
| + make_scoped_ptr(new BluetoothAdvertisement::UUIDList()).Pass());
|
| + data->set_service_data(
|
| + make_scoped_ptr(new BluetoothAdvertisement::ServiceData()).Pass());
|
| + return data.Pass();
|
| + }
|
| +
|
| + // Creates and registers an advertisement with the adapter.
|
| + scoped_refptr<BluetoothAdvertisement> CreateAdvertisement() {
|
| + // Clear the last advertisement we created.
|
| + advertisement_ = nullptr;
|
| +
|
| + adapter_->RegisterAdvertisement(
|
| + CreateAdvertisementData().Pass(),
|
| + base::Bind(&BluetoothAdvertisementChromeOSTest::RegisterCallback,
|
| + base::Unretained(this)),
|
| + base::Bind(
|
| + &BluetoothAdvertisementChromeOSTest::AdvertisementErrorCallback,
|
| + base::Unretained(this)));
|
| +
|
| + message_loop_.RunUntilIdle();
|
| + return advertisement_;
|
| + }
|
| +
|
| + void UnregisterAdvertisement(
|
| + scoped_refptr<BluetoothAdvertisement> advertisement) {
|
| + advertisement->Unregister(
|
| + base::Bind(&BluetoothAdvertisementChromeOSTest::Callback,
|
| + base::Unretained(this)),
|
| + base::Bind(
|
| + &BluetoothAdvertisementChromeOSTest::AdvertisementErrorCallback,
|
| + base::Unretained(this)));
|
| +
|
| + message_loop_.RunUntilIdle();
|
| + }
|
| +
|
| + void TriggerReleased(scoped_refptr<BluetoothAdvertisement> advertisement) {
|
| + BluetoothAdvertisementChromeOS* adv =
|
| + static_cast<BluetoothAdvertisementChromeOS*>(advertisement.get());
|
| + FakeBluetoothLEAdvertisementServiceProvider* provider =
|
| + static_cast<FakeBluetoothLEAdvertisementServiceProvider*>(
|
| + adv->provider());
|
| + provider->Release();
|
| + }
|
| +
|
| + // Called whenever RegisterAdvertisement is completed successfully.
|
| + void RegisterCallback(scoped_refptr<BluetoothAdvertisement> advertisement) {
|
| + ++callback_count_;
|
| + advertisement_ = advertisement;
|
| +
|
| + ASSERT_NE(advertisement_.get(), nullptr);
|
| + }
|
| +
|
| + void AdvertisementErrorCallback(
|
| + BluetoothAdvertisement::ErrorCode error_code) {
|
| + ++error_callback_count_;
|
| + last_error_code_ = error_code;
|
| + }
|
| +
|
| + // Generic callbacks.
|
| + void Callback() { ++callback_count_; }
|
| +
|
| + void ErrorCallback() { ++error_callback_count_; }
|
| +
|
| + void ExpectSuccess() {
|
| + EXPECT_EQ(last_error_callback_count_, error_callback_count_);
|
| + EXPECT_EQ(last_callback_count_ + 1, callback_count_);
|
| + last_callback_count_ = callback_count_;
|
| + last_error_callback_count_ = error_callback_count_;
|
| + }
|
| +
|
| + void ExpectError(BluetoothAdvertisement::ErrorCode error_code) {
|
| + EXPECT_EQ(last_callback_count_, callback_count_);
|
| + EXPECT_EQ(last_error_callback_count_ + 1, error_callback_count_);
|
| + last_callback_count_ = callback_count_;
|
| + last_error_callback_count_ = error_callback_count_;
|
| + EXPECT_EQ(error_code, last_error_code_);
|
| + }
|
| +
|
| + protected:
|
| + int callback_count_;
|
| + int error_callback_count_;
|
| +
|
| + int last_callback_count_;
|
| + int last_error_callback_count_;
|
| +
|
| + BluetoothAdvertisement::ErrorCode last_error_code_;
|
| +
|
| + base::MessageLoopForIO message_loop_;
|
| +
|
| + scoped_ptr<TestAdvertisementObserver> observer_;
|
| + scoped_refptr<BluetoothAdapter> adapter_;
|
| + scoped_refptr<BluetoothAdvertisement> advertisement_;
|
| +};
|
| +
|
| +TEST_F(BluetoothAdvertisementChromeOSTest, RegisterSucceeded) {
|
| + scoped_refptr<BluetoothAdvertisement> advertisement = CreateAdvertisement();
|
| + ExpectSuccess();
|
| + EXPECT_NE(nullptr, advertisement);
|
| +
|
| + UnregisterAdvertisement(advertisement);
|
| + ExpectSuccess();
|
| +}
|
| +
|
| +TEST_F(BluetoothAdvertisementChromeOSTest, DoubleRegisterFailed) {
|
| + scoped_refptr<BluetoothAdvertisement> advertisement = CreateAdvertisement();
|
| + ExpectSuccess();
|
| + EXPECT_NE(nullptr, advertisement);
|
| +
|
| + // Creating a second advertisement should give us an error.
|
| + scoped_refptr<BluetoothAdvertisement> advertisement2 = CreateAdvertisement();
|
| + ExpectError(BluetoothAdvertisement::ERROR_ADVERTISEMENT_ALREADY_EXISTS);
|
| + EXPECT_EQ(nullptr, advertisement2);
|
| +}
|
| +
|
| +TEST_F(BluetoothAdvertisementChromeOSTest, DoubleUnregisterFailed) {
|
| + scoped_refptr<BluetoothAdvertisement> advertisement = CreateAdvertisement();
|
| + ExpectSuccess();
|
| + EXPECT_NE(nullptr, advertisement);
|
| +
|
| + UnregisterAdvertisement(advertisement);
|
| + ExpectSuccess();
|
| +
|
| + // Unregistering an already unregistered advertisement should give us an
|
| + // error.
|
| + UnregisterAdvertisement(advertisement);
|
| + ExpectError(BluetoothAdvertisement::ERROR_ADVERTISEMENT_DOES_NOT_EXIST);
|
| +}
|
| +
|
| +TEST_F(BluetoothAdvertisementChromeOSTest, UnregisterAfterReleasedFailed) {
|
| + scoped_refptr<BluetoothAdvertisement> advertisement = CreateAdvertisement();
|
| + ExpectSuccess();
|
| + EXPECT_NE(nullptr, advertisement);
|
| +
|
| + observer_.reset(new TestAdvertisementObserver(advertisement));
|
| + TriggerReleased(advertisement);
|
| + EXPECT_TRUE(observer_->released());
|
| +
|
| + // Unregistering an advertisement that has been released should give us an
|
| + // error.
|
| + UnregisterAdvertisement(advertisement);
|
| + ExpectError(BluetoothAdvertisement::ERROR_ADVERTISEMENT_DOES_NOT_EXIST);
|
| +}
|
| +
|
| +} // namespace chromeos
|
|
|