96 lines
3.8 KiB
Python
96 lines
3.8 KiB
Python
# 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
|
|
|