| OLD | NEW | 
|    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2012 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  |    8  | 
|    9 #include "base/file_util.h" |    9 #include "base/file_util.h" | 
|   10 #include "base/files/file_path.h" |   10 #include "base/files/file_path.h" | 
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  227  |  227  | 
|  228 TEST_F(ParallelAuthenticatorTest, OnLoginSuccess) { |  228 TEST_F(ParallelAuthenticatorTest, OnLoginSuccess) { | 
|  229   EXPECT_CALL(consumer_, OnLoginSuccess(UserContext(username_, |  229   EXPECT_CALL(consumer_, OnLoginSuccess(UserContext(username_, | 
|  230                                                     password_, |  230                                                     password_, | 
|  231                                                     std::string(), |  231                                                     std::string(), | 
|  232                                                     username_hash_), |  232                                                     username_hash_), | 
|  233                                         false, false)) |  233                                         false, false)) | 
|  234       .Times(1) |  234       .Times(1) | 
|  235       .RetiresOnSaturation(); |  235       .RetiresOnSaturation(); | 
|  236  |  236  | 
|  237   SetAttemptState(auth_, state_.release()); |  237   SetAttemptState(auth_.get(), state_.release()); | 
|  238   auth_->OnLoginSuccess(false); |  238   auth_->OnLoginSuccess(false); | 
|  239 } |  239 } | 
|  240  |  240  | 
|  241 TEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) { |  241 TEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) { | 
|  242   EXPECT_CALL(consumer_, OnPasswordChangeDetected()) |  242   EXPECT_CALL(consumer_, OnPasswordChangeDetected()) | 
|  243       .Times(1) |  243       .Times(1) | 
|  244       .RetiresOnSaturation(); |  244       .RetiresOnSaturation(); | 
|  245   SetAttemptState(auth_, state_.release()); |  245   SetAttemptState(auth_.get(), state_.release()); | 
|  246   auth_->OnPasswordChangeDetected(); |  246   auth_->OnPasswordChangeDetected(); | 
|  247 } |  247 } | 
|  248  |  248  | 
|  249 TEST_F(ParallelAuthenticatorTest, ResolveNothingDone) { |  249 TEST_F(ParallelAuthenticatorTest, ResolveNothingDone) { | 
|  250   EXPECT_EQ(ParallelAuthenticator::CONTINUE, |  250   EXPECT_EQ(ParallelAuthenticator::CONTINUE, | 
|  251             SetAndResolveState(auth_, state_.release())); |  251             SetAndResolveState(auth_.get(), state_.release())); | 
|  252 } |  252 } | 
|  253  |  253  | 
|  254 TEST_F(ParallelAuthenticatorTest, ResolvePossiblePwChange) { |  254 TEST_F(ParallelAuthenticatorTest, ResolvePossiblePwChange) { | 
|  255   // Set a fake online attempt so that we return intermediate cryptohome state. |  255   // Set a fake online attempt so that we return intermediate cryptohome state. | 
|  256   FakeOnlineAttempt(); |  256   FakeOnlineAttempt(); | 
|  257  |  257  | 
|  258   // Set up state as though a cryptohome mount attempt has occurred |  258   // Set up state as though a cryptohome mount attempt has occurred | 
|  259   // and been rejected. |  259   // and been rejected. | 
|  260   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); |  260   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); | 
|  261  |  261  | 
|  262   EXPECT_EQ(ParallelAuthenticator::POSSIBLE_PW_CHANGE, |  262   EXPECT_EQ(ParallelAuthenticator::POSSIBLE_PW_CHANGE, | 
|  263             SetAndResolveState(auth_, state_.release())); |  263             SetAndResolveState(auth_.get(), state_.release())); | 
|  264 } |  264 } | 
|  265  |  265  | 
|  266 TEST_F(ParallelAuthenticatorTest, ResolvePossiblePwChangeToFailedMount) { |  266 TEST_F(ParallelAuthenticatorTest, ResolvePossiblePwChangeToFailedMount) { | 
|  267   // Set up state as though a cryptohome mount attempt has occurred |  267   // Set up state as though a cryptohome mount attempt has occurred | 
|  268   // and been rejected. |  268   // and been rejected. | 
|  269   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); |  269   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); | 
|  270  |  270  | 
|  271   // When there is no online attempt and online results, POSSIBLE_PW_CHANGE |  271   // When there is no online attempt and online results, POSSIBLE_PW_CHANGE | 
|  272   EXPECT_EQ(ParallelAuthenticator::FAILED_MOUNT, |  272   EXPECT_EQ(ParallelAuthenticator::FAILED_MOUNT, | 
|  273             SetAndResolveState(auth_, state_.release())); |  273             SetAndResolveState(auth_.get(), state_.release())); | 
|  274 } |  274 } | 
|  275  |  275  | 
|  276 TEST_F(ParallelAuthenticatorTest, ResolveNeedOldPw) { |  276 TEST_F(ParallelAuthenticatorTest, ResolveNeedOldPw) { | 
|  277   // Set up state as though a cryptohome mount attempt has occurred |  277   // Set up state as though a cryptohome mount attempt has occurred | 
|  278   // and been rejected because of unmatched key; additionally, |  278   // and been rejected because of unmatched key; additionally, | 
|  279   // an online auth attempt has completed successfully. |  279   // an online auth attempt has completed successfully. | 
|  280   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); |  280   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); | 
|  281   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |  281   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 
|  282  |  282  | 
|  283   EXPECT_EQ(ParallelAuthenticator::NEED_OLD_PW, |  283   EXPECT_EQ(ParallelAuthenticator::NEED_OLD_PW, | 
|  284             SetAndResolveState(auth_, state_.release())); |  284             SetAndResolveState(auth_.get(), state_.release())); | 
|  285 } |  285 } | 
|  286  |  286  | 
|  287 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededDirectFailedMount) { |  287 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededDirectFailedMount) { | 
|  288   // Set up state as though a cryptohome mount attempt has occurred |  288   // Set up state as though a cryptohome mount attempt has occurred | 
|  289   // and succeeded but we are in safe mode and the current user is not owner. |  289   // and succeeded but we are in safe mode and the current user is not owner. | 
|  290   // This is a high level test to verify the proper transitioning in this mode |  290   // This is a high level test to verify the proper transitioning in this mode | 
|  291   // only. It is not testing that we properly verify that the user is an owner |  291   // only. It is not testing that we properly verify that the user is an owner | 
|  292   // or that we really are in "safe-mode". |  292   // or that we really are in "safe-mode". | 
|  293   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  293   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  294   SetOwnerState(true, false); |  294   SetOwnerState(true, false); | 
|  295  |  295  | 
|  296   EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED, |  296   EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED, | 
|  297             SetAndResolveState(auth_, state_.release())); |  297             SetAndResolveState(auth_.get(), state_.release())); | 
|  298 } |  298 } | 
|  299  |  299  | 
|  300 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededMount) { |  300 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededMount) { | 
|  301   // Set up state as though a cryptohome mount attempt has occurred |  301   // Set up state as though a cryptohome mount attempt has occurred | 
|  302   // and succeeded but we are in safe mode and the current user is not owner. |  302   // and succeeded but we are in safe mode and the current user is not owner. | 
|  303   // This test will check that the "safe-mode" policy is not set and will let |  303   // This test will check that the "safe-mode" policy is not set and will let | 
|  304   // the mount finish successfully. |  304   // the mount finish successfully. | 
|  305   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  305   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  306   SetOwnerState(false, false); |  306   SetOwnerState(false, false); | 
|  307   // and test that the mount has succeeded. |  307   // and test that the mount has succeeded. | 
|  308   state_.reset(new TestAttemptState(UserContext(username_, |  308   state_.reset(new TestAttemptState(UserContext(username_, | 
|  309                                                 password_, |  309                                                 password_, | 
|  310                                                 std::string()), |  310                                                 std::string()), | 
|  311                                     hash_ascii_, |  311                                     hash_ascii_, | 
|  312                                     "", |  312                                     "", | 
|  313                                     "", |  313                                     "", | 
|  314                                     User::USER_TYPE_REGULAR, |  314                                     User::USER_TYPE_REGULAR, | 
|  315                                     false)); |  315                                     false)); | 
|  316   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  316   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  317   EXPECT_EQ(ParallelAuthenticator::OFFLINE_LOGIN, |  317   EXPECT_EQ(ParallelAuthenticator::OFFLINE_LOGIN, | 
|  318             SetAndResolveState(auth_, state_.release())); |  318             SetAndResolveState(auth_.get(), state_.release())); | 
|  319 } |  319 } | 
|  320  |  320  | 
|  321 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededFailedMount) { |  321 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededFailedMount) { | 
|  322   FailOnLoginSuccess();  // Set failing on success as the default... |  322   FailOnLoginSuccess();  // Set failing on success as the default... | 
|  323   LoginFailure failure = LoginFailure(LoginFailure::OWNER_REQUIRED); |  323   LoginFailure failure = LoginFailure(LoginFailure::OWNER_REQUIRED); | 
|  324   ExpectLoginFailure(failure); |  324   ExpectLoginFailure(failure); | 
|  325  |  325  | 
|  326   MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager = |  326   MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager = | 
|  327       new MockDBusThreadManagerWithoutGMock; |  327       new MockDBusThreadManagerWithoutGMock; | 
|  328   DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager); |  328   DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
|  339   // Remove the real DeviceSettingsProvider and replace it with a stub. |  339   // Remove the real DeviceSettingsProvider and replace it with a stub. | 
|  340   device_settings_provider = |  340   device_settings_provider = | 
|  341       CrosSettings::Get()->GetProvider(chromeos::kReportDeviceVersionInfo); |  341       CrosSettings::Get()->GetProvider(chromeos::kReportDeviceVersionInfo); | 
|  342   EXPECT_TRUE(device_settings_provider != NULL); |  342   EXPECT_TRUE(device_settings_provider != NULL); | 
|  343   EXPECT_TRUE( |  343   EXPECT_TRUE( | 
|  344       CrosSettings::Get()->RemoveSettingsProvider(device_settings_provider)); |  344       CrosSettings::Get()->RemoveSettingsProvider(device_settings_provider)); | 
|  345   CrosSettings::Get()->AddSettingsProvider(&stub_settings_provider); |  345   CrosSettings::Get()->AddSettingsProvider(&stub_settings_provider); | 
|  346   CrosSettings::Get()->SetBoolean(kPolicyMissingMitigationMode, true); |  346   CrosSettings::Get()->SetBoolean(kPolicyMissingMitigationMode, true); | 
|  347  |  347  | 
|  348   EXPECT_EQ(ParallelAuthenticator::CONTINUE, |  348   EXPECT_EQ(ParallelAuthenticator::CONTINUE, | 
|  349             SetAndResolveState(auth_, state_.release())); |  349             SetAndResolveState(auth_.get(), state_.release())); | 
|  350   // Let the owner verification run. |  350   // Let the owner verification run. | 
|  351   device_settings_test_helper_.Flush(); |  351   device_settings_test_helper_.Flush(); | 
|  352   // and test that the mount has succeeded. |  352   // and test that the mount has succeeded. | 
|  353   state_.reset(new TestAttemptState(UserContext(username_, |  353   state_.reset(new TestAttemptState(UserContext(username_, | 
|  354                                                 password_, |  354                                                 password_, | 
|  355                                                 std::string()), |  355                                                 std::string()), | 
|  356                                     hash_ascii_, |  356                                     hash_ascii_, | 
|  357                                     "", |  357                                     "", | 
|  358                                     "", |  358                                     "", | 
|  359                                     User::USER_TYPE_REGULAR, |  359                                     User::USER_TYPE_REGULAR, | 
|  360                                     false)); |  360                                     false)); | 
|  361   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  361   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  362   EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED, |  362   EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED, | 
|  363             SetAndResolveState(auth_, state_.release())); |  363             SetAndResolveState(auth_.get(), state_.release())); | 
|  364  |  364  | 
|  365   EXPECT_TRUE( |  365   EXPECT_TRUE( | 
|  366       CrosSettings::Get()->RemoveSettingsProvider(&stub_settings_provider)); |  366       CrosSettings::Get()->RemoveSettingsProvider(&stub_settings_provider)); | 
|  367   CrosSettings::Get()->AddSettingsProvider(device_settings_provider); |  367   CrosSettings::Get()->AddSettingsProvider(device_settings_provider); | 
|  368   DBusThreadManager::Get()->Shutdown(); |  368   DBusThreadManager::Get()->Shutdown(); | 
|  369 } |  369 } | 
|  370  |  370  | 
|  371 TEST_F(ParallelAuthenticatorTest, DriveFailedMount) { |  371 TEST_F(ParallelAuthenticatorTest, DriveFailedMount) { | 
|  372   FailOnLoginSuccess(); |  372   FailOnLoginSuccess(); | 
|  373   ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_CRYPTOHOME)); |  373   ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_CRYPTOHOME)); | 
|  374  |  374  | 
|  375   // Set up state as though a cryptohome mount attempt has occurred |  375   // Set up state as though a cryptohome mount attempt has occurred | 
|  376   // and failed. |  376   // and failed. | 
|  377   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_NONE); |  377   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_NONE); | 
|  378   SetAttemptState(auth_, state_.release()); |  378   SetAttemptState(auth_.get(), state_.release()); | 
|  379  |  379  | 
|  380   RunResolve(auth_.get()); |  380   RunResolve(auth_.get()); | 
|  381 } |  381 } | 
|  382  |  382  | 
|  383 TEST_F(ParallelAuthenticatorTest, DriveGuestLogin) { |  383 TEST_F(ParallelAuthenticatorTest, DriveGuestLogin) { | 
|  384   ExpectGuestLoginSuccess(); |  384   ExpectGuestLoginSuccess(); | 
|  385   FailOnLoginFailure(); |  385   FailOnLoginFailure(); | 
|  386  |  386  | 
|  387   // Set up mock cryptohome library to respond as though a tmpfs mount |  387   // Set up mock cryptohome library to respond as though a tmpfs mount | 
|  388   // attempt has occurred and succeeded. |  388   // attempt has occurred and succeeded. | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  456       .RetiresOnSaturation(); |  456       .RetiresOnSaturation(); | 
|  457   EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_, |  457   EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_, | 
|  458                                         cryptohome::CREATE_IF_MISSING, _)) |  458                                         cryptohome::CREATE_IF_MISSING, _)) | 
|  459       .Times(1) |  459       .Times(1) | 
|  460       .RetiresOnSaturation(); |  460       .RetiresOnSaturation(); | 
|  461   EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _)) |  461   EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _)) | 
|  462       .Times(1) |  462       .Times(1) | 
|  463       .RetiresOnSaturation(); |  463       .RetiresOnSaturation(); | 
|  464  |  464  | 
|  465   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |  465   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 
|  466   SetAttemptState(auth_, state_.release()); |  466   SetAttemptState(auth_.get(), state_.release()); | 
|  467  |  467  | 
|  468   auth_->ResyncEncryptedData(); |  468   auth_->ResyncEncryptedData(); | 
|  469   message_loop_.Run(); |  469   message_loop_.Run(); | 
|  470 } |  470 } | 
|  471  |  471  | 
|  472 TEST_F(ParallelAuthenticatorTest, DriveResyncFail) { |  472 TEST_F(ParallelAuthenticatorTest, DriveResyncFail) { | 
|  473   FailOnLoginSuccess(); |  473   FailOnLoginSuccess(); | 
|  474   ExpectLoginFailure(LoginFailure(LoginFailure::DATA_REMOVAL_FAILED)); |  474   ExpectLoginFailure(LoginFailure(LoginFailure::DATA_REMOVAL_FAILED)); | 
|  475  |  475  | 
|  476   // Set up mock cryptohome library to fail a cryptohome remove attempt. |  476   // Set up mock cryptohome library to fail a cryptohome remove attempt. | 
|  477   mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_NONE); |  477   mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_NONE); | 
|  478   EXPECT_CALL(*mock_caller_, AsyncRemove(username_, _)) |  478   EXPECT_CALL(*mock_caller_, AsyncRemove(username_, _)) | 
|  479       .Times(1) |  479       .Times(1) | 
|  480       .RetiresOnSaturation(); |  480       .RetiresOnSaturation(); | 
|  481  |  481  | 
|  482   SetAttemptState(auth_, state_.release()); |  482   SetAttemptState(auth_.get(), state_.release()); | 
|  483  |  483  | 
|  484   auth_->ResyncEncryptedData(); |  484   auth_->ResyncEncryptedData(); | 
|  485   message_loop_.Run(); |  485   message_loop_.Run(); | 
|  486 } |  486 } | 
|  487  |  487  | 
|  488 TEST_F(ParallelAuthenticatorTest, DriveRequestOldPassword) { |  488 TEST_F(ParallelAuthenticatorTest, DriveRequestOldPassword) { | 
|  489   FailOnLoginSuccess(); |  489   FailOnLoginSuccess(); | 
|  490   ExpectPasswordChange(); |  490   ExpectPasswordChange(); | 
|  491  |  491  | 
|  492   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); |  492   state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); | 
|  493   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |  493   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 
|  494   SetAttemptState(auth_, state_.release()); |  494   SetAttemptState(auth_.get(), state_.release()); | 
|  495  |  495  | 
|  496   RunResolve(auth_.get()); |  496   RunResolve(auth_.get()); | 
|  497 } |  497 } | 
|  498  |  498  | 
|  499 TEST_F(ParallelAuthenticatorTest, DriveDataRecover) { |  499 TEST_F(ParallelAuthenticatorTest, DriveDataRecover) { | 
|  500   ExpectLoginSuccess(username_, |  500   ExpectLoginSuccess(username_, | 
|  501                      password_, |  501                      password_, | 
|  502                      cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername, |  502                      cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername, | 
|  503                      false); |  503                      false); | 
|  504   FailOnLoginFailure(); |  504   FailOnLoginFailure(); | 
|  505  |  505  | 
|  506   // Set up mock cryptohome library to respond successfully to a key migration. |  506   // Set up mock cryptohome library to respond successfully to a key migration. | 
|  507   mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |  507   mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 
|  508   EXPECT_CALL(*mock_caller_, AsyncMigrateKey(username_, _, hash_ascii_, _)) |  508   EXPECT_CALL(*mock_caller_, AsyncMigrateKey(username_, _, hash_ascii_, _)) | 
|  509       .Times(1) |  509       .Times(1) | 
|  510       .RetiresOnSaturation(); |  510       .RetiresOnSaturation(); | 
|  511   EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_, |  511   EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_, | 
|  512                                         cryptohome::MOUNT_FLAGS_NONE, _)) |  512                                         cryptohome::MOUNT_FLAGS_NONE, _)) | 
|  513       .Times(1) |  513       .Times(1) | 
|  514       .RetiresOnSaturation(); |  514       .RetiresOnSaturation(); | 
|  515   EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _)) |  515   EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _)) | 
|  516         .Times(1) |  516         .Times(1) | 
|  517         .RetiresOnSaturation(); |  517         .RetiresOnSaturation(); | 
|  518   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) |  518   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) | 
|  519       .WillOnce(Return(std::string())) |  519       .WillOnce(Return(std::string())) | 
|  520       .RetiresOnSaturation(); |  520       .RetiresOnSaturation(); | 
|  521  |  521  | 
|  522   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |  522   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 
|  523   SetAttemptState(auth_, state_.release()); |  523   SetAttemptState(auth_.get(), state_.release()); | 
|  524  |  524  | 
|  525   auth_->RecoverEncryptedData(std::string()); |  525   auth_->RecoverEncryptedData(std::string()); | 
|  526   message_loop_.Run(); |  526   message_loop_.Run(); | 
|  527 } |  527 } | 
|  528  |  528  | 
|  529 TEST_F(ParallelAuthenticatorTest, DriveDataRecoverButFail) { |  529 TEST_F(ParallelAuthenticatorTest, DriveDataRecoverButFail) { | 
|  530   FailOnLoginSuccess(); |  530   FailOnLoginSuccess(); | 
|  531   ExpectPasswordChange(); |  531   ExpectPasswordChange(); | 
|  532  |  532  | 
|  533   // Set up mock cryptohome library to fail a key migration attempt, |  533   // Set up mock cryptohome library to fail a key migration attempt, | 
|  534   // asserting that the wrong password was used. |  534   // asserting that the wrong password was used. | 
|  535   mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); |  535   mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); | 
|  536   EXPECT_CALL(*mock_caller_, AsyncMigrateKey(username_, _, hash_ascii_, _)) |  536   EXPECT_CALL(*mock_caller_, AsyncMigrateKey(username_, _, hash_ascii_, _)) | 
|  537       .Times(1) |  537       .Times(1) | 
|  538       .RetiresOnSaturation(); |  538       .RetiresOnSaturation(); | 
|  539   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) |  539   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) | 
|  540       .WillOnce(Return(std::string())) |  540       .WillOnce(Return(std::string())) | 
|  541       .RetiresOnSaturation(); |  541       .RetiresOnSaturation(); | 
|  542  |  542  | 
|  543   SetAttemptState(auth_, state_.release()); |  543   SetAttemptState(auth_.get(), state_.release()); | 
|  544  |  544  | 
|  545   auth_->RecoverEncryptedData(std::string()); |  545   auth_->RecoverEncryptedData(std::string()); | 
|  546   message_loop_.Run(); |  546   message_loop_.Run(); | 
|  547 } |  547 } | 
|  548  |  548  | 
|  549 TEST_F(ParallelAuthenticatorTest, ResolveNoMount) { |  549 TEST_F(ParallelAuthenticatorTest, ResolveNoMount) { | 
|  550   // Set a fake online attempt so that we return intermediate cryptohome state. |  550   // Set a fake online attempt so that we return intermediate cryptohome state. | 
|  551   FakeOnlineAttempt(); |  551   FakeOnlineAttempt(); | 
|  552  |  552  | 
|  553   // Set up state as though a cryptohome mount attempt has occurred |  553   // Set up state as though a cryptohome mount attempt has occurred | 
|  554   // and been rejected because the user doesn't exist. |  554   // and been rejected because the user doesn't exist. | 
|  555   state_->PresetCryptohomeStatus(false, |  555   state_->PresetCryptohomeStatus(false, | 
|  556                                  cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); |  556                                  cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); | 
|  557  |  557  | 
|  558   EXPECT_EQ(ParallelAuthenticator::NO_MOUNT, |  558   EXPECT_EQ(ParallelAuthenticator::NO_MOUNT, | 
|  559             SetAndResolveState(auth_, state_.release())); |  559             SetAndResolveState(auth_.get(), state_.release())); | 
|  560 } |  560 } | 
|  561  |  561  | 
|  562 TEST_F(ParallelAuthenticatorTest, ResolveNoMountToFailedMount) { |  562 TEST_F(ParallelAuthenticatorTest, ResolveNoMountToFailedMount) { | 
|  563   // Set up state as though a cryptohome mount attempt has occurred |  563   // Set up state as though a cryptohome mount attempt has occurred | 
|  564   // and been rejected because the user doesn't exist. |  564   // and been rejected because the user doesn't exist. | 
|  565   state_->PresetCryptohomeStatus(false, |  565   state_->PresetCryptohomeStatus(false, | 
|  566                                  cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); |  566                                  cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); | 
|  567  |  567  | 
|  568   // When there is no online attempt and online results, NO_MOUNT will be |  568   // When there is no online attempt and online results, NO_MOUNT will be | 
|  569   // resolved to FAILED_MOUNT. |  569   // resolved to FAILED_MOUNT. | 
|  570   EXPECT_EQ(ParallelAuthenticator::FAILED_MOUNT, |  570   EXPECT_EQ(ParallelAuthenticator::FAILED_MOUNT, | 
|  571             SetAndResolveState(auth_, state_.release())); |  571             SetAndResolveState(auth_.get(), state_.release())); | 
|  572 } |  572 } | 
|  573  |  573  | 
|  574 TEST_F(ParallelAuthenticatorTest, ResolveCreateNew) { |  574 TEST_F(ParallelAuthenticatorTest, ResolveCreateNew) { | 
|  575   // Set up state as though a cryptohome mount attempt has occurred |  575   // Set up state as though a cryptohome mount attempt has occurred | 
|  576   // and been rejected because the user doesn't exist; additionally, |  576   // and been rejected because the user doesn't exist; additionally, | 
|  577   // an online auth attempt has completed successfully. |  577   // an online auth attempt has completed successfully. | 
|  578   state_->PresetCryptohomeStatus(false, |  578   state_->PresetCryptohomeStatus(false, | 
|  579                                  cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); |  579                                  cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); | 
|  580   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |  580   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 
|  581  |  581  | 
|  582   EXPECT_EQ(ParallelAuthenticator::CREATE_NEW, |  582   EXPECT_EQ(ParallelAuthenticator::CREATE_NEW, | 
|  583             SetAndResolveState(auth_, state_.release())); |  583             SetAndResolveState(auth_.get(), state_.release())); | 
|  584 } |  584 } | 
|  585  |  585  | 
|  586 TEST_F(ParallelAuthenticatorTest, DriveCreateForNewUser) { |  586 TEST_F(ParallelAuthenticatorTest, DriveCreateForNewUser) { | 
|  587   ExpectLoginSuccess(username_, |  587   ExpectLoginSuccess(username_, | 
|  588                      password_, |  588                      password_, | 
|  589                      cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername, |  589                      cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername, | 
|  590                      false); |  590                      false); | 
|  591   FailOnLoginFailure(); |  591   FailOnLoginFailure(); | 
|  592  |  592  | 
|  593   // Set up mock cryptohome library to respond successfully to a cryptohome |  593   // Set up mock cryptohome library to respond successfully to a cryptohome | 
|  594   // create attempt (indicated by the |CREATE_IF_MISSING| flag to AsyncMount). |  594   // create attempt (indicated by the |CREATE_IF_MISSING| flag to AsyncMount). | 
|  595   mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |  595   mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 
|  596   EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_, |  596   EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_, | 
|  597                                         cryptohome::CREATE_IF_MISSING, _)) |  597                                         cryptohome::CREATE_IF_MISSING, _)) | 
|  598       .Times(1) |  598       .Times(1) | 
|  599       .RetiresOnSaturation(); |  599       .RetiresOnSaturation(); | 
|  600   EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _)) |  600   EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _)) | 
|  601       .Times(1) |  601       .Times(1) | 
|  602       .RetiresOnSaturation(); |  602       .RetiresOnSaturation(); | 
|  603  |  603  | 
|  604   // Set up state as though a cryptohome mount attempt has occurred |  604   // Set up state as though a cryptohome mount attempt has occurred | 
|  605   // and been rejected because the user doesn't exist; additionally, |  605   // and been rejected because the user doesn't exist; additionally, | 
|  606   // an online auth attempt has completed successfully. |  606   // an online auth attempt has completed successfully. | 
|  607   state_->PresetCryptohomeStatus(false, |  607   state_->PresetCryptohomeStatus(false, | 
|  608                                  cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); |  608                                  cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); | 
|  609   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |  609   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 
|  610   SetAttemptState(auth_, state_.release()); |  610   SetAttemptState(auth_.get(), state_.release()); | 
|  611  |  611  | 
|  612   RunResolve(auth_.get()); |  612   RunResolve(auth_.get()); | 
|  613 } |  613 } | 
|  614  |  614  | 
|  615 TEST_F(ParallelAuthenticatorTest, DriveOfflineLogin) { |  615 TEST_F(ParallelAuthenticatorTest, DriveOfflineLogin) { | 
|  616   ExpectLoginSuccess(username_, password_, username_hash_, false); |  616   ExpectLoginSuccess(username_, password_, username_hash_, false); | 
|  617   FailOnLoginFailure(); |  617   FailOnLoginFailure(); | 
|  618  |  618  | 
|  619   // Set up state as though a cryptohome mount attempt has occurred and |  619   // Set up state as though a cryptohome mount attempt has occurred and | 
|  620   // succeeded. |  620   // succeeded. | 
|  621   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  621   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  622   GoogleServiceAuthError error = |  622   GoogleServiceAuthError error = | 
|  623       GoogleServiceAuthError::FromConnectionError(net::ERR_CONNECTION_RESET); |  623       GoogleServiceAuthError::FromConnectionError(net::ERR_CONNECTION_RESET); | 
|  624   state_->PresetOnlineLoginStatus(LoginFailure::FromNetworkAuthFailure(error)); |  624   state_->PresetOnlineLoginStatus(LoginFailure::FromNetworkAuthFailure(error)); | 
|  625   SetAttemptState(auth_, state_.release()); |  625   SetAttemptState(auth_.get(), state_.release()); | 
|  626  |  626  | 
|  627   RunResolve(auth_.get()); |  627   RunResolve(auth_.get()); | 
|  628 } |  628 } | 
|  629  |  629  | 
|  630 TEST_F(ParallelAuthenticatorTest, DriveOfflineLoginDelayedOnline) { |  630 TEST_F(ParallelAuthenticatorTest, DriveOfflineLoginDelayedOnline) { | 
|  631   ExpectLoginSuccess(username_, password_, username_hash_, true); |  631   ExpectLoginSuccess(username_, password_, username_hash_, true); | 
|  632   FailOnLoginFailure(); |  632   FailOnLoginFailure(); | 
|  633  |  633  | 
|  634   // Set up state as though a cryptohome mount attempt has occurred and |  634   // Set up state as though a cryptohome mount attempt has occurred and | 
|  635   // succeeded. |  635   // succeeded. | 
|  636   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  636   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  637   // state_ is released further down. |  637   // state_ is released further down. | 
|  638   SetAttemptState(auth_, state_.get()); |  638   SetAttemptState(auth_.get(), state_.get()); | 
|  639   RunResolve(auth_.get()); |  639   RunResolve(auth_.get()); | 
|  640  |  640  | 
|  641   // Offline login has completed, so now we "complete" the online request. |  641   // Offline login has completed, so now we "complete" the online request. | 
|  642   GoogleServiceAuthError error( |  642   GoogleServiceAuthError error( | 
|  643       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |  643       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | 
|  644   LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); |  644   LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); | 
|  645   state_.release()->PresetOnlineLoginStatus(failure); |  645   state_.release()->PresetOnlineLoginStatus(failure); | 
|  646   ExpectLoginFailure(failure); |  646   ExpectLoginFailure(failure); | 
|  647  |  647  | 
|  648   RunResolve(auth_.get()); |  648   RunResolve(auth_.get()); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  661       .Times(1) |  661       .Times(1) | 
|  662       .RetiresOnSaturation(); |  662       .RetiresOnSaturation(); | 
|  663   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) |  663   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) | 
|  664       .WillOnce(Return(std::string())) |  664       .WillOnce(Return(std::string())) | 
|  665       .RetiresOnSaturation(); |  665       .RetiresOnSaturation(); | 
|  666  |  666  | 
|  667   // Set up state as though a cryptohome mount attempt has occurred and |  667   // Set up state as though a cryptohome mount attempt has occurred and | 
|  668   // succeeded; also, an online request that never made it. |  668   // succeeded; also, an online request that never made it. | 
|  669   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  669   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  670   // state_ is released further down. |  670   // state_ is released further down. | 
|  671   SetAttemptState(auth_, state_.get()); |  671   SetAttemptState(auth_.get(), state_.get()); | 
|  672   RunResolve(auth_.get()); |  672   RunResolve(auth_.get()); | 
|  673  |  673  | 
|  674   // Offline login has completed, so now we "complete" the online request. |  674   // Offline login has completed, so now we "complete" the online request. | 
|  675   GoogleServiceAuthError error( |  675   GoogleServiceAuthError error( | 
|  676       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |  676       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | 
|  677   LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); |  677   LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); | 
|  678   state_.release()->PresetOnlineLoginStatus(failure); |  678   state_.release()->PresetOnlineLoginStatus(failure); | 
|  679   ExpectLoginFailure(failure); |  679   ExpectLoginFailure(failure); | 
|  680  |  680  | 
|  681   RunResolve(auth_.get()); |  681   RunResolve(auth_.get()); | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  700   ExpectLoginSuccess(username_, password_, username_hash_, true); |  700   ExpectLoginSuccess(username_, password_, username_hash_, true); | 
|  701   FailOnLoginFailure(); |  701   FailOnLoginFailure(); | 
|  702   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) |  702   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) | 
|  703       .WillOnce(Return(std::string())) |  703       .WillOnce(Return(std::string())) | 
|  704       .RetiresOnSaturation(); |  704       .RetiresOnSaturation(); | 
|  705  |  705  | 
|  706   // Set up state as though a cryptohome mount attempt has occurred and |  706   // Set up state as though a cryptohome mount attempt has occurred and | 
|  707   // succeeded; also, an online request that never made it. |  707   // succeeded; also, an online request that never made it. | 
|  708   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  708   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  709   // state_ is released further down. |  709   // state_ is released further down. | 
|  710   SetAttemptState(auth_, state_.get()); |  710   SetAttemptState(auth_.get(), state_.get()); | 
|  711   RunResolve(auth_.get()); |  711   RunResolve(auth_.get()); | 
|  712  |  712  | 
|  713   // Offline login has completed, so now we "complete" the online request. |  713   // Offline login has completed, so now we "complete" the online request. | 
|  714   GoogleServiceAuthError error( |  714   GoogleServiceAuthError error( | 
|  715       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |  715       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | 
|  716   LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); |  716   LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); | 
|  717   state_.release()->PresetOnlineLoginStatus(failure); |  717   state_.release()->PresetOnlineLoginStatus(failure); | 
|  718   ExpectLoginFailure(failure); |  718   ExpectLoginFailure(failure); | 
|  719  |  719  | 
|  720   RunResolve(auth_.get()); |  720   RunResolve(auth_.get()); | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
|  741 } |  741 } | 
|  742  |  742  | 
|  743 TEST_F(ParallelAuthenticatorTest, DriveOnlineLogin) { |  743 TEST_F(ParallelAuthenticatorTest, DriveOnlineLogin) { | 
|  744   ExpectLoginSuccess(username_, password_, username_hash_, false); |  744   ExpectLoginSuccess(username_, password_, username_hash_, false); | 
|  745   FailOnLoginFailure(); |  745   FailOnLoginFailure(); | 
|  746  |  746  | 
|  747   // Set up state as though a cryptohome mount attempt has occurred and |  747   // Set up state as though a cryptohome mount attempt has occurred and | 
|  748   // succeeded. |  748   // succeeded. | 
|  749   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  749   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  750   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |  750   state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 
|  751   SetAttemptState(auth_, state_.release()); |  751   SetAttemptState(auth_.get(), state_.release()); | 
|  752  |  752  | 
|  753   RunResolve(auth_.get()); |  753   RunResolve(auth_.get()); | 
|  754 } |  754 } | 
|  755  |  755  | 
|  756 // http://crbug.com/106538 |  756 // http://crbug.com/106538 | 
|  757 TEST_F(ParallelAuthenticatorTest, DISABLED_DriveNeedNewPassword) { |  757 TEST_F(ParallelAuthenticatorTest, DISABLED_DriveNeedNewPassword) { | 
|  758   FailOnLoginSuccess();  // Set failing on success as the default... |  758   FailOnLoginSuccess();  // Set failing on success as the default... | 
|  759   // ...but expect ONE successful login first. |  759   // ...but expect ONE successful login first. | 
|  760   ExpectLoginSuccess(username_, password_, username_hash_, true); |  760   ExpectLoginSuccess(username_, password_, username_hash_, true); | 
|  761   GoogleServiceAuthError error( |  761   GoogleServiceAuthError error( | 
|  762       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |  762       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | 
|  763   LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); |  763   LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); | 
|  764   ExpectLoginFailure(failure); |  764   ExpectLoginFailure(failure); | 
|  765  |  765  | 
|  766   // Set up state as though a cryptohome mount attempt has occurred and |  766   // Set up state as though a cryptohome mount attempt has occurred and | 
|  767   // succeeded. |  767   // succeeded. | 
|  768   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |  768   state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 
|  769   state_->PresetOnlineLoginStatus(failure); |  769   state_->PresetOnlineLoginStatus(failure); | 
|  770   SetAttemptState(auth_, state_.release()); |  770   SetAttemptState(auth_.get(), state_.release()); | 
|  771  |  771  | 
|  772   RunResolve(auth_.get()); |  772   RunResolve(auth_.get()); | 
|  773 } |  773 } | 
|  774  |  774  | 
|  775 TEST_F(ParallelAuthenticatorTest, DriveUnlock) { |  775 TEST_F(ParallelAuthenticatorTest, DriveUnlock) { | 
|  776   ExpectLoginSuccess(username_, std::string(), std::string(), false); |  776   ExpectLoginSuccess(username_, std::string(), std::string(), false); | 
|  777   FailOnLoginFailure(); |  777   FailOnLoginFailure(); | 
|  778  |  778  | 
|  779   // Set up mock cryptohome library to respond successfully to a cryptohome |  779   // Set up mock cryptohome library to respond successfully to a cryptohome | 
|  780   // key-check attempt. |  780   // key-check attempt. | 
|  781   mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |  781   mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 
|  782   EXPECT_CALL(*mock_caller_, AsyncCheckKey(username_, _, _)) |  782   EXPECT_CALL(*mock_caller_, AsyncCheckKey(username_, _, _)) | 
|  783       .Times(1) |  783       .Times(1) | 
|  784       .RetiresOnSaturation(); |  784       .RetiresOnSaturation(); | 
|  785   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) |  785   EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) | 
|  786       .WillOnce(Return(std::string())) |  786       .WillOnce(Return(std::string())) | 
|  787       .RetiresOnSaturation(); |  787       .RetiresOnSaturation(); | 
|  788  |  788  | 
|  789   auth_->AuthenticateToUnlock(UserContext(username_, |  789   auth_->AuthenticateToUnlock(UserContext(username_, | 
|  790                                           std::string(), |  790                                           std::string(), | 
|  791                                           std::string())); |  791                                           std::string())); | 
|  792   message_loop_.Run(); |  792   message_loop_.Run(); | 
|  793 } |  793 } | 
|  794  |  794  | 
|  795 }  // namespace chromeos |  795 }  // namespace chromeos | 
| OLD | NEW |