blob: 8e48bd508aa3d260f7db70882166b4494a53dc2d [file] [log] [blame] [edit]
"""
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