# 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'):
        """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.
        """
        # 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)

        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)
