diff options
Diffstat (limited to 'utils/lit/TestFormats.py')
-rw-r--r-- | utils/lit/TestFormats.py | 67 |
1 files changed, 51 insertions, 16 deletions
diff --git a/utils/lit/TestFormats.py b/utils/lit/TestFormats.py index 7e638b4..f067bae 100644 --- a/utils/lit/TestFormats.py +++ b/utils/lit/TestFormats.py @@ -53,8 +53,9 @@ class GoogleTest(object): def execute(self, test, litConfig): testPath,testName = os.path.split(test.getSourcePath()) - if not os.path.exists(testPath): - # Handle GTest typed tests, whose name includes a '/'. + while not os.path.exists(testPath): + # Handle GTest parametrized and typed tests, whose name includes + # some '/'s. testPath, namePrefix = os.path.split(testPath) testName = os.path.join(namePrefix, testName) @@ -81,14 +82,12 @@ class FileBasedTest(object): localConfig) class ShTest(FileBasedTest): - def __init__(self, execute_external = False, require_and_and = False): + def __init__(self, execute_external = 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) + self.execute_external) class TclTest(FileBasedTest): def execute(self, test, litConfig): @@ -99,16 +98,20 @@ class TclTest(FileBasedTest): import re import tempfile -class SyntaxCheckTest: +class OneCommandPerFileTest: # FIXME: Refactor into generic test for running some command on a directory # of inputs. - def __init__(self, compiler, dir, recursive, pattern, extra_cxx_args=[]): - self.compiler = str(compiler) + def __init__(self, command, dir, recursive=False, + pattern=".*", useTempInput=False): + if isinstance(command, str): + self.command = [command] + else: + self.command = list(command) self.dir = str(dir) self.recursive = bool(recursive) self.pattern = re.compile(pattern) - self.extra_cxx_args = list(extra_cxx_args) + self.useTempInput = useTempInput def getTestsInDirectory(self, testSuite, path_in_suite, litConfig, localConfig): @@ -116,6 +119,9 @@ class SyntaxCheckTest: if not self.recursive: subdirs[:] = [] + if dirname == '.svn' or dirname in localConfig.excludes: + continue + for filename in filenames: if (not self.pattern.match(filename) or filename in localConfig.excludes): @@ -132,17 +138,46 @@ class SyntaxCheckTest: test.source_path = path yield test + def createTempInput(self, tmp, test): + abstract + def execute(self, test, litConfig): - tmp = tempfile.NamedTemporaryFile(suffix='.cpp') - print >>tmp, '#include "%s"' % test.source_path - tmp.flush() + if test.config.unsupported: + return (Test.UNSUPPORTED, 'Test is unsupported') + + cmd = list(self.command) + + # If using temp input, create a temporary file and hand it to the + # subclass. + if self.useTempInput: + tmp = tempfile.NamedTemporaryFile(suffix='.cpp') + self.createTempInput(tmp, test) + tmp.flush() + cmd.append(tmp.name) + else: + cmd.append(test.source_path) - cmd = [self.compiler, '-x', 'c++', '-fsyntax-only', tmp.name] - cmd.extend(self.extra_cxx_args) out, err, exitCode = TestRunner.executeCommand(cmd) diags = out + err if not exitCode and not diags.strip(): return Test.PASS,'' - return Test.FAIL, diags + # Try to include some useful information. + report = """Command: %s\n""" % ' '.join(["'%s'" % a + for a in cmd]) + if self.useTempInput: + report += """Temporary File: %s\n""" % tmp.name + report += "--\n%s--\n""" % open(tmp.name).read() + report += """Output:\n--\n%s--""" % diags + + return Test.FAIL, report + +class SyntaxCheckTest(OneCommandPerFileTest): + def __init__(self, compiler, dir, extra_cxx_args=[], *args, **kwargs): + cmd = [compiler, '-x', 'c++', '-fsyntax-only'] + extra_cxx_args + OneCommandPerFileTest.__init__(self, cmd, dir, + useTempInput=1, *args, **kwargs) + + def createTempInput(self, tmp, test): + print >>tmp, '#include "%s"' % test.source_path |