1# Copyright (c) 2012 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 logging
6import os
7from autotest_lib.client.bin import utils, test
8from autotest_lib.client.common_lib import error
9
10import parse_ltp_out
11
12
13class ltp(test.test):
14    version = 6
15
16    def _import_site_config(self):
17        site_config_path = os.path.join(os.path.dirname(__file__),
18                                        'site_config.py')
19        if os.path.exists(site_config_path):
20            # for some reason __import__ with full path does not work within
21            # autotest, although it works just fine on the same client machine
22            # in the python interactive shell or separate testcases
23            execfile(site_config_path)
24            self.site_ignore_tests = locals().get('ignore_tests', [])
25        else:
26            self.site_ignore_tests = []
27
28
29    def initialize(self):
30        self._import_site_config()
31        self.job.require_gcc()
32
33
34    # http://sourceforge.net/projects/ltp/files/LTP%20Source/ltp-20120104/
35    #        ltp-full-20120104.bz2
36    def setup(self, tarball = 'ltp-full-20120104.bz2'):
37        tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
38        utils.extract_tarball_to_dir(tarball, self.srcdir)
39        os.chdir(self.srcdir)
40        ltpbin_dir = os.path.join(self.srcdir, 'bin')
41        os.mkdir(ltpbin_dir)
42
43        utils.system('patch -p1 < ../patches/getdents.patch')
44        utils.system('patch -p1 < ../patches/cpuid.patch')
45        utils.system('patch -p1 < ../patches/kill-ipc.patch')
46        utils.system('patch -p1 < ../patches/genpow.patch')
47        utils.system('patch -p1 < ../patches/sysctl.patch')
48        utils.make('autotools')
49        utils.configure('--prefix=%s' % ltpbin_dir)
50        utils.make('-j %d all' % utils.count_cpus())
51        utils.system('yes n | make SKIP_IDCHECK=1 install')
52
53
54    # Note: to run specific test(s), runltp supports an option (-f)
55    #       to specify a custom 'scenario group' which is a comma-separated
56    #       list of cmdfiles and/or an option (-s) to specify a grep match
57    #       pattern for individual test names.
58    # e.g. -for all tests in math cmdfile:
59    #       job.run_test('ltp', '-f math')
60    #      -for just the float_bessel test in the math cmdfile:
61    #       job.run_test('ltp', '-f math -s float_bessel')
62    #      -for the math and memory management cmdfiles:
63    #       job.run_test('ltp', '-f math,mm')
64    # Note: the site_excluded file lists individual test tags for tests
65    #       to exclude (see the comment at the top of site_excluded).
66    def run_once(self, args = '', script = 'runltp', ignore_tests=[]):
67
68        ignore_tests = ignore_tests + self.site_ignore_tests
69
70        # In case the user wants to run another test script
71        if script == 'runltp':
72            logfile = os.path.join(self.resultsdir, 'ltp.log')
73            outfile = os.path.join(self.resultsdir, 'ltp.out')
74            failcmdfile = os.path.join(self.debugdir, 'failcmdfile')
75            excludecmdfile = os.path.join(self.bindir, 'site_excluded')
76            args2 = '-p -l %s -C %s -d %s -o %s -S %s' % (logfile, failcmdfile,
77                                                          self.tmpdir, outfile,
78                                                          excludecmdfile)
79            args = args + ' ' + args2
80
81        ltpbin_dir = os.path.join(self.srcdir, 'bin')
82        cmd = os.path.join(ltpbin_dir, script) + ' ' + args
83        result = utils.run(cmd, ignore_status=True)
84
85        if script == 'runltp':
86            parse_ltp_out.summarize(outfile)
87
88        # look for any failed test command.
89        try:
90            f = open(failcmdfile)
91        except IOError:
92            logging.warning('Expected to find failcmdfile but did not.')
93            return
94        failed_cmd = f.read().strip()
95        f.close()
96        if failed_cmd:
97            raise error.TestFail(failed_cmd)
98