普通文本  |  107行  |  4.65 KB

# 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
from autotest_lib.client.bin import utils, test
from autotest_lib.client.common_lib import error

import parse_ltp_out


class kernel_LTP(test.test):
    """Base class ltp test runner."""
    _DEP = 'kernel_ltp_dep'
    version = 1

    # Note: to run specific test(s), runltp supports the following options:
    #       -f CMDFILES (separate with ',')
    #       -s PATTERN
    #       -S SKIPFILE (ChromeOS uses ./site_excluded)
    #
    #       CMDFILES are lists of tests grouped by area. If no CMDFILES
    #       are supplied, runltp has a default set of CMDFILES listed
    #       in '$LTPROOT/scenario_groups/default' it uses. The CMDFILES are
    #       individual files under '$LTPROOT/runtest' such as commands, dio
    #       and fsx. Finally, the test cases listed in a CMDFILE are individual
    #       tests which reside under '$LTPROOT/testcases'.
    #
    #       Then, an abridged look at the parts of the LTP dir structure
    #       used here would be:
    #       $LTPROOT
    #               /scenario_groups/default - default list of CMDFILES
    #               /runtest/...             - CMDFILES group test cases
    #               /testcases/...           - test cases
    #
    #       The PATTERN argument is used to refine the tests that will run
    #       within an individual CMDFILE by supplying a regex match for
    #       individual test case names.
    #
    #       The SKIPFILE lists individual test cases to be excluded. These
    #       tests are not appropriate for a project.  ChromeOS uses the
    #       default SKIPFILE=site_excluded.
    #
    # e.g. -for all tests in math cmdfile:
    #           job.run_test('ltp', '-f math')
    #      -for just the float_bessel test in the math cmdfile:
    #           job.run_test('ltp', '-f math -s float_bessel')
    #      -for the math and memory management cmdfiles:
    #           job.run_test('ltp', '-f math,mm')
    def run_once(self, args='', script='runltp', select_tests=None):
        """A test wrapper for running tests/scripts under $LTPROOT.

        For ChromeOS $LTPROOT is the repo under src/third_party/ltp.

        @param args: arguments to be passed to 'script' (usually runltp).
        @param script: LTP script to run.
        @param select_tests: comma-separated list of names of tests
                             (executable files under ltp/testcases/bin) to run.
                             Used for running and debugging during development.
        """
        # In case the user wants to run a test script other than runltp
        # though runltp is the common case.
        if script == 'runltp':
            failcmdfile = os.path.join(self.debugdir, 'failcmdfile')
            outfile = os.path.join(self.resultsdir, 'ltp.out')
            args2 = ['-l %s' % os.path.join(self.resultsdir, 'ltp.log'),
                     '-C %s' % failcmdfile,
                     '-d %s' % self.tmpdir,
                     '-o %s' % outfile,
                     '-S %s' % os.path.join(self.bindir, 'site_excluded')]
            args = '%s -p %s' % (args, ' '.join(args2))

        # Uses the LTP binaries build into client/deps/kernel_ltp_dep.
        dep = self._DEP
        dep_dir = os.path.join(self.autodir, 'deps', dep)
        self.job.install_pkg(dep, 'dep', dep_dir)

        # Setup a fake runtest/testcase file if only running one test.
        if select_tests:
            # Selected files must exist under testcases/bin.
            testcase_bin_dir = os.path.join(dep_dir, 'testcases', 'bin')
            select_tests = select_tests.split(',')
            for select_test in select_tests:
                test_bin_file = os.path.join(testcase_bin_dir, select_test)
                if not os.path.isfile(test_bin_file):
                    raise error.TestFail('%s not found.' % test_bin_file)
            with open(os.path.join(dep_dir, 'runtest', 'cros_suite'), 'w') as f:
                for select_test in select_tests:
                    f.write('%s %s\n' % (select_test, select_test))
            args += ' -f cros_suite'

        cmd = '%s %s' % (os.path.join(dep_dir, script), args)
        result = utils.run(cmd, ignore_status=True)

        if script == 'runltp':
            parse_ltp_out.summarize(outfile)

        # look for any failed test command.
        try:
            f = open(failcmdfile)
        except IOError:
            raise error.TestFail('Expected to find failcmdfile but did not.')
        failed_cmd = f.read().strip()
        f.close()
        if failed_cmd:
            raise error.TestFail(failed_cmd)