]> granicus.if.org Git - llvm/commitdiff
[lit] Check for accidental external command calls
authorJoel E. Denny <jdenny.ornl@gmail.com>
Mon, 19 Aug 2019 22:59:37 +0000 (22:59 +0000)
committerJoel E. Denny <jdenny.ornl@gmail.com>
Mon, 19 Aug 2019 22:59:37 +0000 (22:59 +0000)
This patch extends lit's test suite to check that lit's internal shell
doesn't accidentally execute internal commands as external commands.
It does so by putting fake failing versions of those commands in
`PATH` while the entire lit test suite is running.  Without the fixes
in D65697 but with its tests, this approach catches accidental
external `env` calls.

Reviewed By: probinson

Differential Revision: https://reviews.llvm.org/D66293

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@369309 91177308-0d34-0410-b5e6-96231b3b80d8

utils/lit/tests/Inputs/fake-externals/cd [new file with mode: 0755]
utils/lit/tests/Inputs/fake-externals/diff [new file with mode: 0755]
utils/lit/tests/Inputs/fake-externals/env [new file with mode: 0755]
utils/lit/tests/Inputs/fake-externals/export [new file with mode: 0755]
utils/lit/tests/Inputs/fake-externals/fake_external.py [new file with mode: 0644]
utils/lit/tests/Inputs/fake-externals/mkdir [new file with mode: 0755]
utils/lit/tests/Inputs/fake-externals/rm [new file with mode: 0755]
utils/lit/tests/lit.cfg

diff --git a/utils/lit/tests/Inputs/fake-externals/cd b/utils/lit/tests/Inputs/fake-externals/cd
new file mode 100755 (executable)
index 0000000..9d9612d
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+import fake_external
+
+fake_external.execute(__file__)
diff --git a/utils/lit/tests/Inputs/fake-externals/diff b/utils/lit/tests/Inputs/fake-externals/diff
new file mode 100755 (executable)
index 0000000..9d9612d
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+import fake_external
+
+fake_external.execute(__file__)
diff --git a/utils/lit/tests/Inputs/fake-externals/env b/utils/lit/tests/Inputs/fake-externals/env
new file mode 100755 (executable)
index 0000000..9d9612d
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+import fake_external
+
+fake_external.execute(__file__)
diff --git a/utils/lit/tests/Inputs/fake-externals/export b/utils/lit/tests/Inputs/fake-externals/export
new file mode 100755 (executable)
index 0000000..9d9612d
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+import fake_external
+
+fake_external.execute(__file__)
diff --git a/utils/lit/tests/Inputs/fake-externals/fake_external.py b/utils/lit/tests/Inputs/fake-externals/fake_external.py
new file mode 100644 (file)
index 0000000..1fdc2ee
--- /dev/null
@@ -0,0 +1,7 @@
+import os
+import sys
+
+def execute(fileName):
+  sys.stderr.write("error: external '{}' command called unexpectedly\n"
+                   .format(os.path.basename(fileName)));
+  sys.exit(1)
diff --git a/utils/lit/tests/Inputs/fake-externals/mkdir b/utils/lit/tests/Inputs/fake-externals/mkdir
new file mode 100755 (executable)
index 0000000..9d9612d
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+import fake_external
+
+fake_external.execute(__file__)
diff --git a/utils/lit/tests/Inputs/fake-externals/rm b/utils/lit/tests/Inputs/fake-externals/rm
new file mode 100755 (executable)
index 0000000..9d9612d
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+import fake_external
+
+fake_external.execute(__file__)
index 92f27b0218893fd5d8b4f0bb782fba36fec95d1a..26b3a1147d29ccceb1041eefbe2c05d63cb186e0 100644 (file)
@@ -75,3 +75,14 @@ else:
 if not llvm_config:
   if sys.platform.startswith('win') or sys.platform.startswith('cygwin'):
     config.available_features.add('system-windows')
+
+# For each of lit's internal shell commands ('env', 'cd', 'diff', etc.), put
+# a fake command that always fails at the start of PATH.  This helps us check
+# that we always use lit's internal version rather than some external version
+# that might not be present or behave correctly on all platforms.  Don't do
+# this for 'echo' because an external version is used when it appears in a
+# pipeline.  Don't do this for ':' because it doesn't appear to be a valid file
+# name under Windows.
+test_bin = os.path.join(os.path.dirname(__file__), 'Inputs', 'fake-externals')
+config.environment['PATH'] = os.path.pathsep.join((test_bin,
+                                                   config.environment['PATH']))