diff options
Diffstat (limited to 'utils/lit/lit')
-rw-r--r-- | utils/lit/lit/LitConfig.py | 2 | ||||
-rw-r--r-- | utils/lit/lit/Test.py | 3 | ||||
-rw-r--r-- | utils/lit/lit/TestRunner.py | 52 | ||||
-rw-r--r-- | utils/lit/lit/formats/googletest.py | 20 | ||||
-rwxr-xr-x | utils/lit/lit/main.py | 2 |
5 files changed, 58 insertions, 21 deletions
diff --git a/utils/lit/lit/LitConfig.py b/utils/lit/lit/LitConfig.py index b0dde5db8686..b8183801bfca 100644 --- a/utils/lit/lit/LitConfig.py +++ b/utils/lit/lit/LitConfig.py @@ -76,7 +76,6 @@ class LitConfig: self.bashPath = lit.util.which('bash') if self.bashPath is None: - self.warning("Unable to find 'bash'.") self.bashPath = '' return self.bashPath @@ -91,7 +90,6 @@ class LitConfig: # bash self.bashPath = lit.util.which('bash', dir) if self.bashPath is None: - self.note("Unable to find 'bash.exe'.") self.bashPath = '' return dir diff --git a/utils/lit/lit/Test.py b/utils/lit/lit/Test.py index b81023010d70..38bb41b0252d 100644 --- a/utils/lit/lit/Test.py +++ b/utils/lit/lit/Test.py @@ -91,7 +91,8 @@ class JSONMetricValue(MetricValue): self.value = value def format(self): - return str(self.value) + e = JSONEncoder(indent=2, sort_keys=True) + return e.encode(self.value) def todata(self): return self.value diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py index 268e46c38f74..f1734eca3726 100644 --- a/utils/lit/lit/TestRunner.py +++ b/utils/lit/lit/TestRunner.py @@ -22,33 +22,56 @@ kUseCloseFDs = not kIsWindows # Use temporary files to replace /dev/null on Windows. kAvoidDevNull = kIsWindows -def executeShCmd(cmd, cfg, cwd, results): +class ShellEnvironment(object): + + """Mutable shell environment containing things like CWD and env vars. + + Environment variables are not implemented, but cwd tracking is. + """ + + def __init__(self, cwd, env): + self.cwd = cwd + self.env = env + +def executeShCmd(cmd, shenv, results): if isinstance(cmd, ShUtil.Seq): if cmd.op == ';': - res = executeShCmd(cmd.lhs, cfg, cwd, results) - return executeShCmd(cmd.rhs, cfg, cwd, results) + res = executeShCmd(cmd.lhs, shenv, results) + return executeShCmd(cmd.rhs, shenv, results) if cmd.op == '&': raise InternalShellError(cmd,"unsupported shell operator: '&'") if cmd.op == '||': - res = executeShCmd(cmd.lhs, cfg, cwd, results) + res = executeShCmd(cmd.lhs, shenv, results) if res != 0: - res = executeShCmd(cmd.rhs, cfg, cwd, results) + res = executeShCmd(cmd.rhs, shenv, results) return res if cmd.op == '&&': - res = executeShCmd(cmd.lhs, cfg, cwd, results) + res = executeShCmd(cmd.lhs, shenv, results) if res is None: return res if res == 0: - res = executeShCmd(cmd.rhs, cfg, cwd, results) + res = executeShCmd(cmd.rhs, shenv, results) return res raise ValueError('Unknown shell command: %r' % cmd.op) - assert isinstance(cmd, ShUtil.Pipeline) + + # Handle shell builtins first. + if cmd.commands[0].args[0] == 'cd': + # Update the cwd in the environment. + if len(cmd.commands[0].args) != 2: + raise ValueError('cd supports only one argument') + newdir = cmd.commands[0].args[1] + if os.path.isabs(newdir): + shenv.cwd = newdir + else: + shenv.cwd = os.path.join(shenv.cwd, newdir) + return 0 + procs = [] input = subprocess.PIPE stderrTempFiles = [] @@ -102,7 +125,9 @@ def executeShCmd(cmd, cfg, cwd, results): if kAvoidDevNull and r[0] == '/dev/null': r[2] = tempfile.TemporaryFile(mode=r[1]) else: - r[2] = open(r[0], r[1]) + # Make sure relative paths are relative to the cwd. + redir_filename = os.path.join(shenv.cwd, r[0]) + r[2] = open(redir_filename, r[1]) # Workaround a Win32 and/or subprocess bug when appending. # # FIXME: Actually, this is probably an instance of PR6753. @@ -132,7 +157,7 @@ def executeShCmd(cmd, cfg, cwd, results): # Resolve the executable path ourselves. args = list(j.args) - executable = lit.util.which(args[0], cfg.environment['PATH']) + executable = lit.util.which(args[0], shenv.env['PATH']) if not executable: raise InternalShellError(j, '%r: command not found' % j.args[0]) @@ -146,12 +171,12 @@ def executeShCmd(cmd, cfg, cwd, results): args[i] = f.name try: - procs.append(subprocess.Popen(args, cwd=cwd, + procs.append(subprocess.Popen(args, cwd=shenv.cwd, executable = executable, stdin = stdin, stdout = stdout, stderr = stderr, - env = cfg.environment, + env = shenv.env, close_fds = kUseCloseFDs)) except OSError as e: raise InternalShellError(j, 'Could not create process due to {}'.format(e)) @@ -257,7 +282,8 @@ def executeScriptInternal(test, litConfig, tmpBase, commands, cwd): results = [] try: - exitCode = executeShCmd(cmd, test.config, cwd, results) + shenv = ShellEnvironment(cwd, test.config.environment) + exitCode = executeShCmd(cmd, shenv, results) except InternalShellError: e = sys.exc_info()[1] exitCode = 127 diff --git a/utils/lit/lit/formats/googletest.py b/utils/lit/lit/formats/googletest.py index 59ac3c5cb370..3ce57917113a 100644 --- a/utils/lit/lit/formats/googletest.py +++ b/utils/lit/lit/formats/googletest.py @@ -53,6 +53,11 @@ class GoogleTest(TestFormat): ln = ln[index*2:] if ln.endswith('.'): nested_tests.append(ln) + elif any([name.startswith('DISABLED_') + for name in nested_tests + [ln]]): + # Gtest will internally skip these tests. No need to launch a + # child process for it. + continue else: yield ''.join(nested_tests) + ln @@ -95,7 +100,7 @@ class GoogleTest(TestFormat): # Handle GTest parametrized and typed tests, whose name includes # some '/'s. testPath, namePrefix = os.path.split(testPath) - testName = os.path.join(namePrefix, testName) + testName = namePrefix + '/' + testName cmd = [testPath, '--gtest_filter=' + testName] if litConfig.useValgrind: @@ -107,7 +112,14 @@ class GoogleTest(TestFormat): out, err, exitCode = lit.util.executeCommand( cmd, env=test.config.environment) - if not exitCode: - return lit.Test.PASS,'' + if exitCode: + return lit.Test.FAIL, out + err + + passing_test_line = '[ PASSED ] 1 test.' + if passing_test_line not in out: + msg = ('Unable to find %r in gtest output:\n\n%s%s' % + (passing_test_line, out, err)) + return lit.Test.UNRESOLVED, msg + + return lit.Test.PASS,'' - return lit.Test.FAIL, out + err diff --git a/utils/lit/lit/main.py b/utils/lit/lit/main.py index f2aedc906bb1..e3722674f63f 100755 --- a/utils/lit/lit/main.py +++ b/utils/lit/lit/main.py @@ -146,7 +146,7 @@ def main(builtinParameters = {}): parser.add_option("", "--config-prefix", dest="configPrefix", metavar="NAME", help="Prefix for 'lit' config files", action="store", default=None) - parser.add_option("", "--param", dest="userParameters", + parser.add_option("-D", "--param", dest="userParameters", metavar="NAME=VAL", help="Add 'NAME' = 'VAL' to the user defined parameters", type=str, action="append", default=[]) |