1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
import os
import Test
import TestRunner
import Util
class GoogleTest(object):
def __init__(self, test_sub_dir, test_suffix):
self.test_sub_dir = str(test_sub_dir)
self.test_suffix = str(test_suffix)
def getGTestTests(self, path):
"""getGTestTests(path) - [name]
Return the tests available in gtest executable."""
lines = Util.capture([path, '--gtest_list_tests']).split('\n')
nested_tests = []
for ln in lines:
if not ln.strip():
continue
prefix = ''
index = 0
while ln[index*2:index*2+2] == ' ':
index += 1
while len(nested_tests) > index:
nested_tests.pop()
ln = ln[index*2:]
if ln.endswith('.'):
nested_tests.append(ln)
else:
yield ''.join(nested_tests) + ln
def getTestsInDirectory(self, testSuite, path_in_suite,
litConfig, localConfig):
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
filepath = os.path.join(source_path, filename)
for subfilename in os.listdir(filepath):
if subfilename.endswith(self.test_suffix):
execpath = os.path.join(filepath, subfilename)
# Discover the tests in this executable.
for name in self.getGTestTests(execpath):
testPath = path_in_suite + (filename, subfilename, name)
yield Test.Test(testSuite, testPath, localConfig)
def execute(self, test, litConfig):
testPath,testName = os.path.split(test.getSourcePath())
cmd = [testPath, '--gtest_filter=' + testName]
out, err, exitCode = TestRunner.executeCommand(cmd)
if not exitCode:
return Test.PASS,''
return Test.FAIL, out + err
###
class FileBasedTest(object):
def getTestsInDirectory(self, testSuite, path_in_suite,
litConfig, localConfig):
source_path = testSuite.getSourcePath(path_in_suite)
for filename in os.listdir(source_path):
filepath = os.path.join(source_path, filename)
if not os.path.isdir(filepath):
base,ext = os.path.splitext(filename)
if ext in localConfig.suffixes:
yield Test.Test(testSuite, path_in_suite + (filename,),
localConfig)
class ShTest(FileBasedTest):
def __init__(self, execute_external = False, require_and_and = 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)
class TclTest(FileBasedTest):
def execute(self, test, litConfig):
return TestRunner.executeTclTest(test, litConfig)
###
import re
import tempfile
class SyntaxCheckTest:
# 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)
self.dir = str(dir)
self.recursive = bool(recursive)
self.pattern = re.compile(pattern)
self.extra_cxx_args = list(extra_cxx_args)
def getTestsInDirectory(self, testSuite, path_in_suite,
litConfig, localConfig):
for dirname,subdirs,filenames in os.walk(self.dir):
if not self.recursive:
subdirs[:] = []
for filename in filenames:
if (not self.pattern.match(filename) or
filename in localConfig.excludes):
continue
path = os.path.join(dirname,filename)
suffix = path[len(self.dir):]
if suffix.startswith(os.sep):
suffix = suffix[1:]
test = Test.Test(testSuite,
path_in_suite + tuple(suffix.split(os.sep)),
localConfig)
# FIXME: Hack?
test.source_path = path
yield test
def execute(self, test, litConfig):
tmp = tempfile.NamedTemporaryFile(suffix='.cpp')
print >>tmp, '#include "%s"' % test.source_path
tmp.flush()
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
|