# 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.


""" The autotest performing FW update, both EC and AP."""


import logging
import os
import time

from autotest_lib.client.common_lib import autotemp
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib import global_config
from autotest_lib.client.common_lib.cros import dev_server
from autotest_lib.server import test, utils
from autotest_lib.server.cros import provision
from autotest_lib.server.cros.dynamic_suite import frontend_wrappers
from autotest_lib.server.cros.faft.config.config import Config as FAFTConfig


_CONFIG = global_config.global_config
# pylint: disable-msg=E1120
_IMAGE_URL_PATTERN = _CONFIG.get_config_value(
        'CROS', 'firmware_url_pattern', type=str)
_AFE = frontend_wrappers.RetryingAFE(
        timeout_min=1, delay_sec=10, debug=False)


class provision_FirmwareUpdate(test.test):
    """A test that can provision a machine to the correct firmware version."""


    version = 1
    UNTAR_TIMEOUT = 60
    DOWNLOAD_TIMEOUT = 60


    def initialize(self, host, value):
        """Initialize the test.

        @param host:  a CrosHost object of the machine to update.
        @param value: the provisioning value, which is the build version
                      to which we want to provision the machine,
                      e.g. 'link-firmware/R22-2695.1.144'.
        """
        self._hostname = host.hostname
        # TODO(fdeng): use host.get_board() after
        # crbug.com/271834 is fixed.
        self._board = host._get_board_from_afe()
        self._build = value
        self._config = FAFTConfig(self._board)
        if self._config.use_u_boot:
            self._ap_image = 'image-%s.bin' % self._board
        else: # Depthcharge platform
            self._ap_image = 'image.bin'
        self._ec_image = 'ec.bin'
        self.tmpd = autotemp.tempdir(unique_id='fwimage')
        self._servo = host.servo
        if not self._servo:
            raise error.TestError('Host %s does not have servo.' %
                                  host.hostname)
        try:
            ds = dev_server.ImageServer.resolve(self._build)
            ds.stage_artifacts(self._build, ['firmware'])
        except dev_server.DevServerException as e:
            raise error.TestFail(str(e))
        fwurl = _IMAGE_URL_PATTERN % (ds.url(), self._build)
        local_tarball = os.path.join(self.tmpd.name,
                                     os.path.basename(fwurl))
        utils.system('wget -O %s %s' % (local_tarball, fwurl),
                     timeout=self.DOWNLOAD_TIMEOUT)
        utils.system('tar xf %s -C %s %s %s' % (
                local_tarball, self.tmpd.name,
                self._ap_image, self._ec_image), timeout=self.UNTAR_TIMEOUT)
        utils.system('tar xf %s  --wildcards -C %s "dts/*"' % (
                local_tarball, self.tmpd.name), timeout=self.UNTAR_TIMEOUT,
                ignore_status=True)


    def cleanup(self):
        """Extend cleanup to clean temporary dir."""
        super(provision_FirmwareUpdate, self).cleanup()
        self.tmpd.clean()


    def _clear_version_labels(self):
        """Clear firmware version labels from the machine."""
        labels = _AFE.get_labels(name__startswith=provision.FW_VERSION_PREFIX,
                                host__hostname=self._hostname)
        for label in labels:
            label.remove_hosts(hosts=[self._hostname])


    def _add_version_label(self):
        """Add firmware version label to the machine."""
        fw_label = ':'.join([provision.FW_VERSION_PREFIX, self._build])
        provision.ensure_label_exists(fw_label)
        label = _AFE.get_labels(name__startswith=fw_label)[0]
        label.add_hosts([self._hostname])


    def run_once(self):
        """The method called by the control file to start the test."""
        self._clear_version_labels()
        logging.info('Will re-program EC now')
        self._servo.program_ec(os.path.join(self.tmpd.name, self._ec_image))
        logging.info('Will re-program BIOS now')
        self._servo.program_bios(os.path.join(self.tmpd.name, self._ap_image))
        self._servo.get_power_state_controller().cold_reset()
        time.sleep(self._servo.BOOT_DELAY)
        self._add_version_label()
