import os, re, logging from autotest_lib.client.bin import test, utils, os_dep from autotest_lib.client.common_lib import error class qemu_iotests(test.test): """ This autotest module runs the qemu_iotests testsuite. @copyright: Red Hat 2009 @author: Yolkfull Chow (yzhou@redhat.com) @see: http://www.kernel.org/pub/scm/linux/kernel/git/hch/qemu-iotests.git """ version = 2 def initialize(self, qemu_path=''): if qemu_path: # Prepending the path at the beginning of $PATH will make the # version found on qemu_path be preferred over other ones. os.environ['PATH'] = qemu_path + ":" + os.environ['PATH'] try: self.qemu_img_path = os_dep.command('qemu-img') self.qemu_io_path = os_dep.command('qemu-io') except ValueError, e: raise error.TestNAError('Commands qemu-img or qemu-io missing') self.job.require_gcc() def setup(self, tarball='qemu-iotests.tar.bz2'): """ Uncompresses the tarball and cleans any leftover output files. @param tarball: Relative path to the testsuite tarball. """ tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir) utils.extract_tarball_to_dir(tarball, self.srcdir) os.chdir(self.srcdir) utils.make('clean') def run_once(self, options='', testlist=''): """ Passes the appropriate parameters to the testsuite. # Usage: $0 [options] [testlist] # check options # -raw test raw (default) # -cow test cow # -qcow test qcow # -qcow2 test qcow2 # -vpc test vpc # -vmdk test vmdk # -xdiff graphical mode diff # -nocache use O_DIRECT on backing file # -misalign misalign memory allocations # -n show me, do not run tests # -T output timestamps # -r randomize test order # # testlist options # -g group[,group...] include tests from these groups # -x group[,group...] exclude tests from these groups # NNN include test NNN # NNN-NNN include test range (eg. 012-021) @param qemu_path: Optional qemu install path. @param options: Options accepted by the testsuite. @param testlist: List of tests that will be executed (by default, all testcases will be executed). """ os.chdir(self.srcdir) test_dir = os.path.join(self.srcdir, "scratch") if not os.path.exists(test_dir): os.mkdir(test_dir) cmd = "./check" if options: cmd += " " + options if testlist: cmd += " " + testlist try: try: result = utils.system(cmd) except error.CmdError, e: failed_cases = re.findall("Failures: (\d+)", str(e)) for num in failed_cases: failed_name = num + ".out.bad" src = os.path.join(self.srcdir, failed_name) dest = os.path.join(self.resultsdir, failed_name) utils.get_file(src, dest) if failed_cases: e_msg = ("Qemu-iotests failed. Failed cases: %s" % failed_cases) else: e_msg = "Qemu-iotests failed" raise error.TestFail(e_msg) finally: src = os.path.join(self.srcdir, "check.log") dest = os.path.join(self.resultsdir, "check.log") utils.get_file(src, dest)