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
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)
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
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
# Collect the test lines from the script.
script = []
- xfails = []
requires = []
for line_number, command_type, ln in \
parseIntegratedTestScriptCommands(sourcepath):
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':
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 = """\
if len(res) == 2:
return res
- script, isXFail, tmpBase, execdir = res
+ script, tmpBase, execdir = res
if litConfig.noExecute:
return (Test.PASS, '')
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)