diff options
author | dim <dim@FreeBSD.org> | 2011-02-20 12:57:14 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2011-02-20 12:57:14 +0000 |
commit | cbb70ce070d220642b038ea101d9c0f9fbf860d6 (patch) | |
tree | d2b61ce94e654cb01a254d2195259db5f9cc3f3c /utils/lit | |
parent | 4ace901e87dac5bbbac78ed325e75462e48e386e (diff) | |
download | FreeBSD-src-cbb70ce070d220642b038ea101d9c0f9fbf860d6.zip FreeBSD-src-cbb70ce070d220642b038ea101d9c0f9fbf860d6.tar.gz |
Vendor import of llvm trunk r126079:
http://llvm.org/svn/llvm-project/llvm/trunk@126079
Diffstat (limited to 'utils/lit')
-rw-r--r-- | utils/lit/TODO | 10 | ||||
-rw-r--r-- | utils/lit/lit/LitConfig.py | 19 | ||||
-rw-r--r-- | utils/lit/lit/LitFormats.py | 1 | ||||
-rw-r--r-- | utils/lit/lit/TestFormats.py | 23 | ||||
-rw-r--r-- | utils/lit/lit/TestRunner.py | 21 | ||||
-rw-r--r-- | utils/lit/lit/TestingConfig.py | 2 | ||||
-rw-r--r-- | utils/lit/lit/Util.py | 18 | ||||
-rw-r--r-- | utils/lit/lit/__init__.py | 6 | ||||
-rwxr-xr-x | utils/lit/lit/main.py (renamed from utils/lit/lit/lit.py) | 0 | ||||
-rw-r--r-- | utils/lit/setup.py | 23 |
10 files changed, 84 insertions, 39 deletions
diff --git a/utils/lit/TODO b/utils/lit/TODO index 4d00d2c..6d7f7ea 100644 --- a/utils/lit/TODO +++ b/utils/lit/TODO @@ -2,18 +2,8 @@ - Add --show-unsupported, don't show by default? - - Finish documentation. - - Optionally use multiprocessing. - - Support llvmc and ocaml tests. - - Support valgrind in all configs, and LLVM style valgrind. - - Provide test suite config for running unit tests. - - Support a timeout / ulimit. - - - Support "disabling" tests? The advantage of making this distinct from XFAIL - is it makes it more obvious that it is a temporary measure (and lit can put - in a separate category). diff --git a/utils/lit/lit/LitConfig.py b/utils/lit/lit/LitConfig.py index ac48591..7ca1b9c 100644 --- a/utils/lit/lit/LitConfig.py +++ b/utils/lit/lit/LitConfig.py @@ -8,6 +8,9 @@ class LitConfig: easily. """ + # Provide access to Test module. + import Test + # Provide access to built-in formats. import LitFormats as formats @@ -82,6 +85,22 @@ class LitConfig: return self.bashPath + def getToolsPath(self, dir, paths, tools): + import os, Util + if dir is not None and os.path.isabs(dir) and os.path.isdir(dir): + if not Util.checkToolsPath(dir, tools): + return None + else: + dir = Util.whichTools(tools, paths) + + # bash + self.bashPath = Util.which('bash', dir) + if self.bashPath is None: + self.warning("Unable to find 'bash.exe'.") + self.bashPath = '' + + return dir + def _write_message(self, kind, message): import inspect, os, sys diff --git a/utils/lit/lit/LitFormats.py b/utils/lit/lit/LitFormats.py index e86f103..931d107 100644 --- a/utils/lit/lit/LitFormats.py +++ b/utils/lit/lit/LitFormats.py @@ -1,2 +1,3 @@ +from TestFormats import FileBasedTest from TestFormats import GoogleTest, ShTest, TclTest from TestFormats import SyntaxCheckTest, OneCommandPerFileTest diff --git a/utils/lit/lit/TestFormats.py b/utils/lit/lit/TestFormats.py index 7ffbd2b..6dda2fd 100644 --- a/utils/lit/lit/TestFormats.py +++ b/utils/lit/lit/TestFormats.py @@ -1,15 +1,15 @@ import os -import platform +import sys import Test import TestRunner import Util -kIsWindows = platform.system() == 'Windows' +kIsWindows = sys.platform in ['win32', 'cygwin'] class GoogleTest(object): def __init__(self, test_sub_dir, test_suffix): - self.test_sub_dir = str(test_sub_dir) + self.test_sub_dir = os.path.normcase(str(test_sub_dir)).split(';') self.test_suffix = str(test_suffix) # On Windows, assume tests will also end in '.exe'. @@ -28,7 +28,10 @@ class GoogleTest(object): try: lines = Util.capture([path, '--gtest_list_tests'], - env=localConfig.environment).split('\n') + env=localConfig.environment) + if kIsWindows: + lines = lines.replace('\r', '') + lines = lines.split('\n') except: litConfig.error("unable to discover google-tests in %r" % path) raise StopIteration @@ -44,7 +47,7 @@ class GoogleTest(object): index += 1 while len(nested_tests) > index: nested_tests.pop() - + ln = ln[index*2:] if ln.endswith('.'): nested_tests.append(ln) @@ -56,10 +59,14 @@ class GoogleTest(object): 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 + if not '.' in self.test_sub_dir: + if not os.path.normcase(filename) in self.test_sub_dir: + continue filepath = os.path.join(source_path, filename) + if not os.path.isdir(filepath): + continue + for subfilename in os.listdir(filepath): if subfilename.endswith(self.test_suffix): execpath = os.path.join(filepath, subfilename) @@ -84,7 +91,7 @@ class GoogleTest(object): out, err, exitCode = TestRunner.executeCommand( cmd, env=test.config.environment) - + if not exitCode: return Test.PASS,'' diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py index 0eb51a8..dba7814 100644 --- a/utils/lit/lit/TestRunner.py +++ b/utils/lit/lit/TestRunner.py @@ -8,6 +8,8 @@ import Util import platform import tempfile +import re + class InternalShellError(Exception): def __init__(self, command, message): self.command = command @@ -178,6 +180,13 @@ def executeShCmd(cmd, cfg, cwd, results): else: input = subprocess.PIPE + # Explicitly close any redirected files. We need to do this now because we + # need to release any handles we may have on the temporary files (important + # on Win32, for example). Since we have already spawned the subprocess, our + # handles have already been transferred so we do not need them anymore. + for f in opened_files: + f.close() + # FIXME: There is probably still deadlock potential here. Yawn. procData = [None] * len(procs) procData[-1] = procs[-1].communicate() @@ -215,10 +224,6 @@ def executeShCmd(cmd, cfg, cwd, results): else: exitCode = res - # Explicitly close any redirected files. - for f in opened_files: - f.close() - # Remove any named temporary files we created. for f in named_temp_files: try: @@ -441,11 +446,15 @@ def parseIntegratedTestScript(test, normalize_slashes=False): if ln[ln.index('END.'):].strip() == 'END.': break - # Apply substitutions to the script. + # Apply substitutions to the script. Allow full regular + # expression syntax. Replace each matching occurrence of regular + # expression pattern a with substitution b in line ln. def processLine(ln): # Apply substitutions for a,b in substitutions: - ln = ln.replace(a,b) + if kIsWindows: + b = b.replace("\\","\\\\") + ln = re.sub(a, b, ln) # Strip the trailing newline and any extra whitespace. return ln.strip() diff --git a/utils/lit/lit/TestingConfig.py b/utils/lit/lit/TestingConfig.py index 5c1b273..0d9bc00 100644 --- a/utils/lit/lit/TestingConfig.py +++ b/utils/lit/lit/TestingConfig.py @@ -10,12 +10,14 @@ class TestingConfig: if config is None: # Set the environment based on the command line arguments. environment = { + 'LIBRARY_PATH' : os.environ.get('LIBRARY_PATH',''), 'LD_LIBRARY_PATH' : os.environ.get('LD_LIBRARY_PATH',''), 'PATH' : os.pathsep.join(litConfig.path + [os.environ.get('PATH','')]), 'PATHEXT' : os.environ.get('PATHEXT',''), 'SYSTEMROOT' : os.environ.get('SYSTEMROOT',''), 'LLVM_DISABLE_CRT_DEBUG' : '1', + 'PRINTF_EXPONENT_DIGITS' : '2', } config = TestingConfig(parent, diff --git a/utils/lit/lit/Util.py b/utils/lit/lit/Util.py index 414b714..5635f50 100644 --- a/utils/lit/lit/Util.py +++ b/utils/lit/lit/Util.py @@ -64,7 +64,11 @@ def which(command, paths = None): paths = os.defpath # Get suffixes to search. - pathext = os.environ.get('PATHEXT', '').split(os.pathsep) + # On Cygwin, 'PATHEXT' may exist but it should not be used. + if os.pathsep == ';': + pathext = os.environ.get('PATHEXT', '').split(';') + else: + pathext = [''] # Search the paths... for path in paths.split(os.pathsep): @@ -75,6 +79,18 @@ def which(command, paths = None): return None +def checkToolsPath(dir, tools): + for tool in tools: + if not os.path.exists(os.path.join(dir, tool)): + return False; + return True; + +def whichTools(tools, paths): + for path in paths.split(os.pathsep): + if checkToolsPath(path, tools): + return path + return None + def printHistogram(items, title = 'Items'): import itertools, math diff --git a/utils/lit/lit/__init__.py b/utils/lit/lit/__init__.py index 0102602..f3fbb1c 100644 --- a/utils/lit/lit/__init__.py +++ b/utils/lit/lit/__init__.py @@ -1,10 +1,10 @@ """'lit' Testing Tool""" -from lit import main +from main import main __author__ = 'Daniel Dunbar' __email__ = 'daniel@zuster.org' -__versioninfo__ = (0, 1, 0) -__version__ = '.'.join(map(str, __versioninfo__)) +__versioninfo__ = (0, 2, 0) +__version__ = '.'.join(map(str, __versioninfo__)) + 'dev' __all__ = [] diff --git a/utils/lit/lit/lit.py b/utils/lit/lit/main.py index 13d2630..13d2630 100755 --- a/utils/lit/lit/lit.py +++ b/utils/lit/lit/main.py diff --git a/utils/lit/setup.py b/utils/lit/setup.py index e6ae3d8..738ee23 100644 --- a/utils/lit/setup.py +++ b/utils/lit/setup.py @@ -3,7 +3,7 @@ import lit # FIXME: Support distutils? from setuptools import setup, find_packages setup( - name = "Lit", + name = "lit", version = lit.__version__, author = lit.__author__, @@ -14,15 +14,16 @@ setup( description = "A Software Testing Tool", keywords = 'test C++ automatic discovery', long_description = """\ -Lit -+++ +*lit* ++++++ About ===== -Lit is a portable tool for executing LLVM and Clang style test suites, -summarizing their results, and providing indication of failures. Lit is designed -to be a lightweight testing tool with as simple a user interface as possible. +*lit* is a portable tool for executing LLVM and Clang style test suites, +summarizing their results, and providing indication of failures. *lit* is +designed to be a lightweight testing tool with as simple a user interface as +possible. Features @@ -37,15 +38,15 @@ Features Documentation ============= -The offical Lit documentation is in the man page, available online in the `LLVM -Command Guide http://llvm.org/cmds/lit.html`_. +The offical *lit* documentation is in the man page, available online at the LLVM +Command Guide: http://llvm.org/cmds/lit.html. Source ====== -The Lit source is available as part of LLVM, in the `LLVM SVN repository -<http://llvm.org/svn/llvm-project/llvm/trunk/utils/lit`_. +The *lit* source is available as part of LLVM, in the LLVM SVN repository: +http://llvm.org/svn/llvm-project/llvm/trunk/utils/lit. """, classifiers=[ @@ -55,7 +56,7 @@ The Lit source is available as part of LLVM, in the `LLVM SVN repository 'License :: OSI Approved :: University of Illinois/NCSA Open Source License', 'Natural Language :: English', 'Operating System :: OS Independent', - 'Progamming Language :: Python', + 'Programming Language :: Python', 'Topic :: Software Development :: Testing', ], |