blob: 7c244ba1a9d58b912a9165a16de22d2f7fe9a3fa [file] [log] [blame]
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001"""
2LLDB module which provides the abstract base class of lldb test case.
3
4The concrete subclass can override lldbtest.TesBase in order to inherit the
5common behavior for unitest.TestCase.setUp/tearDown implemented in this file.
6
7The subclass should override the attribute mydir in order for the python runtime
8to locate the individual test cases when running as part of a large test suite
9or when running each test case as a separate python invocation.
10
11./dotest.py provides a test driver which sets up the environment to run the
Johnny Chenc98892e2012-05-16 20:41:28 +000012entire of part of the test suite . Example:
Johnny Chenbf6ffa32010-07-03 03:41:59 +000013
Johnny Chenc98892e2012-05-16 20:41:28 +000014# Exercises the test suite in the types directory....
15/Volumes/data/lldb/svn/ToT/test $ ./dotest.py -A x86_64 types
Johnny Chen57b47382010-09-02 22:25:47 +000016...
Johnny Chend0190a62010-08-23 17:10:44 +000017
Johnny Chenc98892e2012-05-16 20:41:28 +000018Session logs for test failures/errors/unexpected successes will go into directory '2012-05-16-13_35_42'
19Command invoked: python ./dotest.py -A x86_64 types
20compilers=['clang']
Johnny Chend0190a62010-08-23 17:10:44 +000021
Johnny Chenc98892e2012-05-16 20:41:28 +000022Configuration: arch=x86_64 compiler=clang
Johnny Chend0190a62010-08-23 17:10:44 +000023----------------------------------------------------------------------
Johnny Chenc98892e2012-05-16 20:41:28 +000024Collected 72 tests
25
26........................................................................
27----------------------------------------------------------------------
28Ran 72 tests in 135.468s
Johnny Chend0190a62010-08-23 17:10:44 +000029
30OK
Johnny Chenbf6ffa32010-07-03 03:41:59 +000031$
32"""
33
Zachary Turnerff890da2015-10-19 23:45:41 +000034from __future__ import print_function
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000035from __future__ import absolute_import
Zachary Turnerff890da2015-10-19 23:45:41 +000036
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000037# System modules
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +000038import abc
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000039import collections
Zachary Turnerabdb8392015-11-16 22:40:30 +000040from distutils.version import LooseVersion
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +000041import gc
Vince Harron9753dd92015-05-10 15:22:09 +000042import glob
Zachary Turnerba105702015-11-16 23:58:20 +000043import inspect
Johnny Chen90312a82010-09-21 22:34:45 +000044import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000045import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000046import re
Daniel Malea69207462013-06-05 21:07:02 +000047import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000048from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000049import time
Johnny Chena33a93c2010-08-30 23:08:52 +000050import types
Zachary Turner43a01e42015-10-20 21:06:05 +000051
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000052# Third-party modules
53import unittest2
Zachary Turner43a01e42015-10-20 21:06:05 +000054from six import add_metaclass
Zachary Turner814236d2015-10-21 17:48:52 +000055from six import StringIO as SixStringIO
56from six.moves.urllib import parse as urlparse
Zachary Turnercd236b82015-10-26 18:48:24 +000057import six
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000058
59# LLDB modules
60import lldb
Zachary Turner606e3a52015-12-08 01:15:30 +000061from . import configuration
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000062from . import lldbtest_config
63from . import lldbutil
64from . import test_categories
Siva Chandra8af91662015-06-05 00:22:49 +000065
Todd Fiala9187f272015-12-11 18:06:47 +000066from .result_formatter import EventBuilder
67
Vince Harron85d19652015-05-21 19:09:29 +000068# dosep.py starts lots and lots of dotest instances
69# This option helps you find if two (or more) dotest instances are using the same
70# directory at the same time
71# Enable it to cause test failures and stderr messages if dotest instances try to run in
72# the same directory simultaneously
73# it is disabled by default because it litters the test directories with ".dirlock" files
74debug_confirm_directory_exclusivity = False
75
Johnny Chen707b3c92010-10-11 22:25:46 +000076# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000077# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000078
79# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000080if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
81 traceAlways = True
82else:
83 traceAlways = False
84
Johnny Chen707b3c92010-10-11 22:25:46 +000085# By default, doCleanup is True.
86if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
87 doCleanup = False
88else:
89 doCleanup = True
90
Johnny Chen8d55a342010-08-31 17:42:54 +000091
Johnny Chen00778092010-08-09 22:01:17 +000092#
93# Some commonly used assert messages.
94#
95
Johnny Chenaa902922010-09-17 22:45:27 +000096COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
97
Johnny Chen00778092010-08-09 22:01:17 +000098CURRENT_EXECUTABLE_SET = "Current executable set successfully"
99
Johnny Chen7d1d7532010-09-02 21:23:12 +0000100PROCESS_IS_VALID = "Process is valid"
101
102PROCESS_KILLED = "Process is killed successfully"
103
Johnny Chend5f66fc2010-12-23 01:12:19 +0000104PROCESS_EXITED = "Process exited successfully"
105
106PROCESS_STOPPED = "Process status should be stopped"
107
Sean Callanan05834cd2015-07-01 23:56:30 +0000108RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000109
Johnny Chen17941842010-08-09 23:44:24 +0000110RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000111
Johnny Chen67af43f2010-10-05 19:27:32 +0000112BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
113
Johnny Chen17941842010-08-09 23:44:24 +0000114BREAKPOINT_CREATED = "Breakpoint created successfully"
115
Johnny Chenf10af382010-12-04 00:07:24 +0000116BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
117
Johnny Chene76896c2010-08-17 21:33:31 +0000118BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
119
Johnny Chen17941842010-08-09 23:44:24 +0000120BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000121
Johnny Chen703dbd02010-09-30 17:06:24 +0000122BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
123
Johnny Chen164f1e12010-10-15 18:07:09 +0000124BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
125
Greg Clayton5db6b792012-10-24 18:24:14 +0000126MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
127
Johnny Chen89109ed12011-06-27 20:05:23 +0000128OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
129
Johnny Chen5b3a3572010-12-09 18:22:12 +0000130SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
131
Johnny Chenc70b02a2010-09-22 23:00:20 +0000132STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
133
Johnny Chen1691a162011-04-15 16:44:48 +0000134STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
135
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000136STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
137
Johnny Chen5d6c4642010-11-10 23:46:38 +0000138STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000139
Johnny Chen5d6c4642010-11-10 23:46:38 +0000140STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
141 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000142
Johnny Chen2e431ce2010-10-20 18:38:48 +0000143STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
144
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000145STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
146
Johnny Chenc066ab42010-10-14 01:22:03 +0000147STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
148
Johnny Chen00778092010-08-09 22:01:17 +0000149STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
150
Johnny Chenf68cc122011-09-15 21:09:59 +0000151STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
152
Johnny Chen3c884a02010-08-24 22:07:56 +0000153DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
154
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000155VALID_BREAKPOINT = "Got a valid breakpoint"
156
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000157VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
158
Johnny Chen7209d84f2011-05-06 23:26:12 +0000159VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
160
Johnny Chen5ee88192010-08-27 23:47:36 +0000161VALID_FILESPEC = "Got a valid filespec"
162
Johnny Chen025d1b82010-12-08 01:25:21 +0000163VALID_MODULE = "Got a valid module"
164
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000165VALID_PROCESS = "Got a valid process"
166
Johnny Chen025d1b82010-12-08 01:25:21 +0000167VALID_SYMBOL = "Got a valid symbol"
168
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000169VALID_TARGET = "Got a valid target"
170
Matthew Gardinerc928de32014-10-22 07:22:56 +0000171VALID_PLATFORM = "Got a valid platform"
172
Johnny Chen15f247a2012-02-03 20:43:00 +0000173VALID_TYPE = "Got a valid type"
174
Johnny Chen5819ab42011-07-15 22:28:10 +0000175VALID_VARIABLE = "Got a valid variable"
176
Johnny Chen981463d2010-08-25 19:00:04 +0000177VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000178
Johnny Chenf68cc122011-09-15 21:09:59 +0000179WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000180
Sean Callanan05834cd2015-07-01 23:56:30 +0000181def CMD_MSG(str):
182 '''A generic "Command '%s' returns successfully" message generator.'''
183 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000184
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000185def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000186 '''A generic message generator for the completion mechanism.'''
187 return "'%s' successfully completes to '%s'" % (str_before, str_after)
188
Johnny Chenc0c67f22010-11-09 18:42:22 +0000189def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000190 '''A generic "'%s' returns expected result" message generator if exe.
191 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000192 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000193
Johnny Chen3343f042010-10-19 19:11:38 +0000194def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000195 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000196 return "Value of setting '%s' is correct" % setting
197
Johnny Chen27c41232010-08-26 21:49:29 +0000198def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000199 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000200 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000201
Johnny Chen47ceb032010-10-11 23:52:19 +0000202def line_number(filename, string_to_match):
203 """Helper function to return the line number of the first matched string."""
204 with open(filename, 'r') as f:
205 for i, line in enumerate(f):
206 if line.find(string_to_match) != -1:
207 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000208 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000209 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000210
Johnny Chen67af43f2010-10-05 19:27:32 +0000211def pointer_size():
212 """Return the pointer size of the host system."""
213 import ctypes
214 a_pointer = ctypes.c_void_p(0xffff)
215 return 8 * ctypes.sizeof(a_pointer)
216
Johnny Chen57816732012-02-09 02:01:59 +0000217def is_exe(fpath):
218 """Returns true if fpath is an executable."""
219 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
220
221def which(program):
222 """Returns the full path to a program; None otherwise."""
223 fpath, fname = os.path.split(program)
224 if fpath:
225 if is_exe(program):
226 return program
227 else:
228 for path in os.environ["PATH"].split(os.pathsep):
229 exe_file = os.path.join(path, program)
230 if is_exe(exe_file):
231 return exe_file
232 return None
233
Zachary Turner814236d2015-10-21 17:48:52 +0000234class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000235 """
236 A nice little context manager for recording the debugger interactions into
237 our session object. If trace flag is ON, it also emits the interactions
238 into the stderr.
239 """
240 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000241 """Create a SixStringIO instance; record the session obj and trace flag."""
242 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000243 # The test might not have undergone the 'setUp(self)' phase yet, so that
244 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000245 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000246 self.trace = trace
247
248 def __enter__(self):
249 """
250 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000251 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000252 """
253 return self
254
255 def __exit__(self, type, value, tb):
256 """
257 Context management protocol on exit from the body of the with statement.
258 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000259 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000260 """
261 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000262 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000263 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000264 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000265 self.close()
266
Zachary Turner43a01e42015-10-20 21:06:05 +0000267@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000268class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000269
270 @abc.abstractproperty
271 def pid(self):
272 """Returns process PID if has been launched already."""
273
274 @abc.abstractmethod
275 def launch(self, executable, args):
276 """Launches new process with given executable and args."""
277
278 @abc.abstractmethod
279 def terminate(self):
280 """Terminates previously launched process.."""
281
282class _LocalProcess(_BaseProcess):
283
284 def __init__(self, trace_on):
285 self._proc = None
286 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000287 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000288
289 @property
290 def pid(self):
291 return self._proc.pid
292
293 def launch(self, executable, args):
294 self._proc = Popen([executable] + args,
295 stdout = open(os.devnull) if not self._trace_on else None,
296 stdin = PIPE)
297
298 def terminate(self):
299 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000300 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000301 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
302 for sig in signals_to_try:
303 try:
304 self._proc.send_signal(getattr(signal, sig))
305 time.sleep(self._delayafterterminate)
306 if self._proc.poll() != None:
307 return
308 except ValueError:
309 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000310 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000311 time.sleep(self._delayafterterminate)
312 if self._proc.poll() != None:
313 return
314 self._proc.kill()
315 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000316
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000317 def poll(self):
318 return self._proc.poll()
319
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000320class _RemoteProcess(_BaseProcess):
321
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000322 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000323 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000324 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000325
326 @property
327 def pid(self):
328 return self._pid
329
330 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000331 if self._install_remote:
332 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000333 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000334
335 dst_file_spec = lldb.SBFileSpec(dst_path, False)
336 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
337 if err.Fail():
338 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
339 else:
340 dst_path = executable
341 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000342
343 launch_info = lldb.SBLaunchInfo(args)
344 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000345 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000346
347 # Redirect stdout and stderr to /dev/null
348 launch_info.AddSuppressFileAction(1, False, True)
349 launch_info.AddSuppressFileAction(2, False, True)
350
351 err = lldb.remote_platform.Launch(launch_info)
352 if err.Fail():
353 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
354 self._pid = launch_info.GetProcessID()
355
356 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000357 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000358
Johnny Chen690fcef2010-10-15 23:55:05 +0000359# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000360# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000361def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000362 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000363
364 If the exit code was non-zero it raises a CalledProcessError. The
365 CalledProcessError object will have the return code in the returncode
366 attribute and output in the output attribute.
367
368 The arguments are the same as for the Popen constructor. Example:
369
370 >>> check_output(["ls", "-l", "/dev/null"])
371 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
372
373 The stdout argument is not allowed as it is used internally.
374 To capture standard error in the result, use stderr=STDOUT.
375
376 >>> check_output(["/bin/sh", "-c",
377 ... "ls -l non_existent_file ; exit 0"],
378 ... stderr=STDOUT)
379 'ls: non_existent_file: No such file or directory\n'
380 """
381
382 # Assign the sender object to variable 'test' and remove it from kwargs.
383 test = kwargs.pop('sender', None)
384
Zachary Turner9ef307b2014-07-22 16:19:29 +0000385 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
386 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000387 output = ""
388 error = ""
389 for shellCommand in commandList:
390 if 'stdout' in kwargs:
391 raise ValueError('stdout argument not allowed, it will be overridden.')
392 if 'shell' in kwargs and kwargs['shell']==False:
393 raise ValueError('shell=False not allowed')
Zachary Turner48ef8d4c2015-11-18 18:40:16 +0000394 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, universal_newlines=True, **kwargs)
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000395 pid = process.pid
396 this_output, this_error = process.communicate()
397 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000398
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000399 # Enable trace on failure return while tracking down FreeBSD buildbot issues
400 trace = traceAlways
401 if not trace and retcode and sys.platform.startswith("freebsd"):
402 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000403
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000404 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000405 print(file=sbuf)
406 print("os command:", shellCommand, file=sbuf)
407 print("with pid:", pid, file=sbuf)
408 print("stdout:", this_output, file=sbuf)
409 print("stderr:", this_error, file=sbuf)
410 print("retcode:", retcode, file=sbuf)
411 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000412
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000413 if retcode:
414 cmd = kwargs.get("args")
415 if cmd is None:
416 cmd = shellCommand
417 raise CalledProcessError(retcode, cmd)
418 output = output + this_output
419 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000420 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000421
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000422def getsource_if_available(obj):
423 """
424 Return the text of the source code for an object if available. Otherwise,
425 a print representation is returned.
426 """
427 import inspect
428 try:
429 return inspect.getsource(obj)
430 except:
431 return repr(obj)
432
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000433def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000434 if sys.platform.startswith("freebsd"):
435 return __import__("builder_freebsd")
Kamil Rytarowski0b655da2015-12-05 18:46:56 +0000436 if sys.platform.startswith("netbsd"):
437 return __import__("builder_netbsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000438 return __import__("builder_" + sys.platform)
439
Siva Chandra8af91662015-06-05 00:22:49 +0000440def run_adb_command(cmd, device_id):
441 device_id_args = []
442 if device_id:
443 device_id_args = ["-s", device_id]
444 full_cmd = ["adb"] + device_id_args + cmd
445 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
446 stdout, stderr = p.communicate()
447 return p.returncode, stdout, stderr
448
Chaoren Line9bbabc2015-07-18 00:37:55 +0000449def append_android_envs(dictionary):
450 if dictionary is None:
451 dictionary = {}
452 dictionary["OS"] = "Android"
453 if android_device_api() >= 16:
454 dictionary["PIE"] = 1
455 return dictionary
456
Chaoren Lin9070f532015-07-17 22:13:29 +0000457def target_is_android():
458 if not hasattr(target_is_android, 'result'):
459 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
460 match = re.match(".*-.*-.*-android", triple)
461 target_is_android.result = match is not None
462 return target_is_android.result
463
Siva Chandra8af91662015-06-05 00:22:49 +0000464def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000465 if not hasattr(android_device_api, 'result'):
Zachary Turner606e3a52015-12-08 01:15:30 +0000466 assert configuration.lldb_platform_url is not None
Chaoren Lin9070f532015-07-17 22:13:29 +0000467 device_id = None
Zachary Turner606e3a52015-12-08 01:15:30 +0000468 parsed_url = urlparse.urlparse(configuration.lldb_platform_url)
Ying Chenca922bb2015-11-18 19:03:20 +0000469 host_name = parsed_url.netloc.split(":")[0]
470 if host_name != 'localhost':
471 device_id = host_name
472 if device_id.startswith('[') and device_id.endswith(']'):
473 device_id = device_id[1:-1]
Chaoren Lin9070f532015-07-17 22:13:29 +0000474 retcode, stdout, stderr = run_adb_command(
475 ["shell", "getprop", "ro.build.version.sdk"], device_id)
476 if retcode == 0:
477 android_device_api.result = int(stdout)
478 else:
479 raise LookupError(
480 ">>> Unable to determine the API level of the Android device.\n"
481 ">>> stdout:\n%s\n"
482 ">>> stderr:\n%s\n" % (stdout, stderr))
483 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000484
Zachary Turnerabdb8392015-11-16 22:40:30 +0000485def check_expected_version(comparison, expected, actual):
486 def fn_leq(x,y): return x <= y
487 def fn_less(x,y): return x < y
488 def fn_geq(x,y): return x >= y
489 def fn_greater(x,y): return x > y
490 def fn_eq(x,y): return x == y
491 def fn_neq(x,y): return x != y
492
493 op_lookup = {
494 "==": fn_eq,
495 "=": fn_eq,
496 "!=": fn_neq,
497 "<>": fn_neq,
498 ">": fn_greater,
499 "<": fn_less,
500 ">=": fn_geq,
501 "<=": fn_leq
502 }
503 expected_str = '.'.join([str(x) for x in expected])
504 actual_str = '.'.join([str(x) for x in actual])
505
506 return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
507
Johnny Chena74bb0a2011-08-01 18:46:13 +0000508#
509# Decorators for categorizing test cases.
510#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000511from functools import wraps
Pavel Labathffbf9e82015-12-14 13:17:18 +0000512
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000513def add_test_categories(cat):
Pavel Labathffbf9e82015-12-14 13:17:18 +0000514 """Add test categories to a TestCase method"""
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000515 cat = test_categories.validate(cat, True)
516 def impl(func):
Pavel Labathffbf9e82015-12-14 13:17:18 +0000517 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
518 raise Exception("@add_test_categories can only be used to decorate a test method")
519 if hasattr(func, "categories"):
520 cat.extend(func.categories)
521 func.categories = cat
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000522 return func
Pavel Labathffbf9e82015-12-14 13:17:18 +0000523
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000524 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000525
Johnny Chena74bb0a2011-08-01 18:46:13 +0000526def benchmarks_test(func):
527 """Decorate the item as a benchmarks test."""
528 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
529 raise Exception("@benchmarks_test can only be used to decorate a test method")
530 @wraps(func)
531 def wrapper(self, *args, **kwargs):
Zachary Turneraad25fb2015-12-08 18:36:05 +0000532 self.skipTest("benchmarks test")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000533 return func(self, *args, **kwargs)
534
535 # Mark this function as such to separate them from the regular tests.
536 wrapper.__benchmarks_test__ = True
537 return wrapper
538
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000539def no_debug_info_test(func):
540 """Decorate the item as a test what don't use any debug info. If this annotation is specified
541 then the test runner won't generate a separate test for each debug info format. """
542 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
543 raise Exception("@no_debug_info_test can only be used to decorate a test method")
544 @wraps(func)
545 def wrapper(self, *args, **kwargs):
546 return func(self, *args, **kwargs)
547
548 # Mark this function as such to separate them from the regular tests.
549 wrapper.__no_debug_info_test__ = True
550 return wrapper
551
Todd Fialaa41d48c2014-04-28 04:49:40 +0000552def debugserver_test(func):
553 """Decorate the item as a debugserver test."""
554 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
555 raise Exception("@debugserver_test can only be used to decorate a test method")
556 @wraps(func)
557 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000558 if configuration.dont_do_debugserver_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000559 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000560 return func(self, *args, **kwargs)
561
562 # Mark this function as such to separate them from the regular tests.
563 wrapper.__debugserver_test__ = True
564 return wrapper
565
566def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000567 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000568 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
569 raise Exception("@llgs_test can only be used to decorate a test method")
570 @wraps(func)
571 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000572 if configuration.dont_do_llgs_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000573 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000574 return func(self, *args, **kwargs)
575
576 # Mark this function as such to separate them from the regular tests.
577 wrapper.__llgs_test__ = True
578 return wrapper
579
Daniel Maleae0f8f572013-08-26 23:57:52 +0000580def not_remote_testsuite_ready(func):
581 """Decorate the item as a test which is not ready yet for remote testsuite."""
582 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
583 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
584 @wraps(func)
585 def wrapper(self, *args, **kwargs):
Zachary Turnerd865c6b2015-12-08 22:15:48 +0000586 if lldb.remote_platform:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000587 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000588 return func(self, *args, **kwargs)
589
590 # Mark this function as such to separate them from the regular tests.
591 wrapper.__not_ready_for_remote_testsuite_test__ = True
592 return wrapper
593
Ed Maste433790a2014-04-23 12:55:41 +0000594def expectedFailure(expected_fn, bugnumber=None):
595 def expectedFailure_impl(func):
596 @wraps(func)
597 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000598 from unittest2 import case
599 self = args[0]
Ed Maste433790a2014-04-23 12:55:41 +0000600 if expected_fn(self):
Pavel Labath25e241b2015-12-16 12:09:45 +0000601 if configuration.results_formatter_object is not None:
602 # Mark this test as expected to fail.
603 configuration.results_formatter_object.handle_event(
604 EventBuilder.event_for_mark_test_expected_failure(self))
Zachary Turner5cb8e672015-11-06 18:14:42 +0000605 xfail_func = unittest2.expectedFailure(func)
606 xfail_func(*args, **kwargs)
607 else:
608 func(*args, **kwargs)
Ed Maste433790a2014-04-23 12:55:41 +0000609 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000610 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
611 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000612 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000613 return expectedFailure_impl(bugnumber)
614 else:
615 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000616
Ying Chen0c352822015-11-16 23:41:02 +0000617# You can also pass not_in(list) to reverse the sense of the test for the arguments that
618# are simple lists, namely oslist, compiler, and debug_info.
619
Zachary Turnere1eb5e32015-12-14 21:26:49 +0000620def not_in(iterable):
Ying Chen0c352822015-11-16 23:41:02 +0000621 return lambda x : x not in iterable
622
Zachary Turnere1eb5e32015-12-14 21:26:49 +0000623def check_list_or_lambda(list_or_lambda, value):
Siva Chandra7dcad312015-11-20 20:30:36 +0000624 if six.callable(list_or_lambda):
625 return list_or_lambda(value)
Siva Chandraa3863582015-12-15 00:26:52 +0000626 elif isinstance(list_or_lambda, list) or isinstance(list_or_lambda, str):
627 return value is None or value in list_or_lambda
Zachary Turnere1eb5e32015-12-14 21:26:49 +0000628 else:
Siva Chandraa3863582015-12-15 00:26:52 +0000629 return list_or_lambda is None or value is None or list_or_lambda == value
Ying Chen0c352822015-11-16 23:41:02 +0000630
Ying Chen7091c2c2015-04-21 01:15:47 +0000631# provide a function to xfail on defined oslist, compiler version, and archs
632# if none is specified for any argument, that argument won't be checked and thus means for all
633# for example,
634# @expectedFailureAll, xfail for all platform/compiler/arch,
635# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
636# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Pavel Labath7ead0b92015-12-09 10:54:18 +0000637def expectedFailureAll(bugnumber=None, oslist=None, hostoslist=None, compiler=None, compiler_version=None, archs=None, triple=None, debug_info=None, swig_version=None, py_version=None):
Ying Chen7091c2c2015-04-21 01:15:47 +0000638 def fn(self):
Siva Chandra7dcad312015-11-20 20:30:36 +0000639 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
Pavel Labath7ead0b92015-12-09 10:54:18 +0000640 hostoslist_passes = check_list_or_lambda(hostoslist, getHostPlatform())
Siva Chandra7dcad312015-11-20 20:30:36 +0000641 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000642 arch_passes = self.expectedArch(archs)
643 triple_passes = triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())
Siva Chandra7dcad312015-11-20 20:30:36 +0000644 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000645 swig_version_passes = (swig_version is None) or (not hasattr(lldb, 'swig_version')) or (check_expected_version(swig_version[0], swig_version[1], lldb.swig_version))
646 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
647
648 return (oslist_passes and
Pavel Labath7ead0b92015-12-09 10:54:18 +0000649 hostoslist_passes and
Zachary Turnerabdb8392015-11-16 22:40:30 +0000650 compiler_passes and
651 arch_passes and
652 triple_passes and
653 debug_info_passes and
654 swig_version_passes and
655 py_version_passes)
Ying Chen7091c2c2015-04-21 01:15:47 +0000656 return expectedFailure(fn, bugnumber)
657
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000658def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000659 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
660
661def expectedFailureDwo(bugnumber=None):
662 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000663
664def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000665 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000666
667def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
668 if compiler_version is None:
669 compiler_version=['=', None]
670 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
671
Vince Harron8974ce22015-03-13 19:54:54 +0000672# to XFAIL a specific clang versions, try this
673# @expectedFailureClang('bugnumber', ['<=', '3.4'])
674def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000675 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000676
677def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000678 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000679
Matt Kopec0de53f02013-03-15 19:10:12 +0000680def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000681 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000682
Ed Maste433790a2014-04-23 12:55:41 +0000683def expectedFailureArch(arch, bugnumber=None):
684 def fn(self):
685 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000686 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000687
Enrico Granatae6cedc12013-02-23 01:05:23 +0000688def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000689 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000690
Matt Kopecee969f92013-09-26 23:30:59 +0000691def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000692 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000693
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000694def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None):
Ed Maste433790a2014-04-23 12:55:41 +0000695 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000696 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000697 self.expectedCompiler(compilers) and
698 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000699 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000700
Chaoren Linf7160f32015-06-09 17:39:27 +0000701def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
702 def fn(self):
703 return (getHostPlatform() in oslist and
704 self.expectedCompiler(compilers))
705 return expectedFailure(fn, bugnumber)
706
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000707def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000708 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000709 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000710
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000711def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
712 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000713
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000714def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None):
715 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000716
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000717def expectedFailureNetBSD(bugnumber=None, compilers=None, debug_info=None):
718 return expectedFailureOS(['netbsd'], bugnumber, compilers, debug_info=debug_info)
719
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000720def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
721 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000722
Chaoren Linf7160f32015-06-09 17:39:27 +0000723def expectedFailureHostWindows(bugnumber=None, compilers=None):
724 return expectedFailureHostOS(['windows'], bugnumber, compilers)
725
Pavel Labath090152b2015-08-20 11:37:19 +0000726def matchAndroid(api_levels=None, archs=None):
727 def match(self):
728 if not target_is_android():
729 return False
730 if archs is not None and self.getArchitecture() not in archs:
731 return False
732 if api_levels is not None and android_device_api() not in api_levels:
733 return False
734 return True
735 return match
736
737
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000738def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000739 """ Mark a test as xfail for Android.
740
741 Arguments:
742 bugnumber - The LLVM pr associated with the problem.
743 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000744 for which a test is expected to fail. None means all API level.
745 arch - A sequence of architecture names specifying the architectures
746 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000747 """
Pavel Labath090152b2015-08-20 11:37:19 +0000748 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000749
Vince Harron7ac3ea42015-06-26 15:13:21 +0000750# if the test passes on the first try, we're done (success)
751# if the test fails once, then passes on the second try, raise an ExpectedFailure
752# if the test fails twice in a row, re-throw the exception from the second test run
753def expectedFlakey(expected_fn, bugnumber=None):
754 def expectedFailure_impl(func):
755 @wraps(func)
756 def wrapper(*args, **kwargs):
757 from unittest2 import case
758 self = args[0]
Todd Fiala9187f272015-12-11 18:06:47 +0000759 if expected_fn(self):
760 # Send event marking test as explicitly eligible for rerunning.
761 if configuration.results_formatter_object is not None:
762 # Mark this test as rerunnable.
763 configuration.results_formatter_object.handle_event(
764 EventBuilder.event_for_mark_test_rerun_eligible(self))
Vince Harron7ac3ea42015-06-26 15:13:21 +0000765 try:
766 func(*args, **kwargs)
Ying Chen0a7202b2015-07-01 22:44:27 +0000767 # don't retry if the test case is already decorated with xfail or skip
768 except (case._ExpectedFailure, case.SkipTest, case._UnexpectedSuccess):
769 raise
Vince Harron7ac3ea42015-06-26 15:13:21 +0000770 except Exception:
771 if expected_fn(self):
Ying Chen0a7202b2015-07-01 22:44:27 +0000772 # before retry, run tearDown for previous run and setup for next
Vince Harron7ac3ea42015-06-26 15:13:21 +0000773 try:
Ying Chen0a7202b2015-07-01 22:44:27 +0000774 self.tearDown()
775 self.setUp()
Vince Harron7ac3ea42015-06-26 15:13:21 +0000776 func(*args, **kwargs)
777 except Exception:
778 # oh snap! two failures in a row, record a failure/error
779 raise
780 # record the expected failure
781 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
782 else:
783 raise
784 return wrapper
785 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
786 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000787 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000788 return expectedFailure_impl(bugnumber)
789 else:
790 return expectedFailure_impl
791
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000792def expectedFlakeyDwarf(bugnumber=None):
793 def fn(self):
794 return self.debug_info == "dwarf"
795 return expectedFlakey(fn, bugnumber)
796
797def expectedFlakeyDsym(bugnumber=None):
798 def fn(self):
799 return self.debug_info == "dwarf"
800 return expectedFlakey(fn, bugnumber)
801
Vince Harron7ac3ea42015-06-26 15:13:21 +0000802def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
803 def fn(self):
804 return (self.getPlatform() in oslist and
805 self.expectedCompiler(compilers))
806 return expectedFlakey(fn, bugnumber)
807
808def expectedFlakeyDarwin(bugnumber=None, compilers=None):
809 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
810 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
811
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000812def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
813 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
814
Vince Harron7ac3ea42015-06-26 15:13:21 +0000815def expectedFlakeyLinux(bugnumber=None, compilers=None):
816 return expectedFlakeyOS(['linux'], bugnumber, compilers)
817
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000818def expectedFlakeyNetBSD(bugnumber=None, compilers=None):
819 return expectedFlakeyOS(['netbsd'], bugnumber, compilers)
Vince Harron7ac3ea42015-06-26 15:13:21 +0000820
821def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
822 if compiler_version is None:
823 compiler_version=['=', None]
824 def fn(self):
825 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
826 return expectedFlakey(fn, bugnumber)
827
828# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
829def expectedFlakeyClang(bugnumber=None, compiler_version=None):
830 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
831
832# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
833def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
834 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
835
Pavel Labath63a579c2015-09-07 12:15:27 +0000836def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
837 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
838
Greg Clayton12514562013-12-05 22:22:32 +0000839def skipIfRemote(func):
840 """Decorate the item to skip tests if testing remotely."""
841 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
842 raise Exception("@skipIfRemote can only be used to decorate a test method")
843 @wraps(func)
844 def wrapper(*args, **kwargs):
845 from unittest2 import case
846 if lldb.remote_platform:
847 self = args[0]
848 self.skipTest("skip on remote platform")
849 else:
850 func(*args, **kwargs)
851 return wrapper
852
Siva Chandra4470f382015-06-17 22:32:27 +0000853def skipUnlessListedRemote(remote_list=None):
854 def myImpl(func):
855 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
856 raise Exception("@skipIfRemote can only be used to decorate a "
857 "test method")
858
859 @wraps(func)
860 def wrapper(*args, **kwargs):
861 if remote_list and lldb.remote_platform:
862 self = args[0]
863 triple = self.dbg.GetSelectedPlatform().GetTriple()
864 for r in remote_list:
865 if r in triple:
866 func(*args, **kwargs)
867 return
868 self.skipTest("skip on remote platform %s" % str(triple))
869 else:
870 func(*args, **kwargs)
871 return wrapper
872
873 return myImpl
874
Greg Clayton12514562013-12-05 22:22:32 +0000875def skipIfRemoteDueToDeadlock(func):
876 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
877 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
878 raise Exception("@skipIfRemote can only be used to decorate a test method")
879 @wraps(func)
880 def wrapper(*args, **kwargs):
881 from unittest2 import case
882 if lldb.remote_platform:
883 self = args[0]
884 self.skipTest("skip on remote platform (deadlocks)")
885 else:
886 func(*args, **kwargs)
887 return wrapper
888
Enrico Granatab633e432014-10-06 21:37:06 +0000889def skipIfNoSBHeaders(func):
890 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
891 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000892 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000893 @wraps(func)
894 def wrapper(*args, **kwargs):
895 from unittest2 import case
896 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000897 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000898 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000899 else:
900 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000901 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000902 if not os.path.exists(header):
903 self.skipTest("skip because LLDB.h header not found")
904 else:
905 func(*args, **kwargs)
906 return wrapper
907
Enrico Granata5f92a132015-11-05 00:46:25 +0000908def skipIfiOSSimulator(func):
909 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
Zachary Turner606e3a52015-12-08 01:15:30 +0000910 return unittest2.skipIf(configuration.lldb_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
Enrico Granata5f92a132015-11-05 00:46:25 +0000911
Robert Flack13c7ad92015-03-30 14:12:17 +0000912def skipIfFreeBSD(func):
913 """Decorate the item to skip tests that should be skipped on FreeBSD."""
914 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000915
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000916def skipIfNetBSD(func):
917 """Decorate the item to skip tests that should be skipped on NetBSD."""
918 return skipIfPlatform(["netbsd"])(func)
919
Greg Claytone0d0a762015-04-02 18:24:03 +0000920def getDarwinOSTriples():
921 return ['darwin', 'macosx', 'ios']
922
Daniel Maleab3d41a22013-07-09 00:08:01 +0000923def skipIfDarwin(func):
924 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000925 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000926
Robert Flack13c7ad92015-03-30 14:12:17 +0000927def skipIfLinux(func):
928 """Decorate the item to skip tests that should be skipped on Linux."""
929 return skipIfPlatform(["linux"])(func)
930
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000931def skipUnlessHostLinux(func):
932 """Decorate the item to skip tests that should be skipped on any non Linux host."""
933 return skipUnlessHostPlatform(["linux"])(func)
934
Robert Flack13c7ad92015-03-30 14:12:17 +0000935def skipIfWindows(func):
936 """Decorate the item to skip tests that should be skipped on Windows."""
937 return skipIfPlatform(["windows"])(func)
938
Chaoren Line6eea5d2015-06-08 22:13:28 +0000939def skipIfHostWindows(func):
940 """Decorate the item to skip tests that should be skipped on Windows."""
941 return skipIfHostPlatform(["windows"])(func)
942
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000943def skipUnlessWindows(func):
944 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
945 return skipUnlessPlatform(["windows"])(func)
946
Robert Flack13c7ad92015-03-30 14:12:17 +0000947def skipUnlessDarwin(func):
948 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000949 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000950
Ryan Brown57bee1e2015-09-14 22:45:11 +0000951def skipUnlessGoInstalled(func):
952 """Decorate the item to skip tests when no Go compiler is available."""
953 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
954 raise Exception("@skipIfGcc can only be used to decorate a test method")
955 @wraps(func)
956 def wrapper(*args, **kwargs):
957 from unittest2 import case
958 self = args[0]
959 compiler = self.getGoCompilerVersion()
960 if not compiler:
961 self.skipTest("skipping because go compiler not found")
962 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000963 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000964 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000965 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
966 if not match_version:
967 # Couldn't determine version.
968 self.skipTest(
969 "skipping because go version could not be parsed "
970 "out of {}".format(compiler))
971 else:
972 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000973 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000974 compiler_strict_version = StrictVersion(match_version.group(1))
975 if compiler_strict_version < min_strict_version:
976 self.skipTest(
977 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +0000978 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +0000979 compiler_strict_version,
980 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +0000981 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +0000982 return wrapper
983
Robert Flack068898c2015-04-09 18:07:58 +0000984def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +0000985 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +0000986 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
987 if platform.startswith('freebsd'):
988 platform = 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000989 elif platform.startswith('netbsd'):
990 platform = 'netbsd'
Robert Flack068898c2015-04-09 18:07:58 +0000991 return platform
992
Robert Flack6e1fd352015-05-15 12:39:33 +0000993def getHostPlatform():
994 """Returns the host platform running the test suite."""
995 # Attempts to return a platform name matching a target Triple platform.
996 if sys.platform.startswith('linux'):
997 return 'linux'
998 elif sys.platform.startswith('win32'):
999 return 'windows'
1000 elif sys.platform.startswith('darwin'):
1001 return 'darwin'
1002 elif sys.platform.startswith('freebsd'):
1003 return 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001004 elif sys.platform.startswith('netbsd'):
1005 return 'netbsd'
Robert Flack6e1fd352015-05-15 12:39:33 +00001006 else:
1007 return sys.platform
1008
Robert Flackfb2f6c62015-04-17 08:02:18 +00001009def platformIsDarwin():
1010 """Returns true if the OS triple for the selected platform is any valid apple OS"""
1011 return getPlatform() in getDarwinOSTriples()
1012
Robert Flack6e1fd352015-05-15 12:39:33 +00001013def skipIfHostIncompatibleWithRemote(func):
1014 """Decorate the item to skip tests if binaries built on this host are incompatible."""
1015 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1016 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
1017 @wraps(func)
1018 def wrapper(*args, **kwargs):
1019 from unittest2 import case
1020 self = args[0]
1021 host_arch = self.getLldbArchitecture()
1022 host_platform = getHostPlatform()
1023 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +00001024 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +00001025 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
1026 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
1027 elif target_platform != host_platform:
1028 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
1029 else:
1030 func(*args, **kwargs)
1031 return wrapper
1032
Chaoren Line6eea5d2015-06-08 22:13:28 +00001033def skipIfHostPlatform(oslist):
1034 """Decorate the item to skip tests if running on one of the listed host platforms."""
1035 return unittest2.skipIf(getHostPlatform() in oslist,
1036 "skip on %s" % (", ".join(oslist)))
1037
1038def skipUnlessHostPlatform(oslist):
1039 """Decorate the item to skip tests unless running on one of the listed host platforms."""
1040 return unittest2.skipUnless(getHostPlatform() in oslist,
1041 "requires on of %s" % (", ".join(oslist)))
1042
Zachary Turner793d9972015-08-14 23:29:24 +00001043def skipUnlessArch(archlist):
1044 """Decorate the item to skip tests unless running on one of the listed architectures."""
1045 def myImpl(func):
1046 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1047 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1048
1049 @wraps(func)
1050 def wrapper(*args, **kwargs):
1051 self = args[0]
1052 if self.getArchitecture() not in archlist:
1053 self.skipTest("skipping for architecture %s (requires one of %s)" %
1054 (self.getArchitecture(), ", ".join(archlist)))
1055 else:
1056 func(*args, **kwargs)
1057 return wrapper
1058
1059 return myImpl
1060
Robert Flack13c7ad92015-03-30 14:12:17 +00001061def skipIfPlatform(oslist):
1062 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001063 return unittest2.skipIf(getPlatform() in oslist,
1064 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001065
1066def skipUnlessPlatform(oslist):
1067 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001068 return unittest2.skipUnless(getPlatform() in oslist,
1069 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001070
Daniel Malea48359902013-05-14 20:48:54 +00001071def skipIfLinuxClang(func):
1072 """Decorate the item to skip tests that should be skipped if building on
1073 Linux with clang.
1074 """
1075 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1076 raise Exception("@skipIfLinuxClang can only be used to decorate a test method")
1077 @wraps(func)
1078 def wrapper(*args, **kwargs):
1079 from unittest2 import case
1080 self = args[0]
1081 compiler = self.getCompiler()
Vince Harronc8492672015-05-04 02:59:19 +00001082 platform = self.getPlatform()
1083 if "clang" in compiler and platform == "linux":
Daniel Malea48359902013-05-14 20:48:54 +00001084 self.skipTest("skipping because Clang is used on Linux")
1085 else:
1086 func(*args, **kwargs)
1087 return wrapper
1088
Ying Chen7091c2c2015-04-21 01:15:47 +00001089# provide a function to skip on defined oslist, compiler version, and archs
1090# if none is specified for any argument, that argument won't be checked and thus means for all
1091# for example,
1092# @skipIf, skip for all platform/compiler/arch,
1093# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1094# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1095
1096# TODO: refactor current code, to make skipIfxxx functions to call this function
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001097def skipIf(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, debug_info=None, swig_version=None, py_version=None, remote=None):
Ying Chen7091c2c2015-04-21 01:15:47 +00001098 def fn(self):
Zachary Turnere1eb5e32015-12-14 21:26:49 +00001099 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
1100 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Zachary Turnerabdb8392015-11-16 22:40:30 +00001101 arch_passes = self.expectedArch(archs)
Zachary Turnere1eb5e32015-12-14 21:26:49 +00001102 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +00001103 swig_version_passes = (swig_version is None) or (not hasattr(lldb, 'swig_version')) or (check_expected_version(swig_version[0], swig_version[1], lldb.swig_version))
1104 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001105 remote_passes = (remote is None) or (remote == (lldb.remote_platform is not None))
Zachary Turnerabdb8392015-11-16 22:40:30 +00001106
1107 return (oslist_passes and
1108 compiler_passes and
1109 arch_passes and
1110 debug_info_passes and
1111 swig_version_passes and
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001112 py_version_passes and
1113 remote_passes)
Zachary Turnerba105702015-11-16 23:58:20 +00001114
1115 local_vars = locals()
1116 args = [x for x in inspect.getargspec(skipIf).args]
1117 arg_vals = [eval(x, globals(), local_vars) for x in args]
1118 args = [x for x in zip(args, arg_vals) if x[1] is not None]
1119 reasons = ['%s=%s' % (x, str(y)) for (x,y) in args]
1120 return skipTestIfFn(fn, bugnumber, skipReason='skipping because ' + ' && '.join(reasons))
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001121
1122def skipIfDebugInfo(bugnumber=None, debug_info=None):
1123 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1124
Greg Claytonedea2372015-10-07 20:01:13 +00001125def skipIfDWO(bugnumber=None):
1126 return skipIfDebugInfo(bugnumber, ["dwo"])
1127
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001128def skipIfDwarf(bugnumber=None):
1129 return skipIfDebugInfo(bugnumber, ["dwarf"])
1130
1131def skipIfDsym(bugnumber=None):
1132 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001133
1134def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1135 def skipTestIfFn_impl(func):
1136 @wraps(func)
1137 def wrapper(*args, **kwargs):
1138 from unittest2 import case
1139 self = args[0]
1140 if expected_fn(self):
1141 self.skipTest(skipReason)
1142 else:
1143 func(*args, **kwargs)
1144 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001145 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001146 return skipTestIfFn_impl(bugnumber)
1147 else:
1148 return skipTestIfFn_impl
1149
Daniel Maleabe230792013-01-24 23:52:09 +00001150def skipIfGcc(func):
1151 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1152 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001153 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001154 @wraps(func)
1155 def wrapper(*args, **kwargs):
1156 from unittest2 import case
1157 self = args[0]
1158 compiler = self.getCompiler()
1159 if "gcc" in compiler:
1160 self.skipTest("skipping because gcc is the test compiler")
1161 else:
1162 func(*args, **kwargs)
1163 return wrapper
1164
Matt Kopec0de53f02013-03-15 19:10:12 +00001165def skipIfIcc(func):
1166 """Decorate the item to skip tests that should be skipped if building with icc ."""
1167 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1168 raise Exception("@skipIfIcc can only be used to decorate a test method")
1169 @wraps(func)
1170 def wrapper(*args, **kwargs):
1171 from unittest2 import case
1172 self = args[0]
1173 compiler = self.getCompiler()
1174 if "icc" in compiler:
1175 self.skipTest("skipping because icc is the test compiler")
1176 else:
1177 func(*args, **kwargs)
1178 return wrapper
1179
Daniel Malea55faa402013-05-02 21:44:31 +00001180def skipIfi386(func):
1181 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1182 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1183 raise Exception("@skipIfi386 can only be used to decorate a test method")
1184 @wraps(func)
1185 def wrapper(*args, **kwargs):
1186 from unittest2 import case
1187 self = args[0]
1188 if "i386" == self.getArchitecture():
1189 self.skipTest("skipping because i386 is not a supported architecture")
1190 else:
1191 func(*args, **kwargs)
1192 return wrapper
1193
Pavel Labath090152b2015-08-20 11:37:19 +00001194def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001195 """Decorator to skip tests when the target is Android.
1196
1197 Arguments:
1198 api_levels - The API levels for which the test should be skipped. If
1199 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001200 arch - A sequence of architecture names specifying the architectures
1201 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001202 """
1203 def myImpl(func):
1204 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1205 raise Exception("@skipIfTargetAndroid can only be used to "
1206 "decorate a test method")
1207 @wraps(func)
1208 def wrapper(*args, **kwargs):
1209 from unittest2 import case
1210 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001211 if matchAndroid(api_levels, archs)(self):
1212 self.skipTest("skiped on Android target with API %d and architecture %s" %
1213 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001214 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001215 return wrapper
1216 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001217
Ilia Kd9953052015-03-12 07:19:41 +00001218def skipUnlessCompilerRt(func):
1219 """Decorate the item to skip tests if testing remotely."""
1220 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1221 raise Exception("@skipUnless can only be used to decorate a test method")
1222 @wraps(func)
1223 def wrapper(*args, **kwargs):
1224 from unittest2 import case
1225 import os.path
Enrico Granata55d99f02015-11-19 21:45:07 +00001226 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "llvm","projects","compiler-rt")
1227 print(compilerRtPath)
Ilia Kd9953052015-03-12 07:19:41 +00001228 if not os.path.exists(compilerRtPath):
1229 self = args[0]
1230 self.skipTest("skip if compiler-rt not found")
1231 else:
1232 func(*args, **kwargs)
1233 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001234
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001235class _PlatformContext(object):
1236 """Value object class which contains platform-specific options."""
1237
1238 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1239 self.shlib_environment_var = shlib_environment_var
1240 self.shlib_prefix = shlib_prefix
1241 self.shlib_extension = shlib_extension
1242
1243
Johnny Chena74bb0a2011-08-01 18:46:13 +00001244class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001245 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001246 Abstract base for performing lldb (see TestBase) or other generic tests (see
1247 BenchBase for one example). lldbtest.Base works with the test driver to
1248 accomplish things.
1249
Johnny Chen8334dad2010-10-22 23:15:46 +00001250 """
Enrico Granata5020f952012-10-24 21:42:49 +00001251
Enrico Granata19186272012-10-24 21:44:48 +00001252 # The concrete subclass should override this attribute.
1253 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001254
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001255 # Keep track of the old current working directory.
1256 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001257
Greg Clayton4570d3e2013-12-10 23:19:29 +00001258 @staticmethod
1259 def compute_mydir(test_file):
1260 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1261
1262 mydir = TestBase.compute_mydir(__file__)'''
1263 test_dir = os.path.dirname(test_file)
1264 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1265
Johnny Chenfb4264c2011-08-01 19:50:58 +00001266 def TraceOn(self):
1267 """Returns True if we are in trace mode (tracing detailed test execution)."""
1268 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001269
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001270 @classmethod
1271 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001272 """
1273 Python unittest framework class setup fixture.
1274 Do current directory manipulation.
1275 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001276 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001277 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001278 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001279
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001280 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001281 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001282
1283 # Change current working directory if ${LLDB_TEST} is defined.
1284 # See also dotest.py which sets up ${LLDB_TEST}.
1285 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001286 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001287 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001288 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001289 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1290
Vince Harron85d19652015-05-21 19:09:29 +00001291 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001292 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001293 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1294 try:
1295 cls.dir_lock.try_acquire()
1296 # write the class that owns the lock into the lock file
1297 cls.dir_lock.handle.write(cls.__name__)
1298 except IOError as ioerror:
1299 # nothing else should have this directory lock
1300 # wait here until we get a lock
1301 cls.dir_lock.acquire()
1302 # read the previous owner from the lock file
1303 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001304 print("LOCK ERROR: {} wants to lock '{}' but it is already locked by '{}'".format(cls.__name__, full_dir, lock_id), file=sys.stderr)
Vince Harron85d19652015-05-21 19:09:29 +00001305 raise ioerror
1306
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001307 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001308 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001309 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001310 elif getPlatform() in ("freebsd", "linux", "netbsd"):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001311 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001312 else:
1313 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001314
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001315 @classmethod
1316 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001317 """
1318 Python unittest framework class teardown fixture.
1319 Do class-wide cleanup.
1320 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001321
Zachary Turner742afdb2015-12-11 19:21:49 +00001322 if doCleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001323 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001324 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001325 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001326
Johnny Chen707b3c92010-10-11 22:25:46 +00001327 # Subclass might have specific cleanup function defined.
1328 if getattr(cls, "classCleanup", None):
1329 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001330 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001331 try:
1332 cls.classCleanup()
1333 except:
1334 exc_type, exc_value, exc_tb = sys.exc_info()
1335 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001336
Vince Harron85d19652015-05-21 19:09:29 +00001337 if debug_confirm_directory_exclusivity:
1338 cls.dir_lock.release()
1339 del cls.dir_lock
1340
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001341 # Restore old working directory.
1342 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001343 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001344 os.chdir(cls.oldcwd)
1345
Johnny Chena74bb0a2011-08-01 18:46:13 +00001346 @classmethod
1347 def skipLongRunningTest(cls):
1348 """
1349 By default, we skip long running test case.
1350 This can be overridden by passing '-l' to the test driver (dotest.py).
1351 """
1352 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1353 return False
1354 else:
1355 return True
Johnny Chened492022011-06-21 00:53:00 +00001356
Vince Harron6d3d0f12015-05-10 22:01:59 +00001357 def enableLogChannelsForCurrentTest(self):
1358 if len(lldbtest_config.channels) == 0:
1359 return
1360
1361 # if debug channels are specified in lldbtest_config.channels,
1362 # create a new set of log files for every test
1363 log_basename = self.getLogBasenameForCurrentTest()
1364
1365 # confirm that the file is writeable
1366 host_log_path = "{}-host.log".format(log_basename)
1367 open(host_log_path, 'w').close()
1368
1369 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1370 for channel_with_categories in lldbtest_config.channels:
1371 channel_then_categories = channel_with_categories.split(' ', 1)
1372 channel = channel_then_categories[0]
1373 if len(channel_then_categories) > 1:
1374 categories = channel_then_categories[1]
1375 else:
1376 categories = "default"
1377
1378 if channel == "gdb-remote":
1379 # communicate gdb-remote categories to debugserver
1380 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1381
1382 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1383 if not self.res.Succeeded():
1384 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1385
1386 # Communicate log path name to debugserver & lldb-server
1387 server_log_path = "{}-server.log".format(log_basename)
1388 open(server_log_path, 'w').close()
1389 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
1390
1391 # Communicate channels to lldb-server
1392 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
1393
1394 if len(lldbtest_config.channels) == 0:
1395 return
1396
1397 def disableLogChannelsForCurrentTest(self):
1398 # close all log files that we opened
1399 for channel_and_categories in lldbtest_config.channels:
1400 # channel format - <channel-name> [<category0> [<category1> ...]]
1401 channel = channel_and_categories.split(' ', 1)[0]
1402 self.ci.HandleCommand("log disable " + channel, self.res)
1403 if not self.res.Succeeded():
1404 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1405
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001406 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001407 """Fixture for unittest test case setup.
1408
1409 It works with the test driver to conditionally skip tests and does other
1410 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001411 #import traceback
1412 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001413
Daniel Malea9115f072013-08-06 15:02:32 +00001414 if "LIBCXX_PATH" in os.environ:
1415 self.libcxxPath = os.environ["LIBCXX_PATH"]
1416 else:
1417 self.libcxxPath = None
1418
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001419 if "LLDBMI_EXEC" in os.environ:
1420 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1421 else:
1422 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001423
Johnny Chenebe51722011-10-07 19:21:09 +00001424 # If we spawn an lldb process for test (via pexpect), do not load the
1425 # init file unless told otherwise.
1426 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1427 self.lldbOption = ""
1428 else:
1429 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001430
Johnny Chen985e7402011-08-01 21:13:26 +00001431 # Assign the test method name to self.testMethodName.
1432 #
1433 # For an example of the use of this attribute, look at test/types dir.
1434 # There are a bunch of test cases under test/types and we don't want the
1435 # module cacheing subsystem to be confused with executable name "a.out"
1436 # used for all the test cases.
1437 self.testMethodName = self._testMethodName
1438
Johnny Chen985e7402011-08-01 21:13:26 +00001439 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1440 # with it using pexpect.
1441 self.child = None
1442 self.child_prompt = "(lldb) "
1443 # If the child is interacting with the embedded script interpreter,
1444 # there are two exits required during tear down, first to quit the
1445 # embedded script interpreter and second to quit the lldb command
1446 # interpreter.
1447 self.child_in_script_interpreter = False
1448
Johnny Chenfb4264c2011-08-01 19:50:58 +00001449 # These are for customized teardown cleanup.
1450 self.dict = None
1451 self.doTearDownCleanup = False
1452 # And in rare cases where there are multiple teardown cleanups.
1453 self.dicts = []
1454 self.doTearDownCleanups = False
1455
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001456 # List of spawned subproces.Popen objects
1457 self.subprocesses = []
1458
Daniel Malea69207462013-06-05 21:07:02 +00001459 # List of forked process PIDs
1460 self.forkedProcessPids = []
1461
Johnny Chenfb4264c2011-08-01 19:50:58 +00001462 # Create a string buffer to record the session info, to be dumped into a
1463 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001464 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001465
Vince Harron1f160372015-05-21 18:51:20 +00001466 session_file = "{}.log".format(self.log_basename)
Zachary Turner8d13fab2015-11-07 01:08:15 +00001467 # Python 3 doesn't support unbuffered I/O in text mode. Open buffered.
1468 self.session = open(session_file, "w")
Johnny Chenfb4264c2011-08-01 19:50:58 +00001469
1470 # Optimistically set __errored__, __failed__, __expected__ to False
1471 # initially. If the test errored/failed, the session info
1472 # (self.session) is then dumped into a session specific file for
1473 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001474 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001475 self.__errored__ = False
1476 self.__failed__ = False
1477 self.__expected__ = False
1478 # We are also interested in unexpected success.
1479 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001480 # And skipped tests.
1481 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001482
1483 # See addTearDownHook(self, hook) which allows the client to add a hook
1484 # function to be run during tearDown() time.
1485 self.hooks = []
1486
1487 # See HideStdout(self).
1488 self.sys_stdout_hidden = False
1489
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001490 if self.platformContext:
1491 # set environment variable names for finding shared libraries
1492 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001493
Vince Harron6d3d0f12015-05-10 22:01:59 +00001494 # Create the debugger instance if necessary.
1495 try:
1496 self.dbg = lldb.DBG
1497 except AttributeError:
1498 self.dbg = lldb.SBDebugger.Create()
1499
1500 if not self.dbg:
1501 raise Exception('Invalid debugger instance')
1502
1503 # Retrieve the associated command interpreter instance.
1504 self.ci = self.dbg.GetCommandInterpreter()
1505 if not self.ci:
1506 raise Exception('Could not get the command interpreter')
1507
1508 # And the result object.
1509 self.res = lldb.SBCommandReturnObject()
1510
1511 self.enableLogChannelsForCurrentTest()
1512
Ying Chen0c352822015-11-16 23:41:02 +00001513 #Initialize debug_info
1514 self.debug_info = None
1515
Daniel Malea249287a2013-02-19 16:08:57 +00001516 def setAsync(self, value):
1517 """ Sets async mode to True/False and ensures it is reset after the testcase completes."""
1518 old_async = self.dbg.GetAsync()
1519 self.dbg.SetAsync(value)
1520 self.addTearDownHook(lambda: self.dbg.SetAsync(old_async))
1521
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001522 def cleanupSubprocesses(self):
1523 # Ensure any subprocesses are cleaned up
1524 for p in self.subprocesses:
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001525 p.terminate()
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001526 del p
1527 del self.subprocesses[:]
Daniel Malea69207462013-06-05 21:07:02 +00001528 # Ensure any forked processes are cleaned up
1529 for pid in self.forkedProcessPids:
1530 if os.path.exists("/proc/" + str(pid)):
1531 os.kill(pid, signal.SIGTERM)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001532
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001533 def spawnSubprocess(self, executable, args=[], install_remote=True):
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001534 """ Creates a subprocess.Popen object with the specified executable and arguments,
1535 saves it in self.subprocesses, and returns the object.
1536 NOTE: if using this function, ensure you also call:
1537
1538 self.addTearDownHook(self.cleanupSubprocesses)
1539
1540 otherwise the test suite will leak processes.
1541 """
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001542 proc = _RemoteProcess(install_remote) if lldb.remote_platform else _LocalProcess(self.TraceOn())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001543 proc.launch(executable, args)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001544 self.subprocesses.append(proc)
1545 return proc
1546
Daniel Malea69207462013-06-05 21:07:02 +00001547 def forkSubprocess(self, executable, args=[]):
1548 """ Fork a subprocess with its own group ID.
1549 NOTE: if using this function, ensure you also call:
1550
1551 self.addTearDownHook(self.cleanupSubprocesses)
1552
1553 otherwise the test suite will leak processes.
1554 """
1555 child_pid = os.fork()
1556 if child_pid == 0:
1557 # If more I/O support is required, this can be beefed up.
1558 fd = os.open(os.devnull, os.O_RDWR)
Daniel Malea69207462013-06-05 21:07:02 +00001559 os.dup2(fd, 1)
1560 os.dup2(fd, 2)
1561 # This call causes the child to have its of group ID
1562 os.setpgid(0,0)
1563 os.execvp(executable, [executable] + args)
1564 # Give the child time to get through the execvp() call
1565 time.sleep(0.1)
1566 self.forkedProcessPids.append(child_pid)
1567 return child_pid
1568
Johnny Chenfb4264c2011-08-01 19:50:58 +00001569 def HideStdout(self):
1570 """Hide output to stdout from the user.
1571
1572 During test execution, there might be cases where we don't want to show the
1573 standard output to the user. For example,
1574
Zachary Turner35d017f2015-10-23 17:04:29 +00001575 self.runCmd(r'''sc print("\n\n\tHello!\n")''')
Johnny Chenfb4264c2011-08-01 19:50:58 +00001576
1577 tests whether command abbreviation for 'script' works or not. There is no
1578 need to show the 'Hello' output to the user as long as the 'script' command
1579 succeeds and we are not in TraceOn() mode (see the '-t' option).
1580
1581 In this case, the test method calls self.HideStdout(self) to redirect the
1582 sys.stdout to a null device, and restores the sys.stdout upon teardown.
1583
1584 Note that you should only call this method at most once during a test case
1585 execution. Any subsequent call has no effect at all."""
1586 if self.sys_stdout_hidden:
1587 return
1588
1589 self.sys_stdout_hidden = True
1590 old_stdout = sys.stdout
1591 sys.stdout = open(os.devnull, 'w')
1592 def restore_stdout():
1593 sys.stdout = old_stdout
1594 self.addTearDownHook(restore_stdout)
1595
1596 # =======================================================================
1597 # Methods for customized teardown cleanups as well as execution of hooks.
1598 # =======================================================================
1599
1600 def setTearDownCleanup(self, dictionary=None):
1601 """Register a cleanup action at tearDown() time with a dictinary"""
1602 self.dict = dictionary
1603 self.doTearDownCleanup = True
1604
1605 def addTearDownCleanup(self, dictionary):
1606 """Add a cleanup action at tearDown() time with a dictinary"""
1607 self.dicts.append(dictionary)
1608 self.doTearDownCleanups = True
1609
1610 def addTearDownHook(self, hook):
1611 """
1612 Add a function to be run during tearDown() time.
1613
1614 Hooks are executed in a first come first serve manner.
1615 """
Zachary Turnercd236b82015-10-26 18:48:24 +00001616 if six.callable(hook):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001617 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001618 print("Adding tearDown hook:", getsource_if_available(hook), file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001619 self.hooks.append(hook)
Enrico Granataab0e8312014-11-05 21:31:57 +00001620
1621 return self
Johnny Chenfb4264c2011-08-01 19:50:58 +00001622
Jim Inghamda3a3862014-10-16 23:02:14 +00001623 def deletePexpectChild(self):
Johnny Chen985e7402011-08-01 21:13:26 +00001624 # This is for the case of directly spawning 'lldb' and interacting with it
1625 # using pexpect.
Johnny Chen985e7402011-08-01 21:13:26 +00001626 if self.child and self.child.isalive():
Zachary Turner9ef307b2014-07-22 16:19:29 +00001627 import pexpect
Johnny Chen985e7402011-08-01 21:13:26 +00001628 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001629 print("tearing down the child process....", file=sbuf)
Johnny Chen985e7402011-08-01 21:13:26 +00001630 try:
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001631 if self.child_in_script_interpreter:
1632 self.child.sendline('quit()')
1633 self.child.expect_exact(self.child_prompt)
1634 self.child.sendline('settings set interpreter.prompt-on-quit false')
1635 self.child.sendline('quit')
Johnny Chen985e7402011-08-01 21:13:26 +00001636 self.child.expect(pexpect.EOF)
Ilia K47448c22015-02-11 21:41:58 +00001637 except (ValueError, pexpect.ExceptionPexpect):
1638 # child is already terminated
1639 pass
1640 except OSError as exception:
1641 import errno
1642 if exception.errno != errno.EIO:
1643 # unexpected error
1644 raise
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001645 # child is already terminated
Johnny Chen985e7402011-08-01 21:13:26 +00001646 pass
Shawn Besteb3e9052014-11-06 17:52:15 +00001647 finally:
1648 # Give it one final blow to make sure the child is terminated.
1649 self.child.close()
Jim Inghamda3a3862014-10-16 23:02:14 +00001650
1651 def tearDown(self):
1652 """Fixture for unittest test case teardown."""
1653 #import traceback
1654 #traceback.print_stack()
1655
1656 self.deletePexpectChild()
1657
Johnny Chenfb4264c2011-08-01 19:50:58 +00001658 # Check and run any hook functions.
1659 for hook in reversed(self.hooks):
1660 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001661 print("Executing tearDown hook:", getsource_if_available(hook), file=sbuf)
Enrico Granataab0e8312014-11-05 21:31:57 +00001662 import inspect
1663 hook_argc = len(inspect.getargspec(hook).args)
Enrico Granata6e0566c2014-11-17 19:00:20 +00001664 if hook_argc == 0 or getattr(hook,'im_self',None):
Enrico Granataab0e8312014-11-05 21:31:57 +00001665 hook()
1666 elif hook_argc == 1:
1667 hook(self)
1668 else:
1669 hook() # try the plain call and hope it works
Johnny Chenfb4264c2011-08-01 19:50:58 +00001670
1671 del self.hooks
1672
1673 # Perform registered teardown cleanup.
1674 if doCleanup and self.doTearDownCleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00001675 self.cleanup(dictionary=self.dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001676
1677 # In rare cases where there are multiple teardown cleanups added.
1678 if doCleanup and self.doTearDownCleanups:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001679 if self.dicts:
1680 for dict in reversed(self.dicts):
Johnny Chen0fddfb22011-11-17 19:57:27 +00001681 self.cleanup(dictionary=dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001682
Vince Harron9753dd92015-05-10 15:22:09 +00001683 self.disableLogChannelsForCurrentTest()
1684
Johnny Chenfb4264c2011-08-01 19:50:58 +00001685 # =========================================================
1686 # Various callbacks to allow introspection of test progress
1687 # =========================================================
1688
1689 def markError(self):
1690 """Callback invoked when an error (unexpected exception) errored."""
1691 self.__errored__ = True
1692 with recording(self, False) as sbuf:
1693 # False because there's no need to write "ERROR" to the stderr twice.
1694 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001695 print("ERROR", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001696
Zachary Turnerb1490b62015-08-26 19:44:56 +00001697 def markCleanupError(self):
1698 """Callback invoked when an error occurs while a test is cleaning up."""
1699 self.__cleanup_errored__ = True
1700 with recording(self, False) as sbuf:
1701 # False because there's no need to write "CLEANUP_ERROR" to the stderr twice.
1702 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001703 print("CLEANUP_ERROR", file=sbuf)
Zachary Turnerb1490b62015-08-26 19:44:56 +00001704
Johnny Chenfb4264c2011-08-01 19:50:58 +00001705 def markFailure(self):
1706 """Callback invoked when a failure (test assertion failure) occurred."""
1707 self.__failed__ = True
1708 with recording(self, False) as sbuf:
1709 # False because there's no need to write "FAIL" to the stderr twice.
1710 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001711 print("FAIL", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001712
Enrico Granatae6cedc12013-02-23 01:05:23 +00001713 def markExpectedFailure(self,err,bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001714 """Callback invoked when an expected failure/error occurred."""
1715 self.__expected__ = True
1716 with recording(self, False) as sbuf:
1717 # False because there's no need to write "expected failure" to the
1718 # stderr twice.
1719 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001720 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001721 print("expected failure", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001722 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001723 print("expected failure (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001724
Johnny Chenc5cc6252011-08-15 23:09:08 +00001725 def markSkippedTest(self):
1726 """Callback invoked when a test is skipped."""
1727 self.__skipped__ = True
1728 with recording(self, False) as sbuf:
1729 # False because there's no need to write "skipped test" to the
1730 # stderr twice.
1731 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001732 print("skipped test", file=sbuf)
Johnny Chenc5cc6252011-08-15 23:09:08 +00001733
Enrico Granatae6cedc12013-02-23 01:05:23 +00001734 def markUnexpectedSuccess(self, bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001735 """Callback invoked when an unexpected success occurred."""
1736 self.__unexpected__ = True
1737 with recording(self, False) as sbuf:
1738 # False because there's no need to write "unexpected success" to the
1739 # stderr twice.
1740 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001741 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001742 print("unexpected success", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001743 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001744 print("unexpected success (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001745
Greg Clayton70995582015-01-07 22:25:50 +00001746 def getRerunArgs(self):
1747 return " -f %s.%s" % (self.__class__.__name__, self._testMethodName)
Vince Harron9753dd92015-05-10 15:22:09 +00001748
1749 def getLogBasenameForCurrentTest(self, prefix=None):
1750 """
1751 returns a partial path that can be used as the beginning of the name of multiple
1752 log files pertaining to this test
1753
1754 <session-dir>/<arch>-<compiler>-<test-file>.<test-class>.<test-method>
1755 """
1756 dname = os.path.join(os.environ["LLDB_TEST"],
1757 os.environ["LLDB_SESSION_DIRNAME"])
1758 if not os.path.isdir(dname):
1759 os.mkdir(dname)
1760
1761 compiler = self.getCompiler()
1762
1763 if compiler[1] == ':':
1764 compiler = compiler[2:]
Chaoren Lin636a0e32015-07-17 21:40:11 +00001765 if os.path.altsep is not None:
1766 compiler = compiler.replace(os.path.altsep, os.path.sep)
Vince Harron9753dd92015-05-10 15:22:09 +00001767
Vince Harron19e300f2015-05-12 00:50:54 +00001768 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), "_".join(compiler.split(os.path.sep)))
Vince Harron9753dd92015-05-10 15:22:09 +00001769 if len(fname) > 200:
Vince Harron19e300f2015-05-12 00:50:54 +00001770 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), compiler.split(os.path.sep)[-1])
Vince Harron9753dd92015-05-10 15:22:09 +00001771
1772 if prefix is not None:
1773 fname = "{}-{}".format(prefix, fname)
1774
1775 return os.path.join(dname, fname)
1776
Johnny Chenfb4264c2011-08-01 19:50:58 +00001777 def dumpSessionInfo(self):
1778 """
1779 Dump the debugger interactions leading to a test error/failure. This
1780 allows for more convenient postmortem analysis.
1781
1782 See also LLDBTestResult (dotest.py) which is a singlton class derived
1783 from TextTestResult and overwrites addError, addFailure, and
1784 addExpectedFailure methods to allow us to to mark the test instance as
1785 such.
1786 """
1787
1788 # We are here because self.tearDown() detected that this test instance
1789 # either errored or failed. The lldb.test_result singleton contains
1790 # two lists (erros and failures) which get populated by the unittest
1791 # framework. Look over there for stack trace information.
1792 #
1793 # The lists contain 2-tuples of TestCase instances and strings holding
1794 # formatted tracebacks.
1795 #
1796 # See http://docs.python.org/library/unittest.html#unittest.TestResult.
Vince Harron9753dd92015-05-10 15:22:09 +00001797
Vince Harron35b17dc2015-05-21 18:20:21 +00001798 # output tracebacks into session
Vince Harron9753dd92015-05-10 15:22:09 +00001799 pairs = []
Johnny Chenfb4264c2011-08-01 19:50:58 +00001800 if self.__errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001801 pairs = configuration.test_result.errors
Johnny Chenfb4264c2011-08-01 19:50:58 +00001802 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001803 elif self.__cleanup_errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001804 pairs = configuration.test_result.cleanup_errors
Zachary Turnerb1490b62015-08-26 19:44:56 +00001805 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001806 elif self.__failed__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001807 pairs = configuration.test_result.failures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001808 prefix = 'Failure'
1809 elif self.__expected__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001810 pairs = configuration.test_result.expectedFailures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001811 prefix = 'ExpectedFailure'
Johnny Chenc5cc6252011-08-15 23:09:08 +00001812 elif self.__skipped__:
1813 prefix = 'SkippedTest'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001814 elif self.__unexpected__:
Vince Harron35b17dc2015-05-21 18:20:21 +00001815 prefix = 'UnexpectedSuccess'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001816 else:
Vince Harron35b17dc2015-05-21 18:20:21 +00001817 prefix = 'Success'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001818
Johnny Chenc5cc6252011-08-15 23:09:08 +00001819 if not self.__unexpected__ and not self.__skipped__:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001820 for test, traceback in pairs:
1821 if test is self:
Zachary Turnerff890da2015-10-19 23:45:41 +00001822 print(traceback, file=self.session)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001823
Vince Harron35b17dc2015-05-21 18:20:21 +00001824 # put footer (timestamp/rerun instructions) into session
Johnny Chen8082a002011-08-11 00:16:28 +00001825 testMethod = getattr(self, self._testMethodName)
1826 if getattr(testMethod, "__benchmarks_test__", False):
1827 benchmarks = True
1828 else:
1829 benchmarks = False
1830
Vince Harron35b17dc2015-05-21 18:20:21 +00001831 import datetime
Zachary Turnerff890da2015-10-19 23:45:41 +00001832 print("Session info generated @", datetime.datetime.now().ctime(), file=self.session)
1833 print("To rerun this test, issue the following command from the 'test' directory:\n", file=self.session)
1834 print("./dotest.py %s -v %s %s" % (self.getRunOptions(),
Vince Harron35b17dc2015-05-21 18:20:21 +00001835 ('+b' if benchmarks else '-t'),
Zachary Turnerff890da2015-10-19 23:45:41 +00001836 self.getRerunArgs()), file=self.session)
Vince Harron35b17dc2015-05-21 18:20:21 +00001837 self.session.close()
1838 del self.session
1839
1840 # process the log files
Vince Harron1f160372015-05-21 18:51:20 +00001841 log_files_for_this_test = glob.glob(self.log_basename + "*")
Vince Harron35b17dc2015-05-21 18:20:21 +00001842
1843 if prefix != 'Success' or lldbtest_config.log_success:
1844 # keep all log files, rename them to include prefix
1845 dst_log_basename = self.getLogBasenameForCurrentTest(prefix)
1846 for src in log_files_for_this_test:
Zachary Turner306278f2015-05-26 20:26:29 +00001847 if os.path.isfile(src):
1848 dst = src.replace(self.log_basename, dst_log_basename)
1849 if os.name == "nt" and os.path.isfile(dst):
1850 # On Windows, renaming a -> b will throw an exception if b exists. On non-Windows platforms
1851 # it silently replaces the destination. Ultimately this means that atomic renames are not
1852 # guaranteed to be possible on Windows, but we need this to work anyway, so just remove the
1853 # destination first if it already exists.
1854 os.remove(dst)
Zachary Turner5de068b2015-05-26 19:52:24 +00001855
Zachary Turner306278f2015-05-26 20:26:29 +00001856 os.rename(src, dst)
Vince Harron35b17dc2015-05-21 18:20:21 +00001857 else:
1858 # success! (and we don't want log files) delete log files
1859 for log_file in log_files_for_this_test:
Adrian McCarthya7292042015-09-04 20:48:48 +00001860 try:
1861 os.unlink(log_file)
1862 except:
1863 # We've seen consistent unlink failures on Windows, perhaps because the
1864 # just-created log file is being scanned by anti-virus. Empirically, this
1865 # sleep-and-retry approach allows tests to succeed much more reliably.
1866 # Attempts to figure out exactly what process was still holding a file handle
1867 # have failed because running instrumentation like Process Monitor seems to
1868 # slow things down enough that the problem becomes much less consistent.
1869 time.sleep(0.5)
1870 os.unlink(log_file)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001871
1872 # ====================================================
1873 # Config. methods supported through a plugin interface
1874 # (enables reading of the current test configuration)
1875 # ====================================================
1876
1877 def getArchitecture(self):
1878 """Returns the architecture in effect the test suite is running with."""
1879 module = builder_module()
Ed Maste0f434e62015-04-06 15:50:48 +00001880 arch = module.getArchitecture()
1881 if arch == 'amd64':
1882 arch = 'x86_64'
1883 return arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001884
Vince Harron02613762015-05-04 00:17:53 +00001885 def getLldbArchitecture(self):
1886 """Returns the architecture of the lldb binary."""
1887 if not hasattr(self, 'lldbArchitecture'):
1888
1889 # spawn local process
1890 command = [
Vince Harron790d95c2015-05-18 19:39:03 +00001891 lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001892 "-o",
Vince Harron790d95c2015-05-18 19:39:03 +00001893 "file " + lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001894 "-o",
1895 "quit"
1896 ]
1897
1898 output = check_output(command)
1899 str = output.decode("utf-8");
1900
1901 for line in str.splitlines():
1902 m = re.search("Current executable set to '.*' \\((.*)\\)\\.", line)
1903 if m:
1904 self.lldbArchitecture = m.group(1)
1905 break
1906
1907 return self.lldbArchitecture
1908
Johnny Chenfb4264c2011-08-01 19:50:58 +00001909 def getCompiler(self):
1910 """Returns the compiler in effect the test suite is running with."""
1911 module = builder_module()
1912 return module.getCompiler()
1913
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001914 def getCompilerBinary(self):
1915 """Returns the compiler binary the test suite is running with."""
1916 return self.getCompiler().split()[0]
1917
Daniel Malea0aea0162013-02-27 17:29:46 +00001918 def getCompilerVersion(self):
1919 """ Returns a string that represents the compiler version.
1920 Supports: llvm, clang.
1921 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00001922 from .lldbutil import which
Daniel Malea0aea0162013-02-27 17:29:46 +00001923 version = 'unknown'
1924
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001925 compiler = self.getCompilerBinary()
Zachary Turner9ef307b2014-07-22 16:19:29 +00001926 version_output = system([[which(compiler), "-v"]])[1]
Daniel Malea0aea0162013-02-27 17:29:46 +00001927 for line in version_output.split(os.linesep):
Greg Clayton2a844b72013-03-06 02:34:51 +00001928 m = re.search('version ([0-9\.]+)', line)
Daniel Malea0aea0162013-02-27 17:29:46 +00001929 if m:
1930 version = m.group(1)
1931 return version
1932
Ryan Brown57bee1e2015-09-14 22:45:11 +00001933 def getGoCompilerVersion(self):
1934 """ Returns a string that represents the go compiler version, or None if go is not found.
1935 """
1936 compiler = which("go")
1937 if compiler:
1938 version_output = system([[compiler, "version"]])[0]
1939 for line in version_output.split(os.linesep):
1940 m = re.search('go version (devel|go\\S+)', line)
1941 if m:
1942 return m.group(1)
1943 return None
1944
Greg Claytone0d0a762015-04-02 18:24:03 +00001945 def platformIsDarwin(self):
1946 """Returns true if the OS triple for the selected platform is any valid apple OS"""
Robert Flackfb2f6c62015-04-17 08:02:18 +00001947 return platformIsDarwin()
Vince Harron20952cc2015-04-03 01:00:06 +00001948
Robert Flack13c7ad92015-03-30 14:12:17 +00001949 def getPlatform(self):
Robert Flackfb2f6c62015-04-17 08:02:18 +00001950 """Returns the target platform the test suite is running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001951 return getPlatform()
Robert Flack13c7ad92015-03-30 14:12:17 +00001952
Daniel Maleaadaaec92013-08-06 20:51:41 +00001953 def isIntelCompiler(self):
1954 """ Returns true if using an Intel (ICC) compiler, false otherwise. """
1955 return any([x in self.getCompiler() for x in ["icc", "icpc", "icl"]])
1956
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001957 def expectedCompilerVersion(self, compiler_version):
1958 """Returns True iff compiler_version[1] matches the current compiler version.
1959 Use compiler_version[0] to specify the operator used to determine if a match has occurred.
1960 Any operator other than the following defaults to an equality test:
1961 '>', '>=', "=>", '<', '<=', '=<', '!=', "!" or 'not'
1962 """
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001963 if (compiler_version == None):
1964 return True
1965 operator = str(compiler_version[0])
1966 version = compiler_version[1]
1967
1968 if (version == None):
1969 return True
1970 if (operator == '>'):
1971 return self.getCompilerVersion() > version
1972 if (operator == '>=' or operator == '=>'):
1973 return self.getCompilerVersion() >= version
1974 if (operator == '<'):
1975 return self.getCompilerVersion() < version
1976 if (operator == '<=' or operator == '=<'):
1977 return self.getCompilerVersion() <= version
1978 if (operator == '!=' or operator == '!' or operator == 'not'):
1979 return str(version) not in str(self.getCompilerVersion())
1980 return str(version) in str(self.getCompilerVersion())
1981
1982 def expectedCompiler(self, compilers):
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001983 """Returns True iff any element of compilers is a sub-string of the current compiler."""
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001984 if (compilers == None):
1985 return True
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001986
1987 for compiler in compilers:
1988 if compiler in self.getCompiler():
1989 return True
1990
1991 return False
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001992
Ying Chen7091c2c2015-04-21 01:15:47 +00001993 def expectedArch(self, archs):
1994 """Returns True iff any element of archs is a sub-string of the current architecture."""
1995 if (archs == None):
1996 return True
1997
1998 for arch in archs:
1999 if arch in self.getArchitecture():
2000 return True
2001
2002 return False
2003
Johnny Chenfb4264c2011-08-01 19:50:58 +00002004 def getRunOptions(self):
2005 """Command line option for -A and -C to run this test again, called from
2006 self.dumpSessionInfo()."""
2007 arch = self.getArchitecture()
2008 comp = self.getCompiler()
Johnny Chenb7bdd102011-08-24 19:48:51 +00002009 if arch:
2010 option_str = "-A " + arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00002011 else:
Johnny Chenb7bdd102011-08-24 19:48:51 +00002012 option_str = ""
2013 if comp:
Johnny Chen531c0852012-03-16 20:44:00 +00002014 option_str += " -C " + comp
Johnny Chenb7bdd102011-08-24 19:48:51 +00002015 return option_str
Johnny Chenfb4264c2011-08-01 19:50:58 +00002016
2017 # ==================================================
2018 # Build methods supported through a plugin interface
2019 # ==================================================
2020
Ed Mastec97323e2014-04-01 18:47:58 +00002021 def getstdlibFlag(self):
2022 """ Returns the proper -stdlib flag, or empty if not required."""
Robert Flack4629c4b2015-05-15 18:54:32 +00002023 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Ed Mastec97323e2014-04-01 18:47:58 +00002024 stdlibflag = "-stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002025 else: # this includes NetBSD
Ed Mastec97323e2014-04-01 18:47:58 +00002026 stdlibflag = ""
2027 return stdlibflag
2028
Matt Kopec7663b3a2013-09-25 17:44:00 +00002029 def getstdFlag(self):
2030 """ Returns the proper stdflag. """
Daniel Malea55faa402013-05-02 21:44:31 +00002031 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
Daniel Malea0b7c6112013-05-06 19:31:31 +00002032 stdflag = "-std=c++0x"
Daniel Malea55faa402013-05-02 21:44:31 +00002033 else:
2034 stdflag = "-std=c++11"
Matt Kopec7663b3a2013-09-25 17:44:00 +00002035 return stdflag
2036
2037 def buildDriver(self, sources, exe_name):
2038 """ Platform-specific way to build a program that links with LLDB (via the liblldb.so
2039 or LLDB.framework).
2040 """
2041
2042 stdflag = self.getstdFlag()
Ed Mastec97323e2014-04-01 18:47:58 +00002043 stdlibflag = self.getstdlibFlag()
Greg Clayton22fd3b12015-10-26 17:52:16 +00002044
2045 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002046 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002047 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Daniel Malea55faa402013-05-02 21:44:31 +00002048 d = {'CXX_SOURCES' : sources,
2049 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002050 'CFLAGS_EXTRAS' : "%s %s" % (stdflag, stdlibflag),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002051 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2052 'LD_EXTRAS' : "%s -Wl,-rpath,%s" % (dsym, lib_dir),
Daniel Malea55faa402013-05-02 21:44:31 +00002053 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002054 elif sys.platform.rstrip('0123456789') in ('freebsd', 'linux', 'netbsd') or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002055 d = {'CXX_SOURCES' : sources,
Daniel Malea55faa402013-05-02 21:44:31 +00002056 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002057 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002058 'LD_EXTRAS' : "-L%s -llldb" % lib_dir}
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002059 elif sys.platform.startswith('win'):
2060 d = {'CXX_SOURCES' : sources,
2061 'EXE' : exe_name,
2062 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002063 'LD_EXTRAS' : "-L%s -lliblldb" % os.environ["LLDB_IMPLIB_DIR"]}
Daniel Malea55faa402013-05-02 21:44:31 +00002064 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002065 print("Building LLDB Driver (%s) from sources %s" % (exe_name, sources))
Daniel Malea55faa402013-05-02 21:44:31 +00002066
2067 self.buildDefault(dictionary=d)
2068
Matt Kopec7663b3a2013-09-25 17:44:00 +00002069 def buildLibrary(self, sources, lib_name):
2070 """Platform specific way to build a default library. """
2071
2072 stdflag = self.getstdFlag()
2073
Greg Clayton22fd3b12015-10-26 17:52:16 +00002074 lib_dir = os.environ["LLDB_LIB_DIR"]
Robert Flack4629c4b2015-05-15 18:54:32 +00002075 if self.platformIsDarwin():
Greg Clayton22fd3b12015-10-26 17:52:16 +00002076 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Matt Kopec7663b3a2013-09-25 17:44:00 +00002077 d = {'DYLIB_CXX_SOURCES' : sources,
2078 'DYLIB_NAME' : lib_name,
2079 'CFLAGS_EXTRAS' : "%s -stdlib=libc++" % stdflag,
Greg Clayton22fd3b12015-10-26 17:52:16 +00002080 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2081 'LD_EXTRAS' : "%s -Wl,-rpath,%s -dynamiclib" % (dsym, lib_dir),
Matt Kopec7663b3a2013-09-25 17:44:00 +00002082 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002083 elif self.getPlatform() in ('freebsd', 'linux', 'netbsd') or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Matt Kopec7663b3a2013-09-25 17:44:00 +00002084 d = {'DYLIB_CXX_SOURCES' : sources,
2085 'DYLIB_NAME' : lib_name,
2086 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002087 'LD_EXTRAS' : "-shared -L%s -llldb" % lib_dir}
Robert Flack4629c4b2015-05-15 18:54:32 +00002088 elif self.getPlatform() == 'windows':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002089 d = {'DYLIB_CXX_SOURCES' : sources,
2090 'DYLIB_NAME' : lib_name,
2091 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002092 'LD_EXTRAS' : "-shared -l%s\liblldb.lib" % self.os.environ["LLDB_IMPLIB_DIR"]}
Matt Kopec7663b3a2013-09-25 17:44:00 +00002093 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002094 print("Building LLDB Library (%s) from sources %s" % (lib_name, sources))
Matt Kopec7663b3a2013-09-25 17:44:00 +00002095
2096 self.buildDefault(dictionary=d)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002097
Daniel Malea55faa402013-05-02 21:44:31 +00002098 def buildProgram(self, sources, exe_name):
2099 """ Platform specific way to build an executable from C/C++ sources. """
2100 d = {'CXX_SOURCES' : sources,
2101 'EXE' : exe_name}
2102 self.buildDefault(dictionary=d)
2103
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002104 def buildDefault(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002105 """Platform specific way to build the default binaries."""
2106 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002107 if target_is_android():
2108 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002109 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002110 raise Exception("Don't know how to build default binary")
2111
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002112 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002113 """Platform specific way to build binaries with dsym info."""
2114 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002115 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002116 raise Exception("Don't know how to build binary with dsym")
2117
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002118 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002119 """Platform specific way to build binaries with dwarf maps."""
2120 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002121 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002122 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002123 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002124 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002125
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002126 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2127 """Platform specific way to build binaries with dwarf maps."""
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002128 module = builder_module()
2129 if target_is_android():
2130 dictionary = append_android_envs(dictionary)
2131 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2132 raise Exception("Don't know how to build binary with dwo")
2133
Ryan Brown57bee1e2015-09-14 22:45:11 +00002134 def buildGo(self):
2135 """Build the default go binary.
2136 """
2137 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2138
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002139 def signBinary(self, binary_path):
2140 if sys.platform.startswith("darwin"):
2141 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2142 call(codesign_cmd, shell=True)
2143
Kuba Breckabeed8212014-09-04 01:03:18 +00002144 def findBuiltClang(self):
2145 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2146 paths_to_try = [
2147 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2148 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2149 "llvm-build/Release/x86_64/Release/bin/clang",
2150 "llvm-build/Debug/x86_64/Debug/bin/clang",
2151 ]
Enrico Granata55d99f02015-11-19 21:45:07 +00002152 lldb_root_path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")
Kuba Breckabeed8212014-09-04 01:03:18 +00002153 for p in paths_to_try:
2154 path = os.path.join(lldb_root_path, p)
2155 if os.path.exists(path):
2156 return path
Ilia Kd9953052015-03-12 07:19:41 +00002157
2158 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002159 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002160 if os.path.exists(path):
2161 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002162
2163 return os.environ["CC"]
2164
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002165 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002166 """ Returns a dictionary (which can be provided to build* functions above) which
2167 contains OS-specific build flags.
2168 """
2169 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002170 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002171
2172 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002173 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002174 use_libcxx = True
2175
2176 if use_libcxx and self.libcxxPath:
2177 cflags += "-stdlib=libc++ "
2178 if self.libcxxPath:
2179 libcxxInclude = os.path.join(self.libcxxPath, "include")
2180 libcxxLib = os.path.join(self.libcxxPath, "lib")
2181 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2182 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2183
Andrew Kaylor93132f52013-05-28 23:04:25 +00002184 if use_cpp11:
2185 cflags += "-std="
2186 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2187 cflags += "c++0x"
2188 else:
2189 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002190 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002191 cflags += " -stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002192 elif self.getPlatform() == "netbsd":
2193 cflags += " -stdlib=libstdc++"
Andrew Kaylor93132f52013-05-28 23:04:25 +00002194 elif "clang" in self.getCompiler():
2195 cflags += " -stdlib=libstdc++"
2196
Andrew Kaylor93132f52013-05-28 23:04:25 +00002197 return {'CFLAGS_EXTRAS' : cflags,
2198 'LD_EXTRAS' : ldflags,
2199 }
2200
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002201 def cleanup(self, dictionary=None):
2202 """Platform specific way to do cleanup after build."""
2203 module = builder_module()
2204 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002205 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002206
Daniel Malea55faa402013-05-02 21:44:31 +00002207 def getLLDBLibraryEnvVal(self):
2208 """ Returns the path that the OS-specific library search environment variable
2209 (self.dylibPath) should be set to in order for a program to find the LLDB
2210 library. If an environment variable named self.dylibPath is already set,
2211 the new path is appended to it and returned.
2212 """
2213 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002214 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002215 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002216 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002217 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002218 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002219 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002220 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002221
Ed Maste437f8f62013-09-09 14:04:04 +00002222 def getLibcPlusPlusLibs(self):
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002223 if self.getPlatform() in ('freebsd', 'linux', 'netbsd'):
Ed Maste437f8f62013-09-09 14:04:04 +00002224 return ['libc++.so.1']
2225 else:
2226 return ['libc++.1.dylib','libc++abi.dylib']
2227
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002228# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2229# We change the test methods to create a new test method for each test for each debug info we are
2230# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2231# the new test method we remove the old method at the same time.
2232class LLDBTestCaseFactory(type):
2233 def __new__(cls, name, bases, attrs):
2234 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002235 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002236 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002237 target_platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002238
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002239 # If any debug info categories were explicitly tagged, assume that list to be
2240 # authoritative. If none were specified, try with all debug info formats.
2241 all_dbginfo_categories = set(test_categories.debug_info_categories)
2242 categories = set(getattr(attrvalue, "categories", [])) & all_dbginfo_categories
2243 if not categories:
2244 categories = all_dbginfo_categories
2245
2246 supported_categories = [x for x in categories
2247 if test_categories.is_supported_on_platform(x, target_platform)]
Zachary Turner8a927c42015-12-14 22:58:16 +00002248 if "dsym" in supported_categories:
2249 @add_test_categories(["dsym"])
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002250 @wraps(attrvalue)
Zachary Turner8a927c42015-12-14 22:58:16 +00002251 def dsym_test_method(self, attrvalue=attrvalue):
2252 self.debug_info = "dsym"
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002253 return attrvalue(self)
Zachary Turner8a927c42015-12-14 22:58:16 +00002254 dsym_method_name = attrname + "_dsym"
2255 dsym_test_method.__name__ = dsym_method_name
2256 newattrs[dsym_method_name] = dsym_test_method
2257
2258 if "dwarf" in supported_categories:
2259 @add_test_categories(["dwarf"])
2260 @wraps(attrvalue)
2261 def dwarf_test_method(self, attrvalue=attrvalue):
2262 self.debug_info = "dwarf"
2263 return attrvalue(self)
2264 dwarf_method_name = attrname + "_dwarf"
2265 dwarf_test_method.__name__ = dwarf_method_name
2266 newattrs[dwarf_method_name] = dwarf_test_method
2267
2268 if "dwo" in supported_categories:
2269 @add_test_categories(["dwo"])
2270 @wraps(attrvalue)
2271 def dwo_test_method(self, attrvalue=attrvalue):
2272 self.debug_info = "dwo"
2273 return attrvalue(self)
2274 dwo_method_name = attrname + "_dwo"
2275 dwo_test_method.__name__ = dwo_method_name
2276 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002277 else:
2278 newattrs[attrname] = attrvalue
2279 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2280
Zachary Turner43a01e42015-10-20 21:06:05 +00002281# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2282@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002283class TestBase(Base):
2284 """
2285 This abstract base class is meant to be subclassed. It provides default
2286 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2287 among other things.
2288
2289 Important things for test class writers:
2290
2291 - Overwrite the mydir class attribute, otherwise your test class won't
2292 run. It specifies the relative directory to the top level 'test' so
2293 the test harness can change to the correct working directory before
2294 running your test.
2295
2296 - The setUp method sets up things to facilitate subsequent interactions
2297 with the debugger as part of the test. These include:
2298 - populate the test method name
2299 - create/get a debugger set with synchronous mode (self.dbg)
2300 - get the command interpreter from with the debugger (self.ci)
2301 - create a result object for use with the command interpreter
2302 (self.res)
2303 - plus other stuffs
2304
2305 - The tearDown method tries to perform some necessary cleanup on behalf
2306 of the test to return the debugger to a good state for the next test.
2307 These include:
2308 - execute any tearDown hooks registered by the test method with
2309 TestBase.addTearDownHook(); examples can be found in
2310 settings/TestSettings.py
2311 - kill the inferior process associated with each target, if any,
2312 and, then delete the target from the debugger's target list
2313 - perform build cleanup before running the next test method in the
2314 same test class; examples of registering for this service can be
2315 found in types/TestIntegerTypes.py with the call:
2316 - self.setTearDownCleanup(dictionary=d)
2317
2318 - Similarly setUpClass and tearDownClass perform classwise setup and
2319 teardown fixtures. The tearDownClass method invokes a default build
2320 cleanup for the entire test class; also, subclasses can implement the
2321 classmethod classCleanup(cls) to perform special class cleanup action.
2322
2323 - The instance methods runCmd and expect are used heavily by existing
2324 test cases to send a command to the command interpreter and to perform
2325 string/pattern matching on the output of such command execution. The
2326 expect method also provides a mode to peform string/pattern matching
2327 without running a command.
2328
2329 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2330 build the binaries used during a particular test scenario. A plugin
2331 should be provided for the sys.platform running the test suite. The
2332 Mac OS X implementation is located in plugins/darwin.py.
2333 """
2334
2335 # Maximum allowed attempts when launching the inferior process.
2336 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2337 maxLaunchCount = 3;
2338
2339 # Time to wait before the next launching attempt in second(s).
2340 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2341 timeWaitNextLaunch = 1.0;
2342
Enrico Granata165f8af2012-09-21 19:10:53 +00002343 # Returns the list of categories to which this test case belongs
2344 # by default, look for a ".categories" file, and read its contents
2345 # if no such file exists, traverse the hierarchy - we guarantee
2346 # a .categories to exist at the top level directory so we do not end up
2347 # looping endlessly - subclasses are free to define their own categories
2348 # in whatever way makes sense to them
2349 def getCategories(self):
2350 import inspect
2351 import os.path
2352 folder = inspect.getfile(self.__class__)
2353 folder = os.path.dirname(folder)
2354 while folder != '/':
2355 categories_file_name = os.path.join(folder,".categories")
2356 if os.path.exists(categories_file_name):
2357 categories_file = open(categories_file_name,'r')
2358 categories = categories_file.readline()
2359 categories_file.close()
2360 categories = str.replace(categories,'\n','')
2361 categories = str.replace(categories,'\r','')
2362 return categories.split(',')
2363 else:
2364 folder = os.path.dirname(folder)
2365 continue
2366
Johnny Chena74bb0a2011-08-01 18:46:13 +00002367 def setUp(self):
2368 #import traceback
2369 #traceback.print_stack()
2370
2371 # Works with the test driver to conditionally skip tests via decorators.
2372 Base.setUp(self)
2373
Johnny Chenf2b70232010-08-25 18:49:48 +00002374 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2375 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2376
Johnny Chen430eb762010-10-19 16:00:42 +00002377 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002378 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002379
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002380 # We want our debugger to be synchronous.
2381 self.dbg.SetAsync(False)
2382
2383 # Retrieve the associated command interpreter instance.
2384 self.ci = self.dbg.GetCommandInterpreter()
2385 if not self.ci:
2386 raise Exception('Could not get the command interpreter')
2387
2388 # And the result object.
2389 self.res = lldb.SBCommandReturnObject()
2390
Zachary Turner606e3a52015-12-08 01:15:30 +00002391 if lldb.remote_platform and configuration.lldb_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002392 remote_test_dir = lldbutil.join_remote_paths(
Zachary Turner606e3a52015-12-08 01:15:30 +00002393 configuration.lldb_platform_working_dir,
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002394 self.getArchitecture(),
2395 str(self.test_number),
2396 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002397 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002398 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002399 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002400
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002401 # This function removes all files from the current working directory while leaving
2402 # the directories in place. The cleaup is required to reduce the disk space required
2403 # by the test suit while leaving the directories untached is neccessary because
2404 # sub-directories might belong to an other test
2405 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002406 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002407 # TODO: Replace the heuristic to remove the files with a logic what collects the
2408 # list of files we have to remove during test runs.
2409 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002410 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002411 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002412 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002413 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002414
Greg Clayton35c91342014-11-17 18:40:27 +00002415 def registerSharedLibrariesWithTarget(self, target, shlibs):
2416 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2417
2418 Any modules in the target that have their remote install file specification set will
2419 get uploaded to the remote host. This function registers the local copies of the
2420 shared libraries with the target and sets their remote install locations so they will
2421 be uploaded when the target is run.
2422 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002423 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002424 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002425
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002426 shlib_environment_var = self.platformContext.shlib_environment_var
2427 shlib_prefix = self.platformContext.shlib_prefix
2428 shlib_extension = '.' + self.platformContext.shlib_extension
2429
2430 working_dir = self.get_process_working_directory()
2431 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2432 # Add any shared libraries to our target if remote so they get
2433 # uploaded into the working directory on the remote side
2434 for name in shlibs:
2435 # The path can be a full path to a shared library, or a make file name like "Foo" for
2436 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2437 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2438 # of the shared library accordingly
2439 if os.path.exists(name):
2440 local_shlib_path = name # name is the full path to the local shared library
2441 else:
2442 # Check relative names
2443 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2444 if not os.path.exists(local_shlib_path):
2445 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002446 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002447 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002448
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002449 # Make sure we found the local shared library in the above code
2450 self.assertTrue(os.path.exists(local_shlib_path))
2451
2452 # Add the shared library to our target
2453 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2454 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002455 # We must set the remote install location if we want the shared library
2456 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002457 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002458 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002459
2460 return environment
2461
Enrico Granata44818162012-10-24 01:23:57 +00002462 # utility methods that tests can use to access the current objects
2463 def target(self):
2464 if not self.dbg:
2465 raise Exception('Invalid debugger instance')
2466 return self.dbg.GetSelectedTarget()
2467
2468 def process(self):
2469 if not self.dbg:
2470 raise Exception('Invalid debugger instance')
2471 return self.dbg.GetSelectedTarget().GetProcess()
2472
2473 def thread(self):
2474 if not self.dbg:
2475 raise Exception('Invalid debugger instance')
2476 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2477
2478 def frame(self):
2479 if not self.dbg:
2480 raise Exception('Invalid debugger instance')
2481 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2482
Greg Claytonc6947512013-12-13 19:18:59 +00002483 def get_process_working_directory(self):
2484 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2485 if lldb.remote_platform:
2486 # Remote tests set the platform working directory up in TestBase.setUp()
2487 return lldb.remote_platform.GetWorkingDirectory()
2488 else:
2489 # local tests change directory into each test subdirectory
2490 return os.getcwd()
2491
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002492 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002493 #import traceback
2494 #traceback.print_stack()
2495
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002496 # Ensure all the references to SB objects have gone away so that we can
2497 # be sure that all test-specific resources have been freed before we
2498 # attempt to delete the targets.
2499 gc.collect()
2500
Johnny Chen3794ad92011-06-15 21:24:24 +00002501 # Delete the target(s) from the debugger as a general cleanup step.
2502 # This includes terminating the process for each target, if any.
2503 # We'd like to reuse the debugger for our next test without incurring
2504 # the initialization overhead.
2505 targets = []
2506 for target in self.dbg:
2507 if target:
2508 targets.append(target)
2509 process = target.GetProcess()
2510 if process:
2511 rc = self.invoke(process, "Kill")
2512 self.assertTrue(rc.Success(), PROCESS_KILLED)
2513 for target in targets:
2514 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002515
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002516 # Do this last, to make sure it's in reverse order from how we setup.
2517 Base.tearDown(self)
2518
Zachary Turner95812042015-03-26 18:54:21 +00002519 # This must be the last statement, otherwise teardown hooks or other
2520 # lines might depend on this still being active.
2521 del self.dbg
2522
Johnny Chen86268e42011-09-30 21:48:35 +00002523 def switch_to_thread_with_stop_reason(self, stop_reason):
2524 """
2525 Run the 'thread list' command, and select the thread with stop reason as
2526 'stop_reason'. If no such thread exists, no select action is done.
2527 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002528 from .lldbutil import stop_reason_to_str
Johnny Chen86268e42011-09-30 21:48:35 +00002529 self.runCmd('thread list')
2530 output = self.res.GetOutput()
2531 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2532 stop_reason_to_str(stop_reason))
2533 for line in output.splitlines():
2534 matched = thread_line_pattern.match(line)
2535 if matched:
2536 self.runCmd('thread select %s' % matched.group(1))
2537
Enrico Granata7594f142013-06-17 22:51:50 +00002538 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002539 """
2540 Ask the command interpreter to handle the command and then check its
2541 return status.
2542 """
2543 # Fail fast if 'cmd' is not meaningful.
2544 if not cmd or len(cmd) == 0:
2545 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002546
Johnny Chen8d55a342010-08-31 17:42:54 +00002547 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002548
Daniel Maleae0f8f572013-08-26 23:57:52 +00002549 if cmd.startswith("target create "):
2550 cmd = cmd.replace("target create ", "file ")
Daniel Maleae0f8f572013-08-26 23:57:52 +00002551
Johnny Chen63dfb272010-09-01 00:15:19 +00002552 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002553
Johnny Chen63dfb272010-09-01 00:15:19 +00002554 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002555 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002556
Johnny Chen150c3cc2010-10-15 01:18:29 +00002557 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002558 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002559 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002560 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002561 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002562 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002563 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002564 print("runCmd failed!", file=sbuf)
2565 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002566
Johnny Chenff3d01d2010-08-20 21:03:09 +00002567 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002568 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002569 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002570 # For process launch, wait some time before possible next try.
2571 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002572 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002573 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002574
Johnny Chen27f212d2010-08-19 23:26:59 +00002575 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002576 self.assertTrue(self.res.Succeeded(),
2577 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002578
Jim Ingham63dfc722012-09-22 00:05:11 +00002579 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2580 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2581
2582 Otherwise, all the arguments have the same meanings as for the expect function"""
2583
2584 trace = (True if traceAlways else trace)
2585
2586 if exe:
2587 # First run the command. If we are expecting error, set check=False.
2588 # Pass the assert message along since it provides more semantic info.
2589 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2590
2591 # Then compare the output against expected strings.
2592 output = self.res.GetError() if error else self.res.GetOutput()
2593
2594 # If error is True, the API client expects the command to fail!
2595 if error:
2596 self.assertFalse(self.res.Succeeded(),
2597 "Command '" + str + "' is expected to fail!")
2598 else:
2599 # No execution required, just compare str against the golden input.
2600 output = str
2601 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002602 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002603
2604 # The heading says either "Expecting" or "Not expecting".
2605 heading = "Expecting" if matching else "Not expecting"
2606
2607 for pattern in patterns:
2608 # Match Objects always have a boolean value of True.
2609 match_object = re.search(pattern, output)
2610 matched = bool(match_object)
2611 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002612 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2613 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002614 if matched:
2615 break
2616
2617 self.assertTrue(matched if matching else not matched,
2618 msg if msg else EXP_MSG(str, exe))
2619
2620 return match_object
2621
Enrico Granata7594f142013-06-17 22:51:50 +00002622 def expect(self, str, msg=None, patterns=None, startstr=None, endstr=None, substrs=None, trace=False, error=False, matching=True, exe=True, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002623 """
2624 Similar to runCmd; with additional expect style output matching ability.
2625
2626 Ask the command interpreter to handle the command and then check its
2627 return status. The 'msg' parameter specifies an informational assert
2628 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002629 'startstr', matches the substrings contained in 'substrs', and regexp
2630 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002631
2632 If the keyword argument error is set to True, it signifies that the API
2633 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002634 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002635 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002636
2637 If the keyword argument matching is set to False, it signifies that the API
2638 client is expecting the output of the command not to match the golden
2639 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002640
2641 Finally, the required argument 'str' represents the lldb command to be
2642 sent to the command interpreter. In case the keyword argument 'exe' is
2643 set to False, the 'str' is treated as a string to be matched/not-matched
2644 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002645 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002646 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002647
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002648 if exe:
2649 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002650 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002651 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002652
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002653 # Then compare the output against expected strings.
2654 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002655
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002656 # If error is True, the API client expects the command to fail!
2657 if error:
2658 self.assertFalse(self.res.Succeeded(),
2659 "Command '" + str + "' is expected to fail!")
2660 else:
2661 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002662 if isinstance(str,lldb.SBCommandReturnObject):
2663 output = str.GetOutput()
2664 else:
2665 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002666 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002667 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002668
Johnny Chenea88e942010-09-21 21:08:53 +00002669 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002670 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002671
2672 # Start from the startstr, if specified.
2673 # If there's no startstr, set the initial state appropriately.
2674 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002675
Johnny Chen150c3cc2010-10-15 01:18:29 +00002676 if startstr:
2677 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002678 print("%s start string: %s" % (heading, startstr), file=sbuf)
2679 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002680
Johnny Chen86268e42011-09-30 21:48:35 +00002681 # Look for endstr, if specified.
2682 keepgoing = matched if matching else not matched
2683 if endstr:
2684 matched = output.endswith(endstr)
2685 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002686 print("%s end string: %s" % (heading, endstr), file=sbuf)
2687 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002688
Johnny Chenea88e942010-09-21 21:08:53 +00002689 # Look for sub strings, if specified.
2690 keepgoing = matched if matching else not matched
2691 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002692 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002693 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002694 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002695 print("%s sub string: %s" % (heading, str), file=sbuf)
2696 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002697 keepgoing = matched if matching else not matched
2698 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002699 break
2700
Johnny Chenea88e942010-09-21 21:08:53 +00002701 # Search for regular expression patterns, if specified.
2702 keepgoing = matched if matching else not matched
2703 if patterns and keepgoing:
2704 for pattern in patterns:
2705 # Match Objects always have a boolean value of True.
2706 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002707 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002708 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2709 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002710 keepgoing = matched if matching else not matched
2711 if not keepgoing:
2712 break
Johnny Chenea88e942010-09-21 21:08:53 +00002713
2714 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002715 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002716
Johnny Chenf3c59232010-08-25 22:52:45 +00002717 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002718 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002719 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002720
2721 method = getattr(obj, name)
2722 import inspect
2723 self.assertTrue(inspect.ismethod(method),
2724 name + "is a method name of object: " + str(obj))
2725 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002726 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002727 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002728 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002729
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002730 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2731 """Platform specific way to build the default binaries."""
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002732 module = builder_module()
2733 if target_is_android():
2734 dictionary = append_android_envs(dictionary)
2735 if self.debug_info is None:
2736 return self.buildDefault(architecture, compiler, dictionary, clean)
2737 elif self.debug_info == "dsym":
2738 return self.buildDsym(architecture, compiler, dictionary, clean)
2739 elif self.debug_info == "dwarf":
2740 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002741 elif self.debug_info == "dwo":
2742 return self.buildDwo(architecture, compiler, dictionary, clean)
2743 else:
2744 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002745
Johnny Chenf359cf22011-05-27 23:36:52 +00002746 # =================================================
2747 # Misc. helper methods for debugging test execution
2748 # =================================================
2749
Johnny Chen56b92a72011-07-11 19:15:11 +00002750 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002751 """Debug print a SBValue object, if traceAlways is True."""
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002752 from .lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002753
Johnny Chen8d55a342010-08-31 17:42:54 +00002754 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002755 return
2756
2757 err = sys.stderr
2758 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002759 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2760 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2761 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2762 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2763 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2764 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2765 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2766 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2767 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002768
Johnny Chen36c5eb12011-08-05 20:17:27 +00002769 def DebugSBType(self, type):
2770 """Debug print a SBType object, if traceAlways is True."""
2771 if not traceAlways:
2772 return
2773
2774 err = sys.stderr
2775 err.write(type.GetName() + ":\n")
2776 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2777 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2778 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2779
Johnny Chenb877f1e2011-03-12 01:18:19 +00002780 def DebugPExpect(self, child):
2781 """Debug the spwaned pexpect object."""
2782 if not traceAlways:
2783 return
2784
Zachary Turnerff890da2015-10-19 23:45:41 +00002785 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002786
2787 @classmethod
2788 def RemoveTempFile(cls, file):
2789 if os.path.exists(file):
2790 os.remove(file)