# Copyright (c) 2011 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

from autotest_lib.server.cros.faft.firmware_test import FirmwareTest


class firmware_ShellBall(FirmwareTest):
    """
    chromeos-firmwareupdate functional tests.

    Checks the mode condition and enables or disables developement mode
    accordingly and runs all shellball functioanl tests.
    """
    version = 1

    _shellball_name = None

    def update_firmware(self, mode):
        self.faft_client.system.run_shell_command('%s --mode %s' %
                                                  (self._shellball_name, mode))
        # Enalbe dev mode if the mode is todev.
        if mode == 'todev':
            self.servo.enable_development_mode()
        # Disable dev mode if the mode is tonormal.
        elif mode == 'tonormal':
            self.servo.disable_development_mode()

    def install_original_firmware(self):
        self.faft_client.system.run_shell_command(
            'sudo chromeos-firmwareupdate --mode=factory_install')
        self.invalidate_firmware_setup()

    def initialize(self, host, cmdline_args, shellball_path=None,
                   shellball_name=None):
        super(firmware_ShellBall, self).initialize(host, cmdline_args)
        self._shellball_name = "/home/chronos/%s" % self._shellball_name
        host.send_file("%s/%s" % (shellball_path, shellball_name),
                       self._shellball_name)
        self.faft_client.system.run_shell_command('chmod +x %s' %
                                                  self._shellball_name)
        self.switcher.setup_mode('normal')
        # Get crossystem fwid.
        [self._current_fwid] = (
            self.faft_client.system.run_shell_command_get_output(
                'crossystem fwid'))
        # Get BIOS version from shellball.
        [self._shellball_fwid] = self.faft_client. \
                                        system.run_shell_command_get_output(
                                            '%s -V | grep "BIOS version"'
                                            ' | sed "s/BIOS version: '
                                            '\(.*\)/\\1/" '
                                            % self._shellball_name)

    def cleanup(self):
        try:
            if os.path.exists(self._shellball_name):
                os.remove(self._shellball_name)
        except Exception as e:
            logging.error("Caught exception: %s", str(e))
        super(firmware_ShellBall, self).cleanup()

    def run_once(self):
        logging.info("Change to devmode.")
        self.check_state((self.checkers.crossystem_checker,
                          {'dev_boot_usb': '0'}))
        self.update_firmware('todev')
        self.switcher.mode_aware_reboot()

        logging.info("Check mainfw_type and run autoupdate.")
        self.check_state((self.checkers.crossystem_checker,
                          {'mainfw_type': 'developer'}))
        self.update_firmware('autoupdate')
        self.switcher.mode_aware_reboot()

        logging.info("Verify fwid and install system firmware.")
        self.check_state((self.checkers.crossystem_checker,
                          {'fwid': self._shellball_fwid}))
        self.install_original_firmware()
        self.switcher.mode_aware_reboot()

        logging.info("Verify the old firmware id and test factory_install.")
        self.check_state((self.checkers.crossystem_checker,
                          {'fwid': self._current_fwid}))
        self.update_firmware('factory_install')
        self.switcher.mode_aware_reboot()

        logging.info("Verify fwid and install original firmware.")
        self.check_state((self.checkers.crossystem_checker,
                          {'fwid': self._shellball_fwid}))
        self.install_original_firmware()
        self.switcher.mode_aware_reboot()

        logging.info("Verify old fwid.")
        self.check_state((self.checkers.crossystem_checker,
                          {'fwid': self._current_fwid}))
