env = cmd_shenv.env,
close_fds = kUseCloseFDs))
except OSError as e:
- raise InternalShellError(j, 'Could not create process due to {}'.format(e))
+ raise InternalShellError(j, 'Could not create process ({}) due to {}'.format(executable, e))
# Immediately close stdin for any process taking stdin from us.
if stdin == subprocess.PIPE:
finally:
f.close()
-
-def parseIntegratedTestScript(test, normalize_slashes=False,
- extra_substitutions=[], require_script=True):
- """parseIntegratedTestScript - Scan an LLVM/Clang style integrated test
- script and extract the lines to 'RUN' as well as 'XFAIL' and 'REQUIRES'
- and 'UNSUPPORTED' information. The RUN lines also will have variable
- substitution performed. If 'require_script' is False an empty script may be
- returned. This can be used for test formats where the actual script is
- optional or ignored.
- """
-
- # Get the temporary location, this is always relative to the test suite
- # root, not test source root.
- #
- # FIXME: This should not be here?
- sourcepath = test.getSourcePath()
- sourcedir = os.path.dirname(sourcepath)
+def getTempPaths(test):
+ """Get the temporary location, this is always relative to the test suite
+ root, not test source root."""
execpath = test.getExecPath()
execdir,execbase = os.path.split(execpath)
tmpDir = os.path.join(execdir, 'Output')
tmpBase = os.path.join(tmpDir, execbase)
+ return tmpDir, tmpBase
+
+def getDefaultSubstitutions(test, tmpDir, tmpBase, normalize_slashes=False):
+ sourcepath = test.getSourcePath()
+ sourcedir = os.path.dirname(sourcepath)
# Normalize slashes, if requested.
if normalize_slashes:
tmpBase = tmpBase.replace('\\', '/')
# We use #_MARKER_# to hide %% while we do the other substitutions.
- substitutions = list(extra_substitutions)
+ substitutions = []
substitutions.extend([('%%', '#_MARKER_#')])
substitutions.extend(test.config.substitutions)
substitutions.extend([('%s', sourcepath),
('%/t', tmpBase.replace('\\', '/') + '.tmp'),
('%/T', tmpDir.replace('\\', '/')),
])
+ return substitutions
+
+def applySubstitutions(script, substitutions):
+ """Apply substitutions to the script. Allow full regular expression syntax.
+ Replace each matching occurrence of regular expression pattern a with
+ substitution b in line ln."""
+ def processLine(ln):
+ # Apply substitutions
+ for a,b in substitutions:
+ if kIsWindows:
+ b = b.replace("\\","\\\\")
+ ln = re.sub(a, b, ln)
+ # Strip the trailing newline and any extra whitespace.
+ return ln.strip()
+ # Note Python 3 map() gives an iterator rather than a list so explicitly
+ # convert to list before returning.
+ return list(map(processLine, script))
+
+def parseIntegratedTestScript(test, require_script=True):
+ """parseIntegratedTestScript - Scan an LLVM/Clang style integrated test
+ script and extract the lines to 'RUN' as well as 'XFAIL' and 'REQUIRES'
+ and 'UNSUPPORTED' information. If 'require_script' is False an empty script
+ may be returned. This can be used for test formats where the actual script
+ is optional or ignored.
+ """
# Collect the test lines from the script.
+ sourcepath = test.getSourcePath()
script = []
requires = []
unsupported = []
raise ValueError("unknown script command type: %r" % (
command_type,))
- # Apply substitutions to the script. Allow full regular
- # expression syntax. Replace each matching occurrence of regular
- # expression pattern a with substitution b in line ln.
- def processLine(ln):
- # Apply substitutions
- for a,b in substitutions:
- if kIsWindows:
- b = b.replace("\\","\\\\")
- ln = re.sub(a, b, ln)
-
- # Strip the trailing newline and any extra whitespace.
- return ln.strip()
- script = [processLine(ln)
- for ln in script]
-
# Verify the script contains a run line.
if require_script and not script:
return lit.Test.Result(Test.UNRESOLVED, "Test has no run line!")
return lit.Test.Result(Test.UNSUPPORTED,
"Test requires one of the limit_to_features features %s" % msg)
- return script,tmpBase
+ return script
def _runShTest(test, litConfig, useExternalSh, script, tmpBase):
# Create the output directory if it does not already exist.
if test.config.unsupported:
return (Test.UNSUPPORTED, 'Test is unsupported')
- res = parseIntegratedTestScript(test, useExternalSh, extra_substitutions)
- if isinstance(res, lit.Test.Result):
- return res
+ script = parseIntegratedTestScript(test)
+ if isinstance(script, lit.Test.Result):
+ return script
if litConfig.noExecute:
return lit.Test.Result(Test.PASS)
- script, tmpBase = res
+ tmpDir, tmpBase = getTempPaths(test)
+ substitutions = list(extra_substitutions)
+ substitutions += getDefaultSubstitutions(test, tmpDir, tmpBase,
+ normalize_slashes=useExternalSh)
+ script = applySubstitutions(script, substitutions)
# Re-run failed tests up to test_retry_attempts times.
attempts = 1