# 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)