# 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 os, os.path, re
from autotest_lib.client.common_lib import error
from autotest_lib.server import autotest, test

class hardware_DiskFirmwareUpgrade(test.test):
    """
    Integrity stress test for storage device
    """
    version = 1

    TEST_NAME='hardware_DiskFirmwareUpgrade'
    TEST_SCRIPT='/usr/sbin/chromeos-disk-firmware-update.sh'
    DEFAULT_LOCATION='/opt/google/disk/firmware'

    _client_install_path = None


    def _exists_on_client(self, f):
        return self._client.run('ls "%s"' % f,
                               ignore_status=True).exit_status == 0

    def _get_model_name(self):
        """ Return the name of an ATA/SCSI device. """
        return self._client.run(
            'cat /sys/block/$(basename $(rootdev -s -d))/device/model').stdout

    def _get_device_name(self):
        """ Return the name of an eMMC device, using cid data."""
        return self._client.run(
            'cat /sys/block/$(basename $(rootdev -s -d))/device/cid | cut -c 7-18').stdout

    def run_once(self, host, disk_fw_packages):
        """
        For every firmware package in disk_fw_packages, we launch the sibbling
        client test if:
        - the script to install the package is present
        - the model of the device present matches the defined model regex.
        We launch the slibbing client test a second time to put the machine
        in a well-known state.

        @param host:     machine to use.
        @param disk_fw_packages: directory of firmware to use and
                         expected return code. See control for details.
        """

        self._client = host
        self._client_at = autotest.Autotest(self._client)
        # First, check if the machine image contains the
        # upgrade script.
        if not self._exists_on_client(self.TEST_SCRIPT):
            raise error.TestNAError('Firmware upgrade not supported')

        # Retrieve model name.
        try:
            model = self._get_model_name()
        except error.AutoservRunError:
            model = self._get_device_name()

        i = 0
        for model_re, package_desc in disk_fw_packages.iteritems():
            if not re.match(model_re, model):
                continue
            for p, results in package_desc.iteritems():
                result_dir = '-'.join([self.TEST_NAME, str(i), p])
                if p.startswith('test_'):
                    self._client_at.run_test(
                            self.TEST_NAME,
                            results_dir=result_dir,
                            disk_firmware_package=self.DEFAULT_LOCATION + '-test',
                            expected_result=results[0],
                            upgrade_required=results[1])
                else:
                    # We are not expecting downloads.
                    self._tmpdir = self._client.get_tmp_dir()
                    self._client.send_file(os.path.join(self.bindir, p),
                                           self._tmpdir)
                    self._client_at.run_test(
                            self.TEST_NAME,
                            results_dir=result_dir,
                            disk_firmware_package=os.path.join(self._tmpdir, p),
                            expected_result=results[0],
                            upgrade_required=results[1])
                result_dir = '-'.join([self.TEST_NAME, str(i), '~base'])
                # After the test run, reinstall regular firmware.
                self._client_at.run_test(
                        self.TEST_NAME,
                        results_dir=result_dir,
                        disk_firmware_package=self.DEFAULT_LOCATION,
                        upgrade_required=results[1])
                i += 1

