• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
6from autotest_lib.client.bin import utils, test
7from autotest_lib.client.common_lib import error
8
9import parse_ltp_out
10
11
12class kernel_LTP(test.test):
13    """Base class ltp test runner."""
14    _DEP = 'kernel_ltp_dep'
15    version = 1
16
17    # Note: to run specific test(s), runltp supports the following options:
18    #       -f CMDFILES (separate with ',')
19    #       -s PATTERN
20    #       -S SKIPFILE (ChromeOS uses ./site_excluded)
21    #
22    #       CMDFILES are lists of tests grouped by area. If no CMDFILES
23    #       are supplied, runltp has a default set of CMDFILES listed
24    #       in '$LTPROOT/scenario_groups/default' it uses. The CMDFILES are
25    #       individual files under '$LTPROOT/runtest' such as commands, dio
26    #       and fsx. Finally, the test cases listed in a CMDFILE are individual
27    #       tests which reside under '$LTPROOT/testcases'.
28    #
29    #       Then, an abridged look at the parts of the LTP dir structure
30    #       used here would be:
31    #       $LTPROOT
32    #               /scenario_groups/default - default list of CMDFILES
33    #               /runtest/...             - CMDFILES group test cases
34    #               /testcases/...           - test cases
35    #
36    #       The PATTERN argument is used to refine the tests that will run
37    #       within an individual CMDFILE by supplying a regex match for
38    #       individual test case names.
39    #
40    #       The SKIPFILE lists individual test cases to be excluded. These
41    #       tests are not appropriate for a project.  ChromeOS uses the
42    #       default SKIPFILE=site_excluded.
43    #
44    # e.g. -for all tests in math cmdfile:
45    #           job.run_test('ltp', '-f math')
46    #      -for just the float_bessel test in the math cmdfile:
47    #           job.run_test('ltp', '-f math -s float_bessel')
48    #      -for the math and memory management cmdfiles:
49    #           job.run_test('ltp', '-f math,mm')
50    def run_once(self, args='', script='runltp', select_tests=None):
51        """A test wrapper for running tests/scripts under $LTPROOT.
52
53        For ChromeOS $LTPROOT is the repo under src/third_party/ltp.
54
55        @param args: arguments to be passed to 'script' (usually runltp).
56        @param script: LTP script to run.
57        @param select_tests: comma-separated list of names of tests
58                             (executable files under ltp/testcases/bin) to run.
59                             Used for running and debugging during development.
60        """
61        # In case the user wants to run a test script other than runltp
62        # though runltp is the common case.
63        if script == 'runltp':
64            failcmdfile = os.path.join(self.debugdir, 'failcmdfile')
65            outfile = os.path.join(self.resultsdir, 'ltp.out')
66            args2 = ['-l %s' % os.path.join(self.resultsdir, 'ltp.log'),
67                     '-C %s' % failcmdfile,
68                     '-d %s' % self.tmpdir,
69                     '-o %s' % outfile,
70                     '-S %s' % os.path.join(self.bindir, 'site_excluded')]
71            args = '%s -p %s' % (args, ' '.join(args2))
72
73        # Uses the LTP binaries build into client/deps/kernel_ltp_dep.
74        dep = self._DEP
75        dep_dir = os.path.join(self.autodir, 'deps', dep)
76        self.job.install_pkg(dep, 'dep', dep_dir)
77
78        # Setup a fake runtest/testcase file if only running one test.
79        if select_tests:
80            # Selected files must exist under testcases/bin.
81            testcase_bin_dir = os.path.join(dep_dir, 'testcases', 'bin')
82            select_tests = select_tests.split(',')
83            for select_test in select_tests:
84                test_bin_file = os.path.join(testcase_bin_dir, select_test)
85                if not os.path.isfile(test_bin_file):
86                    raise error.TestFail('%s not found.' % test_bin_file)
87            with open(os.path.join(dep_dir, 'runtest', 'cros_suite'), 'w') as f:
88                for select_test in select_tests:
89                    f.write('%s %s\n' % (select_test, select_test))
90            args += ' -f cros_suite'
91
92        cmd = '%s %s' % (os.path.join(dep_dir, script), args)
93        result = utils.run(cmd, ignore_status=True)
94
95        if script == 'runltp':
96            parse_ltp_out.summarize(outfile)
97
98        # look for any failed test command.
99        try:
100            f = open(failcmdfile)
101        except IOError:
102            raise error.TestFail('Expected to find failcmdfile but did not.')
103        failed_cmd = f.read().strip()
104        f.close()
105        if failed_cmd:
106            raise error.TestFail(failed_cmd)
107