| Index: chrome/browser/chromeos/login/parallel_authenticator_unittest.cc
|
| diff --git a/chrome/browser/chromeos/login/parallel_authenticator_unittest.cc b/chrome/browser/chromeos/login/parallel_authenticator_unittest.cc
|
| deleted file mode 100644
|
| index dad81fcfe2584e8e73e9bcf0dbf5f759e9fa0716..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/login/parallel_authenticator_unittest.cc
|
| +++ /dev/null
|
| @@ -1,616 +0,0 @@
|
| -// Copyright (c) 2012 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 "chrome/browser/chromeos/login/parallel_authenticator.h"
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/command_line.h"
|
| -#include "base/file_util.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "chrome/browser/chromeos/login/mock_login_status_consumer.h"
|
| -#include "chrome/browser/chromeos/login/mock_url_fetchers.h"
|
| -#include "chrome/browser/chromeos/login/mock_user_manager.h"
|
| -#include "chrome/browser/chromeos/login/test_attempt_state.h"
|
| -#include "chrome/browser/chromeos/login/user.h"
|
| -#include "chrome/browser/chromeos/login/user_manager.h"
|
| -#include "chrome/browser/chromeos/settings/cros_settings.h"
|
| -#include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
|
| -#include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h"
|
| -#include "chrome/test/base/testing_profile.h"
|
| -#include "chromeos/chromeos_switches.h"
|
| -#include "chromeos/cryptohome/mock_async_method_caller.h"
|
| -#include "chromeos/cryptohome/system_salt_getter.h"
|
| -#include "chromeos/dbus/fake_cryptohome_client.h"
|
| -#include "chromeos/dbus/fake_dbus_thread_manager.h"
|
| -#include "content/public/test/test_browser_thread_bundle.h"
|
| -#include "google_apis/gaia/mock_url_fetcher_factory.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/url_request/url_request_status.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "third_party/cros_system_api/dbus/service_constants.h"
|
| -#include "url/gurl.h"
|
| -
|
| -using ::testing::Invoke;
|
| -using ::testing::Return;
|
| -using ::testing::_;
|
| -
|
| -namespace chromeos {
|
| -
|
| -class ParallelAuthenticatorTest : public testing::Test {
|
| - public:
|
| - ParallelAuthenticatorTest()
|
| - : username_("me@nowhere.org"),
|
| - password_("fakepass"),
|
| - hash_ascii_(ParallelAuthenticator::HashPassword(
|
| - password_,
|
| - SystemSaltGetter::ConvertRawSaltToHexString(
|
| - FakeCryptohomeClient::GetStubSystemSalt()))),
|
| - user_manager_enabler_(new MockUserManager),
|
| - mock_caller_(NULL) {
|
| - }
|
| -
|
| - virtual ~ParallelAuthenticatorTest() {
|
| - DCHECK(!mock_caller_);
|
| - }
|
| -
|
| - virtual void SetUp() {
|
| - CommandLine::ForCurrentProcess()->AppendSwitch(switches::kLoginManager);
|
| -
|
| - mock_caller_ = new cryptohome::MockAsyncMethodCaller;
|
| - cryptohome::AsyncMethodCaller::InitializeForTesting(mock_caller_);
|
| -
|
| - FakeDBusThreadManager* fake_dbus_thread_manager = new FakeDBusThreadManager;
|
| - fake_cryptohome_client_ = new FakeCryptohomeClient;
|
| - fake_dbus_thread_manager->SetCryptohomeClient(
|
| - scoped_ptr<CryptohomeClient>(fake_cryptohome_client_));
|
| - DBusThreadManager::InitializeForTesting(fake_dbus_thread_manager);
|
| -
|
| - SystemSaltGetter::Initialize();
|
| -
|
| - auth_ = new ParallelAuthenticator(&consumer_);
|
| - state_.reset(new TestAttemptState(UserContext(username_,
|
| - password_,
|
| - std::string()),
|
| - "",
|
| - "",
|
| - User::USER_TYPE_REGULAR,
|
| - false));
|
| - }
|
| -
|
| - // Tears down the test fixture.
|
| - virtual void TearDown() {
|
| - SystemSaltGetter::Shutdown();
|
| - DBusThreadManager::Shutdown();
|
| -
|
| - cryptohome::AsyncMethodCaller::Shutdown();
|
| - mock_caller_ = NULL;
|
| - }
|
| -
|
| - base::FilePath PopulateTempFile(const char* data, int data_len) {
|
| - base::FilePath out;
|
| - FILE* tmp_file = base::CreateAndOpenTemporaryFile(&out);
|
| - EXPECT_NE(tmp_file, static_cast<FILE*>(NULL));
|
| - EXPECT_EQ(base::WriteFile(out, data, data_len), data_len);
|
| - EXPECT_TRUE(base::CloseFile(tmp_file));
|
| - return out;
|
| - }
|
| -
|
| - // Allow test to fail and exit gracefully, even if OnLoginFailure()
|
| - // wasn't supposed to happen.
|
| - void FailOnLoginFailure() {
|
| - ON_CALL(consumer_, OnLoginFailure(_))
|
| - .WillByDefault(Invoke(MockConsumer::OnFailQuitAndFail));
|
| - }
|
| -
|
| - // Allow test to fail and exit gracefully, even if
|
| - // OnRetailModeLoginSuccess() wasn't supposed to happen.
|
| - void FailOnRetailModeLoginSuccess() {
|
| - ON_CALL(consumer_, OnRetailModeLoginSuccess(_))
|
| - .WillByDefault(Invoke(MockConsumer::OnRetailModeSuccessQuitAndFail));
|
| - }
|
| -
|
| - // Allow test to fail and exit gracefully, even if OnLoginSuccess()
|
| - // wasn't supposed to happen.
|
| - void FailOnLoginSuccess() {
|
| - ON_CALL(consumer_, OnLoginSuccess(_))
|
| - .WillByDefault(Invoke(MockConsumer::OnSuccessQuitAndFail));
|
| - }
|
| -
|
| - // Allow test to fail and exit gracefully, even if
|
| - // OnOffTheRecordLoginSuccess() wasn't supposed to happen.
|
| - void FailOnGuestLoginSuccess() {
|
| - ON_CALL(consumer_, OnOffTheRecordLoginSuccess())
|
| - .WillByDefault(Invoke(MockConsumer::OnGuestSuccessQuitAndFail));
|
| - }
|
| -
|
| - void ExpectLoginFailure(const LoginFailure& failure) {
|
| - EXPECT_CALL(consumer_, OnLoginFailure(failure))
|
| - .WillOnce(Invoke(MockConsumer::OnFailQuit))
|
| - .RetiresOnSaturation();
|
| - }
|
| -
|
| - void ExpectRetailModeLoginSuccess() {
|
| - EXPECT_CALL(consumer_, OnRetailModeLoginSuccess(_))
|
| - .WillOnce(Invoke(MockConsumer::OnRetailModeSuccessQuit))
|
| - .RetiresOnSaturation();
|
| - }
|
| -
|
| - void ExpectLoginSuccess(const std::string& username,
|
| - const std::string& password,
|
| - const std::string& username_hash_,
|
| - bool pending) {
|
| - EXPECT_CALL(consumer_, OnLoginSuccess(UserContext(
|
| - username,
|
| - password,
|
| - std::string(),
|
| - username_hash_,
|
| - true, // using_oauth
|
| - UserContext::AUTH_FLOW_OFFLINE)))
|
| - .WillOnce(Invoke(MockConsumer::OnSuccessQuit))
|
| - .RetiresOnSaturation();
|
| - }
|
| -
|
| - void ExpectGuestLoginSuccess() {
|
| - EXPECT_CALL(consumer_, OnOffTheRecordLoginSuccess())
|
| - .WillOnce(Invoke(MockConsumer::OnGuestSuccessQuit))
|
| - .RetiresOnSaturation();
|
| - }
|
| -
|
| - void ExpectPasswordChange() {
|
| - EXPECT_CALL(consumer_, OnPasswordChangeDetected())
|
| - .WillOnce(Invoke(MockConsumer::OnMigrateQuit))
|
| - .RetiresOnSaturation();
|
| - }
|
| -
|
| - void RunResolve(ParallelAuthenticator* auth) {
|
| - auth->Resolve();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - }
|
| -
|
| - void SetAttemptState(ParallelAuthenticator* auth, TestAttemptState* state) {
|
| - auth->set_attempt_state(state);
|
| - }
|
| -
|
| - ParallelAuthenticator::AuthState SetAndResolveState(
|
| - ParallelAuthenticator* auth, TestAttemptState* state) {
|
| - auth->set_attempt_state(state);
|
| - return auth->ResolveState();
|
| - }
|
| -
|
| - void SetOwnerState(bool owner_check_finished, bool check_result) {
|
| - auth_->SetOwnerState(owner_check_finished, check_result);
|
| - }
|
| -
|
| - content::TestBrowserThreadBundle thread_bundle_;
|
| -
|
| - std::string username_;
|
| - std::string password_;
|
| - std::string username_hash_;
|
| - std::string hash_ascii_;
|
| -
|
| - ScopedDeviceSettingsTestHelper device_settings_test_helper_;
|
| - ScopedTestCrosSettings test_cros_settings_;
|
| -
|
| - ScopedUserManagerEnabler user_manager_enabler_;
|
| -
|
| - cryptohome::MockAsyncMethodCaller* mock_caller_;
|
| -
|
| - MockConsumer consumer_;
|
| - scoped_refptr<ParallelAuthenticator> auth_;
|
| - scoped_ptr<TestAttemptState> state_;
|
| - FakeCryptohomeClient* fake_cryptohome_client_;
|
| -};
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, OnLoginSuccess) {
|
| - EXPECT_CALL(consumer_, OnLoginSuccess(UserContext(
|
| - username_,
|
| - password_,
|
| - std::string(),
|
| - username_hash_,
|
| - true, // using oauth
|
| - UserContext::AUTH_FLOW_OFFLINE)))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - SetAttemptState(auth_.get(), state_.release());
|
| - auth_->OnLoginSuccess();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) {
|
| - EXPECT_CALL(consumer_, OnPasswordChangeDetected())
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - SetAttemptState(auth_.get(), state_.release());
|
| - auth_->OnPasswordChangeDetected();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, ResolveNothingDone) {
|
| - EXPECT_EQ(ParallelAuthenticator::CONTINUE,
|
| - SetAndResolveState(auth_.get(), state_.release()));
|
| -}
|
| -
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, ResolvePossiblePwChangeToFailedMount) {
|
| - // Set up state as though a cryptohome mount attempt has occurred
|
| - // and been rejected.
|
| - state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE);
|
| -
|
| - // When there is no online attempt and online results, POSSIBLE_PW_CHANGE
|
| - EXPECT_EQ(ParallelAuthenticator::FAILED_MOUNT,
|
| - SetAndResolveState(auth_.get(), state_.release()));
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, ResolveNeedOldPw) {
|
| - // Set up state as though a cryptohome mount attempt has occurred
|
| - // and been rejected because of unmatched key; additionally,
|
| - // an online auth attempt has completed successfully.
|
| - state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE);
|
| - state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone());
|
| -
|
| - EXPECT_EQ(ParallelAuthenticator::NEED_OLD_PW,
|
| - SetAndResolveState(auth_.get(), state_.release()));
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededDirectFailedMount) {
|
| - // Set up state as though a cryptohome mount attempt has occurred
|
| - // and succeeded but we are in safe mode and the current user is not owner.
|
| - // This is a high level test to verify the proper transitioning in this mode
|
| - // only. It is not testing that we properly verify that the user is an owner
|
| - // or that we really are in "safe-mode".
|
| - state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
|
| - SetOwnerState(true, false);
|
| -
|
| - EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED,
|
| - SetAndResolveState(auth_.get(), state_.release()));
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededMount) {
|
| - // Set up state as though a cryptohome mount attempt has occurred
|
| - // and succeeded but we are in safe mode and the current user is not owner.
|
| - // This test will check that the "safe-mode" policy is not set and will let
|
| - // the mount finish successfully.
|
| - state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
|
| - SetOwnerState(false, false);
|
| - // and test that the mount has succeeded.
|
| - state_.reset(new TestAttemptState(UserContext(username_,
|
| - password_,
|
| - std::string()),
|
| - "",
|
| - "",
|
| - User::USER_TYPE_REGULAR,
|
| - false));
|
| - state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_EQ(ParallelAuthenticator::OFFLINE_LOGIN,
|
| - SetAndResolveState(auth_.get(), state_.release()));
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededFailedMount) {
|
| - FailOnLoginSuccess(); // Set failing on success as the default...
|
| - LoginFailure failure = LoginFailure(LoginFailure::OWNER_REQUIRED);
|
| - ExpectLoginFailure(failure);
|
| -
|
| - fake_cryptohome_client_->set_unmount_result(true);
|
| -
|
| - CrosSettingsProvider* device_settings_provider;
|
| - StubCrosSettingsProvider stub_settings_provider;
|
| - // Set up state as though a cryptohome mount attempt has occurred
|
| - // and succeeded but we are in safe mode and the current user is not owner.
|
| - state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
|
| - SetOwnerState(false, false);
|
| - // Remove the real DeviceSettingsProvider and replace it with a stub.
|
| - device_settings_provider =
|
| - CrosSettings::Get()->GetProvider(chromeos::kReportDeviceVersionInfo);
|
| - EXPECT_TRUE(device_settings_provider != NULL);
|
| - EXPECT_TRUE(
|
| - CrosSettings::Get()->RemoveSettingsProvider(device_settings_provider));
|
| - CrosSettings::Get()->AddSettingsProvider(&stub_settings_provider);
|
| - CrosSettings::Get()->SetBoolean(kPolicyMissingMitigationMode, true);
|
| -
|
| - // Initialize login state for this test to verify the login state is changed
|
| - // to SAFE_MODE.
|
| - LoginState::Initialize();
|
| -
|
| - EXPECT_EQ(ParallelAuthenticator::CONTINUE,
|
| - SetAndResolveState(auth_.get(), state_.release()));
|
| - EXPECT_TRUE(LoginState::Get()->IsInSafeMode());
|
| -
|
| - // Simulate TPM token ready event.
|
| - DeviceSettingsService::Get()->OnTPMTokenReady();
|
| -
|
| - // Flush all the pending operations. The operations should induce an owner
|
| - // verification.
|
| - device_settings_test_helper_.Flush();
|
| - // and test that the mount has succeeded.
|
| - state_.reset(new TestAttemptState(UserContext(username_,
|
| - password_,
|
| - std::string()),
|
| - "",
|
| - "",
|
| - User::USER_TYPE_REGULAR,
|
| - false));
|
| - state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED,
|
| - SetAndResolveState(auth_.get(), state_.release()));
|
| -
|
| - // Unset global objects used by this test.
|
| - LoginState::Shutdown();
|
| - EXPECT_TRUE(
|
| - CrosSettings::Get()->RemoveSettingsProvider(&stub_settings_provider));
|
| - CrosSettings::Get()->AddSettingsProvider(device_settings_provider);
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveFailedMount) {
|
| - FailOnLoginSuccess();
|
| - ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_CRYPTOHOME));
|
| -
|
| - // Set up state as though a cryptohome mount attempt has occurred
|
| - // and failed.
|
| - state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_NONE);
|
| - SetAttemptState(auth_.get(), state_.release());
|
| -
|
| - RunResolve(auth_.get());
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveGuestLogin) {
|
| - ExpectGuestLoginSuccess();
|
| - FailOnLoginFailure();
|
| -
|
| - // Set up mock async method caller to respond as though a tmpfs mount
|
| - // attempt has occurred and succeeded.
|
| - mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_CALL(*mock_caller_, AsyncMountGuest(_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - auth_->LoginOffTheRecord();
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveGuestLoginButFail) {
|
| - FailOnGuestLoginSuccess();
|
| - ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_TMPFS));
|
| -
|
| - // Set up mock async method caller to respond as though a tmpfs mount
|
| - // attempt has occurred and failed.
|
| - mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_CALL(*mock_caller_, AsyncMountGuest(_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - auth_->LoginOffTheRecord();
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveRetailModeUserLogin) {
|
| - ExpectRetailModeLoginSuccess();
|
| - FailOnLoginFailure();
|
| -
|
| - // Set up mock async method caller to respond as though a tmpfs mount
|
| - // attempt has occurred and succeeded.
|
| - mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_CALL(*mock_caller_, AsyncMountGuest(_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - auth_->LoginRetailMode();
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveRetailModeLoginButFail) {
|
| - FailOnRetailModeLoginSuccess();
|
| - ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_TMPFS));
|
| -
|
| - // Set up mock async method caller to respond as though a tmpfs mount
|
| - // attempt has occurred and failed.
|
| - mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_CALL(*mock_caller_, AsyncMountGuest(_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - auth_->LoginRetailMode();
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveDataResync) {
|
| - ExpectLoginSuccess(username_,
|
| - password_,
|
| - cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername,
|
| - false);
|
| - FailOnLoginFailure();
|
| -
|
| - // Set up mock async method caller to respond successfully to a cryptohome
|
| - // remove attempt and a cryptohome create attempt (indicated by the
|
| - // |CREATE_IF_MISSING| flag to AsyncMount).
|
| - mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_CALL(*mock_caller_, AsyncRemove(username_, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_,
|
| - cryptohome::CREATE_IF_MISSING, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone());
|
| - SetAttemptState(auth_.get(), state_.release());
|
| -
|
| - auth_->ResyncEncryptedData();
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveResyncFail) {
|
| - FailOnLoginSuccess();
|
| - ExpectLoginFailure(LoginFailure(LoginFailure::DATA_REMOVAL_FAILED));
|
| -
|
| - // Set up mock async method caller to fail a cryptohome remove attempt.
|
| - mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_CALL(*mock_caller_, AsyncRemove(username_, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - SetAttemptState(auth_.get(), state_.release());
|
| -
|
| - auth_->ResyncEncryptedData();
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveRequestOldPassword) {
|
| - FailOnLoginSuccess();
|
| - ExpectPasswordChange();
|
| -
|
| - state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE);
|
| - state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone());
|
| - SetAttemptState(auth_.get(), state_.release());
|
| -
|
| - RunResolve(auth_.get());
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveDataRecover) {
|
| - ExpectLoginSuccess(username_,
|
| - password_,
|
| - cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername,
|
| - false);
|
| - FailOnLoginFailure();
|
| -
|
| - // Set up mock async method caller to respond successfully to a key migration.
|
| - mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_CALL(*mock_caller_, AsyncMigrateKey(username_, _, hash_ascii_, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_,
|
| - cryptohome::MOUNT_FLAGS_NONE, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone());
|
| - SetAttemptState(auth_.get(), state_.release());
|
| -
|
| - auth_->RecoverEncryptedData(std::string());
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveDataRecoverButFail) {
|
| - FailOnLoginSuccess();
|
| - ExpectPasswordChange();
|
| -
|
| - // Set up mock async method caller to fail a key migration attempt,
|
| - // asserting that the wrong password was used.
|
| - mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_KEY_FAILURE);
|
| - EXPECT_CALL(*mock_caller_, AsyncMigrateKey(username_, _, hash_ascii_, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - SetAttemptState(auth_.get(), state_.release());
|
| -
|
| - auth_->RecoverEncryptedData(std::string());
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, ResolveNoMountToFailedMount) {
|
| - // Set up state as though a cryptohome mount attempt has occurred
|
| - // and been rejected because the user doesn't exist.
|
| - state_->PresetCryptohomeStatus(false,
|
| - cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST);
|
| -
|
| - // When there is no online attempt and online results, NO_MOUNT will be
|
| - // resolved to FAILED_MOUNT.
|
| - EXPECT_EQ(ParallelAuthenticator::FAILED_MOUNT,
|
| - SetAndResolveState(auth_.get(), state_.release()));
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, ResolveCreateNew) {
|
| - // Set up state as though a cryptohome mount attempt has occurred
|
| - // and been rejected because the user doesn't exist; additionally,
|
| - // an online auth attempt has completed successfully.
|
| - state_->PresetCryptohomeStatus(false,
|
| - cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST);
|
| - state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone());
|
| -
|
| - EXPECT_EQ(ParallelAuthenticator::CREATE_NEW,
|
| - SetAndResolveState(auth_.get(), state_.release()));
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveCreateForNewUser) {
|
| - ExpectLoginSuccess(username_,
|
| - password_,
|
| - cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername,
|
| - false);
|
| - FailOnLoginFailure();
|
| -
|
| - // Set up mock async method caller to respond successfully to a cryptohome
|
| - // create attempt (indicated by the |CREATE_IF_MISSING| flag to AsyncMount).
|
| - mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_,
|
| - cryptohome::CREATE_IF_MISSING, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - // Set up state as though a cryptohome mount attempt has occurred
|
| - // and been rejected because the user doesn't exist; additionally,
|
| - // an online auth attempt has completed successfully.
|
| - state_->PresetCryptohomeStatus(false,
|
| - cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST);
|
| - state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone());
|
| - SetAttemptState(auth_.get(), state_.release());
|
| -
|
| - RunResolve(auth_.get());
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveOfflineLogin) {
|
| - ExpectLoginSuccess(username_, password_, username_hash_, false);
|
| - FailOnLoginFailure();
|
| -
|
| - // Set up state as though a cryptohome mount attempt has occurred and
|
| - // succeeded.
|
| - state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
|
| - SetAttemptState(auth_.get(), state_.release());
|
| -
|
| - RunResolve(auth_.get());
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveOnlineLogin) {
|
| - ExpectLoginSuccess(username_, password_, username_hash_, false);
|
| - FailOnLoginFailure();
|
| -
|
| - // Set up state as though a cryptohome mount attempt has occurred and
|
| - // succeeded.
|
| - state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
|
| - state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone());
|
| - SetAttemptState(auth_.get(), state_.release());
|
| -
|
| - RunResolve(auth_.get());
|
| -}
|
| -
|
| -TEST_F(ParallelAuthenticatorTest, DriveUnlock) {
|
| - ExpectLoginSuccess(username_, std::string(), std::string(), false);
|
| - FailOnLoginFailure();
|
| -
|
| - // Set up mock async method caller to respond successfully to a cryptohome
|
| - // key-check attempt.
|
| - mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE);
|
| - EXPECT_CALL(*mock_caller_, AsyncCheckKey(username_, _, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - auth_->AuthenticateToUnlock(UserContext(username_,
|
| - std::string(),
|
| - std::string()));
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|