blob: 14d1be383c4938cb6b87f8a65489c25f1ad2cdc2 [file] [log] [blame]
"""
Main integration for llvm-lit: This defines a lit test format.
Also contains logic to load benchmark modules.
"""
import lit
import lit.TestRunner
import lit.util
import lit.formats
import litsupport.modules
import litsupport.modules.hash
import litsupport.testfile
import litsupport.testplan
import os
# The ResultCode constructor has been changed recently in lit. An additional parameter has ben added, which
# results in: TypeError: __new__() takes exactly 4 arguments (3 given)
# However, some users rely on the lit version provided by pypi that does not require or have add_result_category.
# See for more details: http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20200511/780899.html
try:
NOCHANGE = lit.Test.ResultCode('NOCHANGE', 'Executable Unchanged', False)
NOEXE = lit.Test.ResultCode('NOEXE', 'Executable Missing', True)
except TypeError:
NOCHANGE = lit.Test.ResultCode('NOCHANGE', False)
NOEXE = lit.Test.ResultCode('NOEXE', True)
class TestSuiteTest(lit.formats.ShTest):
def __init__(self):
super(TestSuiteTest, self).__init__()
def execute(self, test, litConfig):
config = test.config
if config.unsupported:
return lit.Test.Result(lit.Test.UNSUPPORTED, 'Test is unsupported')
if litConfig.noExecute:
return lit.Test.Result(lit.Test.PASS)
# Parse .test file and initialize context
tmpDir, tmpBase = lit.TestRunner.getTempPaths(test)
lit.util.mkdir_p(os.path.dirname(tmpBase))
context = litsupport.testplan.TestContext(test, litConfig, tmpDir,
tmpBase)
litsupport.testfile.parse(context, test.getSourcePath())
plan = litsupport.testplan.TestPlan()
# Report missing test executables.
if not os.path.exists(context.executable):
return lit.Test.Result(NOEXE, "Executable '%s' is missing" %
context.executable)
# Skip unchanged tests
if config.previous_results:
litsupport.modules.hash.compute(context)
if litsupport.modules.hash.same_as_previous(context):
result = lit.Test.Result(
NOCHANGE, 'Executable identical to previous run')
val = lit.Test.toMetricValue(context.executable_hash)
result.addMetric('hash', val)
return result
# Let test modules modify the test plan.
for modulename in config.test_modules:
module = litsupport.modules.modules.get(modulename)
if module is None:
raise Exception("Unknown testmodule '%s'" % modulename)
module.mutatePlan(context, plan)
# Execute Test plan
result = litsupport.testplan.executePlanTestResult(context, plan)
return result