From 00a42449ecd9aa243d844ffd1e473fd88fe1a2b1 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Mon, 14 Sep 2009 02:38:46 +0000 Subject: [PATCH] lit: Give test formats control over test discovery. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81751 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/lit/LitFormats.py | 4 +- utils/lit/ShTest.py | 12 ------ utils/lit/TclTest.py | 7 ---- utils/lit/TestFormats.py | 91 ++++++++++++++++++++++++++++++++++++++++ utils/lit/lit.py | 12 +++--- 5 files changed, 100 insertions(+), 26 deletions(-) delete mode 100644 utils/lit/ShTest.py delete mode 100644 utils/lit/TclTest.py create mode 100644 utils/lit/TestFormats.py diff --git a/utils/lit/LitFormats.py b/utils/lit/LitFormats.py index cc00ddc7e7e..e22f84bf89a 100644 --- a/utils/lit/LitFormats.py +++ b/utils/lit/LitFormats.py @@ -1,2 +1,2 @@ -from ShTest import ShTest -from TclTest import TclTest +from TestFormats import GoogleTest, ShTest, TclTest + diff --git a/utils/lit/ShTest.py b/utils/lit/ShTest.py deleted file mode 100644 index fefdf7602b2..00000000000 --- a/utils/lit/ShTest.py +++ /dev/null @@ -1,12 +0,0 @@ -import TestRunner - -class ShTest: - def __init__(self, execute_external = False, require_and_and = False): - self.execute_external = execute_external - self.require_and_and = require_and_and - - def execute(self, test, litConfig): - return TestRunner.executeShTest(test, litConfig, - self.execute_external, - self.require_and_and) - diff --git a/utils/lit/TclTest.py b/utils/lit/TclTest.py deleted file mode 100644 index e79f1797506..00000000000 --- a/utils/lit/TclTest.py +++ /dev/null @@ -1,7 +0,0 @@ -import TestRunner - -class TclTest: - def execute(self, test, litConfig): - return TestRunner.executeTclTest(test, litConfig) - - diff --git a/utils/lit/TestFormats.py b/utils/lit/TestFormats.py new file mode 100644 index 00000000000..62451469fda --- /dev/null +++ b/utils/lit/TestFormats.py @@ -0,0 +1,91 @@ +import os + +import Test +import TestRunner +import Util + +class GoogleTest(object): + def __init__(self, test_sub_dir, test_suffix): + self.test_sub_dir = str(test_sub_dir) + self.test_suffix = str(test_suffix) + + def getGTestTests(self, path): + """getGTestTests(path) - [name] + + Return the tests available in gtest executable.""" + + lines = Util.capture([path, '--gtest_list_tests']).split('\n') + nested_tests = [] + for ln in lines: + if not ln.strip(): + continue + + prefix = '' + index = 0 + while ln[index*2:index*2+2] == ' ': + index += 1 + while len(nested_tests) > index: + nested_tests.pop() + + ln = ln[index*2:] + if ln.endswith('.'): + nested_tests.append(ln) + else: + yield ''.join(nested_tests) + ln + + def getTestsInDirectory(self, testSuite, path_in_suite, + litConfig, localConfig): + source_path = testSuite.getSourcePath(path_in_suite) + for filename in os.listdir(source_path): + # Check for the one subdirectory (build directory) tests will be in. + if filename != self.test_sub_dir: + continue + + filepath = os.path.join(source_path, filename) + for subfilename in os.listdir(filepath): + if subfilename.endswith(self.test_suffix): + execpath = os.path.join(filepath, subfilename) + + # Discover the tests in this executable. + for name in self.getGTestTests(execpath): + testPath = path_in_suite + (filename, subfilename, name) + yield Test.Test(testSuite, testPath, localConfig) + + def execute(self, test, litConfig): + testPath,testName = os.path.split(test.getSourcePath()) + + cmd = [testPath, '--gtest_filter=' + testName] + out, err, exitCode = TestRunner.executeCommand(cmd) + + if not exitCode: + return Test.PASS,'' + + return Test.FAIL, out + err + +### + +class FileBasedTest(object): + def getTestsInDirectory(self, testSuite, path_in_suite, + litConfig, localConfig): + source_path = testSuite.getSourcePath(path_in_suite) + for filename in os.listdir(source_path): + filepath = os.path.join(source_path, filename) + if not os.path.isdir(filepath): + base,ext = os.path.splitext(filename) + if ext in localConfig.suffixes: + yield Test.Test(testSuite, path_in_suite + (filename,), + localConfig) + +class ShTest(FileBasedTest): + def __init__(self, execute_external = False, require_and_and = False): + self.execute_external = execute_external + self.require_and_and = require_and_and + + def execute(self, test, litConfig): + return TestRunner.executeShTest(test, litConfig, + self.execute_external, + self.require_and_and) + +class TclTest(FileBasedTest): + def execute(self, test, litConfig): + return TestRunner.executeTclTest(test, litConfig) diff --git a/utils/lit/lit.py b/utils/lit/lit.py index 98cb44d17d4..bc43c505740 100755 --- a/utils/lit/lit.py +++ b/utils/lit/lit.py @@ -252,6 +252,13 @@ def getTestsInSuite(ts, path_in_suite, litConfig, # Otherwise we have a directory to search for tests, start by getting the # local configuration. lc = getLocalConfig(ts, path_in_suite, litConfig, localConfigCache) + + # Search for tests. + for res in lc.test_format.getTestsInDirectory(ts, path_in_suite, + litConfig, lc): + yield res + + # Search subdirectories. for filename in os.listdir(source_path): # FIXME: This doesn't belong here? if filename == 'Output' or filename in lc.excludes: @@ -270,11 +277,6 @@ def getTestsInSuite(ts, path_in_suite, litConfig, litConfig, testSuiteCache, localConfigCache): yield res - else: - # Otherwise add tests for matching suffixes. - base,ext = os.path.splitext(filename) - if ext in lc.suffixes: - yield Test.Test(ts, path_in_suite + (filename,), lc) def runTests(numThreads, litConfig, provider, display): # If only using one testing thread, don't use threads at all; this lets us