1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be 3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file. 4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/parallel_authenticator.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <string> 8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <vector> 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/file_path.h" 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/file_util.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/message_loop.h" 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/path_service.h" 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_util.h" 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/stringprintf.h" 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/cros/mock_cryptohome_library.h" 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/cros/mock_library_loader.h" 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/mock_auth_response_handler.h" 20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/mock_login_status_consumer.h" 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/mock_url_fetchers.h" 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/test_attempt_state.h" 23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/chrome_paths.h" 244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/net/gaia/gaia_auth_fetcher_unittest.h" 25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/net/url_fetcher.h" 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/test/testing_profile.h" 27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/test/thread_test_helper.h" 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "googleurl/src/gurl.h" 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "net/base/net_errors.h" 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "net/url_request/url_request_status.h" 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "testing/gmock/include/gmock/gmock.h" 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "testing/gtest/include/gtest/gtest.h" 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing namespace file_util; 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing ::testing::AnyNumber; 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing ::testing::DoAll; 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing ::testing::Invoke; 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing ::testing::Return; 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing ::testing::SetArgumentPointee; 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing ::testing::_; 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace chromeos { 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ResolveChecker : public ThreadTestHelper { 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ResolveChecker(TestAttemptState* state, 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ParallelAuthenticator* auth, 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ParallelAuthenticator::AuthState expected) 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : ThreadTestHelper(BrowserThread::IO), 50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_(state), 51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_(auth), 52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick expected_(expected) { 53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~ResolveChecker() {} 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void RunTest() { 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->set_attempt_state(state_); 58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick set_test_result(expected_ == auth_->ResolveState()); 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private: 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TestAttemptState* state_; 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ParallelAuthenticator* auth_; 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ParallelAuthenticator::AuthState expected_; 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ParallelAuthenticatorTest : public ::testing::Test { 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ParallelAuthenticatorTest() 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : message_loop_(MessageLoop::TYPE_UI), 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ui_thread_(BrowserThread::UI, &message_loop_), 72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_thread_(BrowserThread::FILE), 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick io_thread_(BrowserThread::IO), 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch username_("me@nowhere.org"), 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch password_("fakepass") { 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick hash_ascii_.assign("0a010000000000a0"); 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick hash_ascii_.append(std::string(16, '0')); 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~ParallelAuthenticatorTest() {} 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void SetUp() { 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::CrosLibrary::TestApi* test_api = 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::CrosLibrary::Get()->GetTestApi(); 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick loader_ = new MockLibraryLoader(); 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ON_CALL(*loader_, Load(_)) 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillByDefault(Return(true)); 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*loader_, Load(_)) 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(AnyNumber()); 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick test_api->SetLibraryLoader(loader_, true); 93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_ = new MockCryptohomeLibrary(); 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick test_api->SetCryptohomeLibrary(mock_library_, true); 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_thread_.Start(); 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick io_thread_.Start(); 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_ = new ParallelAuthenticator(&consumer_); 100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch state_.reset(new TestAttemptState(username_, 101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch password_, 102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch hash_ascii_, 103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch "", 1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch "", 1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch false)); 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Tears down the test fixture. 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void TearDown() { 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Prevent bogus gMock leak check from firing. 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::CrosLibrary::TestApi* test_api = 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::CrosLibrary::Get()->GetTestApi(); 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick test_api->SetLibraryLoader(NULL, false); 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick test_api->SetCryptohomeLibrary(NULL, false); 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath PopulateTempFile(const char* data, int data_len) { 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath out; 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FILE* tmp_file = CreateAndOpenTemporaryFile(&out); 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(tmp_file, static_cast<FILE*>(NULL)); 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(WriteFile(out, data, data_len), data_len); 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(CloseFile(tmp_file)); 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return out; 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath FakeLocalaccountFile(const std::string& ascii) { 127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath exe_dir; 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath local_account_file; 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PathService::Get(base::DIR_EXE, &exe_dir); 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FILE* tmp_file = CreateAndOpenTemporaryFileInDir(exe_dir, 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &local_account_file); 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int ascii_len = ascii.length(); 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(tmp_file, static_cast<FILE*>(NULL)); 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(WriteFile(local_account_file, ascii.c_str(), ascii_len), 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ascii_len); 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(CloseFile(tmp_file)); 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return local_account_file; 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void ReadLocalaccountFile(ParallelAuthenticator* auth, 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& filename) { 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::FILE, FROM_HERE, 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewRunnableMethod(auth, 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &ParallelAuthenticator::LoadLocalaccount, 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick filename)); 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_thread_.Stop(); 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_thread_.Start(); 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Allow test to fail and exit gracefully, even if OnLoginFailure() 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // wasn't supposed to happen. 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void FailOnLoginFailure() { 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ON_CALL(consumer_, OnLoginFailure(_)) 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillByDefault(Invoke(MockConsumer::OnFailQuitAndFail)); 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Allow test to fail and exit gracefully, even if OnLoginSuccess() 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // wasn't supposed to happen. 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void FailOnLoginSuccess() { 161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ON_CALL(consumer_, OnLoginSuccess(_, _, _, _)) 162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillByDefault(Invoke(MockConsumer::OnSuccessQuitAndFail)); 163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Allow test to fail and exit gracefully, even if 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // OnOffTheRecordLoginSuccess() wasn't supposed to happen. 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void FailOnGuestLoginSuccess() { 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ON_CALL(consumer_, OnOffTheRecordLoginSuccess()) 169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillByDefault(Invoke(MockConsumer::OnGuestSuccessQuitAndFail)); 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void ExpectLoginFailure(const LoginFailure& failure) { 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(consumer_, OnLoginFailure(failure)) 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillOnce(Invoke(MockConsumer::OnFailQuit)) 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void ExpectLoginSuccess(const std::string& username, 179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& password, 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const GaiaAuthConsumer::ClientLoginResult& result, 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool pending) { 182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_CALL(consumer_, OnLoginSuccess(username, password, result, pending)) 183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillOnce(Invoke(MockConsumer::OnSuccessQuit)) 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void ExpectGuestLoginSuccess() { 188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(consumer_, OnOffTheRecordLoginSuccess()) 189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillOnce(Invoke(MockConsumer::OnGuestSuccessQuit)) 190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void ExpectPasswordChange() { 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(consumer_, OnPasswordChangeDetected(result_)) 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillOnce(Invoke(MockConsumer::OnMigrateQuit)) 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void RunResolve(ParallelAuthenticator* auth, MessageLoop* loop) { 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewRunnableMethod(auth, &ParallelAuthenticator::Resolve)); 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick loop->Run(); 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void SetAttemptState(ParallelAuthenticator* auth, TestAttemptState* state) { 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth->set_attempt_state(state); 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageLoop message_loop_; 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread ui_thread_; 212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread file_thread_; 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread io_thread_; 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string username_; 216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string password_; 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string hash_ascii_; 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GaiaAuthConsumer::ClientLoginResult result_; 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Mocks, destroyed by CrosLibrary class. 221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MockCryptohomeLibrary* mock_library_; 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MockLibraryLoader* loader_; 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MockConsumer consumer_; 225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<ParallelAuthenticator> auth_; 226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_ptr<TestAttemptState> state_; 227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 229731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, SaltToAscii) { 230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick unsigned char fake_salt[8] = { 0 }; 231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_salt[0] = 10; 232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_salt[1] = 1; 233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_salt[7] = 10 << 4; 234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<unsigned char> salt_v(fake_salt, fake_salt + sizeof(fake_salt)); 235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ON_CALL(*mock_library_, GetSystemSalt()) 237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillByDefault(Return(salt_v)); 238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, GetSystemSalt()) 239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("0a010000000000a0", auth_->SaltAsAscii()); 243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 245731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, ReadLocalaccount) { 246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath tmp_file_path = FakeLocalaccountFile(username_); 247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ReadLocalaccountFile(auth_.get(), tmp_file_path.BaseName().value()); 249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(auth_->localaccount_, username_); 250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Delete(tmp_file_path, false); 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 253731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, ReadLocalaccountTrailingWS) { 254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath tmp_file_path = 255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FakeLocalaccountFile(base::StringPrintf("%s\n", username_.c_str())); 256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ReadLocalaccountFile(auth_.get(), tmp_file_path.BaseName().value()); 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(auth_->localaccount_, username_); 259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Delete(tmp_file_path, false); 260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 262731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, ReadNoLocalaccount) { 263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath tmp_file_path = FakeLocalaccountFile(username_); 264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(Delete(tmp_file_path, false)); // Ensure non-existent file. 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ReadLocalaccountFile(auth_.get(), tmp_file_path.BaseName().value()); 267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(auth_->localaccount_, std::string()); 268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 270731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, OnLoginSuccess) { 271513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_CALL(consumer_, OnLoginSuccess(username_, password_, result_, false)) 272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->OnLoginSuccess(result_, false); 277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 279731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) { 280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(consumer_, OnPasswordChangeDetected(result_)) 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->OnPasswordChangeDetected(result_); 285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 287731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, ResolveNothingDone) { 288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<ResolveChecker> checker( 289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new ResolveChecker(state_.release(), 290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_.get(), 291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ParallelAuthenticator::CONTINUE)); 292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(checker->Run()); 293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 295731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, ResolvePossiblePwChange) { 296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred 297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // and been rejected. 298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus(false, 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::kCryptohomeMountErrorKeyFailure); 300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<ResolveChecker> checker( 301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new ResolveChecker(state_.release(), 302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_.get(), 303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ParallelAuthenticator::POSSIBLE_PW_CHANGE)); 304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(checker->Run()); 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 307731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveFailedMount) { 308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginSuccess(); 309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_CRYPTOHOME)); 310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred 312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // and failed. 313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus(false, 0); 314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 319731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveGuestLogin) { 320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectGuestLoginSuccess(); 321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to respond as though a tmpfs mount 324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // attempt has occurred and succeeded. 325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(true, 0); 326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncMountForBwsi(_)) 327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->LoginOffTheRecord(); 331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick message_loop_.Run(); 332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 334731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveGuestLoginButFail) { 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnGuestLoginSuccess(); 336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_TMPFS)); 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to respond as though a tmpfs mount 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // attempt has occurred and failed. 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(false, 0); 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncMountForBwsi(_)) 342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->LoginOffTheRecord(); 346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick message_loop_.Run(); 347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 349731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveDataResync) { 350513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, password_, result_, false); 351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to respond successfully to a cryptohome 354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // remove attempt and a cryptohome create attempt (specified by the |true| 355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // argument to AsyncMount). 356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(true, 0); 357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncRemove(username_, _)) 358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncMount(username_, hash_ascii_, true, _)) 361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetOnlineLoginStatus(result_, LoginFailure::None()); 365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->ResyncEncryptedData(result_); 368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick message_loop_.Run(); 369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 370731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 371731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveResyncFail) { 372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginSuccess(); 373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectLoginFailure(LoginFailure(LoginFailure::DATA_REMOVAL_FAILED)); 374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to fail a cryptohome remove attempt. 376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(false, 0); 377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncRemove(username_, _)) 378731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 379731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->ResyncEncryptedData(result_); 384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick message_loop_.Run(); 385731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 387731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveRequestOldPassword) { 388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginSuccess(); 389731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectPasswordChange(); 390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 391731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus(false, 392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::kCryptohomeMountErrorKeyFailure); 393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetOnlineLoginStatus(result_, LoginFailure::None()); 394731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 396731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 398731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 399731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveDataRecover) { 400513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, password_, result_, false); 401731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 403731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to respond successfully to a key migration. 404731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(true, 0); 405731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncMigrateKey(username_, _, hash_ascii_, _)) 406731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 408731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncMount(username_, hash_ascii_, false, _)) 409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 410731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, GetSystemSalt()) 412731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillOnce(Return(CryptohomeBlob(2, 0))) 413731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 415731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetOnlineLoginStatus(result_, LoginFailure::None()); 416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->RecoverEncryptedData(std::string(), result_); 419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick message_loop_.Run(); 420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 422731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveDataRecoverButFail) { 423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginSuccess(); 424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectPasswordChange(); 425731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 426731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to fail a key migration attempt, 427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // asserting that the wrong password was used. 428731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(false, chromeos::kCryptohomeMountErrorKeyFailure); 429731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncMigrateKey(username_, _, hash_ascii_, _)) 430731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 431731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, GetSystemSalt()) 433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillOnce(Return(CryptohomeBlob(2, 0))) 434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 437731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->RecoverEncryptedData(std::string(), result_); 439731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick message_loop_.Run(); 440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 442731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, ResolveNoMount) { 443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred 444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // and been rejected because the user doesn't exist. 445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus( 446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick false, 447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::kCryptohomeMountErrorUserDoesNotExist); 448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<ResolveChecker> checker( 449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new ResolveChecker(state_.release(), 450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_.get(), 451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ParallelAuthenticator::NO_MOUNT)); 452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(checker->Run()); 453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 455731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, ResolveCreateNew) { 456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred 457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // and been rejected because the user doesn't exist; additionally, 458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // an online auth attempt has completed successfully. 459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus( 460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick false, 461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::kCryptohomeMountErrorUserDoesNotExist); 462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetOnlineLoginStatus(GaiaAuthConsumer::ClientLoginResult(), 463731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LoginFailure::None()); 464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<ResolveChecker> checker( 465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new ResolveChecker(state_.release(), 466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_.get(), 467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ParallelAuthenticator::CREATE_NEW)); 468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(checker->Run()); 469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 471731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveCreateForNewUser) { 472513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, password_, result_, false); 473731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 474731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to respond successfully to a cryptohome 476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // create attempt (specified by the |true| argument to AsyncMount). 477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(true, 0); 478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncMount(username_, hash_ascii_, true, _)) 479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred 483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // and been rejected because the user doesn't exist; additionally, 484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // an online auth attempt has completed successfully. 485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus( 486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick false, 487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::kCryptohomeMountErrorUserDoesNotExist); 488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetOnlineLoginStatus(GaiaAuthConsumer::ClientLoginResult(), 489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LoginFailure::None()); 490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 495731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveOfflineLogin) { 496513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, password_, result_, false); 497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred and 500731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // succeeded. 501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus(true, 0); 502731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error = 503731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError::FromConnectionError(net::ERR_CONNECTION_RESET); 504731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetOnlineLoginStatus(result_, 505731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LoginFailure::FromNetworkAuthFailure(error)); 506731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 507731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 508731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 509731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 510731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 511731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveOfflineLoginDelayedOnline) { 512513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, password_, result_, true); 513731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 514731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 515731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred and 516731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // succeeded. 517731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus(true, 0); 518731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // state_ is released further down. 519731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.get()); 520731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 521731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 522731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Offline login has completed, so now we "complete" the online request. 523731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error( 524731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 525731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); 526731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_.release()->PresetOnlineLoginStatus(result_, failure); 527731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectLoginFailure(failure); 528731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 532731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveOfflineLoginGetNewPassword) { 533513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, password_, result_, true); 534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to respond successfully to a key migration. 537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(true, 0); 5384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch EXPECT_CALL(*mock_library_, AsyncMigrateKey(username_, 5394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch state_->ascii_hash, 5404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch _, 5414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch _)) 542731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 543731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 544731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, GetSystemSalt()) 545731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillOnce(Return(CryptohomeBlob(2, 0))) 546731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 547731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 548731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred and 549731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // succeeded; also, an online request that never made it. 550731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus(true, 0); 551731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // state_ is released further down. 552731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.get()); 553731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 554731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 555731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Offline login has completed, so now we "complete" the online request. 556731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error( 557731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 558731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); 559731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_.release()->PresetOnlineLoginStatus(result_, failure); 560731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectLoginFailure(failure); 561731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 562731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 563731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // After the request below completes, OnLoginSuccess gets called again. 565513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, password_, result_, false); 566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MockFactory<SuccessFetcher> factory; 568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick URLFetcher::set_factory(&factory); 569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TestingProfile profile; 570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 571731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->RetryAuth(&profile, 572731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick username_, 573731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string(), 574731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string(), 575731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string()); 576731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick message_loop_.Run(); 577731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 578731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 57972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ParallelAuthenticatorTest, DriveOfflineLoginGetCaptchad) { 58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExpectLoginSuccess(username_, password_, result_, true); 58172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FailOnLoginFailure(); 58272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(*mock_library_, GetSystemSalt()) 58372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen .WillOnce(Return(CryptohomeBlob(2, 0))) 58472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen .RetiresOnSaturation(); 58572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 58672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Set up state as though a cryptohome mount attempt has occurred and 58772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // succeeded; also, an online request that never made it. 58872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen state_->PresetCryptohomeStatus(true, 0); 58972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // state_ is released further down. 59072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetAttemptState(auth_, state_.get()); 59172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RunResolve(auth_.get(), &message_loop_); 59272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 59372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Offline login has completed, so now we "complete" the online request. 59472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GoogleServiceAuthError error( 59572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 59672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); 59772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen state_.release()->PresetOnlineLoginStatus(result_, failure); 59872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExpectLoginFailure(failure); 59972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 60072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RunResolve(auth_.get(), &message_loop_); 60172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 60272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // After the request below completes, OnLoginSuccess gets called again. 60372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen failure = LoginFailure::FromNetworkAuthFailure( 60472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GoogleServiceAuthError::FromCaptchaChallenge( 60572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CaptchaFetcher::GetCaptchaToken(), 60672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL(CaptchaFetcher::GetCaptchaUrl()), 60772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL(CaptchaFetcher::GetUnlockUrl()))); 60872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExpectLoginFailure(failure); 60972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 61072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockFactory<CaptchaFetcher> factory; 61172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen URLFetcher::set_factory(&factory); 61272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TestingProfile profile; 61372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 61472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen auth_->RetryAuth(&profile, 61572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen username_, 61672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string(), 61772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string(), 61872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string()); 61972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen message_loop_.Run(); 62072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 62172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 622731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveOnlineLogin) { 623731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GaiaAuthConsumer::ClientLoginResult success("sid", "lsid", "", ""); 624513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, password_, success, false); 625731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 626731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 627731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred and 628731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // succeeded. 629731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus(true, 0); 630731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetOnlineLoginStatus(success, LoginFailure::None()); 631731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 632731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 633731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 634731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 635731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 636731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveNeedNewPassword) { 637731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginSuccess(); // Set failing on success as the default... 638731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // ...but expect ONE successful login first. 639513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, password_, result_, true); 640731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error( 641731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); 643731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectLoginFailure(failure); 644731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 645731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up state as though a cryptohome mount attempt has occurred and 646731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // succeeded. 647731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus(true, 0); 648731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetOnlineLoginStatus(result_, failure); 649731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 652731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 653731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 654731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveLocalLogin) { 655731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExpectGuestLoginSuccess(); 656731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 657731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 658731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to respond as though a tmpfs mount 659731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // attempt has occurred and succeeded. 660731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(true, 0); 661731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncMountForBwsi(_)) 662731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 663731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 664731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 665731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Pre-set test state as though an online login attempt failed to complete, 666731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // and that a cryptohome mount attempt failed because the user doesn't exist. 667731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error = 668731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError::FromConnectionError(net::ERR_CONNECTION_RESET); 669731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LoginFailure failure = 670731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LoginFailure::FromNetworkAuthFailure(error); 671731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetOnlineLoginStatus(result_, failure); 672731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_->PresetCryptohomeStatus( 673731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick false, 674731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::kCryptohomeMountErrorUserDoesNotExist); 675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetAttemptState(auth_, state_.release()); 676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Deal with getting the localaccount file 678731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath tmp_file_path = FakeLocalaccountFile(username_); 679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ReadLocalaccountFile(auth_.get(), tmp_file_path.BaseName().value()); 680731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 681731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RunResolve(auth_.get(), &message_loop_); 682731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Delete(tmp_file_path, false); 684731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 685731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 686731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveUnlock) { 687513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, std::string(), result_, false); 688731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 689731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 690731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to respond successfully to a cryptohome 691731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // key-check attempt. 692731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(true, 0); 693731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncCheckKey(username_, _, _)) 694731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 695731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, GetSystemSalt()) 697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillOnce(Return(CryptohomeBlob(2, 0))) 698731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 699731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 700731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->AuthenticateToUnlock(username_, ""); 701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick message_loop_.Run(); 702731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 703731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 704731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(ParallelAuthenticatorTest, DriveLocalUnlock) { 705513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExpectLoginSuccess(username_, std::string(), result_, false); 706731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FailOnLoginFailure(); 707731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 708731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set up mock cryptohome library to fail a cryptohome key-check 709731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // attempt. 710731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_library_->SetUp(false, 0); 711731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, AsyncCheckKey(username_, _, _)) 712731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .Times(1) 713731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 714731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*mock_library_, GetSystemSalt()) 715731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .WillOnce(Return(CryptohomeBlob(2, 0))) 716731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .RetiresOnSaturation(); 717731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 718731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Deal with getting the localaccount file 719731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath tmp_file_path = FakeLocalaccountFile(username_); 720731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ReadLocalaccountFile(auth_.get(), tmp_file_path.BaseName().value()); 721731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 722731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick auth_->AuthenticateToUnlock(username_, ""); 723731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick message_loop_.Run(); 724731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 725731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Delete(tmp_file_path, false); 726731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 727731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 728731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace chromeos 729