diff options
author | Stephen Hines <srhines@google.com> | 2014-12-01 14:51:49 -0800 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2014-12-02 16:08:10 -0800 |
commit | 37ed9c199ca639565f6ce88105f9e39e898d82d0 (patch) | |
tree | 8fb36d3910e3ee4c4e1b7422f4f017108efc52f5 /utils/lit | |
parent | d2327b22152ced7bc46dc629fc908959e8a52d03 (diff) | |
download | external_llvm-37ed9c199ca639565f6ce88105f9e39e898d82d0.zip external_llvm-37ed9c199ca639565f6ce88105f9e39e898d82d0.tar.gz external_llvm-37ed9c199ca639565f6ce88105f9e39e898d82d0.tar.bz2 |
Update aosp/master LLVM for rebase to r222494.
Change-Id: Ic787f5e0124df789bd26f3f24680f45e678eef2d
Diffstat (limited to 'utils/lit')
-rw-r--r-- | utils/lit/TODO | 2 | ||||
-rw-r--r-- | utils/lit/lit/ProgressBar.py | 8 | ||||
-rw-r--r-- | utils/lit/lit/TestRunner.py | 47 | ||||
-rw-r--r-- | utils/lit/lit/TestingConfig.py | 9 | ||||
-rw-r--r-- | utils/lit/lit/__init__.py | 2 | ||||
-rw-r--r-- | utils/lit/lit/discovery.py | 2 | ||||
-rw-r--r-- | utils/lit/lit/formats/googletest.py | 2 | ||||
-rwxr-xr-x | utils/lit/lit/main.py | 20 | ||||
-rw-r--r-- | utils/lit/lit/util.py | 9 |
9 files changed, 67 insertions, 34 deletions
diff --git a/utils/lit/TODO b/utils/lit/TODO index c1a60c6..90da327 100644 --- a/utils/lit/TODO +++ b/utils/lit/TODO @@ -156,8 +156,6 @@ Miscellaneous * Move temp directory name into local test config. -* Add --show-unsupported, don't show by default? - * Support valgrind in all configs, and LLVM style valgrind. * Support a timeout / ulimit. diff --git a/utils/lit/lit/ProgressBar.py b/utils/lit/lit/ProgressBar.py index e3644f1..3ad704d 100644 --- a/utils/lit/lit/ProgressBar.py +++ b/utils/lit/lit/ProgressBar.py @@ -6,8 +6,8 @@ import sys, re, time def to_bytes(str): - # Encode to Latin1 to get binary data. - return str.encode('ISO-8859-1') + # Encode to UTF-8 to get binary data. + return str.encode('utf-8') class TerminalController: """ @@ -136,7 +136,7 @@ class TerminalController: def _tparm(self, arg, index): import curses - return curses.tparm(to_bytes(arg), index).decode('ascii') or '' + return curses.tparm(to_bytes(arg), index).decode('utf-8') or '' def _tigetstr(self, cap_name): # String capabilities can include "delays" of the form "$<2>". @@ -147,7 +147,7 @@ class TerminalController: if cap is None: cap = '' else: - cap = cap.decode('ascii') + cap = cap.decode('utf-8') return re.sub(r'\$<\d+>[/*]?', '', cap) def render(self, template): diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py index 9752417..1a2df20 100644 --- a/utils/lit/lit/TestRunner.py +++ b/utils/lit/lit/TestRunner.py @@ -144,13 +144,16 @@ def executeShCmd(cmd, cfg, cwd, results): named_temp_files.append(f.name) args[i] = f.name - procs.append(subprocess.Popen(args, cwd=cwd, - executable = executable, - stdin = stdin, - stdout = stdout, - stderr = stderr, - env = cfg.environment, - close_fds = kUseCloseFDs)) + try: + procs.append(subprocess.Popen(args, cwd=cwd, + executable = executable, + stdin = stdin, + stdout = stdout, + stderr = stderr, + env = cfg.environment, + close_fds = kUseCloseFDs)) + except OSError as e: + raise InternalShellError(j, 'Could not create process due to {}'.format(e)) # Immediately close stdin for any process taking stdin from us. if stdin == subprocess.PIPE: @@ -192,6 +195,11 @@ def executeShCmd(cmd, cfg, cwd, results): f.seek(0, 0) procData[i] = (procData[i][0], f.read()) + def to_string(bytes): + if isinstance(bytes, str): + return bytes + return bytes.encode('utf-8') + exitCode = None for i,(out,err) in enumerate(procData): res = procs[i].wait() @@ -201,11 +209,11 @@ def executeShCmd(cmd, cfg, cwd, results): # Ensure the resulting output is always of string type. try: - out = str(out.decode('ascii')) + out = to_string(out.decode('utf-8')) except: out = str(out) try: - err = str(err.decode('ascii')) + err = to_string(err.decode('utf-8')) except: err = str(err) @@ -314,13 +322,18 @@ def parseIntegratedTestScriptCommands(source_path): # Python2 and bytes in Python3. # # Once we find a match, we do require each script line to be decodable to - # ascii, so we convert the outputs to ascii before returning. This way the + # UTF-8, so we convert the outputs to UTF-8 before returning. This way the # remaining code can work with "strings" agnostic of the executing Python # version. def to_bytes(str): - # Encode to Latin1 to get binary data. - return str.encode('ISO-8859-1') + # Encode to UTF-8 to get binary data. + return str.encode('utf-8') + def to_string(bytes): + if isinstance(bytes, str): + return bytes + return to_bytes(bytes) + keywords = ('RUN:', 'XFAIL:', 'REQUIRES:', 'END.') keywords_re = re.compile( to_bytes("(%s)(.*)\n" % ("|".join(k for k in keywords),))) @@ -330,6 +343,10 @@ def parseIntegratedTestScriptCommands(source_path): # Read the entire file contents. data = f.read() + # Ensure the data ends with a newline. + if not data.endswith(to_bytes('\n')): + data = data + to_bytes('\n') + # Iterate over the matches. line_number = 1 last_match_position = 0 @@ -341,13 +358,13 @@ def parseIntegratedTestScriptCommands(source_path): match_position) last_match_position = match_position - # Convert the keyword and line to ascii strings and yield the + # Convert the keyword and line to UTF-8 strings and yield the # command. Note that we take care to return regular strings in # Python 2, to avoid other code having to differentiate between the # str and unicode types. keyword,ln = match.groups() - yield (line_number, str(keyword[:-1].decode('ascii')), - str(ln.decode('ascii'))) + yield (line_number, to_string(keyword[:-1].decode('utf-8')), + to_string(ln.decode('utf-8'))) finally: f.close() diff --git a/utils/lit/lit/TestingConfig.py b/utils/lit/lit/TestingConfig.py index eb89067..4cd9486 100644 --- a/utils/lit/lit/TestingConfig.py +++ b/utils/lit/lit/TestingConfig.py @@ -17,15 +17,16 @@ class TestingConfig: """ # 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','')]), - 'SYSTEMROOT' : os.environ.get('SYSTEMROOT',''), - 'TERM' : os.environ.get('TERM',''), 'LLVM_DISABLE_CRASH_REPORT' : '1', } + pass_vars = ['LIBRARY_PATH', 'LD_LIBRARY_PATH', 'SYSTEMROOT', 'TERM', + 'LD_PRELOAD', 'ASAN_OPTIONS', 'UBSAN_OPTIONS'] + for var in pass_vars: + environment[var] = os.environ.get(var, '') + if sys.platform == 'win32': environment.update({ 'INCLUDE' : os.environ.get('INCLUDE',''), diff --git a/utils/lit/lit/__init__.py b/utils/lit/lit/__init__.py index 46fa82d..c1bd76b 100644 --- a/utils/lit/lit/__init__.py +++ b/utils/lit/lit/__init__.py @@ -5,7 +5,7 @@ from .main import main __author__ = 'Daniel Dunbar' __email__ = 'daniel@zuster.org' -__versioninfo__ = (0, 4, 0) +__versioninfo__ = (0, 5, 0) __version__ = '.'.join(str(v) for v in __versioninfo__) + 'dev' __all__ = [] diff --git a/utils/lit/lit/discovery.py b/utils/lit/lit/discovery.py index 876d4f3..4befe58 100644 --- a/utils/lit/lit/discovery.py +++ b/utils/lit/lit/discovery.py @@ -91,7 +91,7 @@ def getLocalConfig(ts, path_in_suite, litConfig, cache): # Otherwise, copy the current config and load the local configuration # file into it. - config = copy.copy(parent) + config = copy.deepcopy(parent) if litConfig.debug: litConfig.note('loading local config %r' % cfgpath) config.load_from_path(cfgpath, litConfig) diff --git a/utils/lit/lit/formats/googletest.py b/utils/lit/lit/formats/googletest.py index 3d14b729..1b5b785 100644 --- a/utils/lit/lit/formats/googletest.py +++ b/utils/lit/lit/formats/googletest.py @@ -31,7 +31,7 @@ class GoogleTest(TestFormat): try: lines = lit.util.capture([path, '--gtest_list_tests'], env=localConfig.environment) - lines = lines.decode('ascii') + lines = lines.decode('utf-8') if kIsWindows: lines = lines.replace('\r', '') lines = lines.split('\n') diff --git a/utils/lit/lit/main.py b/utils/lit/lit/main.py index c59651a..7343d24 100755 --- a/utils/lit/lit/main.py +++ b/utils/lit/lit/main.py @@ -42,8 +42,9 @@ class TestingProgressDisplay(object): self.progressBar.update(float(self.completed)/self.numTests, test.getFullName()) - if not test.result.code.isFailure and \ - (self.opts.quiet or self.opts.succinct): + shouldShow = test.result.code.isFailure or \ + (not self.opts.quiet and not self.opts.succinct) + if not shouldShow: return if self.progressBar: @@ -168,6 +169,12 @@ def main(builtinParameters = {}): group.add_option("", "--no-progress-bar", dest="useProgressBar", help="Do not use curses based progress bar", action="store_false", default=True) + group.add_option("", "--show-unsupported", dest="show_unsupported", + help="Show unsupported tests", + action="store_true", default=False) + group.add_option("", "--show-xfail", dest="show_xfail", + help="Show tests that were expected to fail", + action="store_true", default=False) parser.add_option_group(group) group = OptionGroup(parser, "Test Execution") @@ -382,7 +389,12 @@ def main(builtinParameters = {}): # Print each test in any of the failing groups. for title,code in (('Unexpected Passing Tests', lit.Test.XPASS), ('Failing Tests', lit.Test.FAIL), - ('Unresolved Tests', lit.Test.UNRESOLVED)): + ('Unresolved Tests', lit.Test.UNRESOLVED), + ('Unsupported Tests', lit.Test.UNSUPPORTED), + ('Expected Failing Tests', lit.Test.XFAIL)): + if (lit.Test.XFAIL == code and not opts.show_xfail) or \ + (lit.Test.UNSUPPORTED == code and not opts.show_unsupported): + continue elts = byCode.get(code) if not elts: continue @@ -403,7 +415,7 @@ def main(builtinParameters = {}): ('Unsupported Tests ', lit.Test.UNSUPPORTED), ('Unresolved Tests ', lit.Test.UNRESOLVED), ('Unexpected Passes ', lit.Test.XPASS), - ('Unexpected Failures', lit.Test.FAIL),): + ('Unexpected Failures', lit.Test.FAIL)): if opts.quiet and not code.isFailure: continue N = len(byCode.get(code,[])) diff --git a/utils/lit/lit/util.py b/utils/lit/lit/util.py index 72a8b48..cce620c 100644 --- a/utils/lit/lit/util.py +++ b/utils/lit/lit/util.py @@ -156,13 +156,18 @@ def executeCommand(command, cwd=None, env=None): if exitCode == -signal.SIGINT: raise KeyboardInterrupt + def to_string(bytes): + if isinstance(bytes, str): + return bytes + return bytes.encode('utf-8') + # Ensure the resulting output is always of string type. try: - out = str(out.decode('ascii')) + out = to_string(out.decode('utf-8')) except: out = str(out) try: - err = str(err.decode('ascii')) + err = to_string(err.decode('utf-8')) except: err = str(err) |