Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Unified Diff: chrome/browser/chromeos/login/parallel_authenticator_unittest.cc

Issue 9466005: Make sure the device recovers from policy loss in the consumer case. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Now with proper testing. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/login/parallel_authenticator_unittest.cc
diff --git a/chrome/browser/chromeos/login/parallel_authenticator_unittest.cc b/chrome/browser/chromeos/login/parallel_authenticator_unittest.cc
index 26f91675fa6e1233e4f1e18924ba609530aba617..39138f1301398ccce03f769258609496a9cbaeff 100644
--- a/chrome/browser/chromeos/login/parallel_authenticator_unittest.cc
+++ b/chrome/browser/chromeos/login/parallel_authenticator_unittest.cc
@@ -18,10 +18,15 @@
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/mock_cryptohome_library.h"
#include "chrome/browser/chromeos/cros/mock_library_loader.h"
+#include "chrome/browser/chromeos/cros_settings.h"
#include "chrome/browser/chromeos/cryptohome/mock_async_method_caller.h"
+#include "chrome/browser/chromeos/dbus/mock_dbus_thread_manager.h"
+#include "chrome/browser/chromeos/dbus/mock_cryptohome_client.h"
#include "chrome/browser/chromeos/login/mock_login_status_consumer.h"
#include "chrome/browser/chromeos/login/mock_url_fetchers.h"
+#include "chrome/browser/chromeos/login/mock_user_manager.h"
#include "chrome/browser/chromeos/login/test_attempt_state.h"
+#include "chrome/browser/chromeos/stub_cros_settings_provider.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/net/gaia/mock_url_fetcher_factory.h"
#include "chrome/test/base/testing_profile.h"
@@ -43,7 +48,7 @@ using ::testing::AnyNumber;
using ::testing::DoAll;
using ::testing::Invoke;
using ::testing::Return;
-using ::testing::SetArgumentPointee;
+using ::testing::SetArgPointee;
using ::testing::_;
namespace chromeos {
@@ -85,6 +90,7 @@ class ParallelAuthenticatorTest : public testing::Test {
ParallelAuthenticatorTest()
: message_loop_(MessageLoop::TYPE_UI),
ui_thread_(BrowserThread::UI, &message_loop_),
+ file_thread_(BrowserThread::FILE, &message_loop_),
io_thread_(BrowserThread::IO),
username_("me@nowhere.org"),
password_("fakepass") {
@@ -115,6 +121,11 @@ class ParallelAuthenticatorTest : public testing::Test {
test_api->SetCryptohomeLibrary(mock_library_, true);
io_thread_.Start();
+ mock_user_manager_ = new MockUserManager();
+ UserManager::Set(mock_user_manager_);
+ EXPECT_CALL(*mock_user_manager_, LoadKeyStore())
+ .Times(AnyNumber());
+
auth_ = new ParallelAuthenticator(&consumer_);
auth_->set_using_oauth(false);
state_.reset(new TestAttemptState(username_,
@@ -218,12 +229,17 @@ class ParallelAuthenticatorTest : public testing::Test {
auth->set_attempt_state(state);
}
+ void SetOwnerState(bool owner_check_finished, bool check_result) {
+ auth_->SetOwnerState(owner_check_finished, check_result);
+ }
+
void FakeOnlineAttempt() {
auth_->set_online_attempt(new TestOnlineAttempt(state_.get(), auth_.get()));
}
MessageLoop message_loop_;
content::TestBrowserThread ui_thread_;
+ content::TestBrowserThread file_thread_;
content::TestBrowserThread io_thread_;
std::string username_;
@@ -236,6 +252,7 @@ class ParallelAuthenticatorTest : public testing::Test {
// Mocks, destroyed by CrosLibrary class.
MockCryptohomeLibrary* mock_library_;
MockLibraryLoader* loader_;
+ MockUserManager* mock_user_manager_;
cryptohome::MockAsyncMethodCaller* mock_caller_;
@@ -310,6 +327,98 @@ TEST_F(ParallelAuthenticatorTest, ResolveNeedOldPw) {
EXPECT_TRUE(checker->Run());
}
+TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededDirectFailedMount) {
+ // Set up state as though a cryptohome mount attempt has occurred
+ // and succeeded but we are in safe mode and the current user is not owner.
+ // This is a high level test to verify the proper transitioning in this mode
+ // only. It is not testing that we properly verify that the user is an owner
+ // or that we really are in "safe-mode".
+ state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
+ SetOwnerState(true, false);
+
+ scoped_refptr<ResolveChecker> checker(
+ new ResolveChecker(state_.release(),
+ auth_.get(),
+ ParallelAuthenticator::OWNER_REQUIRED));
+ EXPECT_TRUE(checker->Run());
+}
+
+TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededMount) {
+ // Set up state as though a cryptohome mount attempt has occurred
+ // and succeeded but we are in safe mode and the current user is not owner.
+ // This test will check that the "safe-mode" policy is not set and will let
+ // the mount finish successfully.
+ state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
+ SetOwnerState(false, false);
+
+ scoped_refptr<ResolveChecker> checker(
+ new ResolveChecker(state_.release(),
+ auth_.get(),
+ ParallelAuthenticator::CONTINUE));
+ EXPECT_TRUE(checker->Run());
+ // Let the owner verification run on the FILE thread...
+ message_loop_.RunAllPending();
+ // and test that the mount has succeeded.
+ state_.reset(new TestAttemptState(username_,
+ password_,
+ hash_ascii_,
+ "",
+ "",
+ false));
+ state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
+ checker = new ResolveChecker(state_.release(),
+ auth_.get(),
+ ParallelAuthenticator::OFFLINE_LOGIN);
+ EXPECT_TRUE(checker->Run());
+}
+
+TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededFailedMount) {
+ scoped_ptr<MockDBusThreadManager> mock_dbus_thread_manager(
+ new MockDBusThreadManager);
+ DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager.get());
+ EXPECT_CALL(*mock_dbus_thread_manager->mock_cryptohome_client(), Unmount(_))
+ .WillOnce(DoAll(SetArgPointee<0>(true), Return(true)));
+
+ CrosSettingsProvider* device_settings_provider;
+ StubCrosSettingsProvider stub_settings_provider;
+ // Set up state as though a cryptohome mount attempt has occurred
+ // and succeeded but we are in safe mode and the current user is not owner.
+ state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
+ SetOwnerState(false, false);
+ // Remove the real DeviceSettingsProvider and replace it with a stub.
+ device_settings_provider =
+ CrosSettings::Get()->GetProvider(chromeos::kReportDeviceVersionInfo);
+ EXPECT_TRUE(device_settings_provider != NULL);
+ EXPECT_TRUE(
+ CrosSettings::Get()->RemoveSettingsProvider(device_settings_provider));
+ CrosSettings::Get()->AddSettingsProvider(&stub_settings_provider);
+ CrosSettings::Get()->SetBoolean(kPolicyMissingMitigationMode, true);
+
+ scoped_refptr<ResolveChecker> checker(
+ new ResolveChecker(state_.release(),
+ auth_.get(),
+ ParallelAuthenticator::CONTINUE));
+ EXPECT_TRUE(checker->Run());
+ // Let the owner verification run on the FILE thread...
+ message_loop_.RunAllPending();
+ // and test that the mount has succeeded.
+ state_.reset(new TestAttemptState(username_,
+ password_,
+ hash_ascii_,
+ "",
+ "",
+ false));
+ state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE);
+ checker = new ResolveChecker(state_.release(),
+ auth_.get(),
+ ParallelAuthenticator::OWNER_REQUIRED);
+ EXPECT_TRUE(checker->Run());
+
+ EXPECT_TRUE(
+ CrosSettings::Get()->RemoveSettingsProvider(&stub_settings_provider));
+ CrosSettings::Get()->AddSettingsProvider(device_settings_provider);
+}
+
TEST_F(ParallelAuthenticatorTest, DriveFailedMount) {
FailOnLoginSuccess();
ExpectLoginFailure(LoginFailure(LoginFailure::COULD_NOT_MOUNT_CRYPTOHOME));

Powered by Google App Engine
This is Rietveld 408576698