diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py index b4d7c98692337..f8e1c58d7671f 100644 --- a/llvm/utils/lit/lit/TestRunner.py +++ b/llvm/utils/lit/lit/TestRunner.py @@ -2417,6 +2417,22 @@ def runOnce( ) +def _expandLateSubstitutionsExternal(commandLine): + filePaths = [] + + def _replaceReadFile(match): + filePath = match.group(1) + filePaths.append(filePath) + return "$(cat %s)" % shlex.quote(filePath) + + commandLine = re.sub(r"%{readfile:([^}]*)}", _replaceReadFile, commandLine) + # Add test commands before the command to check if the file exists as + # cat inside a subshell will never return a non-zero exit code outside + # of the subshell. + for filePath in filePaths: + commandLine = "%s && test -e %s" % (commandLine, filePath) + return commandLine + def executeShTest( test, litConfig, useExternalSh, extra_substitutions=[], preamble_commands=[] ): @@ -2447,4 +2463,8 @@ def executeShTest( recursion_limit=test.config.recursiveExpansionLimit, ) + if useExternalSh: + for index, command in enumerate(script): + script[index] = _expandLateSubstitutionsExternal(command) + return _runShTest(test, litConfig, useExternalSh, script, tmpBase) diff --git a/llvm/utils/lit/tests/Inputs/shtest-readfile/lit.cfg b/llvm/utils/lit/tests/Inputs/shtest-readfile/lit.cfg index cf453e1ea786f..ee496674fdb62 100644 --- a/llvm/utils/lit/tests/Inputs/shtest-readfile/lit.cfg +++ b/llvm/utils/lit/tests/Inputs/shtest-readfile/lit.cfg @@ -1,7 +1,19 @@ +import os + import lit.formats +import lit.util config.name = "shtest-readfile" config.suffixes = [".txt"] -config.test_format = lit.formats.ShTest(execute_external=False) +lit_shell_env = os.environ.get("LIT_USE_INTERNAL_SHELL") +use_lit_shell = lit.util.pythonize_bool(lit_shell_env) +config.test_format = lit.formats.ShTest(execute_external=not use_lit_shell) config.test_source_root = None config.test_exec_root = None + +# If we are testing with the external shell, remove the fake-externals from +# PATH so that we use mkdir in the tests. +if not use_lit_shell: + path_parts = config.environment["PATH"].split(os.path.pathsep) + path_parts = [path_part for path_part in path_parts if "fake-externals" not in path_part] + config.environment["PATH"] = os.path.pathsep.join(path_parts) diff --git a/llvm/utils/lit/tests/shtest-readfile-external.py b/llvm/utils/lit/tests/shtest-readfile-external.py new file mode 100644 index 0000000000000..99b0160d933fe --- /dev/null +++ b/llvm/utils/lit/tests/shtest-readfile-external.py @@ -0,0 +1,22 @@ +## Tests the readfile substitution. + +# UNSUPPORTED: system-windows +# RUN: env LIT_USE_INTERNAL_SHELL=0 not %{lit} -a -v %{inputs}/shtest-readfile | FileCheck -match-full-lines -DTEMP_PATH=%S/Inputs/shtest-readfile/Output %s + +# CHECK: -- Testing: 4 tests{{.*}} + +# CHECK-LABEL: FAIL: shtest-readfile :: absolute-paths.txt ({{[^)]*}}) +# CHECK: echo $(cat [[TEMP_PATH]]/absolute-paths.txt.tmp) && test -e [[TEMP_PATH]]/absolute-paths.txt.tmp {{.*}} +# CHECK: + echo hello + +# CHECK-LABEL: FAIL: shtest-readfile :: file-does-not-exist.txt ({{[^)]*}}) +# CHECK: echo $(cat /file/does/not/exist) && test -e /file/does/not/exist {{.*}} +# CHECK: cat: /file/does/not/exist: No such file or directory + +# CHECK-LABEL: FAIL: shtest-readfile :: relative-paths.txt ({{[^)]*}}) +# CHECK: echo $(cat rel_path_test_folder/test_file) && test -e rel_path_test_folder/test_file {{.*}} +# CHECK: + echo hello + +# CHECK-LABEL: FAIL: shtest-readfile :: two-same-line.txt ({{[^)]*}}) +# CHECK: echo $(cat [[TEMP_PATH]]/two-same-line.txt.tmp.1) $(cat [[TEMP_PATH]]/two-same-line.txt.tmp.2) && test -e [[TEMP_PATH]]/two-same-line.txt.tmp.1 && test -e [[TEMP_PATH]]/two-same-line.txt.tmp.2 {{.*}} +# CHECK: + echo hello bye diff --git a/llvm/utils/lit/tests/shtest-readfile.py b/llvm/utils/lit/tests/shtest-readfile.py index 91250b2afb3f2..a122dd7664272 100644 --- a/llvm/utils/lit/tests/shtest-readfile.py +++ b/llvm/utils/lit/tests/shtest-readfile.py @@ -1,6 +1,6 @@ ## Tests the readfile substitution. -# RUN: not %{lit} -a -v %{inputs}/shtest-readfile | FileCheck -match-full-lines -DTEMP_PATH=%S%{fs-sep}Inputs%{fs-sep}shtest-readfile%{fs-sep}Output %s +# RUN: env LIT_USE_INTERNAL_SHELL=1 not %{lit} -a -v %{inputs}/shtest-readfile | FileCheck -match-full-lines -DTEMP_PATH=%S%{fs-sep}Inputs%{fs-sep}shtest-readfile%{fs-sep}Output %s # CHECK: -- Testing: 4 tests{{.*}}