[tests] Add support for REQUIRES and XFAIL lines in libc++ tests.
- We parse up to the first non-empty non-comment (C++ style) line, otherwise the format and semantics match what is used for LLVM/Clang tests. - For now, the only interesting thing to test against is a user supplied target_triple test parameter. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@174440 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cccf25579a
commit
81d1ef7a3f
69
test/lit.cfg
69
test/lit.cfg
@ -11,6 +11,26 @@ import subprocess
|
|||||||
import errno
|
import errno
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
# FIXME: For now, this is cribbed from lit.TestRunner, to avoid introducing a
|
||||||
|
# dependency there. What we more ideally would like to do is lift the "xfail"
|
||||||
|
# and "requires" handling to be a core lit framework feature.
|
||||||
|
def isExpectedFail(test, xfails):
|
||||||
|
# Check if any of the xfails match an available feature or the target.
|
||||||
|
for item in xfails:
|
||||||
|
# If this is the wildcard, it always fails.
|
||||||
|
if item == '*':
|
||||||
|
return True
|
||||||
|
|
||||||
|
# If this is an exact match for one of the features, it fails.
|
||||||
|
if item in test.config.available_features:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# If this is a part of the target triple, it fails.
|
||||||
|
if item in test.suite.config.target_triple:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
class LibcxxTestFormat(lit.formats.FileBasedTest):
|
class LibcxxTestFormat(lit.formats.FileBasedTest):
|
||||||
"""
|
"""
|
||||||
Custom test format handler for use with the test format use by libc++.
|
Custom test format handler for use with the test format use by libc++.
|
||||||
@ -55,6 +75,52 @@ class LibcxxTestFormat(lit.formats.FileBasedTest):
|
|||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
def _execute(self, test, lit_config):
|
def _execute(self, test, lit_config):
|
||||||
|
# Extract test metadata from the test file.
|
||||||
|
xfails = []
|
||||||
|
requires = []
|
||||||
|
with open(test.getSourcePath()) as f:
|
||||||
|
for ln in f:
|
||||||
|
if 'XFAIL:' in ln:
|
||||||
|
items = ln[ln.index('XFAIL:') + 6:].split(',')
|
||||||
|
xfails.extend([s.strip() for s in items])
|
||||||
|
elif 'REQUIRES:' in ln:
|
||||||
|
items = ln[ln.index('REQUIRES:') + 9:].split(',')
|
||||||
|
requires.extend([s.strip() for s in items])
|
||||||
|
elif not ln.startswith("//") and ln.strip():
|
||||||
|
# Stop at the first non-empty line that is not a C++
|
||||||
|
# comment.
|
||||||
|
break
|
||||||
|
|
||||||
|
# Check that we have the required features.
|
||||||
|
#
|
||||||
|
# FIXME: For now, this is cribbed from lit.TestRunner, to avoid
|
||||||
|
# introducing a dependency there. What we more ideally would like to do
|
||||||
|
# is lift the "xfail" and "requires" handling to be a core lit framework
|
||||||
|
# feature.
|
||||||
|
missing_required_features = [f for f in requires
|
||||||
|
if f not in test.config.available_features]
|
||||||
|
if missing_required_features:
|
||||||
|
return (lit.Test.UNSUPPORTED,
|
||||||
|
"Test requires the following features: %s" % (
|
||||||
|
', '.join(missing_required_features),))
|
||||||
|
|
||||||
|
# Determine if this test is an expected failure.
|
||||||
|
isXFail = isExpectedFail(test, xfails)
|
||||||
|
|
||||||
|
# Evaluate the test.
|
||||||
|
result, report = self._evaluate_test(test, lit_config)
|
||||||
|
|
||||||
|
# Convert the test result based on whether this is an expected failure.
|
||||||
|
if isXFail:
|
||||||
|
if result != lit.Test.FAIL:
|
||||||
|
report += "\n\nTest was expected to FAIL, but did not.\n"
|
||||||
|
result = lit.Test.XPASS
|
||||||
|
else:
|
||||||
|
result = lit.Test.XFAIL
|
||||||
|
|
||||||
|
return result, report
|
||||||
|
|
||||||
|
def _evaluate_test(self, test, lit_config):
|
||||||
name = test.path_in_suite[-1]
|
name = test.path_in_suite[-1]
|
||||||
source_path = test.getSourcePath()
|
source_path = test.getSourcePath()
|
||||||
source_dir = os.path.dirname(source_path)
|
source_dir = os.path.dirname(source_path)
|
||||||
@ -210,4 +276,5 @@ config.test_format = LibcxxTestFormat(
|
|||||||
ld_flags = ['-nodefaultlibs'] + library_paths + ['-lc++'] + libraries,
|
ld_flags = ['-nodefaultlibs'] + library_paths + ['-lc++'] + libraries,
|
||||||
exec_env = exec_env)
|
exec_env = exec_env)
|
||||||
|
|
||||||
config.target_triple = None
|
config.target_triple = lit.params.get(
|
||||||
|
'target_triple', 'unknown-unknown-unknown')
|
||||||
|
Loading…
Reference in New Issue
Block a user