lit/TestRunner.py: Factor variable subsitution into an own function; NFCI

This is a clearer separation of concerns and makes it easier to reuse
the function.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251481 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Matthias Braun 2015-10-28 02:36:45 +00:00
parent ae6661b054
commit 1d7e0281ab

View File

@ -456,13 +456,27 @@ def getDefaultSubstitutions(test, tmpDir, tmpBase, normalize_slashes=False):
]) ])
return substitutions return substitutions
def parseIntegratedTestScript(test, substitutions, require_script=True): 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()
return map(processLine, script)
def parseIntegratedTestScript(test, require_script=True):
"""parseIntegratedTestScript - Scan an LLVM/Clang style integrated test """parseIntegratedTestScript - Scan an LLVM/Clang style integrated test
script and extract the lines to 'RUN' as well as 'XFAIL' and 'REQUIRES' script and extract the lines to 'RUN' as well as 'XFAIL' and 'REQUIRES'
and 'UNSUPPORTED' information. The RUN lines also will have variable and 'UNSUPPORTED' information. If 'require_script' is False an empty script
substitution performed. If 'require_script' is False an empty script may be may be returned. This can be used for test formats where the actual script
returned. This can be used for test formats where the actual script is is optional or ignored.
optional or ignored.
""" """
# Collect the test lines from the script. # Collect the test lines from the script.
sourcepath = test.getSourcePath() sourcepath = test.getSourcePath()
@ -504,21 +518,6 @@ def parseIntegratedTestScript(test, substitutions, require_script=True):
raise ValueError("unknown script command type: %r" % ( raise ValueError("unknown script command type: %r" % (
command_type,)) 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. # Verify the script contains a run line.
if require_script and not script: if require_script and not script:
return lit.Test.Result(Test.UNRESOLVED, "Test has no run line!") return lit.Test.Result(Test.UNRESOLVED, "Test has no run line!")
@ -596,16 +595,18 @@ def executeShTest(test, litConfig, useExternalSh,
if test.config.unsupported: if test.config.unsupported:
return (Test.UNSUPPORTED, 'Test is unsupported') return (Test.UNSUPPORTED, 'Test is unsupported')
tmpDir, tmpBase = getTempPaths(test) script = parseIntegratedTestScript(test)
substitutions = list(extra_substitutions)
substitutions += getDefaultSubstitutions(test, tmpDir, tmpBase,
normalize_slashes=useExternalSh)
script = parseIntegratedTestScript(test, substitutions)
if isinstance(script, lit.Test.Result): if isinstance(script, lit.Test.Result):
return script return script
if litConfig.noExecute: if litConfig.noExecute:
return lit.Test.Result(Test.PASS) return lit.Test.Result(Test.PASS)
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. # Re-run failed tests up to test_retry_attempts times.
attempts = 1 attempts = 1
if hasattr(test.config, 'test_retry_attempts'): if hasattr(test.config, 'test_retry_attempts'):