blob: 86a06ae6a98f4e44a3d32b18a809cc067a7e0286 [file] [log] [blame]
# 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')