# 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