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