# Copyright (c) 2013 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 traceback
from autotest_lib.client.common_lib import error
from autotest_lib.server import test

class platform_CrashStateful(test.test):
    """Tests the crash recovery of the stateful file system

    1. Create a specific file 'charlie'
    2. Sync
    3. Crash system
    4. Wait for reboot
    5. Check if 'charlie' is there and complete
    6. Clean up

    Do the samething with an ecryptfs volume.
    """
    version = 1
    _STATEFUL_DIR = '/usr/local/CrashDir'
    _ECRYPT_DIR = '/usr/local/ecryptfs_tst'
    _ECRYPT_MOUNT_POINT = '/usr/local/ecryptfs_mnt'
    _ECRYPT_TEST_DIR = '%s/CrashDir' % _ECRYPT_MOUNT_POINT


    def _run(self, cmd):
        """Run the give command and log results

        @param cmd: command to be run
        """
        result = self.client.run(cmd)
        if result.exit_status != 0:
            logging.error('%s: %s', cmd, result.stdout)


    def _ecrypt_mount(self, edir, mnt):
        """Mount the eCrypt File System

        @param ddir: directory where encrypted file system is stored
        @param mnt: mount point for encrypted file system
        """
        options = ('-o'
                   ' key=passphrase:passphrase_passwd=secret'
                   ',ecryptfs_cipher=aes'
                   ',ecryptfs_key_bytes=32'
                   ',no_sig_cache'
                   ',ecryptfs_passthrough=no'
                   ',ecryptfs_enable_filename_crypto=no')
        self._run('mkdir -p %s %s' % (edir, mnt))
        self._run('mount -t ecryptfs %s %s %s' %
                           (options, edir, mnt))


    def _ecrypt_unmount(self, edir, mnt):
        """Unmount the eCrypt File System and remove it and its mount point

        @param dir: directory where encrypted file system is stored
        @param mnt: mount point for encrypted file system
        """
        self._run('umount %s' % edir)
        self._run('rm -R %s' % edir)
        self._run('rm -R %s' % mnt)


    def _crash(self):
        """crash the client without giving anything a chance to clean up

        We use the kernel crash testing interface to immediately reboot the
        system. No chance for any flushing of I/O or cleaning up.
        """
        logging.info('CrashStateful: force panic %s', self.client.hostname)
        try:
            lkdtm = "echo PANIC > /sys/kernel/debug/provoke-crash/DIRECT"
            breakme = "echo panic > /proc/breakme"
            self.client.reboot(reboot_cmd='(%s || %s) &' % (lkdtm, breakme))
        except error.AutoservRebootError as e:
            raise error.TestFail('%s.\nTest failed with error %s' % (
                    traceback.format_exc(), str(e)))


    def _create_file_and_crash(self, dir):
        """Sets up first part of test, then crash

        @param dir - directory where test files are created
        """
        self._run('mkdir -p %s' % dir)
        self._run('echo charlie smith >%s/charlie' % dir)
        self._run('sync')
        self._crash()


    def _verify_and_cleanup(self, dir):
        """Verify results and clean up

        @param dir - directory where test files were created
        """
        result = self.client.run('cat %s/charlie' % dir)
        hi = result.stdout.strip()
        if hi != 'charlie smith':
            failed
        self._run('rm -fr %s' % dir)


    def _crash_stateful(self, dir):
        """Crash the stateful file system while changing it

        @param dir - directory where test files are created
        """
        self._create_file_and_crash(dir)
        self._verify_and_cleanup(dir)


    def _crash_ecrptfs(self, edir, mnt, dir):
        """Crash the stateful file system while changing it

        @param edir - directory used for the encrypted file system
        @param mnt - mount point for the encrypted file system
        @param dir - directory where test files are created
        """
        self._ecrypt_mount(edir, mnt)
        self._create_file_and_crash(dir)
        self._ecrypt_mount(edir, mnt)
        self._verify_and_cleanup(dir)
        self._ecrypt_unmount(edir, mnt)


    def run_once(self, host=None):
        """run_once runs the test.

        1. Runs a crash test on stateful partition
        2. Create an ecryptfs volume and run the same
           crash test

        @param host - the host machine running the test
        """
        self.client = host

        self._crash_stateful(self._STATEFUL_DIR)

        self._crash_ecrptfs(self._ECRYPT_DIR, self._ECRYPT_MOUNT_POINT,
            self._ECRYPT_TEST_DIR)
