108 lines
4.3 KiB
Python
108 lines
4.3 KiB
Python
# Copyright 2019 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, re, logging
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.bin import test, utils
|
|
|
|
class blktests(test.test):
|
|
"""
|
|
Runs the blktests suite.
|
|
"""
|
|
|
|
version = 1
|
|
|
|
BLKTESTS_PATH = '/mnt/stateful_partition/unencrypted/cache'
|
|
BLKTESTS_TEST_DIR = "/usr/local/blktests"
|
|
CONFIG_FILE = '/usr/local/blktests/config'
|
|
|
|
FAILED_RE = re.compile(r'.*\[failed\].*', re.DOTALL)
|
|
DEVICE_RE = re.compile(r'/dev/(sd[a-z]|mmcblk[0-9]+|nvme[0-9]+)p?[0-9]*')
|
|
|
|
devs=[]
|
|
loop_devs=[]
|
|
files=[]
|
|
exclude=[]
|
|
|
|
def setup_configs(self, devices):
|
|
"""
|
|
Setup the blk devices to test.
|
|
@param devs: The desired blk devices to test (BLK: real blk
|
|
device, LOOP_FILE: loop device over file, or LOOP_BLK:
|
|
loop device over real blk device).
|
|
"""
|
|
|
|
for dev in devices:
|
|
if dev == 'BLK':
|
|
dev_name = utils.get_free_root_partition()
|
|
self.devs.append(dev_name)
|
|
# block/013 tries to reread the partition table of the device
|
|
# This won't work when run on a block device partition, so we
|
|
# will exclude the test.
|
|
self.exclude.append("block/013")
|
|
elif dev == 'LOOP_FILE':
|
|
file_name = 'blktests_test'
|
|
file_loc = os.path.join(self.BLKTESTS_PATH, file_name)
|
|
utils.system('fallocate -l 10M %s' % file_loc)
|
|
loop_dev = utils.system_output('losetup -f -P --show %s'
|
|
% file_loc)
|
|
self.devs.append(loop_dev)
|
|
self.loop_devs.append(loop_dev)
|
|
self.files.append(file_loc)
|
|
elif dev == 'LOOP_BLK':
|
|
blk_dev = utils.get_free_root_partition()
|
|
loop_dev = utils.system_output('losetup -f -P --show %s'
|
|
% blk_dev)
|
|
self.devs.append(loop_dev)
|
|
self.loop_devs.append(loop_dev)
|
|
elif self.DEVICE_RE.match(dev):
|
|
if dev == utils.get_root_partition():
|
|
raise error.TestError("Can't run the test on the root "
|
|
"partition.")
|
|
elif dev == utils.get_kernel_partition():
|
|
raise error.TestError("Can't run the test on the kernel "
|
|
"partition.")
|
|
elif dev == utils.concat_partition(utils.get_root_device(), 1):
|
|
raise error.TestError("Can't run the test on the stateful "
|
|
"partition.")
|
|
self.devs.append(dev)
|
|
else:
|
|
raise error.TestError("Invalid device specified")
|
|
test_devs = ' '.join(self.devs)
|
|
exclusions = ""
|
|
if self.exclude:
|
|
exclusions = "EXCLUDE=(%s)" % ' '.join(self.exclude)
|
|
config = "TEST_DEVS=(%s) %s" % (test_devs, exclusions)
|
|
logging.debug("Test config: %s", config)
|
|
configFile = open(self.CONFIG_FILE, 'w')
|
|
configFile.write(config)
|
|
configFile.close()
|
|
|
|
def cleanup(self):
|
|
"""
|
|
Clean up the environment by removing any created files and loop devs.
|
|
"""
|
|
for dev in self.loop_devs:
|
|
utils.system('losetup -d %s' % dev)
|
|
for f in self.files:
|
|
utils.system('rm %s' % f, ignore_status=True)
|
|
if os.path.isfile(self.CONFIG_FILE):
|
|
os.remove(self.CONFIG_FILE)
|
|
|
|
def run_once(self, devices=['LOOP_FILE']):
|
|
"""
|
|
Setup the config file and run blktests.
|
|
|
|
@param devices: The desired block devices to test (BLK: real block
|
|
device, LOOP_FILE: loop device over file, or LOOP_BLK:
|
|
loop device over real block device).
|
|
"""
|
|
os.chdir(self.BLKTESTS_TEST_DIR)
|
|
self.setup_configs(devices)
|
|
output = utils.system_output('bash ./check',
|
|
ignore_status=True, retain_output=True)
|
|
if self.FAILED_RE.match(output):
|
|
raise error.TestError('Test error, check debug logs for complete '
|
|
'test output')
|