OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/login/parallel_authenticator.h" | 5 #include "chrome/browser/chromeos/login/parallel_authenticator.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 using file_util::Delete; | 38 using file_util::Delete; |
39 using file_util::WriteFile; | 39 using file_util::WriteFile; |
40 using ::testing::AnyNumber; | 40 using ::testing::AnyNumber; |
41 using ::testing::DoAll; | 41 using ::testing::DoAll; |
42 using ::testing::Invoke; | 42 using ::testing::Invoke; |
43 using ::testing::Return; | 43 using ::testing::Return; |
44 using ::testing::SetArgumentPointee; | 44 using ::testing::SetArgumentPointee; |
45 using ::testing::_; | 45 using ::testing::_; |
46 | 46 |
47 namespace chromeos { | 47 namespace chromeos { |
| 48 |
48 class ResolveChecker : public base::ThreadTestHelper { | 49 class ResolveChecker : public base::ThreadTestHelper { |
49 public: | 50 public: |
50 ResolveChecker(TestAttemptState* state, | 51 ResolveChecker(TestAttemptState* state, |
51 ParallelAuthenticator* auth, | 52 ParallelAuthenticator* auth, |
52 ParallelAuthenticator::AuthState expected) | 53 ParallelAuthenticator::AuthState expected) |
53 : base::ThreadTestHelper( | 54 : base::ThreadTestHelper( |
54 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)), | 55 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)), |
55 state_(state), | 56 state_(state), |
56 auth_(auth), | 57 auth_(auth), |
57 expected_(expected) { | 58 expected_(expected) { |
58 } | 59 } |
59 ~ResolveChecker() {} | 60 ~ResolveChecker() {} |
60 | 61 |
61 virtual void RunTest() { | 62 virtual void RunTest() { |
62 auth_->set_attempt_state(state_); | 63 auth_->set_attempt_state(state_); |
63 set_test_result(expected_ == auth_->ResolveState()); | 64 set_test_result(expected_ == auth_->ResolveState()); |
64 } | 65 } |
65 | 66 |
66 private: | 67 private: |
67 TestAttemptState* state_; | 68 TestAttemptState* state_; |
68 ParallelAuthenticator* auth_; | 69 ParallelAuthenticator* auth_; |
69 ParallelAuthenticator::AuthState expected_; | 70 ParallelAuthenticator::AuthState expected_; |
70 }; | 71 }; |
71 | 72 |
| 73 class TestOnlineAttempt : public OnlineAttempt { |
| 74 public: |
| 75 TestOnlineAttempt(AuthAttemptState* state, |
| 76 AuthAttemptStateResolver* resolver) |
| 77 : OnlineAttempt(false, state, resolver) { |
| 78 } |
| 79 }; |
| 80 |
72 class ParallelAuthenticatorTest : public ::testing::Test { | 81 class ParallelAuthenticatorTest : public ::testing::Test { |
73 public: | 82 public: |
74 ParallelAuthenticatorTest() | 83 ParallelAuthenticatorTest() |
75 : message_loop_(MessageLoop::TYPE_UI), | 84 : message_loop_(MessageLoop::TYPE_UI), |
76 ui_thread_(BrowserThread::UI, &message_loop_), | 85 ui_thread_(BrowserThread::UI, &message_loop_), |
77 file_thread_(BrowserThread::FILE), | 86 file_thread_(BrowserThread::FILE), |
78 io_thread_(BrowserThread::IO), | 87 io_thread_(BrowserThread::IO), |
79 username_("me@nowhere.org"), | 88 username_("me@nowhere.org"), |
80 password_("fakepass") { | 89 password_("fakepass") { |
81 hash_ascii_.assign("0a010000000000a0"); | 90 hash_ascii_.assign("0a010000000000a0"); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 BrowserThread::PostTask( | 215 BrowserThread::PostTask( |
207 BrowserThread::IO, FROM_HERE, | 216 BrowserThread::IO, FROM_HERE, |
208 NewRunnableMethod(auth, &ParallelAuthenticator::Resolve)); | 217 NewRunnableMethod(auth, &ParallelAuthenticator::Resolve)); |
209 loop->Run(); | 218 loop->Run(); |
210 } | 219 } |
211 | 220 |
212 void SetAttemptState(ParallelAuthenticator* auth, TestAttemptState* state) { | 221 void SetAttemptState(ParallelAuthenticator* auth, TestAttemptState* state) { |
213 auth->set_attempt_state(state); | 222 auth->set_attempt_state(state); |
214 } | 223 } |
215 | 224 |
| 225 void FakeOnlineAttempt() { |
| 226 auth_->set_online_attempt(new TestOnlineAttempt(state_.get(), auth_.get())); |
| 227 } |
| 228 |
216 MessageLoop message_loop_; | 229 MessageLoop message_loop_; |
217 BrowserThread ui_thread_; | 230 BrowserThread ui_thread_; |
218 BrowserThread file_thread_; | 231 BrowserThread file_thread_; |
219 BrowserThread io_thread_; | 232 BrowserThread io_thread_; |
220 | 233 |
221 std::string username_; | 234 std::string username_; |
222 std::string password_; | 235 std::string password_; |
223 std::string hash_ascii_; | 236 std::string hash_ascii_; |
224 GaiaAuthConsumer::ClientLoginResult result_; | 237 GaiaAuthConsumer::ClientLoginResult result_; |
225 | 238 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 | 306 |
294 TEST_F(ParallelAuthenticatorTest, ResolveNothingDone) { | 307 TEST_F(ParallelAuthenticatorTest, ResolveNothingDone) { |
295 scoped_refptr<ResolveChecker> checker( | 308 scoped_refptr<ResolveChecker> checker( |
296 new ResolveChecker(state_.release(), | 309 new ResolveChecker(state_.release(), |
297 auth_.get(), | 310 auth_.get(), |
298 ParallelAuthenticator::CONTINUE)); | 311 ParallelAuthenticator::CONTINUE)); |
299 EXPECT_TRUE(checker->Run()); | 312 EXPECT_TRUE(checker->Run()); |
300 } | 313 } |
301 | 314 |
302 TEST_F(ParallelAuthenticatorTest, ResolvePossiblePwChange) { | 315 TEST_F(ParallelAuthenticatorTest, ResolvePossiblePwChange) { |
| 316 // Set a fake online attempt so that we return intermediate cryptohome state. |
| 317 FakeOnlineAttempt(); |
| 318 |
303 // Set up state as though a cryptohome mount attempt has occurred | 319 // Set up state as though a cryptohome mount attempt has occurred |
304 // and been rejected. | 320 // and been rejected. |
305 state_->PresetCryptohomeStatus(false, | 321 state_->PresetCryptohomeStatus(false, |
306 chromeos::kCryptohomeMountErrorKeyFailure); | 322 chromeos::kCryptohomeMountErrorKeyFailure); |
307 scoped_refptr<ResolveChecker> checker( | 323 scoped_refptr<ResolveChecker> checker( |
308 new ResolveChecker(state_.release(), | 324 new ResolveChecker(state_.release(), |
309 auth_.get(), | 325 auth_.get(), |
310 ParallelAuthenticator::POSSIBLE_PW_CHANGE)); | 326 ParallelAuthenticator::POSSIBLE_PW_CHANGE)); |
311 EXPECT_TRUE(checker->Run()); | 327 EXPECT_TRUE(checker->Run()); |
312 } | 328 } |
313 | 329 |
| 330 TEST_F(ParallelAuthenticatorTest, ResolvePossiblePwChangeToFailedMount) { |
| 331 // Set up state as though a cryptohome mount attempt has occurred |
| 332 // and been rejected. |
| 333 state_->PresetCryptohomeStatus(false, |
| 334 chromeos::kCryptohomeMountErrorKeyFailure); |
| 335 |
| 336 // When there is no online attempt and online results, POSSIBLE_PW_CHANGE |
| 337 // will be resolved to FAILED_MOUNT. |
| 338 scoped_refptr<ResolveChecker> checker( |
| 339 new ResolveChecker(state_.release(), |
| 340 auth_.get(), |
| 341 ParallelAuthenticator::FAILED_MOUNT)); |
| 342 EXPECT_TRUE(checker->Run()); |
| 343 } |
| 344 |
| 345 TEST_F(ParallelAuthenticatorTest, ResolveNeedOldPw) { |
| 346 // Set up state as though a cryptohome mount attempt has occurred |
| 347 // and been rejected because of unmatched key; additionally, |
| 348 // an online auth attempt has completed successfully. |
| 349 state_->PresetCryptohomeStatus( |
| 350 false, |
| 351 chromeos::kCryptohomeMountErrorKeyFailure); |
| 352 state_->PresetOnlineLoginStatus(GaiaAuthConsumer::ClientLoginResult(), |
| 353 LoginFailure::None()); |
| 354 scoped_refptr<ResolveChecker> checker( |
| 355 new ResolveChecker(state_.release(), |
| 356 auth_.get(), |
| 357 ParallelAuthenticator::NEED_OLD_PW)); |
| 358 EXPECT_TRUE(checker->Run()); |
| 359 } |
| 360 |
314 TEST_F(ParallelAuthenticatorTest, DriveFailedMount) { | 361 TEST_F(ParallelAuthenticatorTest, DriveFailedMount) { |
315 FailOnLoginSuccess(); | 362 FailOnLoginSuccess(); |
316 ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_CRYPTOHOME)); | 363 ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_CRYPTOHOME)); |
317 | 364 |
318 // Set up state as though a cryptohome mount attempt has occurred | 365 // Set up state as though a cryptohome mount attempt has occurred |
319 // and failed. | 366 // and failed. |
320 state_->PresetCryptohomeStatus(false, 0); | 367 state_->PresetCryptohomeStatus(false, 0); |
321 SetAttemptState(auth_, state_.release()); | 368 SetAttemptState(auth_, state_.release()); |
322 | 369 |
323 RunResolve(auth_.get(), &message_loop_); | 370 RunResolve(auth_.get(), &message_loop_); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 | 436 |
390 auth_->ResyncEncryptedData(result_); | 437 auth_->ResyncEncryptedData(result_); |
391 message_loop_.Run(); | 438 message_loop_.Run(); |
392 } | 439 } |
393 | 440 |
394 TEST_F(ParallelAuthenticatorTest, DriveRequestOldPassword) { | 441 TEST_F(ParallelAuthenticatorTest, DriveRequestOldPassword) { |
395 FailOnLoginSuccess(); | 442 FailOnLoginSuccess(); |
396 ExpectPasswordChange(); | 443 ExpectPasswordChange(); |
397 | 444 |
398 state_->PresetCryptohomeStatus(false, | 445 state_->PresetCryptohomeStatus(false, |
399 chromeos::kCryptohomeMountErrorKeyFailure); | 446 chromeos::kCryptohomeMountErrorKeyFailure); |
400 state_->PresetOnlineLoginStatus(result_, LoginFailure::None()); | 447 state_->PresetOnlineLoginStatus(result_, LoginFailure::None()); |
401 SetAttemptState(auth_, state_.release()); | 448 SetAttemptState(auth_, state_.release()); |
402 | 449 |
403 RunResolve(auth_.get(), &message_loop_); | 450 RunResolve(auth_.get(), &message_loop_); |
404 } | 451 } |
405 | 452 |
406 TEST_F(ParallelAuthenticatorTest, DriveDataRecover) { | 453 TEST_F(ParallelAuthenticatorTest, DriveDataRecover) { |
407 ExpectLoginSuccess(username_, password_, result_, false); | 454 ExpectLoginSuccess(username_, password_, result_, false); |
408 FailOnLoginFailure(); | 455 FailOnLoginFailure(); |
409 | 456 |
(...skipping 30 matching lines...) Expand all Loading... |
440 .WillOnce(Return(CryptohomeBlob(2, 0))) | 487 .WillOnce(Return(CryptohomeBlob(2, 0))) |
441 .RetiresOnSaturation(); | 488 .RetiresOnSaturation(); |
442 | 489 |
443 SetAttemptState(auth_, state_.release()); | 490 SetAttemptState(auth_, state_.release()); |
444 | 491 |
445 auth_->RecoverEncryptedData(std::string(), result_); | 492 auth_->RecoverEncryptedData(std::string(), result_); |
446 message_loop_.Run(); | 493 message_loop_.Run(); |
447 } | 494 } |
448 | 495 |
449 TEST_F(ParallelAuthenticatorTest, ResolveNoMount) { | 496 TEST_F(ParallelAuthenticatorTest, ResolveNoMount) { |
| 497 // Set a fake online attempt so that we return intermediate cryptohome state. |
| 498 FakeOnlineAttempt(); |
| 499 |
450 // Set up state as though a cryptohome mount attempt has occurred | 500 // Set up state as though a cryptohome mount attempt has occurred |
451 // and been rejected because the user doesn't exist. | 501 // and been rejected because the user doesn't exist. |
452 state_->PresetCryptohomeStatus( | 502 state_->PresetCryptohomeStatus( |
453 false, | 503 false, |
454 chromeos::kCryptohomeMountErrorUserDoesNotExist); | 504 chromeos::kCryptohomeMountErrorUserDoesNotExist); |
455 scoped_refptr<ResolveChecker> checker( | 505 scoped_refptr<ResolveChecker> checker( |
456 new ResolveChecker(state_.release(), | 506 new ResolveChecker(state_.release(), |
457 auth_.get(), | 507 auth_.get(), |
458 ParallelAuthenticator::NO_MOUNT)); | 508 ParallelAuthenticator::NO_MOUNT)); |
459 EXPECT_TRUE(checker->Run()); | 509 EXPECT_TRUE(checker->Run()); |
460 } | 510 } |
461 | 511 |
| 512 TEST_F(ParallelAuthenticatorTest, ResolveNoMountToFailedMount) { |
| 513 // Set up state as though a cryptohome mount attempt has occurred |
| 514 // and been rejected because the user doesn't exist. |
| 515 state_->PresetCryptohomeStatus( |
| 516 false, |
| 517 chromeos::kCryptohomeMountErrorUserDoesNotExist); |
| 518 |
| 519 // When there is no online attempt and online results, NO_MOUNT will be |
| 520 // resolved to FAILED_MOUNT. |
| 521 scoped_refptr<ResolveChecker> checker( |
| 522 new ResolveChecker(state_.release(), |
| 523 auth_.get(), |
| 524 ParallelAuthenticator::FAILED_MOUNT)); |
| 525 EXPECT_TRUE(checker->Run()); |
| 526 } |
| 527 |
462 TEST_F(ParallelAuthenticatorTest, ResolveCreateNew) { | 528 TEST_F(ParallelAuthenticatorTest, ResolveCreateNew) { |
463 // Set up state as though a cryptohome mount attempt has occurred | 529 // Set up state as though a cryptohome mount attempt has occurred |
464 // and been rejected because the user doesn't exist; additionally, | 530 // and been rejected because the user doesn't exist; additionally, |
465 // an online auth attempt has completed successfully. | 531 // an online auth attempt has completed successfully. |
466 state_->PresetCryptohomeStatus( | 532 state_->PresetCryptohomeStatus( |
467 false, | 533 false, |
468 chromeos::kCryptohomeMountErrorUserDoesNotExist); | 534 chromeos::kCryptohomeMountErrorUserDoesNotExist); |
469 state_->PresetOnlineLoginStatus(GaiaAuthConsumer::ClientLoginResult(), | 535 state_->PresetOnlineLoginStatus(GaiaAuthConsumer::ClientLoginResult(), |
470 LoginFailure::None()); | 536 LoginFailure::None()); |
471 scoped_refptr<ResolveChecker> checker( | 537 scoped_refptr<ResolveChecker> checker( |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
724 FilePath tmp_file_path = FakeLocalaccountFile(username_); | 790 FilePath tmp_file_path = FakeLocalaccountFile(username_); |
725 ReadLocalaccountFile(auth_.get(), tmp_file_path.BaseName().value()); | 791 ReadLocalaccountFile(auth_.get(), tmp_file_path.BaseName().value()); |
726 | 792 |
727 auth_->AuthenticateToUnlock(username_, ""); | 793 auth_->AuthenticateToUnlock(username_, ""); |
728 message_loop_.Run(); | 794 message_loop_.Run(); |
729 | 795 |
730 Delete(tmp_file_path, false); | 796 Delete(tmp_file_path, false); |
731 } | 797 } |
732 | 798 |
733 } // namespace chromeos | 799 } // namespace chromeos |
OLD | NEW |