summaryrefslogtreecommitdiff
path: root/utils/lit
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2013-08-21 22:26:42 +0000
committerDaniel Dunbar <daniel@zuster.org>2013-08-21 22:26:42 +0000
commitf72bc792264941d1cdffe99775ce5e28bcdc51a4 (patch)
treeb54685122f86ef547bba14b73d0bbeabfc794cc8 /utils/lit
parentd3bf8a2c0aefe36cb4bfc6f41983aa09caae2acb (diff)
downloadllvm-f72bc792264941d1cdffe99775ce5e28bcdc51a4.tar.gz
llvm-f72bc792264941d1cdffe99775ce5e28bcdc51a4.tar.bz2
llvm-f72bc792264941d1cdffe99775ce5e28bcdc51a4.tar.xz
[lit] Lift XFAIL handling to core infrastructure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188949 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/lit')
-rw-r--r--utils/lit/lit/Test.py37
-rw-r--r--utils/lit/lit/TestRunner.py42
-rw-r--r--utils/lit/tests/shtest-format.py5
3 files changed, 48 insertions, 36 deletions
diff --git a/utils/lit/lit/Test.py b/utils/lit/lit/Test.py
index c1bacb3d86..59ca6943e7 100644
--- a/utils/lit/lit/Test.py
+++ b/utils/lit/lit/Test.py
@@ -59,6 +59,10 @@ class Test:
self.suite = suite
self.path_in_suite = path_in_suite
self.config = config
+ # A list of conditions under which this test is expected to fail. These
+ # can optionally be provided by test format handlers, and will be
+ # honored when the test result is supplied.
+ self.xfails = []
# The test result, once complete.
self.result = None
@@ -70,6 +74,13 @@ class Test:
self.result = result
+ # Apply the XFAIL handling to resolve the result exit code.
+ if self.isExpectedToFail():
+ if self.result.code == PASS:
+ self.result.code = XPASS
+ elif self.result.code == FAIL:
+ self.result.code = XFAIL
+
def getFullName(self):
return self.suite.config.name + ' :: ' + '/'.join(self.path_in_suite)
@@ -78,3 +89,29 @@ class Test:
def getExecPath(self):
return self.suite.getExecPath(self.path_in_suite)
+
+ def isExpectedToFail(self):
+ """
+ isExpectedToFail() -> bool
+
+ Check whether this test is expected to fail in the current
+ configuration. This check relies on the test xfails property which by
+ some test formats may not be computed until the test has first been
+ executed.
+ """
+
+ # Check if any of the xfails match an available feature or the target.
+ for item in self.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 self.config.available_features:
+ return True
+
+ # If this is a part of the target triple, it fails.
+ if item in self.suite.config.target_triple:
+ return True
+
+ return False
diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py
index 6e03eb9659..cf98b7a371 100644
--- a/utils/lit/lit/TestRunner.py
+++ b/utils/lit/lit/TestRunner.py
@@ -298,23 +298,6 @@ def executeScript(test, litConfig, tmpBase, commands, cwd):
return lit.util.executeCommand(command, cwd=cwd,
env=test.config.environment)
-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
-
def parseIntegratedTestScriptCommands(source_path):
"""
parseIntegratedTestScriptCommands(source_path) -> commands
@@ -415,7 +398,6 @@ def parseIntegratedTestScript(test, normalize_slashes=False,
# Collect the test lines from the script.
script = []
- xfails = []
requires = []
for line_number, command_type, ln in \
parseIntegratedTestScriptCommands(sourcepath):
@@ -438,7 +420,7 @@ def parseIntegratedTestScript(test, normalize_slashes=False,
else:
script.append(ln)
elif command_type == 'XFAIL':
- xfails.extend([s.strip() for s in ln.split(',')])
+ test.xfails.extend([s.strip() for s in ln.split(',')])
elif command_type == 'REQUIRES':
requires.extend([s.strip() for s in ln.split(',')])
elif command_type == 'END':
@@ -480,8 +462,7 @@ def parseIntegratedTestScript(test, normalize_slashes=False,
return (Test.UNSUPPORTED,
"Test requires the following features: %s" % msg)
- isXFail = isExpectedFail(test, xfails)
- return script,isXFail,tmpBase,execdir
+ return script,tmpBase,execdir
def formatTestOutput(status, out, err, exitCode, script):
output = """\
@@ -521,7 +502,7 @@ def executeShTest(test, litConfig, useExternalSh,
if len(res) == 2:
return res
- script, isXFail, tmpBase, execdir = res
+ script, tmpBase, execdir = res
if litConfig.noExecute:
return (Test.PASS, '')
@@ -537,20 +518,9 @@ def executeShTest(test, litConfig, useExternalSh,
return res
out,err,exitCode = res
- if isXFail:
- ok = exitCode != 0
- if ok:
- status = Test.XFAIL
- else:
- status = Test.XPASS
+ if exitCode == 0:
+ status = Test.PASS
else:
- ok = exitCode == 0
- if ok:
- status = Test.PASS
- else:
- status = Test.FAIL
-
- if ok:
- return (status,'')
+ status = Test.FAIL
return formatTestOutput(status, out, err, exitCode, script)
diff --git a/utils/lit/tests/shtest-format.py b/utils/lit/tests/shtest-format.py
index a5ce2ff949..1c23119e8b 100644
--- a/utils/lit/tests/shtest-format.py
+++ b/utils/lit/tests/shtest-format.py
@@ -53,6 +53,11 @@
# CHECK: XFAIL: shtest-format :: xfail-target.txt
# CHECK: XFAIL: shtest-format :: xfail.txt
# CHECK: XPASS: shtest-format :: xpass.txt
+# CHECK-NEXT: *** TEST 'shtest-format :: xpass.txt' FAILED ***
+# CHECK-NEXT: Script
+# CHECK-NEXT: --
+# CHECK-NEXT: true
+# CHECK-NEXT: --
# CHECK: Testing Time
# CHECK: Unexpected Passing Tests (1)