blob: 18275e51c020a92c59ca96145ffaaacbed7c5cec [file] [log] [blame]
Johnny Chen9707bb62010-06-25 21:14:08 +00001#!/usr/bin/env python
2
3"""
4A simple testing framework for lldb using python's unit testing framework.
5
6Tests for lldb are written as python scripts which take advantage of the script
7bridging provided by LLDB.framework to interact with lldb core.
8
9A specific naming pattern is followed by the .py script to be recognized as
10a module which implements a test scenario, namely, Test*.py.
11
12To specify the directories where "Test*.py" python test scripts are located,
13you need to pass in a list of directory names. By default, the current
14working directory is searched if nothing is specified on the command line.
Johnny Chen872aee12010-09-16 15:44:23 +000015
16Type:
17
18./dotest.py -h
19
20for available options.
Johnny Chen9707bb62010-06-25 21:14:08 +000021"""
22
Johnny Chen91960d32010-09-08 20:56:16 +000023import os, signal, sys, time
Johnny Chen2891bb02011-09-16 01:04:26 +000024import subprocess
Johnny Chen75e28f92010-08-05 23:42:46 +000025import unittest2
Johnny Chen9707bb62010-06-25 21:14:08 +000026
Johnny Chen26901c82011-03-11 19:47:23 +000027def is_exe(fpath):
Johnny Chenf2c7b282011-04-26 23:10:51 +000028 """Returns true if fpath is an executable."""
Johnny Chen26901c82011-03-11 19:47:23 +000029 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
30
Johnny Chen26901c82011-03-11 19:47:23 +000031def which(program):
Johnny Chenf2c7b282011-04-26 23:10:51 +000032 """Returns the full path to a program; None otherwise."""
Johnny Chen26901c82011-03-11 19:47:23 +000033 fpath, fname = os.path.split(program)
34 if fpath:
35 if is_exe(program):
36 return program
37 else:
38 for path in os.environ["PATH"].split(os.pathsep):
39 exe_file = os.path.join(path, program)
40 if is_exe(exe_file):
41 return exe_file
42 return None
43
Johnny Chen877c7e42010-08-07 00:16:07 +000044class _WritelnDecorator(object):
45 """Used to decorate file-like objects with a handy 'writeln' method"""
46 def __init__(self,stream):
47 self.stream = stream
48
49 def __getattr__(self, attr):
50 if attr in ('stream', '__getstate__'):
51 raise AttributeError(attr)
52 return getattr(self.stream,attr)
53
54 def writeln(self, arg=None):
55 if arg:
56 self.write(arg)
57 self.write('\n') # text-mode streams translate to \r\n if needed
58
Johnny Chen9707bb62010-06-25 21:14:08 +000059#
60# Global variables:
61#
62
63# The test suite.
Johnny Chen75e28f92010-08-05 23:42:46 +000064suite = unittest2.TestSuite()
Johnny Chen9707bb62010-06-25 21:14:08 +000065
Johnny Chen4f93bf12010-12-10 00:51:23 +000066# By default, both command line and Python API tests are performed.
Johnny Chen3ebdacc2010-12-10 18:52:10 +000067# Use @python_api_test decorator, defined in lldbtest.py, to mark a test as
68# a Python API test.
Johnny Chen4f93bf12010-12-10 00:51:23 +000069dont_do_python_api_test = False
70
71# By default, both command line and Python API tests are performed.
Johnny Chen4f93bf12010-12-10 00:51:23 +000072just_do_python_api_test = False
73
Johnny Chen82ccf402011-07-30 01:39:58 +000074# By default, benchmarks tests are not run.
75just_do_benchmarks_test = False
76
Johnny Chen82e6b1e2010-12-01 22:47:54 +000077# The blacklist is optional (-b blacklistFile) and allows a central place to skip
78# testclass's and/or testclass.testmethod's.
79blacklist = None
80
81# The dictionary as a result of sourcing blacklistFile.
82blacklistConfig = {}
83
Johnny Chen9fdb0a92010-09-18 00:16:47 +000084# The config file is optional.
85configFile = None
86
Johnny Chend2acdb32010-11-16 22:42:58 +000087# Test suite repeat count. Can be overwritten with '-# count'.
88count = 1
89
Johnny Chenb40056b2010-09-21 00:09:27 +000090# The dictionary as a result of sourcing configFile.
91config = {}
92
Johnny Chen1a4d5e72011-03-04 01:35:22 +000093# The 'archs' and 'compilers' can be specified via either command line or configFile,
94# with the command line overriding the configFile. When specified, they should be
95# of the list type. For example, "-A x86_64^i386" => archs=['x86_64', 'i386'] and
96# "-C gcc^clang" => compilers=['gcc', 'clang'].
97archs = None
98compilers = None
99
Johnny Chen91960d32010-09-08 20:56:16 +0000100# Delay startup in order for the debugger to attach.
101delay = False
102
Johnny Chend5362332011-01-29 01:21:04 +0000103# Dump the Python sys.path variable. Use '-D' to dump sys.path.
Johnny Chen50bc6382011-01-29 01:16:52 +0000104dumpSysPath = False
105
Johnny Chene00c9302011-10-10 22:03:44 +0000106# Full path of the benchmark executable, as specified by the '-e' option.
107bmExecutable = None
108# The breakpoint specification of bmExecutable, as specified by the '-x' option.
109bmBreakpointSpec = None
Johnny Chen5f2ed172011-10-20 18:43:28 +0000110# The benchamrk iteration count, as specified by the '-y' option.
111bmIterationCount = -1
Johnny Chene00c9302011-10-10 22:03:44 +0000112
Johnny Chene9eae812012-01-18 05:15:00 +0000113# By default, don't exclude any directories. Use '-X' to add one excluded directory.
114excluded = set(['.svn', '.git'])
115
Johnny Chen7d6d8442010-12-03 19:59:35 +0000116# By default, failfast is False. Use '-F' to overwrite it.
117failfast = False
118
Johnny Chenc5fa0052011-07-29 22:54:56 +0000119# The filters (testclass.testmethod) used to admit tests into our test suite.
120filters = []
Johnny Chenb62436b2010-10-06 20:40:56 +0000121
Johnny Chen38f823c2011-10-11 01:30:27 +0000122# The runhooks is a list of lldb commands specifically for the debugger.
123# Use '-k' to specify a runhook.
124runHooks = []
125
Johnny Chena224cd12010-11-08 01:21:03 +0000126# If '-g' is specified, the filterspec is not exclusive. If a test module does
127# not contain testclass.testmethod which matches the filterspec, the whole test
128# module is still admitted into our test suite. fs4all flag defaults to True.
129fs4all = True
Johnny Chenb62436b2010-10-06 20:40:56 +0000130
Johnny Chenaf149a02010-09-16 17:11:30 +0000131# Ignore the build search path relative to this script to locate the lldb.py module.
132ignore = False
133
Johnny Chen028d8eb2011-11-17 19:57:27 +0000134# By default, we do not skip build and cleanup. Use '-S' option to override.
135skip_build_and_cleanup = False
136
Johnny Chen548aefd2010-10-11 22:25:46 +0000137# By default, we skip long running test case. Use '-l' option to override.
Johnny Chen028d8eb2011-11-17 19:57:27 +0000138skip_long_running_test = True
Johnny Chen41998192010-10-01 22:59:49 +0000139
Johnny Chenfe5f1ed2011-10-21 18:33:27 +0000140# By default, we print the build dir, lldb version, and svn info. Use '-n' option to
141# turn it off.
142noHeaders = False
143
Johnny Chen7c52ff12010-09-27 23:29:54 +0000144# The regular expression pattern to match against eligible filenames as our test cases.
145regexp = None
146
Johnny Chen548aefd2010-10-11 22:25:46 +0000147# By default, tests are executed in place and cleanups are performed afterwards.
148# Use '-r dir' option to relocate the tests and their intermediate files to a
149# different directory and to forgo any cleanups. The directory specified must
150# not exist yet.
151rdir = None
152
Johnny Chen125fc2b2010-10-21 16:55:35 +0000153# By default, recorded session info for errored/failed test are dumped into its
154# own file under a session directory named after the timestamp of the test suite
155# run. Use '-s session-dir-name' to specify a specific dir name.
156sdir_name = None
157
Johnny Chen63c2cba2010-10-29 22:20:36 +0000158# Set this flag if there is any session info dumped during the test run.
159sdir_has_content = False
160
Johnny Chenb5fe80c2011-05-17 22:58:50 +0000161# svn_info stores the output from 'svn info lldb.base.dir'.
162svn_info = ''
163
Johnny Chen9707bb62010-06-25 21:14:08 +0000164# Default verbosity is 0.
165verbose = 0
166
Johnny Chen08967192011-11-18 00:19:29 +0000167# Set to True only if verbose is 0 and LLDB trace mode is off.
168progress_bar = False
169
Peter Collingbourne61aca482011-06-20 19:06:29 +0000170# By default, search from the script directory.
171testdirs = [ sys.path[0] ]
Johnny Chen9707bb62010-06-25 21:14:08 +0000172
Johnny Chen877c7e42010-08-07 00:16:07 +0000173# Separator string.
174separator = '-' * 70
175
Johnny Chen9707bb62010-06-25 21:14:08 +0000176
177def usage():
178 print """
179Usage: dotest.py [option] [args]
180where options:
Jim Ingham4f347cb2011-04-13 21:11:41 +0000181-h : print this help message and exit. Add '-v' for more detailed help.
Johnny Chen1a4d5e72011-03-04 01:35:22 +0000182-A : specify the architecture(s) to launch for the inferior process
183 -A i386 => launch inferior with i386 architecture
184 -A x86_64^i386 => launch inferior with x86_64 and i386 architectures
185-C : specify the compiler(s) used to build the inferior executable
186 -C clang => build debuggee using clang compiler
Johnny Chence9cf4e2012-01-17 01:26:06 +0000187 -C /my/full/path/to/clang => specify a full path to the clang binary
Johnny Chen1a4d5e72011-03-04 01:35:22 +0000188 -C clang^gcc => build debuggee using clang and gcc compilers
Johnny Chen50bc6382011-01-29 01:16:52 +0000189-D : dump the Python sys.path variable
Johnny Chen4f93bf12010-12-10 00:51:23 +0000190-a : don't do lldb Python API tests
191 use @python_api_test to decorate a test case as lldb Python API test
Johnny Chen3ebdacc2010-12-10 18:52:10 +0000192+a : just do lldb Python API tests
Johnny Chencc659ad2010-12-10 19:02:23 +0000193 do not specify both '-a' and '+a' at the same time
Johnny Chen82ccf402011-07-30 01:39:58 +0000194+b : just do benchmark tests
195 use @benchmark_test to decorate a test case as such
Johnny Chen82e6b1e2010-12-01 22:47:54 +0000196-b : read a blacklist file specified after this option
Johnny Chen9fdb0a92010-09-18 00:16:47 +0000197-c : read a config file specified after this option
Johnny Chen1a4d5e72011-03-04 01:35:22 +0000198 the architectures and compilers (note the plurals) specified via '-A' and '-C'
199 will override those specified via a config file
Johnny Chenb40056b2010-09-21 00:09:27 +0000200 (see also lldb-trunk/example/test/usage-config)
Johnny Chen91960d32010-09-08 20:56:16 +0000201-d : delay startup for 10 seconds (in order for the debugger to attach)
Johnny Chene00c9302011-10-10 22:03:44 +0000202-e : specify the full path of an executable used for benchmark purpose;
203 see also '-x', which provides the breakpoint sepcification
Johnny Chen7d6d8442010-12-03 19:59:35 +0000204-F : failfast, stop the test suite on the first error/failure
Johnny Chen46be75d2010-10-11 16:19:48 +0000205-f : specify a filter, which consists of the test class name, a dot, followed by
Johnny Chen1a6e92a2010-11-08 20:17:04 +0000206 the test method, to only admit such test into the test suite
Johnny Chenb62436b2010-10-06 20:40:56 +0000207 e.g., -f 'ClassTypesTestCase.test_with_dwarf_and_python_api'
Johnny Chena224cd12010-11-08 01:21:03 +0000208-g : if specified, the filterspec by -f is not exclusive, i.e., if a test module
209 does not match the filterspec (testclass.testmethod), the whole module is
210 still admitted to the test suite
Johnny Chenaf149a02010-09-16 17:11:30 +0000211-i : ignore (don't bailout) if 'lldb.py' module cannot be located in the build
212 tree relative to this script; use PYTHONPATH to locate the module
Johnny Chen38f823c2011-10-11 01:30:27 +0000213-k : specify a runhook, which is an lldb command to be executed by the debugger;
214 '-k' option can occur multiple times, the commands are executed one after the
215 other to bring the debugger to a desired state, so that, for example, further
216 benchmarking can be done
Johnny Chen41998192010-10-01 22:59:49 +0000217-l : don't skip long running test
Johnny Chenfe5f1ed2011-10-21 18:33:27 +0000218-n : don't print the headers like build dir, lldb version, and svn info at all
Johnny Chen7c52ff12010-09-27 23:29:54 +0000219-p : specify a regexp filename pattern for inclusion in the test suite
Johnny Chen548aefd2010-10-11 22:25:46 +0000220-r : specify a dir to relocate the tests and their intermediate files to;
221 the directory must not exist before running this test driver;
222 no cleanup of intermediate test files is performed in this case
Johnny Chen028d8eb2011-11-17 19:57:27 +0000223-S : skip the build and cleanup while running the test
224 use this option with care as you would need to build the inferior(s) by hand
225 and build the executable(s) with the correct name(s)
226 this can be used with '-# n' to stress test certain test cases for n number of
227 times
Johnny Chen125fc2b2010-10-21 16:55:35 +0000228-s : specify the name of the dir created to store the session files of tests
229 with errored or failed status; if not specified, the test driver uses the
230 timestamp as the session dir name
Johnny Chena2486f22011-04-21 20:48:32 +0000231-t : turn on tracing of lldb command and other detailed test executions
232-v : do verbose mode of unittest framework (print out each test case invocation)
Johnny Chene9eae812012-01-18 05:15:00 +0000233-X : exclude a directory from consideration for test discovery
234 -X types => if 'types' appear in the pathname components of a potential testfile
235 it will be ignored
Johnny Chene00c9302011-10-10 22:03:44 +0000236-x : specify the breakpoint specification for the benchmark executable;
237 see also '-e', which provides the full path of the executable
Johnny Chen5f2ed172011-10-20 18:43:28 +0000238-y : specify the iteration count used to collect our benchmarks; an example is
239 the number of times to do 'thread step-over' to measure stepping speed
240 see also '-e' and '-x' options
Johnny Chene47649c2010-10-07 02:04:14 +0000241-w : insert some wait time (currently 0.5 sec) between consecutive test cases
Johnny Chend2acdb32010-11-16 22:42:58 +0000242-# : Repeat the test suite for a specified number of times
Johnny Chen9707bb62010-06-25 21:14:08 +0000243
244and:
Johnny Chen9656ab22010-10-22 19:00:18 +0000245args : specify a list of directory names to search for test modules named after
246 Test*.py (test discovery)
Peter Collingbourne5f2b5d62011-06-14 03:55:45 +0000247 if empty, search from the current working directory, instead
Jim Ingham4f347cb2011-04-13 21:11:41 +0000248"""
Johnny Chen58f93922010-06-29 23:10:39 +0000249
Jim Ingham4f347cb2011-04-13 21:11:41 +0000250 if verbose > 0:
251 print """
Johnny Chen9656ab22010-10-22 19:00:18 +0000252Examples:
253
Johnny Chena224cd12010-11-08 01:21:03 +0000254This is an example of using the -f option to pinpoint to a specfic test class
255and test method to be run:
Johnny Chen6ad7e5e2010-10-21 00:47:52 +0000256
Johnny Chena224cd12010-11-08 01:21:03 +0000257$ ./dotest.py -f ClassTypesTestCase.test_with_dsym_and_run_command
Johnny Chen6ad7e5e2010-10-21 00:47:52 +0000258----------------------------------------------------------------------
259Collected 1 test
260
261test_with_dsym_and_run_command (TestClassTypes.ClassTypesTestCase)
262Test 'frame variable this' when stopped on a class constructor. ... ok
263
264----------------------------------------------------------------------
265Ran 1 test in 1.396s
266
267OK
Johnny Chen9656ab22010-10-22 19:00:18 +0000268
269And this is an example of using the -p option to run a single file (the filename
270matches the pattern 'ObjC' and it happens to be 'TestObjCMethods.py'):
271
272$ ./dotest.py -v -p ObjC
273----------------------------------------------------------------------
274Collected 4 tests
275
276test_break_with_dsym (TestObjCMethods.FoundationTestCase)
Greg Claytonb72d0f02011-04-12 05:54:46 +0000277Test setting objc breakpoints using '_regexp-break' and 'breakpoint set'. ... ok
Johnny Chen9656ab22010-10-22 19:00:18 +0000278test_break_with_dwarf (TestObjCMethods.FoundationTestCase)
Greg Claytonb72d0f02011-04-12 05:54:46 +0000279Test setting objc breakpoints using '_regexp-break' and 'breakpoint set'. ... ok
Johnny Chen9656ab22010-10-22 19:00:18 +0000280test_data_type_and_expr_with_dsym (TestObjCMethods.FoundationTestCase)
281Lookup objective-c data types and evaluate expressions. ... ok
282test_data_type_and_expr_with_dwarf (TestObjCMethods.FoundationTestCase)
283Lookup objective-c data types and evaluate expressions. ... ok
284
285----------------------------------------------------------------------
286Ran 4 tests in 16.661s
287
288OK
Johnny Chen6ad7e5e2010-10-21 00:47:52 +0000289
Johnny Chen58f93922010-06-29 23:10:39 +0000290Running of this script also sets up the LLDB_TEST environment variable so that
Johnny Chenaf149a02010-09-16 17:11:30 +0000291individual test cases can locate their supporting files correctly. The script
292tries to set up Python's search paths for modules by looking at the build tree
Johnny Chena85859f2010-11-11 22:14:56 +0000293relative to this script. See also the '-i' option in the following example.
294
295Finally, this is an example of using the lldb.py module distributed/installed by
296Xcode4 to run against the tests under the 'forward' directory, and with the '-w'
297option to add some delay between two tests. It uses ARCH=x86_64 to specify that
298as the architecture and CC=clang to specify the compiler used for the test run:
299
300$ PYTHONPATH=/Xcode4/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/Python ARCH=x86_64 CC=clang ./dotest.py -v -w -i forward
301
302Session logs for test failures/errors will go into directory '2010-11-11-13_56_16'
303----------------------------------------------------------------------
304Collected 2 tests
305
306test_with_dsym_and_run_command (TestForwardDeclaration.ForwardDeclarationTestCase)
307Display *bar_ptr when stopped on a function with forward declaration of struct bar. ... ok
308test_with_dwarf_and_run_command (TestForwardDeclaration.ForwardDeclarationTestCase)
309Display *bar_ptr when stopped on a function with forward declaration of struct bar. ... ok
310
311----------------------------------------------------------------------
312Ran 2 tests in 5.659s
313
314OK
315
316The 'Session ...' verbiage is recently introduced (see also the '-s' option) to
317notify the directory containing the session logs for test failures or errors.
318In case there is any test failure/error, a similar message is appended at the
319end of the stderr output for your convenience.
Johnny Chenfde69bc2010-09-14 22:01:40 +0000320
321Environment variables related to loggings:
322
323o LLDB_LOG: if defined, specifies the log file pathname for the 'lldb' subsystem
324 with a default option of 'event process' if LLDB_LOG_OPTION is not defined.
325
326o GDB_REMOTE_LOG: if defined, specifies the log file pathname for the
327 'process.gdb-remote' subsystem with a default option of 'packets' if
328 GDB_REMOTE_LOG_OPTION is not defined.
Johnny Chen9707bb62010-06-25 21:14:08 +0000329"""
Johnny Chen9fdb0a92010-09-18 00:16:47 +0000330 sys.exit(0)
Johnny Chen9707bb62010-06-25 21:14:08 +0000331
332
Johnny Chenaf149a02010-09-16 17:11:30 +0000333def parseOptionsAndInitTestdirs():
334 """Initialize the list of directories containing our unittest scripts.
335
336 '-h/--help as the first option prints out usage info and exit the program.
337 """
338
Johnny Chen4f93bf12010-12-10 00:51:23 +0000339 global dont_do_python_api_test
340 global just_do_python_api_test
Johnny Chen82ccf402011-07-30 01:39:58 +0000341 global just_do_benchmarks_test
Johnny Chen82e6b1e2010-12-01 22:47:54 +0000342 global blacklist
343 global blacklistConfig
Johnny Chen9fdb0a92010-09-18 00:16:47 +0000344 global configFile
Johnny Chen1a4d5e72011-03-04 01:35:22 +0000345 global archs
346 global compilers
Johnny Chend2acdb32010-11-16 22:42:58 +0000347 global count
Johnny Chenaf149a02010-09-16 17:11:30 +0000348 global delay
Johnny Chen50bc6382011-01-29 01:16:52 +0000349 global dumpSysPath
Johnny Chene00c9302011-10-10 22:03:44 +0000350 global bmExecutable
351 global bmBreakpointSpec
Johnny Chen5f2ed172011-10-20 18:43:28 +0000352 global bmIterationCount
Johnny Chen7d6d8442010-12-03 19:59:35 +0000353 global failfast
Johnny Chenc5fa0052011-07-29 22:54:56 +0000354 global filters
Johnny Chenb62436b2010-10-06 20:40:56 +0000355 global fs4all
Johnny Chen7c52ff12010-09-27 23:29:54 +0000356 global ignore
Johnny Chen08967192011-11-18 00:19:29 +0000357 global progress_bar
Johnny Chen38f823c2011-10-11 01:30:27 +0000358 global runHooks
Johnny Chen028d8eb2011-11-17 19:57:27 +0000359 global skip_build_and_cleanup
360 global skip_long_running_test
Johnny Chenfe5f1ed2011-10-21 18:33:27 +0000361 global noHeaders
Johnny Chen7c52ff12010-09-27 23:29:54 +0000362 global regexp
Johnny Chen548aefd2010-10-11 22:25:46 +0000363 global rdir
Johnny Chen125fc2b2010-10-21 16:55:35 +0000364 global sdir_name
Johnny Chenaf149a02010-09-16 17:11:30 +0000365 global verbose
366 global testdirs
367
Jim Ingham4f347cb2011-04-13 21:11:41 +0000368 do_help = False
369
Johnny Chenaf149a02010-09-16 17:11:30 +0000370 if len(sys.argv) == 1:
371 return
372
373 # Process possible trace and/or verbose flag, among other things.
374 index = 1
Johnny Chence2212c2010-10-07 15:41:55 +0000375 while index < len(sys.argv):
Johnny Chen4f93bf12010-12-10 00:51:23 +0000376 if sys.argv[index].startswith('-') or sys.argv[index].startswith('+'):
377 # We should continue processing...
378 pass
379 else:
Johnny Chenaf149a02010-09-16 17:11:30 +0000380 # End of option processing.
381 break
382
383 if sys.argv[index].find('-h') != -1:
Jim Ingham4f347cb2011-04-13 21:11:41 +0000384 index += 1
385 do_help = True
Johnny Chen012cba12011-01-26 19:07:42 +0000386 elif sys.argv[index].startswith('-A'):
387 # Increment by 1 to fetch the ARCH spec.
388 index += 1
389 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
390 usage()
Johnny Cheneee9b862011-04-26 20:45:00 +0000391 archs = sys.argv[index].split('^')
Johnny Chen012cba12011-01-26 19:07:42 +0000392 index += 1
393 elif sys.argv[index].startswith('-C'):
394 # Increment by 1 to fetch the CC spec.
395 index += 1
396 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
397 usage()
Johnny Cheneee9b862011-04-26 20:45:00 +0000398 compilers = sys.argv[index].split('^')
Johnny Chen012cba12011-01-26 19:07:42 +0000399 index += 1
Johnny Chen50bc6382011-01-29 01:16:52 +0000400 elif sys.argv[index].startswith('-D'):
401 dumpSysPath = True
402 index += 1
Johnny Chen4f93bf12010-12-10 00:51:23 +0000403 elif sys.argv[index].startswith('-a'):
404 dont_do_python_api_test = True
405 index += 1
406 elif sys.argv[index].startswith('+a'):
407 just_do_python_api_test = True
408 index += 1
Johnny Chen82ccf402011-07-30 01:39:58 +0000409 elif sys.argv[index].startswith('+b'):
410 just_do_benchmarks_test = True
411 index += 1
Johnny Chen82e6b1e2010-12-01 22:47:54 +0000412 elif sys.argv[index].startswith('-b'):
413 # Increment by 1 to fetch the blacklist file name option argument.
414 index += 1
415 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
416 usage()
417 blacklistFile = sys.argv[index]
418 if not os.path.isfile(blacklistFile):
419 print "Blacklist file:", blacklistFile, "does not exist!"
420 usage()
421 index += 1
422 # Now read the blacklist contents and assign it to blacklist.
423 execfile(blacklistFile, globals(), blacklistConfig)
424 blacklist = blacklistConfig.get('blacklist')
Johnny Chen9fdb0a92010-09-18 00:16:47 +0000425 elif sys.argv[index].startswith('-c'):
426 # Increment by 1 to fetch the config file name option argument.
427 index += 1
428 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
429 usage()
430 configFile = sys.argv[index]
431 if not os.path.isfile(configFile):
432 print "Config file:", configFile, "does not exist!"
433 usage()
434 index += 1
Johnny Chenaf149a02010-09-16 17:11:30 +0000435 elif sys.argv[index].startswith('-d'):
436 delay = True
437 index += 1
Johnny Chene00c9302011-10-10 22:03:44 +0000438 elif sys.argv[index].startswith('-e'):
439 # Increment by 1 to fetch the full path of the benchmark executable.
440 index += 1
441 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
442 usage()
443 bmExecutable = sys.argv[index]
444 if not is_exe(bmExecutable):
445 usage()
446 index += 1
Johnny Chen7d6d8442010-12-03 19:59:35 +0000447 elif sys.argv[index].startswith('-F'):
448 failfast = True
449 index += 1
Johnny Chenb62436b2010-10-06 20:40:56 +0000450 elif sys.argv[index].startswith('-f'):
451 # Increment by 1 to fetch the filter spec.
452 index += 1
453 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
454 usage()
Johnny Chenc5fa0052011-07-29 22:54:56 +0000455 filters.append(sys.argv[index])
Johnny Chenb62436b2010-10-06 20:40:56 +0000456 index += 1
457 elif sys.argv[index].startswith('-g'):
Johnny Chena224cd12010-11-08 01:21:03 +0000458 fs4all = False
Johnny Chenb62436b2010-10-06 20:40:56 +0000459 index += 1
Johnny Chenaf149a02010-09-16 17:11:30 +0000460 elif sys.argv[index].startswith('-i'):
461 ignore = True
462 index += 1
Johnny Chen38f823c2011-10-11 01:30:27 +0000463 elif sys.argv[index].startswith('-k'):
464 # Increment by 1 to fetch the runhook lldb command.
465 index += 1
466 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
467 usage()
468 runHooks.append(sys.argv[index])
469 index += 1
Johnny Chen41998192010-10-01 22:59:49 +0000470 elif sys.argv[index].startswith('-l'):
Johnny Chen028d8eb2011-11-17 19:57:27 +0000471 skip_long_running_test = False
Johnny Chen41998192010-10-01 22:59:49 +0000472 index += 1
Johnny Chenfe5f1ed2011-10-21 18:33:27 +0000473 elif sys.argv[index].startswith('-n'):
474 noHeaders = True
475 index += 1
Johnny Chen7c52ff12010-09-27 23:29:54 +0000476 elif sys.argv[index].startswith('-p'):
477 # Increment by 1 to fetch the reg exp pattern argument.
478 index += 1
479 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
480 usage()
481 regexp = sys.argv[index]
482 index += 1
Johnny Chen548aefd2010-10-11 22:25:46 +0000483 elif sys.argv[index].startswith('-r'):
484 # Increment by 1 to fetch the relocated directory argument.
485 index += 1
486 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
487 usage()
488 rdir = os.path.abspath(sys.argv[index])
489 if os.path.exists(rdir):
490 print "Relocated directory:", rdir, "must not exist!"
491 usage()
492 index += 1
Johnny Chen028d8eb2011-11-17 19:57:27 +0000493 elif sys.argv[index].startswith('-S'):
494 skip_build_and_cleanup = True
495 index += 1
Johnny Chen125fc2b2010-10-21 16:55:35 +0000496 elif sys.argv[index].startswith('-s'):
497 # Increment by 1 to fetch the session dir name.
498 index += 1
499 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
500 usage()
501 sdir_name = sys.argv[index]
502 index += 1
Johnny Chenaf149a02010-09-16 17:11:30 +0000503 elif sys.argv[index].startswith('-t'):
504 os.environ["LLDB_COMMAND_TRACE"] = "YES"
505 index += 1
506 elif sys.argv[index].startswith('-v'):
507 verbose = 2
508 index += 1
Johnny Chene47649c2010-10-07 02:04:14 +0000509 elif sys.argv[index].startswith('-w'):
510 os.environ["LLDB_WAIT_BETWEEN_TEST_CASES"] = 'YES'
511 index += 1
Johnny Chene9eae812012-01-18 05:15:00 +0000512 elif sys.argv[index].startswith('-X'):
513 # Increment by 1 to fetch an excluded directory.
514 index += 1
515 if index >= len(sys.argv):
516 usage()
517 excluded.add(sys.argv[index])
518 index += 1
Johnny Chene00c9302011-10-10 22:03:44 +0000519 elif sys.argv[index].startswith('-x'):
520 # Increment by 1 to fetch the breakpoint specification of the benchmark executable.
521 index += 1
Johnny Chen8a1b1222011-10-20 22:16:24 +0000522 if index >= len(sys.argv):
Johnny Chene00c9302011-10-10 22:03:44 +0000523 usage()
524 bmBreakpointSpec = sys.argv[index]
525 index += 1
Johnny Chen5f2ed172011-10-20 18:43:28 +0000526 elif sys.argv[index].startswith('-y'):
527 # Increment by 1 to fetch the the benchmark iteration count.
528 index += 1
529 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
530 usage()
531 bmIterationCount = int(sys.argv[index])
532 index += 1
Johnny Chend2acdb32010-11-16 22:42:58 +0000533 elif sys.argv[index].startswith('-#'):
534 # Increment by 1 to fetch the repeat count argument.
535 index += 1
536 if index >= len(sys.argv) or sys.argv[index].startswith('-'):
537 usage()
538 count = int(sys.argv[index])
539 index += 1
Johnny Chenaf149a02010-09-16 17:11:30 +0000540 else:
541 print "Unknown option: ", sys.argv[index]
542 usage()
Johnny Chenaf149a02010-09-16 17:11:30 +0000543
Jim Ingham4f347cb2011-04-13 21:11:41 +0000544 if do_help == True:
545 usage()
546
Johnny Chencc659ad2010-12-10 19:02:23 +0000547 # Do not specify both '-a' and '+a' at the same time.
548 if dont_do_python_api_test and just_do_python_api_test:
549 usage()
550
Johnny Chen08967192011-11-18 00:19:29 +0000551 # The simple progress bar is turned on only if verbose == 0 and LLDB_COMMAND_TRACE is not 'YES'
552 if ("LLDB_COMMAND_TRACE" not in os.environ or os.environ["LLDB_COMMAND_TRACE"]!="YES") and verbose==0:
553 progress_bar = True
554
Johnny Chenaf149a02010-09-16 17:11:30 +0000555 # Gather all the dirs passed on the command line.
556 if len(sys.argv) > index:
557 testdirs = map(os.path.abspath, sys.argv[index:])
558
Johnny Chen548aefd2010-10-11 22:25:46 +0000559 # If '-r dir' is specified, the tests should be run under the relocated
560 # directory. Let's copy the testdirs over.
561 if rdir:
562 from shutil import copytree, ignore_patterns
563
564 tmpdirs = []
565 for srcdir in testdirs:
566 dstdir = os.path.join(rdir, os.path.basename(srcdir))
567 # Don't copy the *.pyc and .svn stuffs.
568 copytree(srcdir, dstdir, ignore=ignore_patterns('*.pyc', '.svn'))
569 tmpdirs.append(dstdir)
570
571 # This will be our modified testdirs.
572 testdirs = tmpdirs
573
574 # With '-r dir' specified, there's no cleanup of intermediate test files.
575 os.environ["LLDB_DO_CLEANUP"] = 'NO'
576
577 # If testdirs is ['test'], the make directory has already been copied
578 # recursively and is contained within the rdir/test dir. For anything
579 # else, we would need to copy over the make directory and its contents,
580 # so that, os.listdir(rdir) looks like, for example:
581 #
582 # array_types conditional_break make
583 #
584 # where the make directory contains the Makefile.rules file.
585 if len(testdirs) != 1 or os.path.basename(testdirs[0]) != 'test':
586 # Don't copy the .svn stuffs.
587 copytree('make', os.path.join(rdir, 'make'),
588 ignore=ignore_patterns('.svn'))
589
590 #print "testdirs:", testdirs
591
Johnny Chenb40056b2010-09-21 00:09:27 +0000592 # Source the configFile if specified.
593 # The side effect, if any, will be felt from this point on. An example
594 # config file may be these simple two lines:
595 #
596 # sys.stderr = open("/tmp/lldbtest-stderr", "w")
597 # sys.stdout = open("/tmp/lldbtest-stdout", "w")
598 #
599 # which will reassign the two file objects to sys.stderr and sys.stdout,
600 # respectively.
601 #
602 # See also lldb-trunk/example/test/usage-config.
603 global config
604 if configFile:
605 # Pass config (a dictionary) as the locals namespace for side-effect.
606 execfile(configFile, globals(), config)
607 #print "config:", config
608 #print "sys.stderr:", sys.stderr
609 #print "sys.stdout:", sys.stdout
610
Johnny Chenaf149a02010-09-16 17:11:30 +0000611
Johnny Chen9707bb62010-06-25 21:14:08 +0000612def setupSysPath():
Johnny Chen8a3c0432011-03-11 20:13:06 +0000613 """
614 Add LLDB.framework/Resources/Python to the search paths for modules.
615 As a side effect, we also discover the 'lldb' executable and export it here.
616 """
Johnny Chen9707bb62010-06-25 21:14:08 +0000617
Johnny Chen548aefd2010-10-11 22:25:46 +0000618 global rdir
619 global testdirs
Johnny Chen50bc6382011-01-29 01:16:52 +0000620 global dumpSysPath
Johnny Chenfe5f1ed2011-10-21 18:33:27 +0000621 global noHeaders
Johnny Chenb5fe80c2011-05-17 22:58:50 +0000622 global svn_info
Johnny Chen548aefd2010-10-11 22:25:46 +0000623
Johnny Chen9707bb62010-06-25 21:14:08 +0000624 # Get the directory containing the current script.
Johnny Chen4d162e52011-08-12 18:54:11 +0000625 if ("DOTEST_PROFILE" in os.environ or "DOTEST_PDB" in os.environ) and "DOTEST_SCRIPT_DIR" in os.environ:
Johnny Chen0de6ab52011-01-19 02:10:40 +0000626 scriptPath = os.environ["DOTEST_SCRIPT_DIR"]
627 else:
628 scriptPath = sys.path[0]
Johnny Chena1affab2010-07-03 03:41:59 +0000629 if not scriptPath.endswith('test'):
Johnny Chen9707bb62010-06-25 21:14:08 +0000630 print "This script expects to reside in lldb's test directory."
631 sys.exit(-1)
632
Johnny Chen548aefd2010-10-11 22:25:46 +0000633 if rdir:
634 # Set up the LLDB_TEST environment variable appropriately, so that the
635 # individual tests can be located relatively.
636 #
637 # See also lldbtest.TestBase.setUpClass(cls).
638 if len(testdirs) == 1 and os.path.basename(testdirs[0]) == 'test':
639 os.environ["LLDB_TEST"] = os.path.join(rdir, 'test')
640 else:
641 os.environ["LLDB_TEST"] = rdir
642 else:
643 os.environ["LLDB_TEST"] = scriptPath
Peter Collingbournef6c3de82011-06-20 19:06:45 +0000644
645 # Set up the LLDB_SRC environment variable, so that the tests can locate
646 # the LLDB source code.
647 os.environ["LLDB_SRC"] = os.path.join(sys.path[0], os.pardir)
648
Johnny Chen9de4ede2010-08-31 17:42:54 +0000649 pluginPath = os.path.join(scriptPath, 'plugins')
Johnny Chen8a3c0432011-03-11 20:13:06 +0000650 pexpectPath = os.path.join(scriptPath, 'pexpect-2.4')
Johnny Chen58f93922010-06-29 23:10:39 +0000651
Johnny Chen8a3c0432011-03-11 20:13:06 +0000652 # Append script dir, plugin dir, and pexpect dir to the sys.path.
Johnny Chenaf149a02010-09-16 17:11:30 +0000653 sys.path.append(scriptPath)
654 sys.path.append(pluginPath)
Johnny Chen8a3c0432011-03-11 20:13:06 +0000655 sys.path.append(pexpectPath)
Johnny Chenaf149a02010-09-16 17:11:30 +0000656
Johnny Chen26901c82011-03-11 19:47:23 +0000657 # This is our base name component.
Johnny Chena1affab2010-07-03 03:41:59 +0000658 base = os.path.abspath(os.path.join(scriptPath, os.pardir))
Johnny Chen6a564a42011-02-15 18:50:19 +0000659
Johnny Chen26901c82011-03-11 19:47:23 +0000660 # These are for xcode build directories.
Johnny Chen6a564a42011-02-15 18:50:19 +0000661 xcode3_build_dir = ['build']
662 xcode4_build_dir = ['build', 'lldb', 'Build', 'Products']
663 dbg = ['Debug']
664 rel = ['Release']
665 bai = ['BuildAndIntegration']
666 python_resource_dir = ['LLDB.framework', 'Resources', 'Python']
Johnny Chen26901c82011-03-11 19:47:23 +0000667
668 # Some of the tests can invoke the 'lldb' command directly.
669 # We'll try to locate the appropriate executable right here.
670
Johnny Chen6033bed2011-08-26 00:00:01 +0000671 # First, you can define an environment variable LLDB_EXEC specifying the
672 # full pathname of the lldb executable.
673 if "LLDB_EXEC" in os.environ and is_exe(os.environ["LLDB_EXEC"]):
674 lldbExec = os.environ["LLDB_EXEC"]
675 else:
676 lldbExec = None
677
Johnny Chen26901c82011-03-11 19:47:23 +0000678 executable = ['lldb']
679 dbgExec = os.path.join(base, *(xcode3_build_dir + dbg + executable))
680 dbgExec2 = os.path.join(base, *(xcode4_build_dir + dbg + executable))
681 relExec = os.path.join(base, *(xcode3_build_dir + rel + executable))
682 relExec2 = os.path.join(base, *(xcode4_build_dir + rel + executable))
683 baiExec = os.path.join(base, *(xcode3_build_dir + bai + executable))
684 baiExec2 = os.path.join(base, *(xcode4_build_dir + bai + executable))
685
Johnny Chen6033bed2011-08-26 00:00:01 +0000686 # The 'lldb' executable built here in the source tree.
687 lldbHere = None
Johnny Chen26901c82011-03-11 19:47:23 +0000688 if is_exe(dbgExec):
Johnny Chen6033bed2011-08-26 00:00:01 +0000689 lldbHere = dbgExec
Johnny Chen26901c82011-03-11 19:47:23 +0000690 elif is_exe(dbgExec2):
Johnny Chen6033bed2011-08-26 00:00:01 +0000691 lldbHere = dbgExec2
Johnny Chen26901c82011-03-11 19:47:23 +0000692 elif is_exe(relExec):
Johnny Chen6033bed2011-08-26 00:00:01 +0000693 lldbHere = relExec
Johnny Chen26901c82011-03-11 19:47:23 +0000694 elif is_exe(relExec2):
Johnny Chen6033bed2011-08-26 00:00:01 +0000695 lldbHere = relExec2
Johnny Chen26901c82011-03-11 19:47:23 +0000696 elif is_exe(baiExec):
Johnny Chen6033bed2011-08-26 00:00:01 +0000697 lldbHere = baiExec
Johnny Chen26901c82011-03-11 19:47:23 +0000698 elif is_exe(baiExec2):
Johnny Chen6033bed2011-08-26 00:00:01 +0000699 lldbHere = baiExec2
Daniel Dunbar2bd310c2011-10-31 23:27:06 +0000700 elif lldbExec:
701 lldbHere = lldbExec
Johnny Chen26901c82011-03-11 19:47:23 +0000702
Johnny Chen6033bed2011-08-26 00:00:01 +0000703 if lldbHere:
704 os.environ["LLDB_HERE"] = lldbHere
Johnny Chen0409d992011-10-25 20:08:03 +0000705 os.environ["LLDB_BUILD_DIR"] = os.path.split(lldbHere)[0]
Johnny Chenfe5f1ed2011-10-21 18:33:27 +0000706 if not noHeaders:
707 print "LLDB build dir:", os.environ["LLDB_BUILD_DIR"]
Johnny Chen91da0052011-10-28 17:56:02 +0000708 os.system('%s -v' % lldbHere)
Johnny Chen62d527e2011-08-04 18:17:16 +0000709
Johnny Chen6033bed2011-08-26 00:00:01 +0000710 # One last chance to locate the 'lldb' executable.
Johnny Chen26901c82011-03-11 19:47:23 +0000711 if not lldbExec:
Johnny Chen0409d992011-10-25 20:08:03 +0000712 lldbExec = which('lldb')
713 if lldbHere and not lldbExec:
Johnny Chen6033bed2011-08-26 00:00:01 +0000714 lldbExec = lldbHere
Johnny Chen0409d992011-10-25 20:08:03 +0000715
Johnny Chen26901c82011-03-11 19:47:23 +0000716
717 if not lldbExec:
718 print "The 'lldb' executable cannot be located. Some of the tests may not be run as a result."
719 else:
720 os.environ["LLDB_EXEC"] = lldbExec
Johnny Chen8904eb02011-10-28 00:59:00 +0000721 #print "The 'lldb' from PATH env variable", lldbExec
Johnny Chend7931462011-03-17 00:38:22 +0000722
Johnny Chenb264c9b2011-06-24 22:52:05 +0000723 if os.path.isdir(os.path.join(base, '.svn')):
724 pipe = subprocess.Popen(["svn", "info", base], stdout = subprocess.PIPE)
725 svn_info = pipe.stdout.read()
726 elif os.path.isdir(os.path.join(base, '.git')):
727 pipe = subprocess.Popen(["git", "svn", "info", base], stdout = subprocess.PIPE)
728 svn_info = pipe.stdout.read()
Johnny Chenfe5f1ed2011-10-21 18:33:27 +0000729 if not noHeaders:
730 print svn_info
Johnny Chen26901c82011-03-11 19:47:23 +0000731
732 global ignore
733
734 # The '-i' option is used to skip looking for lldb.py in the build tree.
735 if ignore:
736 return
737
Johnny Chen6a564a42011-02-15 18:50:19 +0000738 dbgPath = os.path.join(base, *(xcode3_build_dir + dbg + python_resource_dir))
739 dbgPath2 = os.path.join(base, *(xcode4_build_dir + dbg + python_resource_dir))
740 relPath = os.path.join(base, *(xcode3_build_dir + rel + python_resource_dir))
741 relPath2 = os.path.join(base, *(xcode4_build_dir + rel + python_resource_dir))
742 baiPath = os.path.join(base, *(xcode3_build_dir + bai + python_resource_dir))
743 baiPath2 = os.path.join(base, *(xcode4_build_dir + bai + python_resource_dir))
Johnny Chen9707bb62010-06-25 21:14:08 +0000744
745 lldbPath = None
746 if os.path.isfile(os.path.join(dbgPath, 'lldb.py')):
747 lldbPath = dbgPath
Greg Claytond9846b02011-02-14 21:17:06 +0000748 elif os.path.isfile(os.path.join(dbgPath2, 'lldb.py')):
749 lldbPath = dbgPath2
Johnny Chen9707bb62010-06-25 21:14:08 +0000750 elif os.path.isfile(os.path.join(relPath, 'lldb.py')):
751 lldbPath = relPath
Greg Claytond9846b02011-02-14 21:17:06 +0000752 elif os.path.isfile(os.path.join(relPath2, 'lldb.py')):
753 lldbPath = relPath2
Johnny Chenc202c462010-09-15 18:11:19 +0000754 elif os.path.isfile(os.path.join(baiPath, 'lldb.py')):
755 lldbPath = baiPath
Greg Claytond9846b02011-02-14 21:17:06 +0000756 elif os.path.isfile(os.path.join(baiPath2, 'lldb.py')):
757 lldbPath = baiPath2
Johnny Chen9707bb62010-06-25 21:14:08 +0000758
759 if not lldbPath:
Johnny Chenc202c462010-09-15 18:11:19 +0000760 print 'This script requires lldb.py to be in either ' + dbgPath + ',',
761 print relPath + ', or ' + baiPath
Johnny Chen9707bb62010-06-25 21:14:08 +0000762 sys.exit(-1)
763
Johnny Chenaf149a02010-09-16 17:11:30 +0000764 # This is to locate the lldb.py module. Insert it right after sys.path[0].
765 sys.path[1:1] = [lldbPath]
Johnny Chen50bc6382011-01-29 01:16:52 +0000766 if dumpSysPath:
767 print "sys.path:", sys.path
Johnny Chen9707bb62010-06-25 21:14:08 +0000768
Johnny Chen9707bb62010-06-25 21:14:08 +0000769
Johnny Chencd0279d2010-09-20 18:07:50 +0000770def doDelay(delta):
771 """Delaying startup for delta-seconds to facilitate debugger attachment."""
772 def alarm_handler(*args):
773 raise Exception("timeout")
774
775 signal.signal(signal.SIGALRM, alarm_handler)
776 signal.alarm(delta)
777 sys.stdout.write("pid=%d\n" % os.getpid())
778 sys.stdout.write("Enter RET to proceed (or timeout after %d seconds):" %
779 delta)
780 sys.stdout.flush()
781 try:
782 text = sys.stdin.readline()
783 except:
784 text = ""
785 signal.alarm(0)
786 sys.stdout.write("proceeding...\n")
787 pass
788
789
Johnny Chen9707bb62010-06-25 21:14:08 +0000790def visit(prefix, dir, names):
791 """Visitor function for os.path.walk(path, visit, arg)."""
792
793 global suite
Johnny Chen7c52ff12010-09-27 23:29:54 +0000794 global regexp
Johnny Chenc5fa0052011-07-29 22:54:56 +0000795 global filters
Johnny Chenb62436b2010-10-06 20:40:56 +0000796 global fs4all
Johnny Chene9eae812012-01-18 05:15:00 +0000797 global excluded
798
799 if set(dir.split(os.sep)).intersection(excluded):
800 #print "Detected an excluded dir component: %s" % dir
801 return
Johnny Chen9707bb62010-06-25 21:14:08 +0000802
803 for name in names:
804 if os.path.isdir(os.path.join(dir, name)):
805 continue
806
807 if '.py' == os.path.splitext(name)[1] and name.startswith(prefix):
Johnny Chen7c52ff12010-09-27 23:29:54 +0000808 # Try to match the regexp pattern, if specified.
809 if regexp:
810 import re
811 if re.search(regexp, name):
812 #print "Filename: '%s' matches pattern: '%s'" % (name, regexp)
813 pass
814 else:
815 #print "Filename: '%s' does not match pattern: '%s'" % (name, regexp)
816 continue
817
Johnny Chen953864a2010-10-12 21:35:54 +0000818 # We found a match for our test. Add it to the suite.
Johnny Chen79723352010-10-12 15:53:22 +0000819
820 # Update the sys.path first.
Johnny Chena85d7ee2010-06-26 00:19:32 +0000821 if not sys.path.count(dir):
Johnny Chen548aefd2010-10-11 22:25:46 +0000822 sys.path.insert(0, dir)
Johnny Chen9707bb62010-06-25 21:14:08 +0000823 base = os.path.splitext(name)[0]
Johnny Chenb62436b2010-10-06 20:40:56 +0000824
825 # Thoroughly check the filterspec against the base module and admit
826 # the (base, filterspec) combination only when it makes sense.
Johnny Chenc5fa0052011-07-29 22:54:56 +0000827 filterspec = None
828 for filterspec in filters:
Johnny Chenb62436b2010-10-06 20:40:56 +0000829 # Optimistically set the flag to True.
830 filtered = True
831 module = __import__(base)
832 parts = filterspec.split('.')
833 obj = module
834 for part in parts:
835 try:
836 parent, obj = obj, getattr(obj, part)
837 except AttributeError:
838 # The filterspec has failed.
839 filtered = False
840 break
Johnny Chenc5fa0052011-07-29 22:54:56 +0000841
Johnny Chendb4be602011-08-12 23:55:07 +0000842 # If filtered, we have a good filterspec. Add it.
Johnny Chenc5fa0052011-07-29 22:54:56 +0000843 if filtered:
Johnny Chendb4be602011-08-12 23:55:07 +0000844 #print "adding filter spec %s to module %s" % (filterspec, module)
845 suite.addTests(
846 unittest2.defaultTestLoader.loadTestsFromName(filterspec, module))
847 continue
Johnny Chenc5fa0052011-07-29 22:54:56 +0000848
849 # Forgo this module if the (base, filterspec) combo is invalid
850 # and no '-g' option is specified
851 if filters and fs4all and not filtered:
852 continue
Johnny Chenb62436b2010-10-06 20:40:56 +0000853
Johnny Chendb4be602011-08-12 23:55:07 +0000854 # Add either the filtered test case(s) (which is done before) or the entire test class.
855 if not filterspec or not filtered:
Johnny Chenb62436b2010-10-06 20:40:56 +0000856 # A simple case of just the module name. Also the failover case
857 # from the filterspec branch when the (base, filterspec) combo
858 # doesn't make sense.
859 suite.addTests(unittest2.defaultTestLoader.loadTestsFromName(base))
Johnny Chen9707bb62010-06-25 21:14:08 +0000860
861
Johnny Chencd0279d2010-09-20 18:07:50 +0000862def lldbLoggings():
863 """Check and do lldb loggings if necessary."""
864
865 # Turn on logging for debugging purposes if ${LLDB_LOG} environment variable is
866 # defined. Use ${LLDB_LOG} to specify the log file.
867 ci = lldb.DBG.GetCommandInterpreter()
868 res = lldb.SBCommandReturnObject()
869 if ("LLDB_LOG" in os.environ):
870 if ("LLDB_LOG_OPTION" in os.environ):
871 lldb_log_option = os.environ["LLDB_LOG_OPTION"]
872 else:
Johnny Chen8fd886c2010-12-08 01:25:21 +0000873 lldb_log_option = "event process expr state api"
Johnny Chencd0279d2010-09-20 18:07:50 +0000874 ci.HandleCommand(
Greg Clayton940b1032011-02-23 00:35:02 +0000875 "log enable -n -f " + os.environ["LLDB_LOG"] + " lldb " + lldb_log_option,
Johnny Chencd0279d2010-09-20 18:07:50 +0000876 res)
877 if not res.Succeeded():
878 raise Exception('log enable failed (check LLDB_LOG env variable.')
879 # Ditto for gdb-remote logging if ${GDB_REMOTE_LOG} environment variable is defined.
880 # Use ${GDB_REMOTE_LOG} to specify the log file.
881 if ("GDB_REMOTE_LOG" in os.environ):
882 if ("GDB_REMOTE_LOG_OPTION" in os.environ):
883 gdb_remote_log_option = os.environ["GDB_REMOTE_LOG_OPTION"]
884 else:
Johnny Chen7ab8c852010-12-02 18:35:13 +0000885 gdb_remote_log_option = "packets process"
Johnny Chencd0279d2010-09-20 18:07:50 +0000886 ci.HandleCommand(
Johnny Chenc935a892011-06-21 19:25:45 +0000887 "log enable -n -f " + os.environ["GDB_REMOTE_LOG"] + " gdb-remote "
Johnny Chencd0279d2010-09-20 18:07:50 +0000888 + gdb_remote_log_option,
889 res)
890 if not res.Succeeded():
891 raise Exception('log enable failed (check GDB_REMOTE_LOG env variable.')
892
Johnny Chen067022b2011-01-19 19:31:46 +0000893def getMyCommandLine():
Johnny Chen067022b2011-01-19 19:31:46 +0000894 ps = subprocess.Popen(['ps', '-o', "command=CMD", str(os.getpid())], stdout=subprocess.PIPE).communicate()[0]
895 lines = ps.split('\n')
896 cmd_line = lines[1]
897 return cmd_line
Johnny Chencd0279d2010-09-20 18:07:50 +0000898
Johnny Chend96b5682010-11-05 17:30:53 +0000899# ======================================== #
Johnny Chencd0279d2010-09-20 18:07:50 +0000900# #
901# Execution of the test driver starts here #
902# #
Johnny Chend96b5682010-11-05 17:30:53 +0000903# ======================================== #
Johnny Chencd0279d2010-09-20 18:07:50 +0000904
Johnny Chen2891bb02011-09-16 01:04:26 +0000905def checkDsymForUUIDIsNotOn():
Johnny Chen6a4e0872011-09-16 17:50:44 +0000906 cmd = ["defaults", "read", "com.apple.DebugSymbols"]
907 pipe = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
908 cmd_output = pipe.stdout.read()
Johnny Chen178c8d92011-09-16 18:03:19 +0000909 if cmd_output and "DBGFileMappedPaths = " in cmd_output:
Johnny Chen6a451482011-09-16 18:09:45 +0000910 print "%s =>" % ' '.join(cmd)
Johnny Chen6a4e0872011-09-16 17:50:44 +0000911 print cmd_output
Johnny Chen2891bb02011-09-16 01:04:26 +0000912 print "Disable automatic lookup and caching of dSYMs before running the test suite!"
913 print "Exiting..."
914 sys.exit(0)
915
916# On MacOS X, check to make sure that domain for com.apple.DebugSymbols defaults
917# does not exist before proceeding to running the test suite.
918if sys.platform.startswith("darwin"):
919 checkDsymForUUIDIsNotOn()
920
Johnny Chen9707bb62010-06-25 21:14:08 +0000921#
Johnny Chenaf149a02010-09-16 17:11:30 +0000922# Start the actions by first parsing the options while setting up the test
923# directories, followed by setting up the search paths for lldb utilities;
924# then, we walk the directory trees and collect the tests into our test suite.
Johnny Chen9707bb62010-06-25 21:14:08 +0000925#
Johnny Chenaf149a02010-09-16 17:11:30 +0000926parseOptionsAndInitTestdirs()
Johnny Chen9707bb62010-06-25 21:14:08 +0000927setupSysPath()
Johnny Chen91960d32010-09-08 20:56:16 +0000928
929#
930# If '-d' is specified, do a delay of 10 seconds for the debugger to attach.
931#
932if delay:
Johnny Chencd0279d2010-09-20 18:07:50 +0000933 doDelay(10)
Johnny Chen91960d32010-09-08 20:56:16 +0000934
Johnny Chen49f2f7a2010-09-20 17:25:45 +0000935#
Johnny Chen41998192010-10-01 22:59:49 +0000936# If '-l' is specified, do not skip the long running tests.
Johnny Chen028d8eb2011-11-17 19:57:27 +0000937if not skip_long_running_test:
Johnny Chen41998192010-10-01 22:59:49 +0000938 os.environ["LLDB_SKIP_LONG_RUNNING_TEST"] = "NO"
939
940#
Johnny Chen79723352010-10-12 15:53:22 +0000941# Walk through the testdirs while collecting tests.
Johnny Chen49f2f7a2010-09-20 17:25:45 +0000942#
Johnny Chen9707bb62010-06-25 21:14:08 +0000943for testdir in testdirs:
944 os.path.walk(testdir, visit, 'Test')
945
Johnny Chenb40056b2010-09-21 00:09:27 +0000946#
Johnny Chen9707bb62010-06-25 21:14:08 +0000947# Now that we have loaded all the test cases, run the whole test suite.
Johnny Chenb40056b2010-09-21 00:09:27 +0000948#
Johnny Chencd0279d2010-09-20 18:07:50 +0000949
Johnny Chen1bfbd412010-06-29 19:44:16 +0000950# For the time being, let's bracket the test runner within the
951# lldb.SBDebugger.Initialize()/Terminate() pair.
Johnny Chen01f2a6a2010-08-10 20:23:55 +0000952import lldb, atexit
Johnny Chen6b6f5ba2010-10-14 16:36:49 +0000953# Update: the act of importing lldb now executes lldb.SBDebugger.Initialize(),
954# there's no need to call it a second time.
955#lldb.SBDebugger.Initialize()
Johnny Chen01f2a6a2010-08-10 20:23:55 +0000956atexit.register(lambda: lldb.SBDebugger.Terminate())
Johnny Chen1bfbd412010-06-29 19:44:16 +0000957
Johnny Chen909e5a62010-07-01 22:52:57 +0000958# Create a singleton SBDebugger in the lldb namespace.
959lldb.DBG = lldb.SBDebugger.Create()
960
Johnny Chen4f93bf12010-12-10 00:51:23 +0000961# Put the blacklist in the lldb namespace, to be used by lldb.TestBase.
Johnny Chen82e6b1e2010-12-01 22:47:54 +0000962lldb.blacklist = blacklist
963
Johnny Chene00c9302011-10-10 22:03:44 +0000964# Put dont/just_do_python_api_test in the lldb namespace.
Johnny Chen4f93bf12010-12-10 00:51:23 +0000965lldb.dont_do_python_api_test = dont_do_python_api_test
966lldb.just_do_python_api_test = just_do_python_api_test
Johnny Chen82ccf402011-07-30 01:39:58 +0000967lldb.just_do_benchmarks_test = just_do_benchmarks_test
Johnny Chen4f93bf12010-12-10 00:51:23 +0000968
Johnny Chen028d8eb2011-11-17 19:57:27 +0000969# Do we need to skip build and cleanup?
970lldb.skip_build_and_cleanup = skip_build_and_cleanup
971
Johnny Chen5f2ed172011-10-20 18:43:28 +0000972# Put bmExecutable, bmBreakpointSpec, and bmIterationCount into the lldb namespace, too.
Johnny Chene00c9302011-10-10 22:03:44 +0000973lldb.bmExecutable = bmExecutable
974lldb.bmBreakpointSpec = bmBreakpointSpec
Johnny Chen5f2ed172011-10-20 18:43:28 +0000975lldb.bmIterationCount = bmIterationCount
Johnny Chene00c9302011-10-10 22:03:44 +0000976
Johnny Chen38f823c2011-10-11 01:30:27 +0000977# And don't forget the runHooks!
978lldb.runHooks = runHooks
979
Johnny Chencd0279d2010-09-20 18:07:50 +0000980# Turn on lldb loggings if necessary.
981lldbLoggings()
Johnny Chen909e5a62010-07-01 22:52:57 +0000982
Johnny Chen7987ac92010-08-09 20:40:52 +0000983# Install the control-c handler.
984unittest2.signals.installHandler()
985
Johnny Chen125fc2b2010-10-21 16:55:35 +0000986# If sdir_name is not specified through the '-s sdir_name' option, get a
987# timestamp string and export it as LLDB_SESSION_DIR environment var. This will
988# be used when/if we want to dump the session info of individual test cases
989# later on.
Johnny Chence681462010-10-19 00:25:01 +0000990#
991# See also TestBase.dumpSessionInfo() in lldbtest.py.
Johnny Chen125fc2b2010-10-21 16:55:35 +0000992if not sdir_name:
993 import datetime
Johnny Chen41fae812010-10-29 22:26:38 +0000994 # The windows platforms don't like ':' in the pathname.
Johnny Chen76bd0102010-10-28 16:32:13 +0000995 timestamp = datetime.datetime.now().strftime("%Y-%m-%d-%H_%M_%S")
Johnny Chen125fc2b2010-10-21 16:55:35 +0000996 sdir_name = timestamp
Peter Collingbourne132476f2011-06-20 23:55:53 +0000997os.environ["LLDB_SESSION_DIRNAME"] = os.path.join(os.getcwd(), sdir_name)
Johnny Chen067022b2011-01-19 19:31:46 +0000998
Johnny Chenfe5f1ed2011-10-21 18:33:27 +0000999if not noHeaders:
1000 sys.stderr.write("\nSession logs for test failures/errors/unexpected successes"
1001 " will go into directory '%s'\n" % sdir_name)
1002 sys.stderr.write("Command invoked: %s\n" % getMyCommandLine())
Johnny Chence681462010-10-19 00:25:01 +00001003
Johnny Chenb5fe80c2011-05-17 22:58:50 +00001004if not os.path.isdir(sdir_name):
1005 os.mkdir(sdir_name)
1006fname = os.path.join(sdir_name, "svn-info")
1007with open(fname, "w") as f:
1008 print >> f, svn_info
1009 print >> f, "Command invoked: %s\n" % getMyCommandLine()
1010
Johnny Chenb40056b2010-09-21 00:09:27 +00001011#
1012# Invoke the default TextTestRunner to run the test suite, possibly iterating
1013# over different configurations.
1014#
1015
Johnny Chenb40056b2010-09-21 00:09:27 +00001016iterArchs = False
Johnny Chenf032d902010-09-21 00:16:09 +00001017iterCompilers = False
Johnny Chenb40056b2010-09-21 00:09:27 +00001018
Johnny Chen1a4d5e72011-03-04 01:35:22 +00001019if not archs and "archs" in config:
Johnny Chenb40056b2010-09-21 00:09:27 +00001020 archs = config["archs"]
Johnny Chen1a4d5e72011-03-04 01:35:22 +00001021
1022if isinstance(archs, list) and len(archs) >= 1:
1023 iterArchs = True
1024
1025if not compilers and "compilers" in config:
Johnny Chenb40056b2010-09-21 00:09:27 +00001026 compilers = config["compilers"]
Johnny Chen1a4d5e72011-03-04 01:35:22 +00001027
1028if isinstance(compilers, list) and len(compilers) >= 1:
1029 iterCompilers = True
Johnny Chenb40056b2010-09-21 00:09:27 +00001030
Johnny Chen953864a2010-10-12 21:35:54 +00001031# Make a shallow copy of sys.path, we need to manipulate the search paths later.
1032# This is only necessary if we are relocated and with different configurations.
Johnny Chen1a4d5e72011-03-04 01:35:22 +00001033if rdir:
Johnny Chen953864a2010-10-12 21:35:54 +00001034 old_sys_path = sys.path[:]
Johnny Chen1a4d5e72011-03-04 01:35:22 +00001035# If we iterate on archs or compilers, there is a chance we want to split stderr/stdout.
1036if iterArchs or iterCompilers:
Johnny Chen953864a2010-10-12 21:35:54 +00001037 old_stderr = sys.stderr
1038 old_stdout = sys.stdout
1039 new_stderr = None
1040 new_stdout = None
1041
Johnny Chend96b5682010-11-05 17:30:53 +00001042# Iterating over all possible architecture and compiler combinations.
Johnny Chenb40056b2010-09-21 00:09:27 +00001043for ia in range(len(archs) if iterArchs else 1):
1044 archConfig = ""
1045 if iterArchs:
Johnny Chen18a921f2010-09-30 17:11:58 +00001046 os.environ["ARCH"] = archs[ia]
Johnny Chenb40056b2010-09-21 00:09:27 +00001047 archConfig = "arch=%s" % archs[ia]
1048 for ic in range(len(compilers) if iterCompilers else 1):
1049 if iterCompilers:
Johnny Chen18a921f2010-09-30 17:11:58 +00001050 os.environ["CC"] = compilers[ic]
Johnny Chenb40056b2010-09-21 00:09:27 +00001051 configString = "%s compiler=%s" % (archConfig, compilers[ic])
1052 else:
1053 configString = archConfig
1054
Johnny Chenb40056b2010-09-21 00:09:27 +00001055 if iterArchs or iterCompilers:
Johnny Chen1a4d5e72011-03-04 01:35:22 +00001056 # Translate ' ' to '-' for pathname component.
1057 from string import maketrans
1058 tbl = maketrans(' ', '-')
1059 configPostfix = configString.translate(tbl)
1060
1061 # Check whether we need to split stderr/stdout into configuration
1062 # specific files.
1063 if old_stderr.name != '<stderr>' and config.get('split_stderr'):
1064 if new_stderr:
1065 new_stderr.close()
1066 new_stderr = open("%s.%s" % (old_stderr.name, configPostfix), "w")
1067 sys.stderr = new_stderr
1068 if old_stdout.name != '<stdout>' and config.get('split_stdout'):
1069 if new_stdout:
1070 new_stdout.close()
1071 new_stdout = open("%s.%s" % (old_stdout.name, configPostfix), "w")
1072 sys.stdout = new_stdout
1073
Johnny Chen953864a2010-10-12 21:35:54 +00001074 # If we specified a relocated directory to run the test suite, do
1075 # the extra housekeeping to copy the testdirs to a configStringified
1076 # directory and to update sys.path before invoking the test runner.
1077 # The purpose is to separate the configuration-specific directories
1078 # from each other.
1079 if rdir:
Johnny Chen953864a2010-10-12 21:35:54 +00001080 from shutil import copytree, ignore_patterns
1081
Johnny Chen953864a2010-10-12 21:35:54 +00001082 newrdir = "%s.%s" % (rdir, configPostfix)
1083
1084 # Copy the tree to a new directory with postfix name configPostfix.
1085 copytree(rdir, newrdir, ignore=ignore_patterns('*.pyc', '*.o', '*.d'))
1086
Johnny Chen1a4d5e72011-03-04 01:35:22 +00001087 # Update the LLDB_TEST environment variable to reflect new top
Johnny Chen953864a2010-10-12 21:35:54 +00001088 # level test directory.
1089 #
1090 # See also lldbtest.TestBase.setUpClass(cls).
1091 if len(testdirs) == 1 and os.path.basename(testdirs[0]) == 'test':
1092 os.environ["LLDB_TEST"] = os.path.join(newrdir, 'test')
1093 else:
1094 os.environ["LLDB_TEST"] = newrdir
1095
1096 # And update the Python search paths for modules.
1097 sys.path = [x.replace(rdir, newrdir, 1) for x in old_sys_path]
1098
1099 # Output the configuration.
Johnny Chenb40056b2010-09-21 00:09:27 +00001100 sys.stderr.write("\nConfiguration: " + configString + "\n")
Johnny Chen953864a2010-10-12 21:35:54 +00001101
1102 #print "sys.stderr name is", sys.stderr.name
1103 #print "sys.stdout name is", sys.stdout.name
1104
1105 # First, write out the number of collected test cases.
Johnny Chen08967192011-11-18 00:19:29 +00001106 sys.stderr.write(separator + "\n")
1107 sys.stderr.write("Collected %d test%s\n\n"
1108 % (suite.countTestCases(),
1109 suite.countTestCases() != 1 and "s" or ""))
Johnny Chen953864a2010-10-12 21:35:54 +00001110
Johnny Chen84a6d6f2010-10-15 01:18:29 +00001111 class LLDBTestResult(unittest2.TextTestResult):
1112 """
Johnny Chen26be4532010-11-09 23:56:14 +00001113 Enforce a singleton pattern to allow introspection of test progress.
1114
1115 Overwrite addError(), addFailure(), and addExpectedFailure() methods
1116 to enable each test instance to track its failure/error status. It
1117 is used in the LLDB test framework to emit detailed trace messages
1118 to a log file for easier human inspection of test failres/errors.
Johnny Chen84a6d6f2010-10-15 01:18:29 +00001119 """
1120 __singleton__ = None
Johnny Chen360dd372010-11-29 17:50:10 +00001121 __ignore_singleton__ = False
Johnny Chen84a6d6f2010-10-15 01:18:29 +00001122
1123 def __init__(self, *args):
Johnny Chen360dd372010-11-29 17:50:10 +00001124 if not LLDBTestResult.__ignore_singleton__ and LLDBTestResult.__singleton__:
Johnny Chend2acdb32010-11-16 22:42:58 +00001125 raise Exception("LLDBTestResult instantiated more than once")
Johnny Chen84a6d6f2010-10-15 01:18:29 +00001126 super(LLDBTestResult, self).__init__(*args)
1127 LLDBTestResult.__singleton__ = self
1128 # Now put this singleton into the lldb module namespace.
1129 lldb.test_result = self
Johnny Chen810042e2011-01-05 20:24:11 +00001130 # Computes the format string for displaying the counter.
1131 global suite
1132 counterWidth = len(str(suite.countTestCases()))
1133 self.fmt = "%" + str(counterWidth) + "d: "
Johnny Chenc87fd492011-01-05 22:50:11 +00001134 self.indentation = ' ' * (counterWidth + 2)
Johnny Chen810042e2011-01-05 20:24:11 +00001135 # This counts from 1 .. suite.countTestCases().
1136 self.counter = 0
1137
Johnny Chenc87fd492011-01-05 22:50:11 +00001138 def getDescription(self, test):
1139 doc_first_line = test.shortDescription()
1140 if self.descriptions and doc_first_line:
1141 return '\n'.join((str(test), self.indentation + doc_first_line))
1142 else:
1143 return str(test)
1144
Johnny Chen810042e2011-01-05 20:24:11 +00001145 def startTest(self, test):
1146 self.counter += 1
1147 if self.showAll:
1148 self.stream.write(self.fmt % self.counter)
1149 super(LLDBTestResult, self).startTest(test)
Johnny Chen84a6d6f2010-10-15 01:18:29 +00001150
Johnny Chen08967192011-11-18 00:19:29 +00001151 def stopTest(self, test):
1152 """Called when the given test has been run"""
1153 if progress_bar:
1154 sys.__stdout__.write('.')
1155 sys.__stdout__.flush()
1156 if self.counter == suite.countTestCases():
1157 sys.__stdout__.write('\n')
1158
1159 super(LLDBTestResult, self).stopTest(test)
1160
Johnny Chence681462010-10-19 00:25:01 +00001161 def addError(self, test, err):
Johnny Chen63c2cba2010-10-29 22:20:36 +00001162 global sdir_has_content
1163 sdir_has_content = True
Johnny Chence681462010-10-19 00:25:01 +00001164 super(LLDBTestResult, self).addError(test, err)
1165 method = getattr(test, "markError", None)
1166 if method:
1167 method()
1168
Johnny Chen84a6d6f2010-10-15 01:18:29 +00001169 def addFailure(self, test, err):
Johnny Chen63c2cba2010-10-29 22:20:36 +00001170 global sdir_has_content
1171 sdir_has_content = True
Johnny Chen84a6d6f2010-10-15 01:18:29 +00001172 super(LLDBTestResult, self).addFailure(test, err)
1173 method = getattr(test, "markFailure", None)
1174 if method:
1175 method()
Johnny Chen84a6d6f2010-10-15 01:18:29 +00001176
Johnny Chendd2bb2c2010-11-03 18:17:03 +00001177 def addExpectedFailure(self, test, err):
1178 global sdir_has_content
1179 sdir_has_content = True
1180 super(LLDBTestResult, self).addExpectedFailure(test, err)
1181 method = getattr(test, "markExpectedFailure", None)
1182 if method:
1183 method()
1184
Johnny Chenf5b89092011-08-15 23:09:08 +00001185 def addSkip(self, test, reason):
1186 global sdir_has_content
1187 sdir_has_content = True
1188 super(LLDBTestResult, self).addSkip(test, reason)
1189 method = getattr(test, "markSkippedTest", None)
1190 if method:
1191 method()
1192
Johnny Chenab2f0662011-05-06 20:30:22 +00001193 def addUnexpectedSuccess(self, test):
1194 global sdir_has_content
1195 sdir_has_content = True
1196 super(LLDBTestResult, self).addUnexpectedSuccess(test)
1197 method = getattr(test, "markUnexpectedSuccess", None)
1198 if method:
1199 method()
1200
Johnny Chen26be4532010-11-09 23:56:14 +00001201 # Invoke the test runner.
Johnny Chend2acdb32010-11-16 22:42:58 +00001202 if count == 1:
Johnny Chen7d6d8442010-12-03 19:59:35 +00001203 result = unittest2.TextTestRunner(stream=sys.stderr,
1204 verbosity=verbose,
1205 failfast=failfast,
Johnny Chend2acdb32010-11-16 22:42:58 +00001206 resultclass=LLDBTestResult).run(suite)
1207 else:
Johnny Chend6e7ca22010-11-29 17:52:43 +00001208 # We are invoking the same test suite more than once. In this case,
1209 # mark __ignore_singleton__ flag as True so the signleton pattern is
1210 # not enforced.
Johnny Chen360dd372010-11-29 17:50:10 +00001211 LLDBTestResult.__ignore_singleton__ = True
Johnny Chend2acdb32010-11-16 22:42:58 +00001212 for i in range(count):
Johnny Chen7d6d8442010-12-03 19:59:35 +00001213 result = unittest2.TextTestRunner(stream=sys.stderr,
1214 verbosity=verbose,
1215 failfast=failfast,
Johnny Chen360dd372010-11-29 17:50:10 +00001216 resultclass=LLDBTestResult).run(suite)
Johnny Chenb40056b2010-09-21 00:09:27 +00001217
Johnny Chen1bfbd412010-06-29 19:44:16 +00001218
Johnny Chen63c2cba2010-10-29 22:20:36 +00001219if sdir_has_content:
Johnny Chenab2f0662011-05-06 20:30:22 +00001220 sys.stderr.write("Session logs for test failures/errors/unexpected successes"
1221 " can be found in directory '%s'\n" % sdir_name)
Johnny Chen63c2cba2010-10-29 22:20:36 +00001222
Johnny Chencd0279d2010-09-20 18:07:50 +00001223# Terminate the test suite if ${LLDB_TESTSUITE_FORCE_FINISH} is defined.
1224# This should not be necessary now.
Johnny Chen83f6e512010-08-13 22:58:44 +00001225if ("LLDB_TESTSUITE_FORCE_FINISH" in os.environ):
Johnny Chen83f6e512010-08-13 22:58:44 +00001226 print "Terminating Test suite..."
1227 subprocess.Popen(["/bin/sh", "-c", "kill %s; exit 0" % (os.getpid())])
1228
Johnny Chen01f2a6a2010-08-10 20:23:55 +00001229# Exiting.
1230sys.exit(not result.wasSuccessful)