From 992a59103bce8ab973a24ba0315fa3d1849537db Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Fri, 12 Apr 2013 19:09:09 +0000 Subject: [PATCH] lit: Fix infinite recursion when an out-of-tree test root is located inside the source test root. llvm-svn: 179402 --- utils/lit/lit/discovery.py | 29 +++++++++++++------ .../Inputs/exec-discovery-in-tree/lit.cfg | 7 +++++ .../exec-discovery-in-tree/obj/lit.site.cfg | 4 +++ .../exec-discovery-in-tree/test-one.txt | 1 + utils/lit/tests/discovery.py | 15 ++++++++++ 5 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 utils/lit/tests/Inputs/exec-discovery-in-tree/lit.cfg create mode 100644 utils/lit/tests/Inputs/exec-discovery-in-tree/obj/lit.site.cfg create mode 100644 utils/lit/tests/Inputs/exec-discovery-in-tree/test-one.txt diff --git a/utils/lit/lit/discovery.py b/utils/lit/lit/discovery.py index b87de74c8b5..64a9510f955 100644 --- a/utils/lit/lit/discovery.py +++ b/utils/lit/lit/discovery.py @@ -147,20 +147,31 @@ def getTestsInSuite(ts, path_in_suite, litConfig, # Check for nested test suites, first in the execpath in case there is a # site configuration and then in the source path. - file_execpath = ts.getExecPath(path_in_suite + (filename,)) + subpath = path_in_suite + (filename,) + file_execpath = ts.getExecPath(subpath) if dirContainsTestSuite(file_execpath, litConfig): - sub_ts, subiter = getTests(file_execpath, litConfig, - testSuiteCache, localConfigCache) + sub_ts, subpath_in_suite = getTestSuite(file_execpath, litConfig, + testSuiteCache) elif dirContainsTestSuite(file_sourcepath, litConfig): - sub_ts, subiter = getTests(file_sourcepath, litConfig, - testSuiteCache, localConfigCache) + sub_ts, subpath_in_suite = getTestSuite(file_sourcepath, litConfig, + testSuiteCache) else: - # Otherwise, continue loading from inside this test suite. - subiter = getTestsInSuite(ts, path_in_suite + (filename,), - litConfig, testSuiteCache, - localConfigCache) sub_ts = None + # If the this directory recursively maps back to the current test suite, + # disregard it (this can happen if the exec root is located inside the + # current test suite, for example). + if sub_ts is ts: + continue + + # Otherwise, load from the nested test suite, if present. + if sub_ts is not None: + subiter = getTestsInSuite(sub_ts, subpath_in_suite, litConfig, + testSuiteCache, localConfigCache) + else: + subiter = getTestsInSuite(ts, subpath, litConfig, testSuiteCache, + localConfigCache) + N = 0 for res in subiter: N += 1 diff --git a/utils/lit/tests/Inputs/exec-discovery-in-tree/lit.cfg b/utils/lit/tests/Inputs/exec-discovery-in-tree/lit.cfg new file mode 100644 index 00000000000..342b2fdd3c8 --- /dev/null +++ b/utils/lit/tests/Inputs/exec-discovery-in-tree/lit.cfg @@ -0,0 +1,7 @@ +# Verify that the site configuration was loaded. +if config.test_source_root is None or config.test_exec_root is None: + lit.fatal("No site specific configuration") + +config.name = 'exec-discovery-in-tree-suite' +config.suffixes = ['.txt'] +config.test_format = lit.formats.ShTest() diff --git a/utils/lit/tests/Inputs/exec-discovery-in-tree/obj/lit.site.cfg b/utils/lit/tests/Inputs/exec-discovery-in-tree/obj/lit.site.cfg new file mode 100644 index 00000000000..de9a3d0c6df --- /dev/null +++ b/utils/lit/tests/Inputs/exec-discovery-in-tree/obj/lit.site.cfg @@ -0,0 +1,4 @@ +import os +config.test_exec_root = os.path.dirname(__file__) +config.test_source_root = os.path.dirname(config.test_exec_root) +lit.load_config(config, os.path.join(config.test_source_root, "lit.cfg")) \ No newline at end of file diff --git a/utils/lit/tests/Inputs/exec-discovery-in-tree/test-one.txt b/utils/lit/tests/Inputs/exec-discovery-in-tree/test-one.txt new file mode 100644 index 00000000000..b80b60b7a27 --- /dev/null +++ b/utils/lit/tests/Inputs/exec-discovery-in-tree/test-one.txt @@ -0,0 +1 @@ +# RUN: true diff --git a/utils/lit/tests/discovery.py b/utils/lit/tests/discovery.py index 88a72729aff..56d9dd07e84 100644 --- a/utils/lit/tests/discovery.py +++ b/utils/lit/tests/discovery.py @@ -79,3 +79,18 @@ # # CHECK-ASEXEC-EXACT-TEST: -- Testing: 1 tests, 1 threads -- # CHECK-ASEXEC-EXACT-TEST: PASS: top-level-suite :: subdir/test-three + + +# Check that we don't recurse infinitely when loading an site specific test +# suite located inside the test source root. +# +# RUN: %{lit} \ +# RUN: %{inputs}/exec-discovery-in-tree/obj/ \ +# RUN: -j 1 --no-execute --show-suites -v > %t.out +# RUN: FileCheck --check-prefix=CHECK-ASEXEC-INTREE < %t.out %s +# +# CHECK-ASEXEC-INTREE: exec-discovery-in-tree-suite - 1 tests +# CHECK-ASEXEC-INTREE-NEXT: Source Root: {{.*/exec-discovery-in-tree$}} +# CHECK-ASEXEC-INTREE-NEXT: Exec Root : {{.*/exec-discovery-in-tree/obj$}} +# CHECK-ASEXEC-INTREE-NEXT: -- Testing: 1 tests, 1 threads -- +# CHECK-ASEXEC-INTREE-NEXT: PASS: exec-discovery-in-tree-suite :: test-one