1# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import os, os.path, re 6from autotest_lib.client.common_lib import error 7from autotest_lib.server import autotest, test 8 9class hardware_DiskFirmwareUpgrade(test.test): 10 """ 11 Integrity stress test for storage device 12 """ 13 version = 1 14 15 TEST_NAME='hardware_DiskFirmwareUpgrade' 16 TEST_SCRIPT='/usr/sbin/chromeos-disk-firmware-update.sh' 17 DEFAULT_LOCATION='/opt/google/disk/firmware' 18 19 _client_install_path = None 20 21 22 def _exists_on_client(self, f): 23 return self._client.run('ls "%s"' % f, 24 ignore_status=True).exit_status == 0 25 26 def _get_model_name(self): 27 """ Return the name of an ATA/SCSI device. """ 28 return self._client.run( 29 'cat /sys/block/$(basename $(rootdev -s -d))/device/model').stdout 30 31 def _get_device_name(self): 32 """ Return the name of an eMMC device, using cid data.""" 33 return self._client.run( 34 'cat /sys/block/$(basename $(rootdev -s -d))/device/cid | cut -c 7-18').stdout 35 36 def run_once(self, host, disk_fw_packages): 37 """ 38 For every firmware package in disk_fw_packages, we launch the sibbling 39 client test if: 40 - the script to install the package is present 41 - the model of the device present matches the defined model regex. 42 We launch the slibbing client test a second time to put the machine 43 in a well-known state. 44 45 @param host: machine to use. 46 @param disk_fw_packages: directory of firmware to use and 47 expected return code. See control for details. 48 """ 49 50 self._client = host 51 self._client_at = autotest.Autotest(self._client) 52 # First, check if the machine image contains the 53 # upgrade script. 54 if not self._exists_on_client(self.TEST_SCRIPT): 55 raise error.TestNAError('Firmware upgrade not supported') 56 57 # Retrieve model name. 58 try: 59 model = self._get_model_name() 60 except error.AutoservRunError: 61 model = self._get_device_name() 62 63 i = 0 64 for model_re, package_desc in disk_fw_packages.iteritems(): 65 if not re.match(model_re, model): 66 continue 67 for p, results in package_desc.iteritems(): 68 result_dir = '-'.join([self.TEST_NAME, str(i), p]) 69 if p.startswith('test_'): 70 self._client_at.run_test( 71 self.TEST_NAME, 72 results_dir=result_dir, 73 disk_firmware_package=self.DEFAULT_LOCATION + '-test', 74 expected_result=results[0], 75 upgrade_required=results[1]) 76 else: 77 # We are not expecting downloads. 78 self._tmpdir = self._client.get_tmp_dir() 79 self._client.send_file(os.path.join(self.bindir, p), 80 self._tmpdir) 81 self._client_at.run_test( 82 self.TEST_NAME, 83 results_dir=result_dir, 84 disk_firmware_package=os.path.join(self._tmpdir, p), 85 expected_result=results[0], 86 upgrade_required=results[1]) 87 result_dir = '-'.join([self.TEST_NAME, str(i), '~base']) 88 # After the test run, reinstall regular firmware. 89 self._client_at.run_test( 90 self.TEST_NAME, 91 results_dir=result_dir, 92 disk_firmware_package=self.DEFAULT_LOCATION, 93 upgrade_required=results[1]) 94 i += 1 95 96