blob: 2724b57a8d8214a6ca1218243af7722b336cc0b8 [file] [log] [blame]
# 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