mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 06:30:39 +00:00
Remove support for Tcl test format since nobody uses it
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172794 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0a38861364
commit
41169f2a0e
@ -14,7 +14,7 @@ config.test_format = lit.formats.ShTest(execute_external = True)
|
||||
# suffixes: A list of file extensions to treat as test files.
|
||||
config.suffixes = ['.c', '.cpp', '.m', '.mm']
|
||||
|
||||
# target_triple: Used by ShTest and TclTest formats for XFAIL checks.
|
||||
# target_triple: Used by ShTest format for XFAIL checks.
|
||||
config.target_triple = 'foo'
|
||||
|
||||
###
|
||||
|
1
utils/lit/lit/ExampleTests/LLVM.InTree/test/Bar/data.txt
Normal file
1
utils/lit/lit/ExampleTests/LLVM.InTree/test/Bar/data.txt
Normal file
@ -0,0 +1 @@
|
||||
hi
|
@ -1,6 +0,0 @@
|
||||
load_lib llvm.exp
|
||||
|
||||
if { [llvm_supports_target X86] } {
|
||||
RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll}]]
|
||||
}
|
||||
|
1
utils/lit/lit/ExampleTests/LLVM.InTree/test/Bar/pct-S.ll
Normal file
1
utils/lit/lit/ExampleTests/LLVM.InTree/test/Bar/pct-S.ll
Normal file
@ -0,0 +1 @@
|
||||
; RUN: grep "hi" %S/data.txt
|
@ -8,11 +8,11 @@ import os
|
||||
config.name = 'LLVM'
|
||||
|
||||
# testFormat: The test format to use to interpret tests.
|
||||
config.test_format = lit.formats.TclTest()
|
||||
config.test_format = lit.formats.ShTest()
|
||||
|
||||
# suffixes: A list of file extensions to treat as test files, this is actually
|
||||
# set by on_clone().
|
||||
config.suffixes = []
|
||||
config.suffixes = [ '.ll' ]
|
||||
|
||||
# test_source_root: The root path where tests are located.
|
||||
config.test_source_root = os.path.dirname(__file__)
|
||||
@ -64,74 +64,3 @@ if config.test_exec_root is None:
|
||||
lit.load_config(config, site_cfg)
|
||||
raise SystemExit
|
||||
|
||||
###
|
||||
|
||||
# Load site data from DejaGNU's site.exp.
|
||||
import re
|
||||
site_exp = {}
|
||||
# FIXME: Implement lit.site.cfg.
|
||||
for line in open(os.path.join(config.llvm_obj_root, 'test', 'site.exp')):
|
||||
m = re.match('set ([^ ]+) "([^"]*)"', line)
|
||||
if m:
|
||||
site_exp[m.group(1)] = m.group(2)
|
||||
|
||||
excludes = []
|
||||
|
||||
# Provide target_triple for use in XFAIL.
|
||||
config.target_triple = site_exp['target_triplet']
|
||||
|
||||
# Provide llvm_supports_target for use in local configs.
|
||||
targets = set(site_exp["TARGETS_TO_BUILD"].split())
|
||||
def llvm_supports_target(name):
|
||||
return name in targets
|
||||
|
||||
# Provide on_clone hook for reading 'dg.exp'.
|
||||
import os
|
||||
simpleLibData = re.compile(r"""load_lib llvm.exp
|
||||
|
||||
RunLLVMTests \[lsort \[glob -nocomplain \$srcdir/\$subdir/\*\.(.*)\]\]""",
|
||||
re.MULTILINE)
|
||||
conditionalLibData = re.compile(r"""load_lib llvm.exp
|
||||
|
||||
if.*\[ ?(llvm[^ ]*) ([^ ]*) ?\].*{
|
||||
*RunLLVMTests \[lsort \[glob -nocomplain \$srcdir/\$subdir/\*\.(.*)\]\]
|
||||
\}""", re.MULTILINE)
|
||||
def on_clone(parent, cfg, for_path):
|
||||
def addSuffixes(match):
|
||||
if match[0] == '{' and match[-1] == '}':
|
||||
cfg.suffixes = ['.' + s for s in match[1:-1].split(',')]
|
||||
else:
|
||||
cfg.suffixes = ['.' + match]
|
||||
|
||||
libPath = os.path.join(os.path.dirname(for_path),
|
||||
'dg.exp')
|
||||
if not os.path.exists(libPath):
|
||||
cfg.unsupported = True
|
||||
return
|
||||
|
||||
# Reset unsupported, in case we inherited it.
|
||||
cfg.unsupported = False
|
||||
lib = open(libPath).read().strip()
|
||||
|
||||
# Check for a simple library.
|
||||
m = simpleLibData.match(lib)
|
||||
if m:
|
||||
addSuffixes(m.group(1))
|
||||
return
|
||||
|
||||
# Check for a conditional test set.
|
||||
m = conditionalLibData.match(lib)
|
||||
if m:
|
||||
funcname,arg,match = m.groups()
|
||||
addSuffixes(match)
|
||||
|
||||
func = globals().get(funcname)
|
||||
if not func:
|
||||
lit.error('unsupported predicate %r' % funcname)
|
||||
elif not func(arg):
|
||||
cfg.unsupported = True
|
||||
return
|
||||
# Otherwise, give up.
|
||||
lit.error('unable to understand %r:\n%s' % (libPath, lib))
|
||||
|
||||
config.on_clone = on_clone
|
||||
|
@ -1,8 +1,5 @@
|
||||
# -*- Python -*-
|
||||
|
||||
## Autogenerated by Makefile ##
|
||||
# Do not edit!
|
||||
|
||||
# Preserve some key paths for use by main LLVM test suite config.
|
||||
config.llvm_obj_root = os.path.dirname(os.path.dirname(__file__))
|
||||
|
||||
|
@ -1,10 +0,0 @@
|
||||
## these variables are automatically generated by make ##
|
||||
# Do not edit here. If you wish to override these values
|
||||
# edit the last section
|
||||
set target_triplet "x86_64-apple-darwin10"
|
||||
set TARGETS_TO_BUILD "X86 Sparc PowerPC ARM Mips PIC16 XCore MSP430 Blackfin MSIL CppBackend"
|
||||
set srcroot "/Volumes/Data/ddunbar/llvm"
|
||||
set objroot "/Volumes/Data/ddunbar/llvm.obj.64"
|
||||
set srcdir "/Volumes/Data/ddunbar/llvm/test"
|
||||
set objdir "/Volumes/Data/ddunbar/llvm.obj.64/test"
|
||||
## All variables above are generated by configure. Do Not Edit ##
|
@ -1,8 +1,5 @@
|
||||
# -*- Python -*-
|
||||
|
||||
## Autogenerated by Makefile ##
|
||||
# Do not edit!
|
||||
|
||||
# Preserve some key paths for use by main LLVM test suite config.
|
||||
config.llvm_obj_root = os.path.dirname(os.path.dirname(__file__))
|
||||
|
||||
|
@ -1,10 +0,0 @@
|
||||
## these variables are automatically generated by make ##
|
||||
# Do not edit here. If you wish to override these values
|
||||
# edit the last section
|
||||
set target_triplet "x86_64-apple-darwin10"
|
||||
set TARGETS_TO_BUILD "X86 Sparc PowerPC ARM Mips PIC16 XCore MSP430 Blackfin MSIL CppBackend"
|
||||
set srcroot "/Volumes/Data/ddunbar/llvm"
|
||||
set objroot "/Volumes/Data/ddunbar/llvm.obj.64"
|
||||
set srcdir "/Volumes/Data/ddunbar/llvm/test"
|
||||
set objdir "/Volumes/Data/ddunbar/llvm.obj.64/test"
|
||||
## All variables above are generated by configure. Do Not Edit ##
|
@ -1,6 +0,0 @@
|
||||
load_lib llvm.exp
|
||||
|
||||
if { [llvm_supports_target X86] } {
|
||||
RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll}]]
|
||||
}
|
||||
|
@ -8,11 +8,11 @@ import os
|
||||
config.name = 'LLVM'
|
||||
|
||||
# testFormat: The test format to use to interpret tests.
|
||||
config.test_format = lit.formats.TclTest()
|
||||
config.test_format = lit.formats.ShTest()
|
||||
|
||||
# suffixes: A list of file extensions to treat as test files, this is actually
|
||||
# set by on_clone().
|
||||
config.suffixes = []
|
||||
config.suffixes = [ '.ll' ]
|
||||
|
||||
# test_source_root: The root path where tests are located.
|
||||
config.test_source_root = os.path.dirname(__file__)
|
||||
@ -64,74 +64,3 @@ if config.test_exec_root is None:
|
||||
lit.load_config(config, site_cfg)
|
||||
raise SystemExit
|
||||
|
||||
###
|
||||
|
||||
# Load site data from DejaGNU's site.exp.
|
||||
import re
|
||||
site_exp = {}
|
||||
# FIXME: Implement lit.site.cfg.
|
||||
for line in open(os.path.join(config.llvm_obj_root, 'test', 'site.exp')):
|
||||
m = re.match('set ([^ ]+) "([^"]*)"', line)
|
||||
if m:
|
||||
site_exp[m.group(1)] = m.group(2)
|
||||
|
||||
excludes = []
|
||||
|
||||
# Provide target_triple for use in XFAIL.
|
||||
config.target_triple = site_exp['target_triplet']
|
||||
|
||||
# Provide llvm_supports_target for use in local configs.
|
||||
targets = set(site_exp["TARGETS_TO_BUILD"].split())
|
||||
def llvm_supports_target(name):
|
||||
return name in targets
|
||||
|
||||
# Provide on_clone hook for reading 'dg.exp'.
|
||||
import os
|
||||
simpleLibData = re.compile(r"""load_lib llvm.exp
|
||||
|
||||
RunLLVMTests \[lsort \[glob -nocomplain \$srcdir/\$subdir/\*\.(.*)\]\]""",
|
||||
re.MULTILINE)
|
||||
conditionalLibData = re.compile(r"""load_lib llvm.exp
|
||||
|
||||
if.*\[ ?(llvm[^ ]*) ([^ ]*) ?\].*{
|
||||
*RunLLVMTests \[lsort \[glob -nocomplain \$srcdir/\$subdir/\*\.(.*)\]\]
|
||||
\}""", re.MULTILINE)
|
||||
def on_clone(parent, cfg, for_path):
|
||||
def addSuffixes(match):
|
||||
if match[0] == '{' and match[-1] == '}':
|
||||
cfg.suffixes = ['.' + s for s in match[1:-1].split(',')]
|
||||
else:
|
||||
cfg.suffixes = ['.' + match]
|
||||
|
||||
libPath = os.path.join(os.path.dirname(for_path),
|
||||
'dg.exp')
|
||||
if not os.path.exists(libPath):
|
||||
cfg.unsupported = True
|
||||
return
|
||||
|
||||
# Reset unsupported, in case we inherited it.
|
||||
cfg.unsupported = False
|
||||
lib = open(libPath).read().strip()
|
||||
|
||||
# Check for a simple library.
|
||||
m = simpleLibData.match(lib)
|
||||
if m:
|
||||
addSuffixes(m.group(1))
|
||||
return
|
||||
|
||||
# Check for a conditional test set.
|
||||
m = conditionalLibData.match(lib)
|
||||
if m:
|
||||
funcname,arg,match = m.groups()
|
||||
addSuffixes(match)
|
||||
|
||||
func = globals().get(funcname)
|
||||
if not func:
|
||||
lit.error('unsupported predicate %r' % funcname)
|
||||
elif not func(arg):
|
||||
cfg.unsupported = True
|
||||
return
|
||||
# Otherwise, give up.
|
||||
lit.error('unable to understand %r:\n%s' % (libPath, lib))
|
||||
|
||||
config.on_clone = on_clone
|
||||
|
@ -1,5 +0,0 @@
|
||||
# -*- Python -*-
|
||||
|
||||
config.test_format = lit.formats.TclTest()
|
||||
|
||||
config.suffixes = ['.ll']
|
@ -1 +0,0 @@
|
||||
; RUN: gcc -### > /dev/null |& grep {gcc version}
|
@ -1,7 +0,0 @@
|
||||
; RUN: echo 'hi' > %t.1 | echo 'hello' > %t.2
|
||||
; RUN: not grep 'hi' %t.1
|
||||
; RUN: grep 'hello' %t.2
|
||||
|
||||
|
||||
|
||||
|
@ -19,8 +19,8 @@ config.test_source_root = None
|
||||
# root).
|
||||
config.test_exec_root = None
|
||||
|
||||
# target_triple: Used by ShTest and TclTest formats for XFAIL checks.
|
||||
# target_triple: Used by ShTest format for XFAIL checks.
|
||||
config.target_triple = 'foo'
|
||||
|
||||
# available_features: Used by ShTest and TclTest formats for REQUIRES checks.
|
||||
# available_features: Used by ShTest format for REQUIRES checks.
|
||||
config.available_features.add('some-feature-name')
|
||||
|
@ -19,7 +19,6 @@ class LitConfig:
|
||||
|
||||
def __init__(self, progname, path, quiet,
|
||||
useValgrind, valgrindLeakCheck, valgrindArgs,
|
||||
useTclAsSh,
|
||||
noExecute, ignoreStdErr, debug, isWindows,
|
||||
params):
|
||||
# The name of the test runner.
|
||||
@ -30,7 +29,6 @@ class LitConfig:
|
||||
self.useValgrind = bool(useValgrind)
|
||||
self.valgrindLeakCheck = bool(valgrindLeakCheck)
|
||||
self.valgrindUserArgs = list(valgrindArgs)
|
||||
self.useTclAsSh = bool(useTclAsSh)
|
||||
self.noExecute = noExecute
|
||||
self.ignoreStdErr = ignoreStdErr
|
||||
self.debug = debug
|
||||
@ -80,7 +78,7 @@ class LitConfig:
|
||||
break
|
||||
|
||||
if self.bashPath is None:
|
||||
self.warning("Unable to find 'bash', running Tcl tests internally.")
|
||||
self.warning("Unable to find 'bash'.")
|
||||
self.bashPath = ''
|
||||
|
||||
return self.bashPath
|
||||
|
@ -1,3 +1,3 @@
|
||||
from TestFormats import FileBasedTest
|
||||
from TestFormats import GoogleTest, ShTest, TclTest
|
||||
from TestFormats import GoogleTest, ShTest
|
||||
from TestFormats import SyntaxCheckTest, OneCommandPerFileTest
|
||||
|
@ -1,322 +0,0 @@
|
||||
import itertools
|
||||
|
||||
from ShCommands import Command, Pipeline
|
||||
|
||||
def tcl_preprocess(data):
|
||||
# Tcl has a preprocessing step to replace escaped newlines.
|
||||
i = data.find('\\\n')
|
||||
if i == -1:
|
||||
return data
|
||||
|
||||
# Replace '\\\n' and subsequent whitespace by a single space.
|
||||
n = len(data)
|
||||
str = data[:i]
|
||||
i += 2
|
||||
while i < n and data[i] in ' \t':
|
||||
i += 1
|
||||
return str + ' ' + data[i:]
|
||||
|
||||
class TclLexer:
|
||||
"""TclLexer - Lex a string into "words", following the Tcl syntax."""
|
||||
|
||||
def __init__(self, data):
|
||||
self.data = tcl_preprocess(data)
|
||||
self.pos = 0
|
||||
self.end = len(self.data)
|
||||
|
||||
def at_end(self):
|
||||
return self.pos == self.end
|
||||
|
||||
def eat(self):
|
||||
c = self.data[self.pos]
|
||||
self.pos += 1
|
||||
return c
|
||||
|
||||
def look(self):
|
||||
return self.data[self.pos]
|
||||
|
||||
def maybe_eat(self, c):
|
||||
"""
|
||||
maybe_eat(c) - Consume the character c if it is the next character,
|
||||
returning True if a character was consumed. """
|
||||
if self.data[self.pos] == c:
|
||||
self.pos += 1
|
||||
return True
|
||||
return False
|
||||
|
||||
def escape(self, c):
|
||||
if c == 'a':
|
||||
return '\x07'
|
||||
elif c == 'b':
|
||||
return '\x08'
|
||||
elif c == 'f':
|
||||
return '\x0c'
|
||||
elif c == 'n':
|
||||
return '\n'
|
||||
elif c == 'r':
|
||||
return '\r'
|
||||
elif c == 't':
|
||||
return '\t'
|
||||
elif c == 'v':
|
||||
return '\x0b'
|
||||
elif c in 'uxo':
|
||||
raise ValueError,'Invalid quoted character %r' % c
|
||||
else:
|
||||
return c
|
||||
|
||||
def lex_braced(self):
|
||||
# Lex until whitespace or end of string, the opening brace has already
|
||||
# been consumed.
|
||||
|
||||
str = ''
|
||||
while 1:
|
||||
if self.at_end():
|
||||
raise ValueError,"Unterminated '{' quoted word"
|
||||
|
||||
c = self.eat()
|
||||
if c == '}':
|
||||
break
|
||||
elif c == '{':
|
||||
str += '{' + self.lex_braced() + '}'
|
||||
elif c == '\\' and self.look() in '{}':
|
||||
str += self.eat()
|
||||
else:
|
||||
str += c
|
||||
|
||||
return str
|
||||
|
||||
def lex_quoted(self):
|
||||
str = ''
|
||||
|
||||
while 1:
|
||||
if self.at_end():
|
||||
raise ValueError,"Unterminated '\"' quoted word"
|
||||
|
||||
c = self.eat()
|
||||
if c == '"':
|
||||
break
|
||||
elif c == '\\':
|
||||
if self.at_end():
|
||||
raise ValueError,'Missing quoted character'
|
||||
|
||||
str += self.escape(self.eat())
|
||||
else:
|
||||
str += c
|
||||
|
||||
return str
|
||||
|
||||
def lex_unquoted(self, process_all=False):
|
||||
# Lex until whitespace or end of string.
|
||||
str = ''
|
||||
while not self.at_end():
|
||||
if not process_all:
|
||||
if self.look().isspace() or self.look() == ';':
|
||||
break
|
||||
|
||||
c = self.eat()
|
||||
if c == '\\':
|
||||
if self.at_end():
|
||||
raise ValueError,'Missing quoted character'
|
||||
|
||||
str += self.escape(self.eat())
|
||||
elif c == '[':
|
||||
raise NotImplementedError, ('Command substitution is '
|
||||
'not supported')
|
||||
elif c == '$' and not self.at_end() and (self.look().isalpha() or
|
||||
self.look() == '{'):
|
||||
raise NotImplementedError, ('Variable substitution is '
|
||||
'not supported')
|
||||
else:
|
||||
str += c
|
||||
|
||||
return str
|
||||
|
||||
def lex_one_token(self):
|
||||
if self.maybe_eat('"'):
|
||||
return self.lex_quoted()
|
||||
elif self.maybe_eat('{'):
|
||||
# Check for argument substitution.
|
||||
if not self.maybe_eat('*'):
|
||||
return self.lex_braced()
|
||||
|
||||
if not self.maybe_eat('}'):
|
||||
return '*' + self.lex_braced()
|
||||
|
||||
if self.at_end() or self.look().isspace():
|
||||
return '*'
|
||||
|
||||
raise NotImplementedError, "Argument substitution is unsupported"
|
||||
else:
|
||||
return self.lex_unquoted()
|
||||
|
||||
def lex(self):
|
||||
while not self.at_end():
|
||||
c = self.look()
|
||||
if c in ' \t':
|
||||
self.eat()
|
||||
elif c in ';\n':
|
||||
self.eat()
|
||||
yield (';',)
|
||||
else:
|
||||
yield self.lex_one_token()
|
||||
|
||||
class TclExecCommand:
|
||||
kRedirectPrefixes1 = ('<', '>')
|
||||
kRedirectPrefixes2 = ('<@', '<<', '2>', '>&', '>>', '>@')
|
||||
kRedirectPrefixes3 = ('2>@', '2>>', '>>&', '>&@')
|
||||
kRedirectPrefixes4 = ('2>@1',)
|
||||
|
||||
def __init__(self, args):
|
||||
self.args = iter(args)
|
||||
|
||||
def lex(self):
|
||||
try:
|
||||
return self.args.next()
|
||||
except StopIteration:
|
||||
return None
|
||||
|
||||
def look(self):
|
||||
next = self.lex()
|
||||
if next is not None:
|
||||
self.args = itertools.chain([next], self.args)
|
||||
return next
|
||||
|
||||
def parse_redirect(self, tok, length):
|
||||
if len(tok) == length:
|
||||
arg = self.lex()
|
||||
if arg is None:
|
||||
raise ValueError,'Missing argument to %r redirection' % tok
|
||||
else:
|
||||
tok,arg = tok[:length],tok[length:]
|
||||
|
||||
if tok[0] == '2':
|
||||
op = (tok[1:],2)
|
||||
else:
|
||||
op = (tok,)
|
||||
return (op, arg)
|
||||
|
||||
def parse_pipeline(self):
|
||||
if self.look() is None:
|
||||
raise ValueError,"Expected at least one argument to exec"
|
||||
|
||||
commands = [Command([],[])]
|
||||
while 1:
|
||||
arg = self.lex()
|
||||
if arg is None:
|
||||
break
|
||||
elif arg == '|':
|
||||
commands.append(Command([],[]))
|
||||
elif arg == '|&':
|
||||
# Write this as a redirect of stderr; it must come first because
|
||||
# stdout may have already been redirected.
|
||||
commands[-1].redirects.insert(0, (('>&',2),'1'))
|
||||
commands.append(Command([],[]))
|
||||
elif arg[:4] in TclExecCommand.kRedirectPrefixes4:
|
||||
commands[-1].redirects.append(self.parse_redirect(arg, 4))
|
||||
elif arg[:3] in TclExecCommand.kRedirectPrefixes3:
|
||||
commands[-1].redirects.append(self.parse_redirect(arg, 3))
|
||||
elif arg[:2] in TclExecCommand.kRedirectPrefixes2:
|
||||
commands[-1].redirects.append(self.parse_redirect(arg, 2))
|
||||
elif arg[:1] in TclExecCommand.kRedirectPrefixes1:
|
||||
commands[-1].redirects.append(self.parse_redirect(arg, 1))
|
||||
else:
|
||||
commands[-1].args.append(arg)
|
||||
|
||||
return Pipeline(commands, False, pipe_err=True)
|
||||
|
||||
def parse(self):
|
||||
ignoreStderr = False
|
||||
keepNewline = False
|
||||
|
||||
# Parse arguments.
|
||||
while 1:
|
||||
next = self.look()
|
||||
if not isinstance(next, str) or next[0] != '-':
|
||||
break
|
||||
|
||||
if next == '--':
|
||||
self.lex()
|
||||
break
|
||||
elif next == '-ignorestderr':
|
||||
ignoreStderr = True
|
||||
elif next == '-keepnewline':
|
||||
keepNewline = True
|
||||
else:
|
||||
raise ValueError,"Invalid exec argument %r" % next
|
||||
|
||||
return (ignoreStderr, keepNewline, self.parse_pipeline())
|
||||
|
||||
###
|
||||
|
||||
import unittest
|
||||
|
||||
class TestTclLexer(unittest.TestCase):
|
||||
def lex(self, str, *args, **kwargs):
|
||||
return list(TclLexer(str, *args, **kwargs).lex())
|
||||
|
||||
def test_preprocess(self):
|
||||
self.assertEqual(tcl_preprocess('a b'), 'a b')
|
||||
self.assertEqual(tcl_preprocess('a\\\nb c'), 'a b c')
|
||||
|
||||
def test_unquoted(self):
|
||||
self.assertEqual(self.lex('a b c'),
|
||||
['a', 'b', 'c'])
|
||||
self.assertEqual(self.lex(r'a\nb\tc\ '),
|
||||
['a\nb\tc '])
|
||||
self.assertEqual(self.lex(r'a \\\$b c $\\'),
|
||||
['a', r'\$b', 'c', '$\\'])
|
||||
|
||||
def test_braced(self):
|
||||
self.assertEqual(self.lex('a {b c} {}'),
|
||||
['a', 'b c', ''])
|
||||
self.assertEqual(self.lex(r'a {b {c\n}}'),
|
||||
['a', 'b {c\\n}'])
|
||||
self.assertEqual(self.lex(r'a {b\{}'),
|
||||
['a', 'b{'])
|
||||
self.assertEqual(self.lex(r'{*}'), ['*'])
|
||||
self.assertEqual(self.lex(r'{*} a'), ['*', 'a'])
|
||||
self.assertEqual(self.lex(r'{*} a'), ['*', 'a'])
|
||||
self.assertEqual(self.lex('{a\\\n b}'),
|
||||
['a b'])
|
||||
|
||||
def test_quoted(self):
|
||||
self.assertEqual(self.lex('a "b c"'),
|
||||
['a', 'b c'])
|
||||
|
||||
def test_terminators(self):
|
||||
self.assertEqual(self.lex('a\nb'),
|
||||
['a', (';',), 'b'])
|
||||
self.assertEqual(self.lex('a;b'),
|
||||
['a', (';',), 'b'])
|
||||
self.assertEqual(self.lex('a ; b'),
|
||||
['a', (';',), 'b'])
|
||||
|
||||
class TestTclExecCommand(unittest.TestCase):
|
||||
def parse(self, str):
|
||||
return TclExecCommand(list(TclLexer(str).lex())).parse()
|
||||
|
||||
def test_basic(self):
|
||||
self.assertEqual(self.parse('echo hello'),
|
||||
(False, False,
|
||||
Pipeline([Command(['echo', 'hello'], [])],
|
||||
False, True)))
|
||||
self.assertEqual(self.parse('echo hello | grep hello'),
|
||||
(False, False,
|
||||
Pipeline([Command(['echo', 'hello'], []),
|
||||
Command(['grep', 'hello'], [])],
|
||||
False, True)))
|
||||
|
||||
def test_redirect(self):
|
||||
self.assertEqual(self.parse('echo hello > a >b >>c 2> d |& e'),
|
||||
(False, False,
|
||||
Pipeline([Command(['echo', 'hello'],
|
||||
[(('>&',2),'1'),
|
||||
(('>',),'a'),
|
||||
(('>',),'b'),
|
||||
(('>>',),'c'),
|
||||
(('>',2),'d')]),
|
||||
Command(['e'], [])],
|
||||
False, True)))
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
@ -124,14 +124,6 @@ class ShTest(FileBasedTest):
|
||||
return TestRunner.executeShTest(test, litConfig,
|
||||
self.execute_external)
|
||||
|
||||
class TclTest(FileBasedTest):
|
||||
def __init__(self, ignoreStdErr=False):
|
||||
self.ignoreStdErr = ignoreStdErr
|
||||
|
||||
def execute(self, test, litConfig):
|
||||
litConfig.ignoreStdErr = self.ignoreStdErr
|
||||
return TestRunner.executeTclTest(test, litConfig)
|
||||
|
||||
###
|
||||
|
||||
import re
|
||||
|
@ -269,82 +269,6 @@ def executeScriptInternal(test, litConfig, tmpBase, commands, cwd):
|
||||
|
||||
return out, err, exitCode
|
||||
|
||||
def executeTclScriptInternal(test, litConfig, tmpBase, commands, cwd):
|
||||
import TclUtil
|
||||
cmds = []
|
||||
for ln in commands:
|
||||
# Given the unfortunate way LLVM's test are written, the line gets
|
||||
# backslash substitution done twice.
|
||||
ln = TclUtil.TclLexer(ln).lex_unquoted(process_all = True)
|
||||
|
||||
try:
|
||||
tokens = list(TclUtil.TclLexer(ln).lex())
|
||||
except:
|
||||
return (Test.FAIL, "Tcl lexer error on: %r" % ln)
|
||||
|
||||
# Validate there are no control tokens.
|
||||
for t in tokens:
|
||||
if not isinstance(t, str):
|
||||
return (Test.FAIL,
|
||||
"Invalid test line: %r containing %r" % (ln, t))
|
||||
|
||||
try:
|
||||
cmds.append(TclUtil.TclExecCommand(tokens).parse_pipeline())
|
||||
except:
|
||||
return (Test.FAIL, "Tcl 'exec' parse error on: %r" % ln)
|
||||
|
||||
if litConfig.useValgrind:
|
||||
for pipeline in cmds:
|
||||
if pipeline.commands:
|
||||
# Only valgrind the first command in each pipeline, to avoid
|
||||
# valgrinding things like grep, not, and FileCheck.
|
||||
cmd = pipeline.commands[0]
|
||||
cmd.args = litConfig.valgrindArgs + cmd.args
|
||||
|
||||
cmd = cmds[0]
|
||||
for c in cmds[1:]:
|
||||
cmd = ShUtil.Seq(cmd, '&&', c)
|
||||
|
||||
# FIXME: This is lame, we shouldn't need bash. See PR5240.
|
||||
bashPath = litConfig.getBashPath()
|
||||
if litConfig.useTclAsSh and bashPath:
|
||||
script = tmpBase + '.script'
|
||||
|
||||
# Write script file
|
||||
f = open(script,'w')
|
||||
print >>f, 'set -o pipefail'
|
||||
cmd.toShell(f, pipefail = True)
|
||||
f.close()
|
||||
|
||||
if 0:
|
||||
print >>sys.stdout, cmd
|
||||
print >>sys.stdout, open(script).read()
|
||||
print >>sys.stdout
|
||||
return '', '', 0
|
||||
|
||||
command = [litConfig.getBashPath(), script]
|
||||
out,err,exitCode = executeCommand(command, cwd=cwd,
|
||||
env=test.config.environment)
|
||||
|
||||
return out,err,exitCode
|
||||
else:
|
||||
results = []
|
||||
try:
|
||||
exitCode = executeShCmd(cmd, test.config, cwd, results)
|
||||
except InternalShellError,e:
|
||||
results.append((e.command, '', e.message + '\n', 255))
|
||||
exitCode = 255
|
||||
|
||||
out = err = ''
|
||||
|
||||
for i,(cmd, cmd_out, cmd_err, res) in enumerate(results):
|
||||
out += 'Command %d: %s\n' % (i, ' '.join('"%s"' % s for s in cmd.args))
|
||||
out += 'Command %d Result: %r\n' % (i, res)
|
||||
out += 'Command %d Output:\n%s\n\n' % (i, cmd_out)
|
||||
out += 'Command %d Stderr:\n%s\n\n' % (i, cmd_err)
|
||||
|
||||
return out, err, exitCode
|
||||
|
||||
def executeScript(test, litConfig, tmpBase, commands, cwd):
|
||||
bashPath = litConfig.getBashPath();
|
||||
isWin32CMDEXE = (litConfig.isWindows and not bashPath)
|
||||
@ -429,8 +353,6 @@ def parseIntegratedTestScript(test, normalize_slashes=False,
|
||||
('%{pathsep}', os.pathsep),
|
||||
('%t', tmpBase + '.tmp'),
|
||||
('%T', tmpDir),
|
||||
# FIXME: Remove this once we kill DejaGNU.
|
||||
('%abs_tmp', tmpBase + '.tmp'),
|
||||
('#_MARKER_#', '%')])
|
||||
|
||||
# Collect the test lines from the script.
|
||||
@ -529,53 +451,6 @@ def formatTestOutput(status, out, err, exitCode, failDueToStderr, script):
|
||||
print >>output, "--"
|
||||
return (status, output.getvalue())
|
||||
|
||||
def executeTclTest(test, litConfig):
|
||||
if test.config.unsupported:
|
||||
return (Test.UNSUPPORTED, 'Test is unsupported')
|
||||
|
||||
# Parse the test script, normalizing slashes in substitutions on Windows
|
||||
# (since otherwise Tcl style lexing will treat them as escapes).
|
||||
res = parseIntegratedTestScript(test, normalize_slashes=kIsWindows)
|
||||
if len(res) == 2:
|
||||
return res
|
||||
|
||||
script, isXFail, tmpBase, execdir = res
|
||||
|
||||
if litConfig.noExecute:
|
||||
return (Test.PASS, '')
|
||||
|
||||
# Create the output directory if it does not already exist.
|
||||
Util.mkdir_p(os.path.dirname(tmpBase))
|
||||
|
||||
res = executeTclScriptInternal(test, litConfig, tmpBase, script, execdir)
|
||||
if len(res) == 2:
|
||||
return res
|
||||
|
||||
# Test for failure. In addition to the exit code, Tcl commands are
|
||||
# considered to fail if there is any standard error output.
|
||||
out,err,exitCode = res
|
||||
if isXFail:
|
||||
ok = exitCode != 0 or err and not litConfig.ignoreStdErr
|
||||
if ok:
|
||||
status = Test.XFAIL
|
||||
else:
|
||||
status = Test.XPASS
|
||||
else:
|
||||
ok = exitCode == 0 and (not err or litConfig.ignoreStdErr)
|
||||
if ok:
|
||||
status = Test.PASS
|
||||
else:
|
||||
status = Test.FAIL
|
||||
|
||||
if ok:
|
||||
return (status,'')
|
||||
|
||||
# Set a flag for formatTestOutput so it can explain why the test was
|
||||
# considered to have failed, despite having an exit code of 0.
|
||||
failDueToStderr = exitCode == 0 and err and not litConfig.ignoreStdErr
|
||||
|
||||
return formatTestOutput(status, out, err, exitCode, failDueToStderr, script)
|
||||
|
||||
def executeShTest(test, litConfig, useExternalSh,
|
||||
extra_substitutions=[]):
|
||||
if test.config.unsupported:
|
||||
|
@ -326,7 +326,6 @@ def load_test_suite(inputs):
|
||||
useValgrind = False,
|
||||
valgrindLeakCheck = False,
|
||||
valgrindArgs = [],
|
||||
useTclAsSh = False,
|
||||
noExecute = False,
|
||||
ignoreStdErr = False,
|
||||
debug = False,
|
||||
@ -442,9 +441,6 @@ def main(builtinParameters = {}): # Bump the GIL check interval, its more imp
|
||||
group.add_option("", "--show-suites", dest="showSuites",
|
||||
help="Show discovered test suites",
|
||||
action="store_true", default=False)
|
||||
group.add_option("", "--no-tcl-as-sh", dest="useTclAsSh",
|
||||
help="Don't run Tcl scripts using 'sh'",
|
||||
action="store_false", default=True)
|
||||
group.add_option("", "--repeat", dest="repeatTests", metavar="N",
|
||||
help="Repeat tests N times (for timing)",
|
||||
action="store", default=None, type=int)
|
||||
@ -489,7 +485,6 @@ def main(builtinParameters = {}): # Bump the GIL check interval, its more imp
|
||||
useValgrind = opts.useValgrind,
|
||||
valgrindLeakCheck = opts.valgrindLeakCheck,
|
||||
valgrindArgs = opts.valgrindArgs,
|
||||
useTclAsSh = opts.useTclAsSh,
|
||||
noExecute = opts.noExecute,
|
||||
ignoreStdErr = False,
|
||||
debug = opts.debug,
|
||||
|
Loading…
Reference in New Issue
Block a user