blob: 8e62fc5a9d9945100ff9cd6aba5b9e2f67a71d98 [file] [log] [blame]
// Copyright 2018 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 "device/fido/ble_adapter_power_manager.h"
#include <memory>
#include "base/test/scoped_task_environment.h"
#include "device/bluetooth/bluetooth_adapter_factory.h"
#include "device/bluetooth/test/mock_bluetooth_adapter.h"
#include "device/fido/fido_request_handler_base.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace device {
namespace {
using ::testing::_;
class MockTransportAvailabilityObserver
: public FidoRequestHandlerBase::TransportAvailabilityObserver {
public:
MockTransportAvailabilityObserver() = default;
~MockTransportAvailabilityObserver() override = default;
MOCK_METHOD1(OnTransportAvailabilityEnumerated,
void(FidoRequestHandlerBase::TransportAvailabilityInfo data));
MOCK_METHOD1(EmbedderControlsAuthenticatorDispatch,
bool(const FidoAuthenticator& authenticator));
MOCK_METHOD1(BluetoothAdapterPowerChanged, void(bool is_powered_on));
MOCK_METHOD1(FidoAuthenticatorAdded,
void(const FidoAuthenticator& authenticator));
MOCK_METHOD1(FidoAuthenticatorRemoved, void(base::StringPiece device_id));
private:
DISALLOW_COPY_AND_ASSIGN(MockTransportAvailabilityObserver);
};
class FakeFidoRequestHandlerBase : public FidoRequestHandlerBase {
public:
explicit FakeFidoRequestHandlerBase(
MockTransportAvailabilityObserver* observer)
: FidoRequestHandlerBase(nullptr, {}) {
set_observer(observer);
}
private:
void DispatchRequest(FidoAuthenticator*) override {}
DISALLOW_COPY_AND_ASSIGN(FakeFidoRequestHandlerBase);
};
} // namespace
class FidoBleAdapterPowerManagerTest : public ::testing::Test {
public:
FidoBleAdapterPowerManagerTest() {
BluetoothAdapterFactory::SetAdapterForTesting(adapter_);
}
std::unique_ptr<BleAdapterPowerManager> CreateTestBleAdapterPowerManager() {
return std::make_unique<BleAdapterPowerManager>(
fake_request_handler_.get());
}
MockBluetoothAdapter* adapter() { return adapter_.get(); }
MockTransportAvailabilityObserver* observer() { return mock_observer_.get(); }
bool adapter_powered_on_programmatically(
const BleAdapterPowerManager& adapter_power_manager) {
return adapter_power_manager.adapter_powered_on_programmatically_;
}
protected:
base::test::ScopedTaskEnvironment scoped_task_environment_;
scoped_refptr<MockBluetoothAdapter> adapter_ =
base::MakeRefCounted<::testing::NiceMock<MockBluetoothAdapter>>();
std::unique_ptr<MockTransportAvailabilityObserver> mock_observer_ =
std::make_unique<MockTransportAvailabilityObserver>();
std::unique_ptr<FakeFidoRequestHandlerBase> fake_request_handler_ =
std::make_unique<FakeFidoRequestHandlerBase>(mock_observer_.get());
};
TEST_F(FidoBleAdapterPowerManagerTest, AdapaterNotPresent) {
EXPECT_CALL(*adapter(), IsPresent()).WillOnce(::testing::Return(false));
EXPECT_CALL(*adapter(), IsPowered()).WillOnce(::testing::Return(false));
EXPECT_CALL(*adapter(), CanPower()).WillOnce(::testing::Return(false));
FidoRequestHandlerBase::TransportAvailabilityInfo data;
EXPECT_CALL(*observer(), OnTransportAvailabilityEnumerated(_))
.WillOnce(::testing::SaveArg<0>(&data));
CreateTestBleAdapterPowerManager();
scoped_task_environment_.RunUntilIdle();
EXPECT_FALSE(data.is_ble_powered);
EXPECT_FALSE(data.can_power_on_ble_adapter);
}
TEST_F(FidoBleAdapterPowerManagerTest, AdapaterPresentAndPowered) {
EXPECT_CALL(*adapter(), IsPresent()).WillOnce(::testing::Return(true));
EXPECT_CALL(*adapter(), IsPowered()).WillOnce(::testing::Return(true));
EXPECT_CALL(*adapter(), CanPower()).WillOnce(::testing::Return(false));
FidoRequestHandlerBase::TransportAvailabilityInfo data;
EXPECT_CALL(*observer(), OnTransportAvailabilityEnumerated(_))
.WillOnce(::testing::SaveArg<0>(&data));
CreateTestBleAdapterPowerManager();
scoped_task_environment_.RunUntilIdle();
EXPECT_TRUE(data.is_ble_powered);
EXPECT_FALSE(data.can_power_on_ble_adapter);
}
TEST_F(FidoBleAdapterPowerManagerTest, AdapaterPresentAndCanBePowered) {
EXPECT_CALL(*adapter(), IsPresent()).WillOnce(::testing::Return(true));
EXPECT_CALL(*adapter(), IsPowered()).WillOnce(::testing::Return(false));
EXPECT_CALL(*adapter(), CanPower()).WillOnce(::testing::Return(true));
FidoRequestHandlerBase::TransportAvailabilityInfo data;
EXPECT_CALL(*observer(), OnTransportAvailabilityEnumerated(_))
.WillOnce(::testing::SaveArg<0>(&data));
CreateTestBleAdapterPowerManager();
scoped_task_environment_.RunUntilIdle();
EXPECT_FALSE(data.is_ble_powered);
EXPECT_TRUE(data.can_power_on_ble_adapter);
}
TEST_F(FidoBleAdapterPowerManagerTest, TestSetBluetoothPowerOn) {
auto power_manager = CreateTestBleAdapterPowerManager();
::testing::InSequence s;
EXPECT_CALL(*adapter(), SetPowered(true, _, _));
EXPECT_CALL(*adapter(), SetPowered(false, _, _));
power_manager->SetAdapterPower(true /* set_power_on */);
EXPECT_TRUE(adapter_powered_on_programmatically(*power_manager));
power_manager.reset();
}
} // namespace device