# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging
import os
import re
import shutil

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error, utils
from autotest_lib.client.cros import constants, cryptohome

class platform_CryptohomeTestAuth(test.test):
    version = 1


    def run_once(self):
        test_user = 'this_is_a_local_test_account@chromium.org'
        test_password = 'this_is_a_test_password'

        user_hash = cryptohome.get_user_hash(test_user)


        # Ensure that the user directory is unmounted and does not exist.
        cryptohome.unmount_vault()
        cryptohome.remove_vault(test_user)
        if os.path.exists(os.path.join(constants.SHADOW_ROOT, user_hash)):
            raise error.TestFail('Could not remove the test user.')

        # Mount the test user account, which ensures that the vault is
        # created, and that the mount succeeds.
        cryptohome.mount_vault(test_user, test_password, create=True)

        # Test credentials when the user's directory is mounted
        if not cryptohome.test_auth(test_user, test_password):
            raise error.TestFail('Valid credentials should authenticate '
                                 'while mounted.')

        # Make sure that an incorrect password fails
        if cryptohome.test_auth(test_user, 'badpass'):
            raise error.TestFail('Invalid credentials should not authenticate '
                                 'while mounted.')

        # Unmount the directory
        cryptohome.unmount_vault()
        # Ensure that the user directory is not mounted
        if cryptohome.is_vault_mounted(user=test_user, allow_fail=True):
            raise error.TestFail('Cryptohome did not unmount the user.')

        # Test valid credentials when the user's directory is not mounted
        if not cryptohome.test_auth(test_user, test_password):
            raise error.TestFail('Valid credentials should authenticate '
                                 ' while mounted.')

        # Test invalid credentials fails while not mounted.
        if cryptohome.test_auth(test_user, 'badpass'):
            raise error.TestFail('Invalid credentials should not authenticate '
                                 'when unmounted.')


        # Re-mount existing test user vault, verifying that the mount succeeds.
        cryptohome.mount_vault(test_user, test_password)

        # Finally, unmount and destroy the vault again.
        cryptohome.unmount_vault()
        cryptohome.remove_vault(test_user)
        if os.path.exists(os.path.join(constants.SHADOW_ROOT, user_hash)):
            raise error.TestFail('Could not destroy the vault.')
