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

Unified Diff: components/proximity_auth/unlock_manager_unittest.cc

Issue 1239193005: [Proximity Auth] Port the UnlockManager class. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months 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: components/proximity_auth/unlock_manager_unittest.cc
diff --git a/components/proximity_auth/unlock_manager_unittest.cc b/components/proximity_auth/unlock_manager_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..78ef93894d36433a4a6de43d7b5f445ca62b979b
--- /dev/null
+++ b/components/proximity_auth/unlock_manager_unittest.cc
@@ -0,0 +1,809 @@
+// 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 "components/proximity_auth/unlock_manager.h"
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/test/test_simple_task_runner.h"
+#include "base/thread_task_runner_handle.h"
+#include "components/proximity_auth/client.h"
+#include "components/proximity_auth/controller.h"
+#include "components/proximity_auth/logging/logging.h"
+#include "components/proximity_auth/proximity_auth_client.h"
+#include "components/proximity_auth/proximity_monitor.h"
+#include "components/proximity_auth/remote_status_update.h"
+#include "components/proximity_auth/screenlock_bridge.h"
+#include "device/bluetooth/bluetooth_adapter_factory.h"
+#include "device/bluetooth/test/mock_bluetooth_adapter.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if defined(OS_CHROMEOS)
+#include "chromeos/dbus/dbus_thread_manager.h"
+#endif // defined(OS_CHROMEOS)
+
+using testing::AtLeast;
+using testing::NiceMock;
+using testing::Return;
+using testing::_;
+
+namespace proximity_auth {
+namespace {
+
+// Note that the trust agent state is currently ignored by the UnlockManager
+// implementation.
+RemoteStatusUpdate kRemoteScreenUnlocked = {
+ USER_PRESENT, SECURE_SCREEN_LOCK_ENABLED, TRUST_AGENT_UNSUPPORTED};
+RemoteStatusUpdate kRemoteScreenLocked = {
+ USER_ABSENT, SECURE_SCREEN_LOCK_ENABLED, TRUST_AGENT_UNSUPPORTED};
+RemoteStatusUpdate kRemoteScreenlockDisabled = {
+ USER_PRESENT, SECURE_SCREEN_LOCK_DISABLED, TRUST_AGENT_UNSUPPORTED};
+RemoteStatusUpdate kRemoteScreenlockStateUnknown = {
+ USER_PRESENCE_UNKNOWN, SECURE_SCREEN_LOCK_STATE_UNKNOWN,
+ TRUST_AGENT_UNSUPPORTED};
+
+class MockController : public Controller {
+ public:
+ MockController() {}
+ ~MockController() override {}
+
+ MOCK_CONST_METHOD0(GetState, State());
+ MOCK_METHOD0(GetClient, Client*());
+};
+
+class MockClient : public Client {
+ public:
+ MockClient() {}
+ ~MockClient() override {}
+
+ MOCK_METHOD1(AddObserver, void(ClientObserver* observer));
+ MOCK_METHOD1(RemoveObserver, void(ClientObserver* observer));
+ MOCK_CONST_METHOD0(SupportsSignIn, bool());
+ MOCK_METHOD0(DispatchUnlockEvent, void());
+ MOCK_METHOD1(RequestDecryption, void(const std::string& challenge));
+ MOCK_METHOD0(RequestUnlock, void());
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockClient);
+};
+
+class MockProximityMonitor : public ProximityMonitor {
+ public:
+ MockProximityMonitor() {
+ ON_CALL(*this, GetStrategy())
+ .WillByDefault(Return(ProximityMonitor::Strategy::NONE));
+ ON_CALL(*this, IsUnlockAllowed()).WillByDefault(Return(true));
+ ON_CALL(*this, IsInRssiRange()).WillByDefault(Return(false));
+ }
+ ~MockProximityMonitor() override {}
+
+ MOCK_METHOD0(Start, void());
+ MOCK_METHOD0(Stop, void());
+ MOCK_CONST_METHOD0(GetStrategy, Strategy());
+ MOCK_CONST_METHOD0(IsUnlockAllowed, bool());
+ MOCK_CONST_METHOD0(IsInRssiRange, bool());
+ MOCK_METHOD0(RecordProximityMetricsOnAuthSuccess, void());
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockProximityMonitor);
+};
+
+class MockProximityAuthClient : public ProximityAuthClient {
+ public:
+ MockProximityAuthClient() {}
+ ~MockProximityAuthClient() override {}
+
+ MOCK_CONST_METHOD0(GetAuthenticatedUsername, std::string());
+ MOCK_METHOD0(Lock, void());
+ MOCK_METHOD1(UpdateScreenlockState,
+ void(proximity_auth::ScreenlockState state));
+ MOCK_METHOD1(FinalizeUnlock, void(bool success));
+ MOCK_METHOD1(FinalizeSignIn, void(const std::string& secret));
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockProximityAuthClient);
+};
+
+class FakeLockHandler : public ScreenlockBridge::LockHandler {
+ public:
+ FakeLockHandler() {}
+ ~FakeLockHandler() override {}
+
+ // LockHandler:
+ void ShowBannerMessage(const base::string16& message) override {}
+ void ShowUserPodCustomIcon(
+ const std::string& user_email,
+ const ScreenlockBridge::UserPodCustomIconOptions& icon) override {}
+ void HideUserPodCustomIcon(const std::string& user_email) override {}
+ void EnableInput() override {}
+ void SetAuthType(const std::string& user_email,
+ AuthType auth_type,
+ const base::string16& auth_value) override {}
+ AuthType GetAuthType(const std::string& user_email) const override {
+ return USER_CLICK;
+ }
+ ScreenType GetScreenType() const override { return LOCK_SCREEN; }
+ void Unlock(const std::string& user_email) override {}
+ void AttemptEasySignin(const std::string& user_email,
+ const std::string& secret,
+ const std::string& key_label) override {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FakeLockHandler);
+};
+
+class TestUnlockManager : public UnlockManager {
+ public:
+ TestUnlockManager(ScreenlockType screenlock_type,
+ scoped_ptr<ProximityMonitor> proximity_monitor,
+ ProximityAuthClient* proximity_auth_client)
+ : UnlockManager(screenlock_type,
+ proximity_monitor.Pass(),
+ proximity_auth_client) {}
+ ~TestUnlockManager() override {}
+
+ using UnlockManager::OnAuthAttempted;
+ using ClientObserver::OnUnlockEventSent;
+ using ClientObserver::OnRemoteStatusUpdate;
+ using ClientObserver::OnDecryptResponse;
+ using ClientObserver::OnUnlockResponse;
+ using ClientObserver::OnDisconnected;
+ using ScreenlockBridge::Observer::OnScreenDidLock;
+ using ScreenlockBridge::Observer::OnScreenDidUnlock;
+ using ScreenlockBridge::Observer::OnFocusedUserChanged;
+};
+
+// Creates a mock Bluetooth adapter and sets it as the global adapter for
+// testing.
+scoped_refptr<device::MockBluetoothAdapter>
+CreateAndRegisterMockBluetoothAdapter() {
+ scoped_refptr<device::MockBluetoothAdapter> adapter =
+ new NiceMock<device::MockBluetoothAdapter>();
+ device::BluetoothAdapterFactory::SetAdapterForTesting(adapter);
+ return adapter;
+}
+
+} // namespace
+
+class ProximityAuthUnlockManagerTest : public testing::Test {
+ public:
+ ProximityAuthUnlockManagerTest()
+ : bluetooth_adapter_(CreateAndRegisterMockBluetoothAdapter()),
+ proximity_monitor_(nullptr),
+ task_runner_(new base::TestSimpleTaskRunner()),
+ thread_task_runner_handle_(task_runner_) {
+ ON_CALL(*bluetooth_adapter_, IsPowered()).WillByDefault(Return(true));
+ ON_CALL(controller_, GetClient()).WillByDefault(Return(&client_));
+ ON_CALL(client_, SupportsSignIn()).WillByDefault(Return(true));
+
+ ScreenlockBridge::Get()->SetLockHandler(&lock_handler_);
+
+#if defined(OS_CHROMEOS)
+ chromeos::DBusThreadManager::Initialize();
+#endif
+ }
+
+ ~ProximityAuthUnlockManagerTest() override {
+ // Make sure to verify the mock prior to the destruction of the unlock
+ // manager, as otherwise it's impossible to tell whether calls to Stop()
+ // occur as a side-effect of the destruction or from the code intended to be
+ // under test.
+ if (proximity_monitor_)
+ testing::Mock::VerifyAndClearExpectations(proximity_monitor_);
+
+#if defined(OS_CHROMEOS)
+ chromeos::DBusThreadManager::Shutdown();
+#endif
+
+ ScreenlockBridge::Get()->SetLockHandler(nullptr);
+ }
+
+ void CreateUnlockManager(UnlockManager::ScreenlockType screenlock_type) {
+ proximity_monitor_ = new NiceMock<MockProximityMonitor>;
+ unlock_manager_.reset(new TestUnlockManager(
+ screenlock_type, make_scoped_ptr(proximity_monitor_),
+ &proximity_auth_client_));
+ }
+
+ void SimulateUserPresentState() {
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::STOPPED));
+ unlock_manager_->SetController(&controller_);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->OnControllerStateChanged();
+
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
+ }
+
+ void RunPendingTasks() { task_runner_->RunPendingTasks(); }
+
+ protected:
+ // Mock used for verifying interactions with the Bluetooth subsystem.
+ scoped_refptr<device::MockBluetoothAdapter> bluetooth_adapter_;
+
+ NiceMock<MockProximityAuthClient> proximity_auth_client_;
+ NiceMock<MockController> controller_;
+ NiceMock<MockClient> client_;
+ scoped_ptr<TestUnlockManager> unlock_manager_;
+ // Owned by the |unlock_manager_|.
+ MockProximityMonitor* proximity_monitor_;
+
+ private:
+ scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
+ base::ThreadTaskRunnerHandle thread_task_runner_handle_;
+ FakeLockHandler lock_handler_;
+ ScopedDisableLoggingForTesting disable_logging_;
+};
+
+TEST_F(ProximityAuthUnlockManagerTest, IsUnlockAllowed_InitialState) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, IsUnlockAllowed_SessionLock_AllGood) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
Tim Song 2015/07/23 21:32:15 Wouldn't it be easier to make the controller a fak
Ilya Sherman 2015/08/11 23:37:15 How would you structure the fake? Provide a set_s
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->SetController(&controller_);
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
+
+ EXPECT_TRUE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, IsUnlockAllowed_SignIn_AllGood) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SIGN_IN);
+
+ ON_CALL(controller_, GetState())
Tim Song 2015/07/23 21:32:16 Can't you replace these lines SimulateUserPresentS
Ilya Sherman 2015/08/11 23:37:15 My goal was to have each test case be pretty expli
+ .WillByDefault(Return(Controller::State::STOPPED));
+ unlock_manager_->SetController(&controller_);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->OnControllerStateChanged();
+
+ ON_CALL(client_, SupportsSignIn()).WillByDefault(Return(true));
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
+
+ EXPECT_TRUE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ IsUnlockAllowed_SignIn_ClientDoesNotSupportSignIn) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SIGN_IN);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::STOPPED));
+ unlock_manager_->SetController(&controller_);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->OnControllerStateChanged();
+
+ ON_CALL(client_, SupportsSignIn()).WillByDefault(Return(false));
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
+
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, IsUnlockAllowed_SignIn_ClientIsNull) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SIGN_IN);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
Tim Song 2015/07/23 21:32:15 Don't you need to make controller_->GetClient() re
Ilya Sherman 2015/08/11 23:37:15 Done.
+ unlock_manager_->SetController(&controller_);
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
+
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ IsUnlockAllowed_DisallowedByProximityMonitor) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->SetController(&controller_);
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
+
+ ON_CALL(*proximity_monitor_, IsUnlockAllowed()).WillByDefault(Return(false));
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ IsUnlockAllowed_SecureChannelNotEstablished) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::AUTHENTICATING));
+ unlock_manager_->SetController(&controller_);
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
+
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, IsUnlockAllowed_ControllerIsNull) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ unlock_manager_->SetController(nullptr);
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
+
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ IsUnlockAllowed_RemoteScreenlockStateLocked) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->SetController(&controller_);
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenLocked);
+
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ IsUnlockAllowed_RemoteScreenlockStateUnknown) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->SetController(&controller_);
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenlockStateUnknown);
+
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ IsUnlockAllowed_RemoteScreenlockStateDisabled) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->SetController(&controller_);
+ unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenlockDisabled);
+
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ IsUnlockAllowed_RemoteScreenlockStateNotYetReceived) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->SetController(&controller_);
+
+ EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, SetController_SetToNull) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::INACTIVE));
+ unlock_manager_->SetController(nullptr);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, SetController_ExistingController) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(proximity_auth_client_, UpdateScreenlockState(_)).Times(0);
+ unlock_manager_->SetController(&controller_);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ SetController_NullThenExistingController) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ unlock_manager_->SetController(nullptr);
Tim Song 2015/07/23 21:32:16 nit: add an expectation for for the INACTIVE state
Ilya Sherman 2015/08/11 23:37:15 Done.
+
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::AUTHENTICATED));
+ unlock_manager_->SetController(&controller_);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, SetController_AuthenticationFailed) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ unlock_manager_->SetController(nullptr);
Tim Song 2015/07/23 21:32:15 Why simulate the user present state at all for thi
Ilya Sherman 2015/08/11 23:37:15 The idea is to test going from a good state to a b
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::AUTHENTICATION_FAILED));
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::PHONE_NOT_AUTHENTICATED));
+ unlock_manager_->SetController(&controller_);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, SetController_WakingUp) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ unlock_manager_->SetController(nullptr);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::FINDING_CONNECTION));
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::BLUETOOTH_CONNECTING));
+ unlock_manager_->SetController(&controller_);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ SetController_NullController_StopsProximityMonitor) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(*proximity_monitor_, Stop()).Times(AtLeast(1));
+ unlock_manager_->SetController(nullptr);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ SetController_ConnectingController_StopsProximityMonitor) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ NiceMock<MockController> controller;
+ ON_CALL(controller, GetState())
+ .WillByDefault(Return(Controller::State::FINDING_CONNECTION));
+
+ EXPECT_CALL(*proximity_monitor_, Stop()).Times(AtLeast(1));
+ unlock_manager_->SetController(&controller);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ SetController_ConnectedController_StartsProximityMonitor) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ NiceMock<MockController> controller;
+ ON_CALL(controller, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+
+ EXPECT_CALL(*proximity_monitor_, Start()).Times(AtLeast(1));
+ unlock_manager_->SetController(&controller);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnControllerStateChanged_SecureChannelEstablished_RegistersAsObserver) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ NiceMock<MockController> controller;
+ ON_CALL(controller, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+
+ EXPECT_CALL(client_, AddObserver(unlock_manager_.get()));
+ unlock_manager_->OnControllerStateChanged();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnControllerStateChanged_StartsProximityMonitor) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ NiceMock<MockController> controller;
+ ON_CALL(controller, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+
+ EXPECT_CALL(*proximity_monitor_, Start()).Times(AtLeast(1));
+ unlock_manager_->OnControllerStateChanged();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnControllerStateChanged_StopsProximityMonitor) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::AUTHENTICATION_FAILED));
+
+ EXPECT_CALL(*proximity_monitor_, Stop()).Times(AtLeast(1));
+ unlock_manager_->OnControllerStateChanged();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnControllerStateChanged_Stopped_UpdatesScreenlockState) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::STOPPED));
+
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::INACTIVE));
+ unlock_manager_->OnControllerStateChanged();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnControllerStateChanged_AuthenticationFailed_UpdatesScreenlockState) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::AUTHENTICATION_FAILED));
+
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::PHONE_NOT_AUTHENTICATED));
+ unlock_manager_->OnControllerStateChanged();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnControllerStateChanged_FindingConnection_UpdatesScreenlockState) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::STOPPED));
+ unlock_manager_->SetController(&controller_);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::FINDING_CONNECTION));
+
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::BLUETOOTH_CONNECTING));
+ unlock_manager_->OnControllerStateChanged();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnControllerStateChanged_Authenticating_UpdatesScreenlockState) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::STOPPED));
+ unlock_manager_->SetController(&controller_);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::AUTHENTICATING));
+
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::BLUETOOTH_CONNECTING));
+ unlock_manager_->OnControllerStateChanged();
+}
+
+TEST_F(
+ ProximityAuthUnlockManagerTest,
+ OnControllerStateChanged_SecureChannelEstablished_UpdatesScreenlockState) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::STOPPED));
+ unlock_manager_->SetController(&controller_);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::BLUETOOTH_CONNECTING));
+ unlock_manager_->OnControllerStateChanged();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, OnDisconnected_UnregistersAsObserver) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::AUTHENTICATION_FAILED));
+
+ EXPECT_CALL(client_, RemoveObserver(unlock_manager_.get()));
+ unlock_manager_.get()->OnDisconnected();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnScreenDidUnlock_StopsProximityMonitor) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(*proximity_monitor_, Stop());
+ unlock_manager_.get()->OnScreenDidUnlock(
+ ScreenlockBridge::LockHandler::LOCK_SCREEN);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, OnScreenDidLock_StartsProximityMonitor) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::STOPPED));
+ unlock_manager_->SetController(&controller_);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::SECURE_CHANNEL_ESTABLISHED));
+ unlock_manager_->OnControllerStateChanged();
+
+ EXPECT_CALL(*proximity_monitor_, Start());
+ unlock_manager_.get()->OnScreenDidLock(
+ ScreenlockBridge::LockHandler::LOCK_SCREEN);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, OnScreenDidLock_SetsWakingUpState) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ unlock_manager_.get()->OnScreenDidUnlock(
+ ScreenlockBridge::LockHandler::LOCK_SCREEN);
+
+ ON_CALL(controller_, GetState())
+ .WillByDefault(Return(Controller::State::FINDING_CONNECTION));
+ unlock_manager_->OnControllerStateChanged();
+
+ EXPECT_CALL(proximity_auth_client_,
+ UpdateScreenlockState(ScreenlockState::BLUETOOTH_CONNECTING));
+ unlock_manager_.get()->OnScreenDidLock(
+ ScreenlockBridge::LockHandler::LOCK_SCREEN);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnDecryptResponse_NoAuthAttemptInProgress) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(_)).Times(0);
+ unlock_manager_.get()->OnDecryptResponse(nullptr);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnUnlockEventSent_NoAuthAttemptInProgress) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(_)).Times(0);
+ unlock_manager_.get()->OnUnlockEventSent(true);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnUnlockResponse_NoAuthAttemptInProgress) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(_)).Times(0);
+ unlock_manager_.get()->OnUnlockResponse(true);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, OnAuthAttempted_NoController) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ unlock_manager_->SetController(nullptr);
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(false));
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, OnAuthAttempted_UnlockNotAllowed) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ ON_CALL(*proximity_monitor_, IsUnlockAllowed()).WillByDefault(Return(false));
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(false));
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, OnAuthAttempted_NotUserClick) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(_)).Times(0);
+ unlock_manager_->OnAuthAttempted(
+ ScreenlockBridge::LockHandler::EXPAND_THEN_USER_CLICK);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, OnAuthAttempted_DuplicateCall) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(client_, RequestUnlock());
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+
+ EXPECT_CALL(client_, RequestUnlock()).Times(0);
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest, OnAuthAttempted_TimesOut) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+
+ // Simulate the timeout period elapsing.
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(false));
+ RunPendingTasks();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnAuthAttempted_DoesntTimeOutFollowingResponse) {
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(_));
+ unlock_manager_->OnUnlockResponse(false);
+
+ // Simulate the timeout period elapsing.
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(_)).Times(0);
+ RunPendingTasks();
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnAuthAttempted_Unlock_SupportsSignIn_UnlockRequestFails) {
+ ON_CALL(client_, SupportsSignIn()).WillByDefault(Return(true));
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(client_, RequestUnlock());
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(false));
+ unlock_manager_->OnUnlockResponse(false);
+}
+
+TEST_F(
+ ProximityAuthUnlockManagerTest,
+ OnAuthAttempted_Unlock_SupportsSignIn_UnlockRequestSucceeds_UnlockEventSendFails) {
Tim Song 2015/07/23 21:32:15 This formatting is kind of weird. Perhaps there is
Ilya Sherman 2015/08/11 23:37:15 Done.
+ ON_CALL(client_, SupportsSignIn()).WillByDefault(Return(true));
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(client_, RequestUnlock());
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+
+ EXPECT_CALL(client_, DispatchUnlockEvent());
+ unlock_manager_->OnUnlockResponse(true);
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(false));
+ unlock_manager_->OnUnlockEventSent(false);
+}
+
+TEST_F(
+ ProximityAuthUnlockManagerTest,
+ OnAuthAttempted_Unlock_SupportsSignIn_UnlockRequestSucceeds_UnlockEventSendSucceeds) {
Tim Song 2015/07/23 21:32:15 same here.
Ilya Sherman 2015/08/11 23:37:15 Done.
+ ON_CALL(client_, SupportsSignIn()).WillByDefault(Return(true));
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(client_, RequestUnlock());
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+
+ EXPECT_CALL(client_, DispatchUnlockEvent());
+ unlock_manager_->OnUnlockResponse(true);
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(true));
+ unlock_manager_->OnUnlockEventSent(true);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnAuthAttempted_Unlock_DoesntSupportSignIn_UnlockEventSendFails) {
+ ON_CALL(client_, SupportsSignIn()).WillByDefault(Return(false));
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(client_, DispatchUnlockEvent());
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(false));
+ unlock_manager_->OnUnlockEventSent(false);
+}
+
+TEST_F(ProximityAuthUnlockManagerTest,
+ OnAuthAttempted_Unlock_SupportsSignIn_UnlockEventSendSucceeds) {
+ ON_CALL(client_, SupportsSignIn()).WillByDefault(Return(false));
+ CreateUnlockManager(UnlockManager::ScreenlockType::SESSION_LOCK);
+ SimulateUserPresentState();
+
+ EXPECT_CALL(client_, DispatchUnlockEvent());
+ unlock_manager_->OnAuthAttempted(ScreenlockBridge::LockHandler::USER_CLICK);
+
+ EXPECT_CALL(proximity_auth_client_, FinalizeUnlock(true));
+ unlock_manager_->OnUnlockEventSent(true);
+}
+
+} // namespace proximity_auth
« components/proximity_auth/unlock_manager.cc ('K') | « components/proximity_auth/unlock_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698