blob: e1403c1902ec9f94b6423817ec0d2e39ae2cf76d [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
Vince Harron85d19652015-05-21 19:09:29 +000066# dosep.py starts lots and lots of dotest instances
67# This option helps you find if two (or more) dotest instances are using the same
68# directory at the same time
69# Enable it to cause test failures and stderr messages if dotest instances try to run in
70# the same directory simultaneously
71# it is disabled by default because it litters the test directories with ".dirlock" files
72debug_confirm_directory_exclusivity = False
73
Johnny Chen707b3c92010-10-11 22:25:46 +000074# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000075# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000076
77# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000078if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
79 traceAlways = True
80else:
81 traceAlways = False
82
Johnny Chen707b3c92010-10-11 22:25:46 +000083# By default, doCleanup is True.
84if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
85 doCleanup = False
86else:
87 doCleanup = True
88
Johnny Chen8d55a342010-08-31 17:42:54 +000089
Johnny Chen00778092010-08-09 22:01:17 +000090#
91# Some commonly used assert messages.
92#
93
Johnny Chenaa902922010-09-17 22:45:27 +000094COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
95
Johnny Chen00778092010-08-09 22:01:17 +000096CURRENT_EXECUTABLE_SET = "Current executable set successfully"
97
Johnny Chen7d1d7532010-09-02 21:23:12 +000098PROCESS_IS_VALID = "Process is valid"
99
100PROCESS_KILLED = "Process is killed successfully"
101
Johnny Chend5f66fc2010-12-23 01:12:19 +0000102PROCESS_EXITED = "Process exited successfully"
103
104PROCESS_STOPPED = "Process status should be stopped"
105
Sean Callanan05834cd2015-07-01 23:56:30 +0000106RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000107
Johnny Chen17941842010-08-09 23:44:24 +0000108RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000109
Johnny Chen67af43f2010-10-05 19:27:32 +0000110BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
111
Johnny Chen17941842010-08-09 23:44:24 +0000112BREAKPOINT_CREATED = "Breakpoint created successfully"
113
Johnny Chenf10af382010-12-04 00:07:24 +0000114BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
115
Johnny Chene76896c2010-08-17 21:33:31 +0000116BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
117
Johnny Chen17941842010-08-09 23:44:24 +0000118BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000119
Johnny Chen703dbd02010-09-30 17:06:24 +0000120BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
121
Johnny Chen164f1e12010-10-15 18:07:09 +0000122BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
123
Greg Clayton5db6b792012-10-24 18:24:14 +0000124MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
125
Johnny Chen89109ed12011-06-27 20:05:23 +0000126OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
127
Johnny Chen5b3a3572010-12-09 18:22:12 +0000128SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
129
Johnny Chenc70b02a2010-09-22 23:00:20 +0000130STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
131
Johnny Chen1691a162011-04-15 16:44:48 +0000132STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
133
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000134STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
135
Johnny Chen5d6c4642010-11-10 23:46:38 +0000136STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000137
Johnny Chen5d6c4642010-11-10 23:46:38 +0000138STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
139 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000140
Johnny Chen2e431ce2010-10-20 18:38:48 +0000141STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
142
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000143STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
144
Johnny Chenc066ab42010-10-14 01:22:03 +0000145STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
146
Johnny Chen00778092010-08-09 22:01:17 +0000147STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
148
Johnny Chenf68cc122011-09-15 21:09:59 +0000149STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
150
Johnny Chen3c884a02010-08-24 22:07:56 +0000151DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
152
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000153VALID_BREAKPOINT = "Got a valid breakpoint"
154
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000155VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
156
Johnny Chen7209d84f2011-05-06 23:26:12 +0000157VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
158
Johnny Chen5ee88192010-08-27 23:47:36 +0000159VALID_FILESPEC = "Got a valid filespec"
160
Johnny Chen025d1b82010-12-08 01:25:21 +0000161VALID_MODULE = "Got a valid module"
162
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000163VALID_PROCESS = "Got a valid process"
164
Johnny Chen025d1b82010-12-08 01:25:21 +0000165VALID_SYMBOL = "Got a valid symbol"
166
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000167VALID_TARGET = "Got a valid target"
168
Matthew Gardinerc928de32014-10-22 07:22:56 +0000169VALID_PLATFORM = "Got a valid platform"
170
Johnny Chen15f247a2012-02-03 20:43:00 +0000171VALID_TYPE = "Got a valid type"
172
Johnny Chen5819ab42011-07-15 22:28:10 +0000173VALID_VARIABLE = "Got a valid variable"
174
Johnny Chen981463d2010-08-25 19:00:04 +0000175VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000176
Johnny Chenf68cc122011-09-15 21:09:59 +0000177WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000178
Sean Callanan05834cd2015-07-01 23:56:30 +0000179def CMD_MSG(str):
180 '''A generic "Command '%s' returns successfully" message generator.'''
181 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000182
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000183def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000184 '''A generic message generator for the completion mechanism.'''
185 return "'%s' successfully completes to '%s'" % (str_before, str_after)
186
Johnny Chenc0c67f22010-11-09 18:42:22 +0000187def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000188 '''A generic "'%s' returns expected result" message generator if exe.
189 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000190 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000191
Johnny Chen3343f042010-10-19 19:11:38 +0000192def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000193 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000194 return "Value of setting '%s' is correct" % setting
195
Johnny Chen27c41232010-08-26 21:49:29 +0000196def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000197 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000198 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000199
Johnny Chen47ceb032010-10-11 23:52:19 +0000200def line_number(filename, string_to_match):
201 """Helper function to return the line number of the first matched string."""
202 with open(filename, 'r') as f:
203 for i, line in enumerate(f):
204 if line.find(string_to_match) != -1:
205 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000206 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000207 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000208
Johnny Chen67af43f2010-10-05 19:27:32 +0000209def pointer_size():
210 """Return the pointer size of the host system."""
211 import ctypes
212 a_pointer = ctypes.c_void_p(0xffff)
213 return 8 * ctypes.sizeof(a_pointer)
214
Johnny Chen57816732012-02-09 02:01:59 +0000215def is_exe(fpath):
216 """Returns true if fpath is an executable."""
217 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
218
219def which(program):
220 """Returns the full path to a program; None otherwise."""
221 fpath, fname = os.path.split(program)
222 if fpath:
223 if is_exe(program):
224 return program
225 else:
226 for path in os.environ["PATH"].split(os.pathsep):
227 exe_file = os.path.join(path, program)
228 if is_exe(exe_file):
229 return exe_file
230 return None
231
Zachary Turner814236d2015-10-21 17:48:52 +0000232class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000233 """
234 A nice little context manager for recording the debugger interactions into
235 our session object. If trace flag is ON, it also emits the interactions
236 into the stderr.
237 """
238 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000239 """Create a SixStringIO instance; record the session obj and trace flag."""
240 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000241 # The test might not have undergone the 'setUp(self)' phase yet, so that
242 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000243 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000244 self.trace = trace
245
246 def __enter__(self):
247 """
248 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000249 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000250 """
251 return self
252
253 def __exit__(self, type, value, tb):
254 """
255 Context management protocol on exit from the body of the with statement.
256 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000257 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000258 """
259 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000260 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000261 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000262 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000263 self.close()
264
Zachary Turner43a01e42015-10-20 21:06:05 +0000265@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000266class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000267
268 @abc.abstractproperty
269 def pid(self):
270 """Returns process PID if has been launched already."""
271
272 @abc.abstractmethod
273 def launch(self, executable, args):
274 """Launches new process with given executable and args."""
275
276 @abc.abstractmethod
277 def terminate(self):
278 """Terminates previously launched process.."""
279
280class _LocalProcess(_BaseProcess):
281
282 def __init__(self, trace_on):
283 self._proc = None
284 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000285 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000286
287 @property
288 def pid(self):
289 return self._proc.pid
290
291 def launch(self, executable, args):
292 self._proc = Popen([executable] + args,
293 stdout = open(os.devnull) if not self._trace_on else None,
294 stdin = PIPE)
295
296 def terminate(self):
297 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000298 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000299 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
300 for sig in signals_to_try:
301 try:
302 self._proc.send_signal(getattr(signal, sig))
303 time.sleep(self._delayafterterminate)
304 if self._proc.poll() != None:
305 return
306 except ValueError:
307 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000308 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000309 time.sleep(self._delayafterterminate)
310 if self._proc.poll() != None:
311 return
312 self._proc.kill()
313 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000314
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000315 def poll(self):
316 return self._proc.poll()
317
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000318class _RemoteProcess(_BaseProcess):
319
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000320 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000321 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000322 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000323
324 @property
325 def pid(self):
326 return self._pid
327
328 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000329 if self._install_remote:
330 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000331 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000332
333 dst_file_spec = lldb.SBFileSpec(dst_path, False)
334 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
335 if err.Fail():
336 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
337 else:
338 dst_path = executable
339 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000340
341 launch_info = lldb.SBLaunchInfo(args)
342 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000343 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000344
345 # Redirect stdout and stderr to /dev/null
346 launch_info.AddSuppressFileAction(1, False, True)
347 launch_info.AddSuppressFileAction(2, False, True)
348
349 err = lldb.remote_platform.Launch(launch_info)
350 if err.Fail():
351 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
352 self._pid = launch_info.GetProcessID()
353
354 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000355 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000356
Johnny Chen690fcef2010-10-15 23:55:05 +0000357# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000358# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000359def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000360 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000361
362 If the exit code was non-zero it raises a CalledProcessError. The
363 CalledProcessError object will have the return code in the returncode
364 attribute and output in the output attribute.
365
366 The arguments are the same as for the Popen constructor. Example:
367
368 >>> check_output(["ls", "-l", "/dev/null"])
369 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
370
371 The stdout argument is not allowed as it is used internally.
372 To capture standard error in the result, use stderr=STDOUT.
373
374 >>> check_output(["/bin/sh", "-c",
375 ... "ls -l non_existent_file ; exit 0"],
376 ... stderr=STDOUT)
377 'ls: non_existent_file: No such file or directory\n'
378 """
379
380 # Assign the sender object to variable 'test' and remove it from kwargs.
381 test = kwargs.pop('sender', None)
382
Zachary Turner9ef307b2014-07-22 16:19:29 +0000383 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
384 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000385 output = ""
386 error = ""
387 for shellCommand in commandList:
388 if 'stdout' in kwargs:
389 raise ValueError('stdout argument not allowed, it will be overridden.')
390 if 'shell' in kwargs and kwargs['shell']==False:
391 raise ValueError('shell=False not allowed')
Zachary Turner48ef8d4c2015-11-18 18:40:16 +0000392 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, universal_newlines=True, **kwargs)
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000393 pid = process.pid
394 this_output, this_error = process.communicate()
395 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000396
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000397 # Enable trace on failure return while tracking down FreeBSD buildbot issues
398 trace = traceAlways
399 if not trace and retcode and sys.platform.startswith("freebsd"):
400 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000401
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000402 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000403 print(file=sbuf)
404 print("os command:", shellCommand, file=sbuf)
405 print("with pid:", pid, file=sbuf)
406 print("stdout:", this_output, file=sbuf)
407 print("stderr:", this_error, file=sbuf)
408 print("retcode:", retcode, file=sbuf)
409 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000410
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000411 if retcode:
412 cmd = kwargs.get("args")
413 if cmd is None:
414 cmd = shellCommand
415 raise CalledProcessError(retcode, cmd)
416 output = output + this_output
417 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000418 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000419
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000420def getsource_if_available(obj):
421 """
422 Return the text of the source code for an object if available. Otherwise,
423 a print representation is returned.
424 """
425 import inspect
426 try:
427 return inspect.getsource(obj)
428 except:
429 return repr(obj)
430
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000431def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000432 if sys.platform.startswith("freebsd"):
433 return __import__("builder_freebsd")
Kamil Rytarowski0b655da2015-12-05 18:46:56 +0000434 if sys.platform.startswith("netbsd"):
435 return __import__("builder_netbsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000436 return __import__("builder_" + sys.platform)
437
Siva Chandra8af91662015-06-05 00:22:49 +0000438def run_adb_command(cmd, device_id):
439 device_id_args = []
440 if device_id:
441 device_id_args = ["-s", device_id]
442 full_cmd = ["adb"] + device_id_args + cmd
443 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
444 stdout, stderr = p.communicate()
445 return p.returncode, stdout, stderr
446
Chaoren Line9bbabc2015-07-18 00:37:55 +0000447def append_android_envs(dictionary):
448 if dictionary is None:
449 dictionary = {}
450 dictionary["OS"] = "Android"
451 if android_device_api() >= 16:
452 dictionary["PIE"] = 1
453 return dictionary
454
Chaoren Lin9070f532015-07-17 22:13:29 +0000455def target_is_android():
456 if not hasattr(target_is_android, 'result'):
457 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
458 match = re.match(".*-.*-.*-android", triple)
459 target_is_android.result = match is not None
460 return target_is_android.result
461
Siva Chandra8af91662015-06-05 00:22:49 +0000462def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000463 if not hasattr(android_device_api, 'result'):
Zachary Turner606e3a52015-12-08 01:15:30 +0000464 assert configuration.lldb_platform_url is not None
Chaoren Lin9070f532015-07-17 22:13:29 +0000465 device_id = None
Zachary Turner606e3a52015-12-08 01:15:30 +0000466 parsed_url = urlparse.urlparse(configuration.lldb_platform_url)
Ying Chenca922bb2015-11-18 19:03:20 +0000467 host_name = parsed_url.netloc.split(":")[0]
468 if host_name != 'localhost':
469 device_id = host_name
470 if device_id.startswith('[') and device_id.endswith(']'):
471 device_id = device_id[1:-1]
Chaoren Lin9070f532015-07-17 22:13:29 +0000472 retcode, stdout, stderr = run_adb_command(
473 ["shell", "getprop", "ro.build.version.sdk"], device_id)
474 if retcode == 0:
475 android_device_api.result = int(stdout)
476 else:
477 raise LookupError(
478 ">>> Unable to determine the API level of the Android device.\n"
479 ">>> stdout:\n%s\n"
480 ">>> stderr:\n%s\n" % (stdout, stderr))
481 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000482
Zachary Turnerabdb8392015-11-16 22:40:30 +0000483def check_expected_version(comparison, expected, actual):
484 def fn_leq(x,y): return x <= y
485 def fn_less(x,y): return x < y
486 def fn_geq(x,y): return x >= y
487 def fn_greater(x,y): return x > y
488 def fn_eq(x,y): return x == y
489 def fn_neq(x,y): return x != y
490
491 op_lookup = {
492 "==": fn_eq,
493 "=": fn_eq,
494 "!=": fn_neq,
495 "<>": fn_neq,
496 ">": fn_greater,
497 "<": fn_less,
498 ">=": fn_geq,
499 "<=": fn_leq
500 }
501 expected_str = '.'.join([str(x) for x in expected])
502 actual_str = '.'.join([str(x) for x in actual])
503
504 return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
505
Johnny Chena74bb0a2011-08-01 18:46:13 +0000506#
507# Decorators for categorizing test cases.
508#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000509from functools import wraps
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000510def add_test_categories(cat):
511 """Decorate an item with test categories"""
512 cat = test_categories.validate(cat, True)
513 def impl(func):
514 func.getCategories = lambda test: cat
515 return func
516 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000517
Johnny Chena74bb0a2011-08-01 18:46:13 +0000518def benchmarks_test(func):
519 """Decorate the item as a benchmarks test."""
520 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
521 raise Exception("@benchmarks_test can only be used to decorate a test method")
522 @wraps(func)
523 def wrapper(self, *args, **kwargs):
Zachary Turneraad25fb2015-12-08 18:36:05 +0000524 self.skipTest("benchmarks test")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000525 return func(self, *args, **kwargs)
526
527 # Mark this function as such to separate them from the regular tests.
528 wrapper.__benchmarks_test__ = True
529 return wrapper
530
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000531def no_debug_info_test(func):
532 """Decorate the item as a test what don't use any debug info. If this annotation is specified
533 then the test runner won't generate a separate test for each debug info format. """
534 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
535 raise Exception("@no_debug_info_test can only be used to decorate a test method")
536 @wraps(func)
537 def wrapper(self, *args, **kwargs):
538 return func(self, *args, **kwargs)
539
540 # Mark this function as such to separate them from the regular tests.
541 wrapper.__no_debug_info_test__ = True
542 return wrapper
543
Johnny Chenf1548d42012-04-06 00:56:05 +0000544def dsym_test(func):
545 """Decorate the item as a dsym test."""
546 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
547 raise Exception("@dsym_test can only be used to decorate a test method")
548 @wraps(func)
549 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000550 if configuration.dont_do_dsym_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000551 self.skipTest("dsym tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000552 return func(self, *args, **kwargs)
553
554 # Mark this function as such to separate them from the regular tests.
555 wrapper.__dsym_test__ = True
556 return wrapper
557
558def dwarf_test(func):
559 """Decorate the item as a dwarf test."""
560 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
561 raise Exception("@dwarf_test can only be used to decorate a test method")
562 @wraps(func)
563 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000564 if configuration.dont_do_dwarf_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000565 self.skipTest("dwarf tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000566 return func(self, *args, **kwargs)
567
568 # Mark this function as such to separate them from the regular tests.
569 wrapper.__dwarf_test__ = True
570 return wrapper
571
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000572def dwo_test(func):
573 """Decorate the item as a dwo test."""
574 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
575 raise Exception("@dwo_test can only be used to decorate a test method")
576 @wraps(func)
577 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000578 if configuration.dont_do_dwo_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000579 self.skipTest("dwo tests")
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000580 return func(self, *args, **kwargs)
581
582 # Mark this function as such to separate them from the regular tests.
583 wrapper.__dwo_test__ = True
584 return wrapper
585
Todd Fialaa41d48c2014-04-28 04:49:40 +0000586def debugserver_test(func):
587 """Decorate the item as a debugserver test."""
588 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
589 raise Exception("@debugserver_test can only be used to decorate a test method")
590 @wraps(func)
591 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000592 if configuration.dont_do_debugserver_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000593 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000594 return func(self, *args, **kwargs)
595
596 # Mark this function as such to separate them from the regular tests.
597 wrapper.__debugserver_test__ = True
598 return wrapper
599
600def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000601 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000602 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
603 raise Exception("@llgs_test can only be used to decorate a test method")
604 @wraps(func)
605 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000606 if configuration.dont_do_llgs_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000607 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000608 return func(self, *args, **kwargs)
609
610 # Mark this function as such to separate them from the regular tests.
611 wrapper.__llgs_test__ = True
612 return wrapper
613
Daniel Maleae0f8f572013-08-26 23:57:52 +0000614def not_remote_testsuite_ready(func):
615 """Decorate the item as a test which is not ready yet for remote testsuite."""
616 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
617 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
618 @wraps(func)
619 def wrapper(self, *args, **kwargs):
Zachary Turnerd865c6b2015-12-08 22:15:48 +0000620 if lldb.remote_platform:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000621 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000622 return func(self, *args, **kwargs)
623
624 # Mark this function as such to separate them from the regular tests.
625 wrapper.__not_ready_for_remote_testsuite_test__ = True
626 return wrapper
627
Ed Maste433790a2014-04-23 12:55:41 +0000628def expectedFailure(expected_fn, bugnumber=None):
629 def expectedFailure_impl(func):
630 @wraps(func)
631 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000632 from unittest2 import case
633 self = args[0]
Ed Maste433790a2014-04-23 12:55:41 +0000634 if expected_fn(self):
Zachary Turner5cb8e672015-11-06 18:14:42 +0000635 xfail_func = unittest2.expectedFailure(func)
636 xfail_func(*args, **kwargs)
637 else:
638 func(*args, **kwargs)
Ed Maste433790a2014-04-23 12:55:41 +0000639 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000640 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
641 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000642 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000643 return expectedFailure_impl(bugnumber)
644 else:
645 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000646
Ying Chen0c352822015-11-16 23:41:02 +0000647# You can also pass not_in(list) to reverse the sense of the test for the arguments that
648# are simple lists, namely oslist, compiler, and debug_info.
649
650def not_in (iterable):
651 return lambda x : x not in iterable
652
Siva Chandra7dcad312015-11-20 20:30:36 +0000653def check_list_or_lambda (list_or_lambda, value):
654 if six.callable(list_or_lambda):
655 return list_or_lambda(value)
656 else:
657 return list_or_lambda is None or value is None or value in list_or_lambda
Ying Chen0c352822015-11-16 23:41:02 +0000658
Ying Chen7091c2c2015-04-21 01:15:47 +0000659# provide a function to xfail on defined oslist, compiler version, and archs
660# if none is specified for any argument, that argument won't be checked and thus means for all
661# for example,
662# @expectedFailureAll, xfail for all platform/compiler/arch,
663# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
664# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Pavel Labath7ead0b92015-12-09 10:54:18 +0000665def 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 +0000666 def fn(self):
Siva Chandra7dcad312015-11-20 20:30:36 +0000667 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
Pavel Labath7ead0b92015-12-09 10:54:18 +0000668 hostoslist_passes = check_list_or_lambda(hostoslist, getHostPlatform())
Siva Chandra7dcad312015-11-20 20:30:36 +0000669 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000670 arch_passes = self.expectedArch(archs)
671 triple_passes = triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())
Siva Chandra7dcad312015-11-20 20:30:36 +0000672 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000673 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))
674 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
675
676 return (oslist_passes and
Pavel Labath7ead0b92015-12-09 10:54:18 +0000677 hostoslist_passes and
Zachary Turnerabdb8392015-11-16 22:40:30 +0000678 compiler_passes and
679 arch_passes and
680 triple_passes and
681 debug_info_passes and
682 swig_version_passes and
683 py_version_passes)
Ying Chen7091c2c2015-04-21 01:15:47 +0000684 return expectedFailure(fn, bugnumber)
685
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000686def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000687 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
688
689def expectedFailureDwo(bugnumber=None):
690 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000691
692def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000693 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000694
695def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
696 if compiler_version is None:
697 compiler_version=['=', None]
698 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
699
Vince Harron8974ce22015-03-13 19:54:54 +0000700# to XFAIL a specific clang versions, try this
701# @expectedFailureClang('bugnumber', ['<=', '3.4'])
702def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000703 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000704
705def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000706 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000707
Matt Kopec0de53f02013-03-15 19:10:12 +0000708def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000709 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000710
Ed Maste433790a2014-04-23 12:55:41 +0000711def expectedFailureArch(arch, bugnumber=None):
712 def fn(self):
713 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000714 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000715
Enrico Granatae6cedc12013-02-23 01:05:23 +0000716def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000717 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000718
Matt Kopecee969f92013-09-26 23:30:59 +0000719def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000720 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000721
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000722def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None):
Ed Maste433790a2014-04-23 12:55:41 +0000723 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000724 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000725 self.expectedCompiler(compilers) and
726 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000727 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000728
Chaoren Linf7160f32015-06-09 17:39:27 +0000729def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
730 def fn(self):
731 return (getHostPlatform() in oslist and
732 self.expectedCompiler(compilers))
733 return expectedFailure(fn, bugnumber)
734
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000735def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000736 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000737 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000738
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000739def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
740 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000741
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000742def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None):
743 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000744
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000745def expectedFailureNetBSD(bugnumber=None, compilers=None, debug_info=None):
746 return expectedFailureOS(['netbsd'], bugnumber, compilers, debug_info=debug_info)
747
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000748def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
749 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000750
Chaoren Linf7160f32015-06-09 17:39:27 +0000751def expectedFailureHostWindows(bugnumber=None, compilers=None):
752 return expectedFailureHostOS(['windows'], bugnumber, compilers)
753
Pavel Labath090152b2015-08-20 11:37:19 +0000754def matchAndroid(api_levels=None, archs=None):
755 def match(self):
756 if not target_is_android():
757 return False
758 if archs is not None and self.getArchitecture() not in archs:
759 return False
760 if api_levels is not None and android_device_api() not in api_levels:
761 return False
762 return True
763 return match
764
765
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000766def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000767 """ Mark a test as xfail for Android.
768
769 Arguments:
770 bugnumber - The LLVM pr associated with the problem.
771 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000772 for which a test is expected to fail. None means all API level.
773 arch - A sequence of architecture names specifying the architectures
774 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000775 """
Pavel Labath090152b2015-08-20 11:37:19 +0000776 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000777
Vince Harron7ac3ea42015-06-26 15:13:21 +0000778# if the test passes on the first try, we're done (success)
779# if the test fails once, then passes on the second try, raise an ExpectedFailure
780# if the test fails twice in a row, re-throw the exception from the second test run
781def expectedFlakey(expected_fn, bugnumber=None):
782 def expectedFailure_impl(func):
783 @wraps(func)
784 def wrapper(*args, **kwargs):
785 from unittest2 import case
786 self = args[0]
787 try:
788 func(*args, **kwargs)
Ying Chen0a7202b2015-07-01 22:44:27 +0000789 # don't retry if the test case is already decorated with xfail or skip
790 except (case._ExpectedFailure, case.SkipTest, case._UnexpectedSuccess):
791 raise
Vince Harron7ac3ea42015-06-26 15:13:21 +0000792 except Exception:
793 if expected_fn(self):
Ying Chen0a7202b2015-07-01 22:44:27 +0000794 # before retry, run tearDown for previous run and setup for next
Vince Harron7ac3ea42015-06-26 15:13:21 +0000795 try:
Ying Chen0a7202b2015-07-01 22:44:27 +0000796 self.tearDown()
797 self.setUp()
Vince Harron7ac3ea42015-06-26 15:13:21 +0000798 func(*args, **kwargs)
799 except Exception:
800 # oh snap! two failures in a row, record a failure/error
801 raise
802 # record the expected failure
803 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
804 else:
805 raise
806 return wrapper
807 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
808 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000809 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000810 return expectedFailure_impl(bugnumber)
811 else:
812 return expectedFailure_impl
813
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000814def expectedFlakeyDwarf(bugnumber=None):
815 def fn(self):
816 return self.debug_info == "dwarf"
817 return expectedFlakey(fn, bugnumber)
818
819def expectedFlakeyDsym(bugnumber=None):
820 def fn(self):
821 return self.debug_info == "dwarf"
822 return expectedFlakey(fn, bugnumber)
823
Vince Harron7ac3ea42015-06-26 15:13:21 +0000824def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
825 def fn(self):
826 return (self.getPlatform() in oslist and
827 self.expectedCompiler(compilers))
828 return expectedFlakey(fn, bugnumber)
829
830def expectedFlakeyDarwin(bugnumber=None, compilers=None):
831 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
832 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
833
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000834def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
835 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
836
Vince Harron7ac3ea42015-06-26 15:13:21 +0000837def expectedFlakeyLinux(bugnumber=None, compilers=None):
838 return expectedFlakeyOS(['linux'], bugnumber, compilers)
839
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000840def expectedFlakeyNetBSD(bugnumber=None, compilers=None):
841 return expectedFlakeyOS(['netbsd'], bugnumber, compilers)
Vince Harron7ac3ea42015-06-26 15:13:21 +0000842
843def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
844 if compiler_version is None:
845 compiler_version=['=', None]
846 def fn(self):
847 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
848 return expectedFlakey(fn, bugnumber)
849
850# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
851def expectedFlakeyClang(bugnumber=None, compiler_version=None):
852 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
853
854# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
855def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
856 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
857
Pavel Labath63a579c2015-09-07 12:15:27 +0000858def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
859 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
860
Greg Clayton12514562013-12-05 22:22:32 +0000861def skipIfRemote(func):
862 """Decorate the item to skip tests if testing remotely."""
863 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
864 raise Exception("@skipIfRemote can only be used to decorate a test method")
865 @wraps(func)
866 def wrapper(*args, **kwargs):
867 from unittest2 import case
868 if lldb.remote_platform:
869 self = args[0]
870 self.skipTest("skip on remote platform")
871 else:
872 func(*args, **kwargs)
873 return wrapper
874
Siva Chandra4470f382015-06-17 22:32:27 +0000875def skipUnlessListedRemote(remote_list=None):
876 def myImpl(func):
877 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
878 raise Exception("@skipIfRemote can only be used to decorate a "
879 "test method")
880
881 @wraps(func)
882 def wrapper(*args, **kwargs):
883 if remote_list and lldb.remote_platform:
884 self = args[0]
885 triple = self.dbg.GetSelectedPlatform().GetTriple()
886 for r in remote_list:
887 if r in triple:
888 func(*args, **kwargs)
889 return
890 self.skipTest("skip on remote platform %s" % str(triple))
891 else:
892 func(*args, **kwargs)
893 return wrapper
894
895 return myImpl
896
Greg Clayton12514562013-12-05 22:22:32 +0000897def skipIfRemoteDueToDeadlock(func):
898 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
899 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
900 raise Exception("@skipIfRemote can only be used to decorate a test method")
901 @wraps(func)
902 def wrapper(*args, **kwargs):
903 from unittest2 import case
904 if lldb.remote_platform:
905 self = args[0]
906 self.skipTest("skip on remote platform (deadlocks)")
907 else:
908 func(*args, **kwargs)
909 return wrapper
910
Enrico Granatab633e432014-10-06 21:37:06 +0000911def skipIfNoSBHeaders(func):
912 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
913 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000914 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000915 @wraps(func)
916 def wrapper(*args, **kwargs):
917 from unittest2 import case
918 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000919 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000920 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000921 else:
922 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000923 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000924 if not os.path.exists(header):
925 self.skipTest("skip because LLDB.h header not found")
926 else:
927 func(*args, **kwargs)
928 return wrapper
929
Enrico Granata5f92a132015-11-05 00:46:25 +0000930def skipIfiOSSimulator(func):
931 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
Zachary Turner606e3a52015-12-08 01:15:30 +0000932 return unittest2.skipIf(configuration.lldb_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
Enrico Granata5f92a132015-11-05 00:46:25 +0000933
Robert Flack13c7ad92015-03-30 14:12:17 +0000934def skipIfFreeBSD(func):
935 """Decorate the item to skip tests that should be skipped on FreeBSD."""
936 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000937
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000938def skipIfNetBSD(func):
939 """Decorate the item to skip tests that should be skipped on NetBSD."""
940 return skipIfPlatform(["netbsd"])(func)
941
Greg Claytone0d0a762015-04-02 18:24:03 +0000942def getDarwinOSTriples():
943 return ['darwin', 'macosx', 'ios']
944
Daniel Maleab3d41a22013-07-09 00:08:01 +0000945def skipIfDarwin(func):
946 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000947 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000948
Robert Flack13c7ad92015-03-30 14:12:17 +0000949def skipIfLinux(func):
950 """Decorate the item to skip tests that should be skipped on Linux."""
951 return skipIfPlatform(["linux"])(func)
952
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000953def skipUnlessHostLinux(func):
954 """Decorate the item to skip tests that should be skipped on any non Linux host."""
955 return skipUnlessHostPlatform(["linux"])(func)
956
Robert Flack13c7ad92015-03-30 14:12:17 +0000957def skipIfWindows(func):
958 """Decorate the item to skip tests that should be skipped on Windows."""
959 return skipIfPlatform(["windows"])(func)
960
Chaoren Line6eea5d2015-06-08 22:13:28 +0000961def skipIfHostWindows(func):
962 """Decorate the item to skip tests that should be skipped on Windows."""
963 return skipIfHostPlatform(["windows"])(func)
964
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000965def skipUnlessWindows(func):
966 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
967 return skipUnlessPlatform(["windows"])(func)
968
Robert Flack13c7ad92015-03-30 14:12:17 +0000969def skipUnlessDarwin(func):
970 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000971 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000972
Ryan Brown57bee1e2015-09-14 22:45:11 +0000973def skipUnlessGoInstalled(func):
974 """Decorate the item to skip tests when no Go compiler is available."""
975 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
976 raise Exception("@skipIfGcc can only be used to decorate a test method")
977 @wraps(func)
978 def wrapper(*args, **kwargs):
979 from unittest2 import case
980 self = args[0]
981 compiler = self.getGoCompilerVersion()
982 if not compiler:
983 self.skipTest("skipping because go compiler not found")
984 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000985 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000986 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000987 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
988 if not match_version:
989 # Couldn't determine version.
990 self.skipTest(
991 "skipping because go version could not be parsed "
992 "out of {}".format(compiler))
993 else:
994 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000995 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000996 compiler_strict_version = StrictVersion(match_version.group(1))
997 if compiler_strict_version < min_strict_version:
998 self.skipTest(
999 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +00001000 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +00001001 compiler_strict_version,
1002 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +00001003 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +00001004 return wrapper
1005
Robert Flack068898c2015-04-09 18:07:58 +00001006def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +00001007 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001008 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
1009 if platform.startswith('freebsd'):
1010 platform = 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001011 elif platform.startswith('netbsd'):
1012 platform = 'netbsd'
Robert Flack068898c2015-04-09 18:07:58 +00001013 return platform
1014
Robert Flack6e1fd352015-05-15 12:39:33 +00001015def getHostPlatform():
1016 """Returns the host platform running the test suite."""
1017 # Attempts to return a platform name matching a target Triple platform.
1018 if sys.platform.startswith('linux'):
1019 return 'linux'
1020 elif sys.platform.startswith('win32'):
1021 return 'windows'
1022 elif sys.platform.startswith('darwin'):
1023 return 'darwin'
1024 elif sys.platform.startswith('freebsd'):
1025 return 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001026 elif sys.platform.startswith('netbsd'):
1027 return 'netbsd'
Robert Flack6e1fd352015-05-15 12:39:33 +00001028 else:
1029 return sys.platform
1030
Robert Flackfb2f6c62015-04-17 08:02:18 +00001031def platformIsDarwin():
1032 """Returns true if the OS triple for the selected platform is any valid apple OS"""
1033 return getPlatform() in getDarwinOSTriples()
1034
Robert Flack6e1fd352015-05-15 12:39:33 +00001035def skipIfHostIncompatibleWithRemote(func):
1036 """Decorate the item to skip tests if binaries built on this host are incompatible."""
1037 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1038 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
1039 @wraps(func)
1040 def wrapper(*args, **kwargs):
1041 from unittest2 import case
1042 self = args[0]
1043 host_arch = self.getLldbArchitecture()
1044 host_platform = getHostPlatform()
1045 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +00001046 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +00001047 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
1048 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
1049 elif target_platform != host_platform:
1050 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
1051 else:
1052 func(*args, **kwargs)
1053 return wrapper
1054
Chaoren Line6eea5d2015-06-08 22:13:28 +00001055def skipIfHostPlatform(oslist):
1056 """Decorate the item to skip tests if running on one of the listed host platforms."""
1057 return unittest2.skipIf(getHostPlatform() in oslist,
1058 "skip on %s" % (", ".join(oslist)))
1059
1060def skipUnlessHostPlatform(oslist):
1061 """Decorate the item to skip tests unless running on one of the listed host platforms."""
1062 return unittest2.skipUnless(getHostPlatform() in oslist,
1063 "requires on of %s" % (", ".join(oslist)))
1064
Zachary Turner793d9972015-08-14 23:29:24 +00001065def skipUnlessArch(archlist):
1066 """Decorate the item to skip tests unless running on one of the listed architectures."""
1067 def myImpl(func):
1068 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1069 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1070
1071 @wraps(func)
1072 def wrapper(*args, **kwargs):
1073 self = args[0]
1074 if self.getArchitecture() not in archlist:
1075 self.skipTest("skipping for architecture %s (requires one of %s)" %
1076 (self.getArchitecture(), ", ".join(archlist)))
1077 else:
1078 func(*args, **kwargs)
1079 return wrapper
1080
1081 return myImpl
1082
Robert Flack13c7ad92015-03-30 14:12:17 +00001083def skipIfPlatform(oslist):
1084 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001085 return unittest2.skipIf(getPlatform() in oslist,
1086 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001087
1088def skipUnlessPlatform(oslist):
1089 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001090 return unittest2.skipUnless(getPlatform() in oslist,
1091 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001092
Daniel Malea48359902013-05-14 20:48:54 +00001093def skipIfLinuxClang(func):
1094 """Decorate the item to skip tests that should be skipped if building on
1095 Linux with clang.
1096 """
1097 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1098 raise Exception("@skipIfLinuxClang can only be used to decorate a test method")
1099 @wraps(func)
1100 def wrapper(*args, **kwargs):
1101 from unittest2 import case
1102 self = args[0]
1103 compiler = self.getCompiler()
Vince Harronc8492672015-05-04 02:59:19 +00001104 platform = self.getPlatform()
1105 if "clang" in compiler and platform == "linux":
Daniel Malea48359902013-05-14 20:48:54 +00001106 self.skipTest("skipping because Clang is used on Linux")
1107 else:
1108 func(*args, **kwargs)
1109 return wrapper
1110
Ying Chen7091c2c2015-04-21 01:15:47 +00001111# provide a function to skip on defined oslist, compiler version, and archs
1112# if none is specified for any argument, that argument won't be checked and thus means for all
1113# for example,
1114# @skipIf, skip for all platform/compiler/arch,
1115# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1116# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1117
1118# TODO: refactor current code, to make skipIfxxx functions to call this function
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001119def 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 +00001120 def fn(self):
Siva Chandra7dcad312015-11-20 20:30:36 +00001121 oslist_passes = oslist is None or self.getPlatform() in oslist
1122 compiler_passes = compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))
Zachary Turnerabdb8392015-11-16 22:40:30 +00001123 arch_passes = self.expectedArch(archs)
Siva Chandra7dcad312015-11-20 20:30:36 +00001124 debug_info_passes = debug_info is None or self.debug_info in debug_info
Zachary Turnerabdb8392015-11-16 22:40:30 +00001125 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))
1126 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 +00001127 remote_passes = (remote is None) or (remote == (lldb.remote_platform is not None))
Zachary Turnerabdb8392015-11-16 22:40:30 +00001128
1129 return (oslist_passes and
1130 compiler_passes and
1131 arch_passes and
1132 debug_info_passes and
1133 swig_version_passes and
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001134 py_version_passes and
1135 remote_passes)
Zachary Turnerba105702015-11-16 23:58:20 +00001136
1137 local_vars = locals()
1138 args = [x for x in inspect.getargspec(skipIf).args]
1139 arg_vals = [eval(x, globals(), local_vars) for x in args]
1140 args = [x for x in zip(args, arg_vals) if x[1] is not None]
1141 reasons = ['%s=%s' % (x, str(y)) for (x,y) in args]
1142 return skipTestIfFn(fn, bugnumber, skipReason='skipping because ' + ' && '.join(reasons))
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001143
1144def skipIfDebugInfo(bugnumber=None, debug_info=None):
1145 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1146
Greg Claytonedea2372015-10-07 20:01:13 +00001147def skipIfDWO(bugnumber=None):
1148 return skipIfDebugInfo(bugnumber, ["dwo"])
1149
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001150def skipIfDwarf(bugnumber=None):
1151 return skipIfDebugInfo(bugnumber, ["dwarf"])
1152
1153def skipIfDsym(bugnumber=None):
1154 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001155
1156def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1157 def skipTestIfFn_impl(func):
1158 @wraps(func)
1159 def wrapper(*args, **kwargs):
1160 from unittest2 import case
1161 self = args[0]
1162 if expected_fn(self):
1163 self.skipTest(skipReason)
1164 else:
1165 func(*args, **kwargs)
1166 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001167 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001168 return skipTestIfFn_impl(bugnumber)
1169 else:
1170 return skipTestIfFn_impl
1171
Daniel Maleabe230792013-01-24 23:52:09 +00001172def skipIfGcc(func):
1173 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1174 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001175 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001176 @wraps(func)
1177 def wrapper(*args, **kwargs):
1178 from unittest2 import case
1179 self = args[0]
1180 compiler = self.getCompiler()
1181 if "gcc" in compiler:
1182 self.skipTest("skipping because gcc is the test compiler")
1183 else:
1184 func(*args, **kwargs)
1185 return wrapper
1186
Matt Kopec0de53f02013-03-15 19:10:12 +00001187def skipIfIcc(func):
1188 """Decorate the item to skip tests that should be skipped if building with icc ."""
1189 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1190 raise Exception("@skipIfIcc can only be used to decorate a test method")
1191 @wraps(func)
1192 def wrapper(*args, **kwargs):
1193 from unittest2 import case
1194 self = args[0]
1195 compiler = self.getCompiler()
1196 if "icc" in compiler:
1197 self.skipTest("skipping because icc is the test compiler")
1198 else:
1199 func(*args, **kwargs)
1200 return wrapper
1201
Daniel Malea55faa402013-05-02 21:44:31 +00001202def skipIfi386(func):
1203 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1204 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1205 raise Exception("@skipIfi386 can only be used to decorate a test method")
1206 @wraps(func)
1207 def wrapper(*args, **kwargs):
1208 from unittest2 import case
1209 self = args[0]
1210 if "i386" == self.getArchitecture():
1211 self.skipTest("skipping because i386 is not a supported architecture")
1212 else:
1213 func(*args, **kwargs)
1214 return wrapper
1215
Pavel Labath090152b2015-08-20 11:37:19 +00001216def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001217 """Decorator to skip tests when the target is Android.
1218
1219 Arguments:
1220 api_levels - The API levels for which the test should be skipped. If
1221 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001222 arch - A sequence of architecture names specifying the architectures
1223 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001224 """
1225 def myImpl(func):
1226 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1227 raise Exception("@skipIfTargetAndroid can only be used to "
1228 "decorate a test method")
1229 @wraps(func)
1230 def wrapper(*args, **kwargs):
1231 from unittest2 import case
1232 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001233 if matchAndroid(api_levels, archs)(self):
1234 self.skipTest("skiped on Android target with API %d and architecture %s" %
1235 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001236 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001237 return wrapper
1238 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001239
Ilia Kd9953052015-03-12 07:19:41 +00001240def skipUnlessCompilerRt(func):
1241 """Decorate the item to skip tests if testing remotely."""
1242 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1243 raise Exception("@skipUnless can only be used to decorate a test method")
1244 @wraps(func)
1245 def wrapper(*args, **kwargs):
1246 from unittest2 import case
1247 import os.path
Enrico Granata55d99f02015-11-19 21:45:07 +00001248 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "llvm","projects","compiler-rt")
1249 print(compilerRtPath)
Ilia Kd9953052015-03-12 07:19:41 +00001250 if not os.path.exists(compilerRtPath):
1251 self = args[0]
1252 self.skipTest("skip if compiler-rt not found")
1253 else:
1254 func(*args, **kwargs)
1255 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001256
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001257class _PlatformContext(object):
1258 """Value object class which contains platform-specific options."""
1259
1260 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1261 self.shlib_environment_var = shlib_environment_var
1262 self.shlib_prefix = shlib_prefix
1263 self.shlib_extension = shlib_extension
1264
1265
Johnny Chena74bb0a2011-08-01 18:46:13 +00001266class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001267 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001268 Abstract base for performing lldb (see TestBase) or other generic tests (see
1269 BenchBase for one example). lldbtest.Base works with the test driver to
1270 accomplish things.
1271
Johnny Chen8334dad2010-10-22 23:15:46 +00001272 """
Enrico Granata5020f952012-10-24 21:42:49 +00001273
Enrico Granata19186272012-10-24 21:44:48 +00001274 # The concrete subclass should override this attribute.
1275 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001276
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001277 # Keep track of the old current working directory.
1278 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001279
Greg Clayton4570d3e2013-12-10 23:19:29 +00001280 @staticmethod
1281 def compute_mydir(test_file):
1282 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1283
1284 mydir = TestBase.compute_mydir(__file__)'''
1285 test_dir = os.path.dirname(test_file)
1286 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1287
Johnny Chenfb4264c2011-08-01 19:50:58 +00001288 def TraceOn(self):
1289 """Returns True if we are in trace mode (tracing detailed test execution)."""
1290 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001291
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001292 @classmethod
1293 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001294 """
1295 Python unittest framework class setup fixture.
1296 Do current directory manipulation.
1297 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001298 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001299 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001300 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001301
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001302 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001303 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001304
1305 # Change current working directory if ${LLDB_TEST} is defined.
1306 # See also dotest.py which sets up ${LLDB_TEST}.
1307 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001308 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001309 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001310 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001311 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1312
Vince Harron85d19652015-05-21 19:09:29 +00001313 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001314 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001315 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1316 try:
1317 cls.dir_lock.try_acquire()
1318 # write the class that owns the lock into the lock file
1319 cls.dir_lock.handle.write(cls.__name__)
1320 except IOError as ioerror:
1321 # nothing else should have this directory lock
1322 # wait here until we get a lock
1323 cls.dir_lock.acquire()
1324 # read the previous owner from the lock file
1325 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001326 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 +00001327 raise ioerror
1328
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001329 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001330 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001331 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001332 elif getPlatform() in ("freebsd", "linux", "netbsd"):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001333 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001334 else:
1335 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001336
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001337 @classmethod
1338 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001339 """
1340 Python unittest framework class teardown fixture.
1341 Do class-wide cleanup.
1342 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001343
Zachary Turner606e3a52015-12-08 01:15:30 +00001344 if doCleanup and not configuration.skip_build_and_cleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001345 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001346 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001347 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001348
Johnny Chen707b3c92010-10-11 22:25:46 +00001349 # Subclass might have specific cleanup function defined.
1350 if getattr(cls, "classCleanup", None):
1351 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001352 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001353 try:
1354 cls.classCleanup()
1355 except:
1356 exc_type, exc_value, exc_tb = sys.exc_info()
1357 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001358
Vince Harron85d19652015-05-21 19:09:29 +00001359 if debug_confirm_directory_exclusivity:
1360 cls.dir_lock.release()
1361 del cls.dir_lock
1362
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001363 # Restore old working directory.
1364 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001365 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001366 os.chdir(cls.oldcwd)
1367
Johnny Chena74bb0a2011-08-01 18:46:13 +00001368 @classmethod
1369 def skipLongRunningTest(cls):
1370 """
1371 By default, we skip long running test case.
1372 This can be overridden by passing '-l' to the test driver (dotest.py).
1373 """
1374 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1375 return False
1376 else:
1377 return True
Johnny Chened492022011-06-21 00:53:00 +00001378
Vince Harron6d3d0f12015-05-10 22:01:59 +00001379 def enableLogChannelsForCurrentTest(self):
1380 if len(lldbtest_config.channels) == 0:
1381 return
1382
1383 # if debug channels are specified in lldbtest_config.channels,
1384 # create a new set of log files for every test
1385 log_basename = self.getLogBasenameForCurrentTest()
1386
1387 # confirm that the file is writeable
1388 host_log_path = "{}-host.log".format(log_basename)
1389 open(host_log_path, 'w').close()
1390
1391 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1392 for channel_with_categories in lldbtest_config.channels:
1393 channel_then_categories = channel_with_categories.split(' ', 1)
1394 channel = channel_then_categories[0]
1395 if len(channel_then_categories) > 1:
1396 categories = channel_then_categories[1]
1397 else:
1398 categories = "default"
1399
1400 if channel == "gdb-remote":
1401 # communicate gdb-remote categories to debugserver
1402 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1403
1404 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1405 if not self.res.Succeeded():
1406 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1407
1408 # Communicate log path name to debugserver & lldb-server
1409 server_log_path = "{}-server.log".format(log_basename)
1410 open(server_log_path, 'w').close()
1411 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
1412
1413 # Communicate channels to lldb-server
1414 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
1415
1416 if len(lldbtest_config.channels) == 0:
1417 return
1418
1419 def disableLogChannelsForCurrentTest(self):
1420 # close all log files that we opened
1421 for channel_and_categories in lldbtest_config.channels:
1422 # channel format - <channel-name> [<category0> [<category1> ...]]
1423 channel = channel_and_categories.split(' ', 1)[0]
1424 self.ci.HandleCommand("log disable " + channel, self.res)
1425 if not self.res.Succeeded():
1426 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1427
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001428 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001429 """Fixture for unittest test case setup.
1430
1431 It works with the test driver to conditionally skip tests and does other
1432 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001433 #import traceback
1434 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001435
Daniel Malea9115f072013-08-06 15:02:32 +00001436 if "LIBCXX_PATH" in os.environ:
1437 self.libcxxPath = os.environ["LIBCXX_PATH"]
1438 else:
1439 self.libcxxPath = None
1440
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001441 if "LLDBMI_EXEC" in os.environ:
1442 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1443 else:
1444 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001445
Johnny Chenebe51722011-10-07 19:21:09 +00001446 # If we spawn an lldb process for test (via pexpect), do not load the
1447 # init file unless told otherwise.
1448 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1449 self.lldbOption = ""
1450 else:
1451 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001452
Johnny Chen985e7402011-08-01 21:13:26 +00001453 # Assign the test method name to self.testMethodName.
1454 #
1455 # For an example of the use of this attribute, look at test/types dir.
1456 # There are a bunch of test cases under test/types and we don't want the
1457 # module cacheing subsystem to be confused with executable name "a.out"
1458 # used for all the test cases.
1459 self.testMethodName = self._testMethodName
1460
Johnny Chen985e7402011-08-01 21:13:26 +00001461 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1462 # with it using pexpect.
1463 self.child = None
1464 self.child_prompt = "(lldb) "
1465 # If the child is interacting with the embedded script interpreter,
1466 # there are two exits required during tear down, first to quit the
1467 # embedded script interpreter and second to quit the lldb command
1468 # interpreter.
1469 self.child_in_script_interpreter = False
1470
Johnny Chenfb4264c2011-08-01 19:50:58 +00001471 # These are for customized teardown cleanup.
1472 self.dict = None
1473 self.doTearDownCleanup = False
1474 # And in rare cases where there are multiple teardown cleanups.
1475 self.dicts = []
1476 self.doTearDownCleanups = False
1477
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001478 # List of spawned subproces.Popen objects
1479 self.subprocesses = []
1480
Daniel Malea69207462013-06-05 21:07:02 +00001481 # List of forked process PIDs
1482 self.forkedProcessPids = []
1483
Johnny Chenfb4264c2011-08-01 19:50:58 +00001484 # Create a string buffer to record the session info, to be dumped into a
1485 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001486 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001487
Vince Harron1f160372015-05-21 18:51:20 +00001488 session_file = "{}.log".format(self.log_basename)
Zachary Turner8d13fab2015-11-07 01:08:15 +00001489 # Python 3 doesn't support unbuffered I/O in text mode. Open buffered.
1490 self.session = open(session_file, "w")
Johnny Chenfb4264c2011-08-01 19:50:58 +00001491
1492 # Optimistically set __errored__, __failed__, __expected__ to False
1493 # initially. If the test errored/failed, the session info
1494 # (self.session) is then dumped into a session specific file for
1495 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001496 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001497 self.__errored__ = False
1498 self.__failed__ = False
1499 self.__expected__ = False
1500 # We are also interested in unexpected success.
1501 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001502 # And skipped tests.
1503 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001504
1505 # See addTearDownHook(self, hook) which allows the client to add a hook
1506 # function to be run during tearDown() time.
1507 self.hooks = []
1508
1509 # See HideStdout(self).
1510 self.sys_stdout_hidden = False
1511
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001512 if self.platformContext:
1513 # set environment variable names for finding shared libraries
1514 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001515
Vince Harron6d3d0f12015-05-10 22:01:59 +00001516 # Create the debugger instance if necessary.
1517 try:
1518 self.dbg = lldb.DBG
1519 except AttributeError:
1520 self.dbg = lldb.SBDebugger.Create()
1521
1522 if not self.dbg:
1523 raise Exception('Invalid debugger instance')
1524
1525 # Retrieve the associated command interpreter instance.
1526 self.ci = self.dbg.GetCommandInterpreter()
1527 if not self.ci:
1528 raise Exception('Could not get the command interpreter')
1529
1530 # And the result object.
1531 self.res = lldb.SBCommandReturnObject()
1532
1533 self.enableLogChannelsForCurrentTest()
1534
Ying Chen0c352822015-11-16 23:41:02 +00001535 #Initialize debug_info
1536 self.debug_info = None
1537
Daniel Malea249287a2013-02-19 16:08:57 +00001538 def setAsync(self, value):
1539 """ Sets async mode to True/False and ensures it is reset after the testcase completes."""
1540 old_async = self.dbg.GetAsync()
1541 self.dbg.SetAsync(value)
1542 self.addTearDownHook(lambda: self.dbg.SetAsync(old_async))
1543
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001544 def cleanupSubprocesses(self):
1545 # Ensure any subprocesses are cleaned up
1546 for p in self.subprocesses:
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001547 p.terminate()
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001548 del p
1549 del self.subprocesses[:]
Daniel Malea69207462013-06-05 21:07:02 +00001550 # Ensure any forked processes are cleaned up
1551 for pid in self.forkedProcessPids:
1552 if os.path.exists("/proc/" + str(pid)):
1553 os.kill(pid, signal.SIGTERM)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001554
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001555 def spawnSubprocess(self, executable, args=[], install_remote=True):
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001556 """ Creates a subprocess.Popen object with the specified executable and arguments,
1557 saves it in self.subprocesses, and returns the object.
1558 NOTE: if using this function, ensure you also call:
1559
1560 self.addTearDownHook(self.cleanupSubprocesses)
1561
1562 otherwise the test suite will leak processes.
1563 """
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001564 proc = _RemoteProcess(install_remote) if lldb.remote_platform else _LocalProcess(self.TraceOn())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001565 proc.launch(executable, args)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001566 self.subprocesses.append(proc)
1567 return proc
1568
Daniel Malea69207462013-06-05 21:07:02 +00001569 def forkSubprocess(self, executable, args=[]):
1570 """ Fork a subprocess with its own group ID.
1571 NOTE: if using this function, ensure you also call:
1572
1573 self.addTearDownHook(self.cleanupSubprocesses)
1574
1575 otherwise the test suite will leak processes.
1576 """
1577 child_pid = os.fork()
1578 if child_pid == 0:
1579 # If more I/O support is required, this can be beefed up.
1580 fd = os.open(os.devnull, os.O_RDWR)
Daniel Malea69207462013-06-05 21:07:02 +00001581 os.dup2(fd, 1)
1582 os.dup2(fd, 2)
1583 # This call causes the child to have its of group ID
1584 os.setpgid(0,0)
1585 os.execvp(executable, [executable] + args)
1586 # Give the child time to get through the execvp() call
1587 time.sleep(0.1)
1588 self.forkedProcessPids.append(child_pid)
1589 return child_pid
1590
Johnny Chenfb4264c2011-08-01 19:50:58 +00001591 def HideStdout(self):
1592 """Hide output to stdout from the user.
1593
1594 During test execution, there might be cases where we don't want to show the
1595 standard output to the user. For example,
1596
Zachary Turner35d017f2015-10-23 17:04:29 +00001597 self.runCmd(r'''sc print("\n\n\tHello!\n")''')
Johnny Chenfb4264c2011-08-01 19:50:58 +00001598
1599 tests whether command abbreviation for 'script' works or not. There is no
1600 need to show the 'Hello' output to the user as long as the 'script' command
1601 succeeds and we are not in TraceOn() mode (see the '-t' option).
1602
1603 In this case, the test method calls self.HideStdout(self) to redirect the
1604 sys.stdout to a null device, and restores the sys.stdout upon teardown.
1605
1606 Note that you should only call this method at most once during a test case
1607 execution. Any subsequent call has no effect at all."""
1608 if self.sys_stdout_hidden:
1609 return
1610
1611 self.sys_stdout_hidden = True
1612 old_stdout = sys.stdout
1613 sys.stdout = open(os.devnull, 'w')
1614 def restore_stdout():
1615 sys.stdout = old_stdout
1616 self.addTearDownHook(restore_stdout)
1617
1618 # =======================================================================
1619 # Methods for customized teardown cleanups as well as execution of hooks.
1620 # =======================================================================
1621
1622 def setTearDownCleanup(self, dictionary=None):
1623 """Register a cleanup action at tearDown() time with a dictinary"""
1624 self.dict = dictionary
1625 self.doTearDownCleanup = True
1626
1627 def addTearDownCleanup(self, dictionary):
1628 """Add a cleanup action at tearDown() time with a dictinary"""
1629 self.dicts.append(dictionary)
1630 self.doTearDownCleanups = True
1631
1632 def addTearDownHook(self, hook):
1633 """
1634 Add a function to be run during tearDown() time.
1635
1636 Hooks are executed in a first come first serve manner.
1637 """
Zachary Turnercd236b82015-10-26 18:48:24 +00001638 if six.callable(hook):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001639 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001640 print("Adding tearDown hook:", getsource_if_available(hook), file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001641 self.hooks.append(hook)
Enrico Granataab0e8312014-11-05 21:31:57 +00001642
1643 return self
Johnny Chenfb4264c2011-08-01 19:50:58 +00001644
Jim Inghamda3a3862014-10-16 23:02:14 +00001645 def deletePexpectChild(self):
Johnny Chen985e7402011-08-01 21:13:26 +00001646 # This is for the case of directly spawning 'lldb' and interacting with it
1647 # using pexpect.
Johnny Chen985e7402011-08-01 21:13:26 +00001648 if self.child and self.child.isalive():
Zachary Turner9ef307b2014-07-22 16:19:29 +00001649 import pexpect
Johnny Chen985e7402011-08-01 21:13:26 +00001650 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001651 print("tearing down the child process....", file=sbuf)
Johnny Chen985e7402011-08-01 21:13:26 +00001652 try:
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001653 if self.child_in_script_interpreter:
1654 self.child.sendline('quit()')
1655 self.child.expect_exact(self.child_prompt)
1656 self.child.sendline('settings set interpreter.prompt-on-quit false')
1657 self.child.sendline('quit')
Johnny Chen985e7402011-08-01 21:13:26 +00001658 self.child.expect(pexpect.EOF)
Ilia K47448c22015-02-11 21:41:58 +00001659 except (ValueError, pexpect.ExceptionPexpect):
1660 # child is already terminated
1661 pass
1662 except OSError as exception:
1663 import errno
1664 if exception.errno != errno.EIO:
1665 # unexpected error
1666 raise
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001667 # child is already terminated
Johnny Chen985e7402011-08-01 21:13:26 +00001668 pass
Shawn Besteb3e9052014-11-06 17:52:15 +00001669 finally:
1670 # Give it one final blow to make sure the child is terminated.
1671 self.child.close()
Jim Inghamda3a3862014-10-16 23:02:14 +00001672
1673 def tearDown(self):
1674 """Fixture for unittest test case teardown."""
1675 #import traceback
1676 #traceback.print_stack()
1677
1678 self.deletePexpectChild()
1679
Johnny Chenfb4264c2011-08-01 19:50:58 +00001680 # Check and run any hook functions.
1681 for hook in reversed(self.hooks):
1682 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001683 print("Executing tearDown hook:", getsource_if_available(hook), file=sbuf)
Enrico Granataab0e8312014-11-05 21:31:57 +00001684 import inspect
1685 hook_argc = len(inspect.getargspec(hook).args)
Enrico Granata6e0566c2014-11-17 19:00:20 +00001686 if hook_argc == 0 or getattr(hook,'im_self',None):
Enrico Granataab0e8312014-11-05 21:31:57 +00001687 hook()
1688 elif hook_argc == 1:
1689 hook(self)
1690 else:
1691 hook() # try the plain call and hope it works
Johnny Chenfb4264c2011-08-01 19:50:58 +00001692
1693 del self.hooks
1694
1695 # Perform registered teardown cleanup.
1696 if doCleanup and self.doTearDownCleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00001697 self.cleanup(dictionary=self.dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001698
1699 # In rare cases where there are multiple teardown cleanups added.
1700 if doCleanup and self.doTearDownCleanups:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001701 if self.dicts:
1702 for dict in reversed(self.dicts):
Johnny Chen0fddfb22011-11-17 19:57:27 +00001703 self.cleanup(dictionary=dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001704
Vince Harron9753dd92015-05-10 15:22:09 +00001705 self.disableLogChannelsForCurrentTest()
1706
Johnny Chenfb4264c2011-08-01 19:50:58 +00001707 # =========================================================
1708 # Various callbacks to allow introspection of test progress
1709 # =========================================================
1710
1711 def markError(self):
1712 """Callback invoked when an error (unexpected exception) errored."""
1713 self.__errored__ = True
1714 with recording(self, False) as sbuf:
1715 # False because there's no need to write "ERROR" to the stderr twice.
1716 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001717 print("ERROR", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001718
Zachary Turnerb1490b62015-08-26 19:44:56 +00001719 def markCleanupError(self):
1720 """Callback invoked when an error occurs while a test is cleaning up."""
1721 self.__cleanup_errored__ = True
1722 with recording(self, False) as sbuf:
1723 # False because there's no need to write "CLEANUP_ERROR" to the stderr twice.
1724 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001725 print("CLEANUP_ERROR", file=sbuf)
Zachary Turnerb1490b62015-08-26 19:44:56 +00001726
Johnny Chenfb4264c2011-08-01 19:50:58 +00001727 def markFailure(self):
1728 """Callback invoked when a failure (test assertion failure) occurred."""
1729 self.__failed__ = True
1730 with recording(self, False) as sbuf:
1731 # False because there's no need to write "FAIL" to the stderr twice.
1732 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001733 print("FAIL", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001734
Enrico Granatae6cedc12013-02-23 01:05:23 +00001735 def markExpectedFailure(self,err,bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001736 """Callback invoked when an expected failure/error occurred."""
1737 self.__expected__ = True
1738 with recording(self, False) as sbuf:
1739 # False because there's no need to write "expected failure" to the
1740 # stderr twice.
1741 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001742 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001743 print("expected failure", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001744 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001745 print("expected failure (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001746
Johnny Chenc5cc6252011-08-15 23:09:08 +00001747 def markSkippedTest(self):
1748 """Callback invoked when a test is skipped."""
1749 self.__skipped__ = True
1750 with recording(self, False) as sbuf:
1751 # False because there's no need to write "skipped test" to the
1752 # stderr twice.
1753 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001754 print("skipped test", file=sbuf)
Johnny Chenc5cc6252011-08-15 23:09:08 +00001755
Enrico Granatae6cedc12013-02-23 01:05:23 +00001756 def markUnexpectedSuccess(self, bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001757 """Callback invoked when an unexpected success occurred."""
1758 self.__unexpected__ = True
1759 with recording(self, False) as sbuf:
1760 # False because there's no need to write "unexpected success" to the
1761 # stderr twice.
1762 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001763 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001764 print("unexpected success", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001765 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001766 print("unexpected success (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001767
Greg Clayton70995582015-01-07 22:25:50 +00001768 def getRerunArgs(self):
1769 return " -f %s.%s" % (self.__class__.__name__, self._testMethodName)
Vince Harron9753dd92015-05-10 15:22:09 +00001770
1771 def getLogBasenameForCurrentTest(self, prefix=None):
1772 """
1773 returns a partial path that can be used as the beginning of the name of multiple
1774 log files pertaining to this test
1775
1776 <session-dir>/<arch>-<compiler>-<test-file>.<test-class>.<test-method>
1777 """
1778 dname = os.path.join(os.environ["LLDB_TEST"],
1779 os.environ["LLDB_SESSION_DIRNAME"])
1780 if not os.path.isdir(dname):
1781 os.mkdir(dname)
1782
1783 compiler = self.getCompiler()
1784
1785 if compiler[1] == ':':
1786 compiler = compiler[2:]
Chaoren Lin636a0e32015-07-17 21:40:11 +00001787 if os.path.altsep is not None:
1788 compiler = compiler.replace(os.path.altsep, os.path.sep)
Vince Harron9753dd92015-05-10 15:22:09 +00001789
Vince Harron19e300f2015-05-12 00:50:54 +00001790 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), "_".join(compiler.split(os.path.sep)))
Vince Harron9753dd92015-05-10 15:22:09 +00001791 if len(fname) > 200:
Vince Harron19e300f2015-05-12 00:50:54 +00001792 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), compiler.split(os.path.sep)[-1])
Vince Harron9753dd92015-05-10 15:22:09 +00001793
1794 if prefix is not None:
1795 fname = "{}-{}".format(prefix, fname)
1796
1797 return os.path.join(dname, fname)
1798
Johnny Chenfb4264c2011-08-01 19:50:58 +00001799 def dumpSessionInfo(self):
1800 """
1801 Dump the debugger interactions leading to a test error/failure. This
1802 allows for more convenient postmortem analysis.
1803
1804 See also LLDBTestResult (dotest.py) which is a singlton class derived
1805 from TextTestResult and overwrites addError, addFailure, and
1806 addExpectedFailure methods to allow us to to mark the test instance as
1807 such.
1808 """
1809
1810 # We are here because self.tearDown() detected that this test instance
1811 # either errored or failed. The lldb.test_result singleton contains
1812 # two lists (erros and failures) which get populated by the unittest
1813 # framework. Look over there for stack trace information.
1814 #
1815 # The lists contain 2-tuples of TestCase instances and strings holding
1816 # formatted tracebacks.
1817 #
1818 # See http://docs.python.org/library/unittest.html#unittest.TestResult.
Vince Harron9753dd92015-05-10 15:22:09 +00001819
Vince Harron35b17dc2015-05-21 18:20:21 +00001820 # output tracebacks into session
Vince Harron9753dd92015-05-10 15:22:09 +00001821 pairs = []
Johnny Chenfb4264c2011-08-01 19:50:58 +00001822 if self.__errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001823 pairs = configuration.test_result.errors
Johnny Chenfb4264c2011-08-01 19:50:58 +00001824 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001825 elif self.__cleanup_errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001826 pairs = configuration.test_result.cleanup_errors
Zachary Turnerb1490b62015-08-26 19:44:56 +00001827 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001828 elif self.__failed__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001829 pairs = configuration.test_result.failures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001830 prefix = 'Failure'
1831 elif self.__expected__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001832 pairs = configuration.test_result.expectedFailures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001833 prefix = 'ExpectedFailure'
Johnny Chenc5cc6252011-08-15 23:09:08 +00001834 elif self.__skipped__:
1835 prefix = 'SkippedTest'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001836 elif self.__unexpected__:
Vince Harron35b17dc2015-05-21 18:20:21 +00001837 prefix = 'UnexpectedSuccess'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001838 else:
Vince Harron35b17dc2015-05-21 18:20:21 +00001839 prefix = 'Success'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001840
Johnny Chenc5cc6252011-08-15 23:09:08 +00001841 if not self.__unexpected__ and not self.__skipped__:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001842 for test, traceback in pairs:
1843 if test is self:
Zachary Turnerff890da2015-10-19 23:45:41 +00001844 print(traceback, file=self.session)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001845
Vince Harron35b17dc2015-05-21 18:20:21 +00001846 # put footer (timestamp/rerun instructions) into session
Johnny Chen8082a002011-08-11 00:16:28 +00001847 testMethod = getattr(self, self._testMethodName)
1848 if getattr(testMethod, "__benchmarks_test__", False):
1849 benchmarks = True
1850 else:
1851 benchmarks = False
1852
Vince Harron35b17dc2015-05-21 18:20:21 +00001853 import datetime
Zachary Turnerff890da2015-10-19 23:45:41 +00001854 print("Session info generated @", datetime.datetime.now().ctime(), file=self.session)
1855 print("To rerun this test, issue the following command from the 'test' directory:\n", file=self.session)
1856 print("./dotest.py %s -v %s %s" % (self.getRunOptions(),
Vince Harron35b17dc2015-05-21 18:20:21 +00001857 ('+b' if benchmarks else '-t'),
Zachary Turnerff890da2015-10-19 23:45:41 +00001858 self.getRerunArgs()), file=self.session)
Vince Harron35b17dc2015-05-21 18:20:21 +00001859 self.session.close()
1860 del self.session
1861
1862 # process the log files
Vince Harron1f160372015-05-21 18:51:20 +00001863 log_files_for_this_test = glob.glob(self.log_basename + "*")
Vince Harron35b17dc2015-05-21 18:20:21 +00001864
1865 if prefix != 'Success' or lldbtest_config.log_success:
1866 # keep all log files, rename them to include prefix
1867 dst_log_basename = self.getLogBasenameForCurrentTest(prefix)
1868 for src in log_files_for_this_test:
Zachary Turner306278f2015-05-26 20:26:29 +00001869 if os.path.isfile(src):
1870 dst = src.replace(self.log_basename, dst_log_basename)
1871 if os.name == "nt" and os.path.isfile(dst):
1872 # On Windows, renaming a -> b will throw an exception if b exists. On non-Windows platforms
1873 # it silently replaces the destination. Ultimately this means that atomic renames are not
1874 # guaranteed to be possible on Windows, but we need this to work anyway, so just remove the
1875 # destination first if it already exists.
1876 os.remove(dst)
Zachary Turner5de068b2015-05-26 19:52:24 +00001877
Zachary Turner306278f2015-05-26 20:26:29 +00001878 os.rename(src, dst)
Vince Harron35b17dc2015-05-21 18:20:21 +00001879 else:
1880 # success! (and we don't want log files) delete log files
1881 for log_file in log_files_for_this_test:
Adrian McCarthya7292042015-09-04 20:48:48 +00001882 try:
1883 os.unlink(log_file)
1884 except:
1885 # We've seen consistent unlink failures on Windows, perhaps because the
1886 # just-created log file is being scanned by anti-virus. Empirically, this
1887 # sleep-and-retry approach allows tests to succeed much more reliably.
1888 # Attempts to figure out exactly what process was still holding a file handle
1889 # have failed because running instrumentation like Process Monitor seems to
1890 # slow things down enough that the problem becomes much less consistent.
1891 time.sleep(0.5)
1892 os.unlink(log_file)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001893
1894 # ====================================================
1895 # Config. methods supported through a plugin interface
1896 # (enables reading of the current test configuration)
1897 # ====================================================
1898
1899 def getArchitecture(self):
1900 """Returns the architecture in effect the test suite is running with."""
1901 module = builder_module()
Ed Maste0f434e62015-04-06 15:50:48 +00001902 arch = module.getArchitecture()
1903 if arch == 'amd64':
1904 arch = 'x86_64'
1905 return arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001906
Vince Harron02613762015-05-04 00:17:53 +00001907 def getLldbArchitecture(self):
1908 """Returns the architecture of the lldb binary."""
1909 if not hasattr(self, 'lldbArchitecture'):
1910
1911 # spawn local process
1912 command = [
Vince Harron790d95c2015-05-18 19:39:03 +00001913 lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001914 "-o",
Vince Harron790d95c2015-05-18 19:39:03 +00001915 "file " + lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001916 "-o",
1917 "quit"
1918 ]
1919
1920 output = check_output(command)
1921 str = output.decode("utf-8");
1922
1923 for line in str.splitlines():
1924 m = re.search("Current executable set to '.*' \\((.*)\\)\\.", line)
1925 if m:
1926 self.lldbArchitecture = m.group(1)
1927 break
1928
1929 return self.lldbArchitecture
1930
Johnny Chenfb4264c2011-08-01 19:50:58 +00001931 def getCompiler(self):
1932 """Returns the compiler in effect the test suite is running with."""
1933 module = builder_module()
1934 return module.getCompiler()
1935
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001936 def getCompilerBinary(self):
1937 """Returns the compiler binary the test suite is running with."""
1938 return self.getCompiler().split()[0]
1939
Daniel Malea0aea0162013-02-27 17:29:46 +00001940 def getCompilerVersion(self):
1941 """ Returns a string that represents the compiler version.
1942 Supports: llvm, clang.
1943 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00001944 from .lldbutil import which
Daniel Malea0aea0162013-02-27 17:29:46 +00001945 version = 'unknown'
1946
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001947 compiler = self.getCompilerBinary()
Zachary Turner9ef307b2014-07-22 16:19:29 +00001948 version_output = system([[which(compiler), "-v"]])[1]
Daniel Malea0aea0162013-02-27 17:29:46 +00001949 for line in version_output.split(os.linesep):
Greg Clayton2a844b72013-03-06 02:34:51 +00001950 m = re.search('version ([0-9\.]+)', line)
Daniel Malea0aea0162013-02-27 17:29:46 +00001951 if m:
1952 version = m.group(1)
1953 return version
1954
Ryan Brown57bee1e2015-09-14 22:45:11 +00001955 def getGoCompilerVersion(self):
1956 """ Returns a string that represents the go compiler version, or None if go is not found.
1957 """
1958 compiler = which("go")
1959 if compiler:
1960 version_output = system([[compiler, "version"]])[0]
1961 for line in version_output.split(os.linesep):
1962 m = re.search('go version (devel|go\\S+)', line)
1963 if m:
1964 return m.group(1)
1965 return None
1966
Greg Claytone0d0a762015-04-02 18:24:03 +00001967 def platformIsDarwin(self):
1968 """Returns true if the OS triple for the selected platform is any valid apple OS"""
Robert Flackfb2f6c62015-04-17 08:02:18 +00001969 return platformIsDarwin()
Vince Harron20952cc2015-04-03 01:00:06 +00001970
Robert Flack13c7ad92015-03-30 14:12:17 +00001971 def getPlatform(self):
Robert Flackfb2f6c62015-04-17 08:02:18 +00001972 """Returns the target platform the test suite is running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001973 return getPlatform()
Robert Flack13c7ad92015-03-30 14:12:17 +00001974
Daniel Maleaadaaec92013-08-06 20:51:41 +00001975 def isIntelCompiler(self):
1976 """ Returns true if using an Intel (ICC) compiler, false otherwise. """
1977 return any([x in self.getCompiler() for x in ["icc", "icpc", "icl"]])
1978
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001979 def expectedCompilerVersion(self, compiler_version):
1980 """Returns True iff compiler_version[1] matches the current compiler version.
1981 Use compiler_version[0] to specify the operator used to determine if a match has occurred.
1982 Any operator other than the following defaults to an equality test:
1983 '>', '>=', "=>", '<', '<=', '=<', '!=', "!" or 'not'
1984 """
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001985 if (compiler_version == None):
1986 return True
1987 operator = str(compiler_version[0])
1988 version = compiler_version[1]
1989
1990 if (version == None):
1991 return True
1992 if (operator == '>'):
1993 return self.getCompilerVersion() > version
1994 if (operator == '>=' or operator == '=>'):
1995 return self.getCompilerVersion() >= version
1996 if (operator == '<'):
1997 return self.getCompilerVersion() < version
1998 if (operator == '<=' or operator == '=<'):
1999 return self.getCompilerVersion() <= version
2000 if (operator == '!=' or operator == '!' or operator == 'not'):
2001 return str(version) not in str(self.getCompilerVersion())
2002 return str(version) in str(self.getCompilerVersion())
2003
2004 def expectedCompiler(self, compilers):
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00002005 """Returns True iff any element of compilers is a sub-string of the current compiler."""
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00002006 if (compilers == None):
2007 return True
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00002008
2009 for compiler in compilers:
2010 if compiler in self.getCompiler():
2011 return True
2012
2013 return False
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00002014
Ying Chen7091c2c2015-04-21 01:15:47 +00002015 def expectedArch(self, archs):
2016 """Returns True iff any element of archs is a sub-string of the current architecture."""
2017 if (archs == None):
2018 return True
2019
2020 for arch in archs:
2021 if arch in self.getArchitecture():
2022 return True
2023
2024 return False
2025
Johnny Chenfb4264c2011-08-01 19:50:58 +00002026 def getRunOptions(self):
2027 """Command line option for -A and -C to run this test again, called from
2028 self.dumpSessionInfo()."""
2029 arch = self.getArchitecture()
2030 comp = self.getCompiler()
Johnny Chenb7bdd102011-08-24 19:48:51 +00002031 if arch:
2032 option_str = "-A " + arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00002033 else:
Johnny Chenb7bdd102011-08-24 19:48:51 +00002034 option_str = ""
2035 if comp:
Johnny Chen531c0852012-03-16 20:44:00 +00002036 option_str += " -C " + comp
Johnny Chenb7bdd102011-08-24 19:48:51 +00002037 return option_str
Johnny Chenfb4264c2011-08-01 19:50:58 +00002038
2039 # ==================================================
2040 # Build methods supported through a plugin interface
2041 # ==================================================
2042
Ed Mastec97323e2014-04-01 18:47:58 +00002043 def getstdlibFlag(self):
2044 """ Returns the proper -stdlib flag, or empty if not required."""
Robert Flack4629c4b2015-05-15 18:54:32 +00002045 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Ed Mastec97323e2014-04-01 18:47:58 +00002046 stdlibflag = "-stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002047 else: # this includes NetBSD
Ed Mastec97323e2014-04-01 18:47:58 +00002048 stdlibflag = ""
2049 return stdlibflag
2050
Matt Kopec7663b3a2013-09-25 17:44:00 +00002051 def getstdFlag(self):
2052 """ Returns the proper stdflag. """
Daniel Malea55faa402013-05-02 21:44:31 +00002053 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
Daniel Malea0b7c6112013-05-06 19:31:31 +00002054 stdflag = "-std=c++0x"
Daniel Malea55faa402013-05-02 21:44:31 +00002055 else:
2056 stdflag = "-std=c++11"
Matt Kopec7663b3a2013-09-25 17:44:00 +00002057 return stdflag
2058
2059 def buildDriver(self, sources, exe_name):
2060 """ Platform-specific way to build a program that links with LLDB (via the liblldb.so
2061 or LLDB.framework).
2062 """
2063
2064 stdflag = self.getstdFlag()
Ed Mastec97323e2014-04-01 18:47:58 +00002065 stdlibflag = self.getstdlibFlag()
Greg Clayton22fd3b12015-10-26 17:52:16 +00002066
2067 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002068 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002069 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Daniel Malea55faa402013-05-02 21:44:31 +00002070 d = {'CXX_SOURCES' : sources,
2071 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002072 'CFLAGS_EXTRAS' : "%s %s" % (stdflag, stdlibflag),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002073 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2074 'LD_EXTRAS' : "%s -Wl,-rpath,%s" % (dsym, lib_dir),
Daniel Malea55faa402013-05-02 21:44:31 +00002075 }
Ed Maste372c24d2013-07-25 21:02:34 +00002076 elif sys.platform.startswith('freebsd') or sys.platform.startswith("linux") or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002077 d = {'CXX_SOURCES' : sources,
Daniel Malea55faa402013-05-02 21:44:31 +00002078 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002079 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002080 'LD_EXTRAS' : "-L%s -llldb" % lib_dir}
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002081 elif sys.platform.startswith('win'):
2082 d = {'CXX_SOURCES' : sources,
2083 'EXE' : exe_name,
2084 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002085 'LD_EXTRAS' : "-L%s -lliblldb" % os.environ["LLDB_IMPLIB_DIR"]}
Daniel Malea55faa402013-05-02 21:44:31 +00002086 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002087 print("Building LLDB Driver (%s) from sources %s" % (exe_name, sources))
Daniel Malea55faa402013-05-02 21:44:31 +00002088
2089 self.buildDefault(dictionary=d)
2090
Matt Kopec7663b3a2013-09-25 17:44:00 +00002091 def buildLibrary(self, sources, lib_name):
2092 """Platform specific way to build a default library. """
2093
2094 stdflag = self.getstdFlag()
2095
Greg Clayton22fd3b12015-10-26 17:52:16 +00002096 lib_dir = os.environ["LLDB_LIB_DIR"]
Robert Flack4629c4b2015-05-15 18:54:32 +00002097 if self.platformIsDarwin():
Greg Clayton22fd3b12015-10-26 17:52:16 +00002098 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Matt Kopec7663b3a2013-09-25 17:44:00 +00002099 d = {'DYLIB_CXX_SOURCES' : sources,
2100 'DYLIB_NAME' : lib_name,
2101 'CFLAGS_EXTRAS' : "%s -stdlib=libc++" % stdflag,
Greg Clayton22fd3b12015-10-26 17:52:16 +00002102 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2103 'LD_EXTRAS' : "%s -Wl,-rpath,%s -dynamiclib" % (dsym, lib_dir),
Matt Kopec7663b3a2013-09-25 17:44:00 +00002104 }
Robert Flack4629c4b2015-05-15 18:54:32 +00002105 elif self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux' or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Matt Kopec7663b3a2013-09-25 17:44:00 +00002106 d = {'DYLIB_CXX_SOURCES' : sources,
2107 'DYLIB_NAME' : lib_name,
2108 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002109 'LD_EXTRAS' : "-shared -L%s -llldb" % lib_dir}
Robert Flack4629c4b2015-05-15 18:54:32 +00002110 elif self.getPlatform() == 'windows':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002111 d = {'DYLIB_CXX_SOURCES' : sources,
2112 'DYLIB_NAME' : lib_name,
2113 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002114 'LD_EXTRAS' : "-shared -l%s\liblldb.lib" % self.os.environ["LLDB_IMPLIB_DIR"]}
Matt Kopec7663b3a2013-09-25 17:44:00 +00002115 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002116 print("Building LLDB Library (%s) from sources %s" % (lib_name, sources))
Matt Kopec7663b3a2013-09-25 17:44:00 +00002117
2118 self.buildDefault(dictionary=d)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002119
Daniel Malea55faa402013-05-02 21:44:31 +00002120 def buildProgram(self, sources, exe_name):
2121 """ Platform specific way to build an executable from C/C++ sources. """
2122 d = {'CXX_SOURCES' : sources,
2123 'EXE' : exe_name}
2124 self.buildDefault(dictionary=d)
2125
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002126 def buildDefault(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002127 """Platform specific way to build the default binaries."""
Zachary Turner606e3a52015-12-08 01:15:30 +00002128 if configuration.skip_build_and_cleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00002129 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002130 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002131 if target_is_android():
2132 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002133 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002134 raise Exception("Don't know how to build default binary")
2135
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002136 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002137 """Platform specific way to build binaries with dsym info."""
Zachary Turner606e3a52015-12-08 01:15:30 +00002138 if configuration.skip_build_and_cleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00002139 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002140 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002141 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002142 raise Exception("Don't know how to build binary with dsym")
2143
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002144 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002145 """Platform specific way to build binaries with dwarf maps."""
Zachary Turner606e3a52015-12-08 01:15:30 +00002146 if configuration.skip_build_and_cleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00002147 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002148 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002149 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002150 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002151 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002152 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002153
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002154 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2155 """Platform specific way to build binaries with dwarf maps."""
Zachary Turner606e3a52015-12-08 01:15:30 +00002156 if configuration.skip_build_and_cleanup:
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002157 return
2158 module = builder_module()
2159 if target_is_android():
2160 dictionary = append_android_envs(dictionary)
2161 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2162 raise Exception("Don't know how to build binary with dwo")
2163
Ryan Brown57bee1e2015-09-14 22:45:11 +00002164 def buildGo(self):
2165 """Build the default go binary.
2166 """
2167 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2168
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002169 def signBinary(self, binary_path):
2170 if sys.platform.startswith("darwin"):
2171 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2172 call(codesign_cmd, shell=True)
2173
Kuba Breckabeed8212014-09-04 01:03:18 +00002174 def findBuiltClang(self):
2175 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2176 paths_to_try = [
2177 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2178 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2179 "llvm-build/Release/x86_64/Release/bin/clang",
2180 "llvm-build/Debug/x86_64/Debug/bin/clang",
2181 ]
Enrico Granata55d99f02015-11-19 21:45:07 +00002182 lldb_root_path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")
Kuba Breckabeed8212014-09-04 01:03:18 +00002183 for p in paths_to_try:
2184 path = os.path.join(lldb_root_path, p)
2185 if os.path.exists(path):
2186 return path
Ilia Kd9953052015-03-12 07:19:41 +00002187
2188 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002189 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002190 if os.path.exists(path):
2191 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002192
2193 return os.environ["CC"]
2194
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002195 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002196 """ Returns a dictionary (which can be provided to build* functions above) which
2197 contains OS-specific build flags.
2198 """
2199 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002200 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002201
2202 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002203 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002204 use_libcxx = True
2205
2206 if use_libcxx and self.libcxxPath:
2207 cflags += "-stdlib=libc++ "
2208 if self.libcxxPath:
2209 libcxxInclude = os.path.join(self.libcxxPath, "include")
2210 libcxxLib = os.path.join(self.libcxxPath, "lib")
2211 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2212 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2213
Andrew Kaylor93132f52013-05-28 23:04:25 +00002214 if use_cpp11:
2215 cflags += "-std="
2216 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2217 cflags += "c++0x"
2218 else:
2219 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002220 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002221 cflags += " -stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002222 elif self.getPlatform() == "netbsd":
2223 cflags += " -stdlib=libstdc++"
Andrew Kaylor93132f52013-05-28 23:04:25 +00002224 elif "clang" in self.getCompiler():
2225 cflags += " -stdlib=libstdc++"
2226
Andrew Kaylor93132f52013-05-28 23:04:25 +00002227 return {'CFLAGS_EXTRAS' : cflags,
2228 'LD_EXTRAS' : ldflags,
2229 }
2230
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002231 def cleanup(self, dictionary=None):
2232 """Platform specific way to do cleanup after build."""
Zachary Turner606e3a52015-12-08 01:15:30 +00002233 if configuration.skip_build_and_cleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00002234 return
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002235 module = builder_module()
2236 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002237 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002238
Daniel Malea55faa402013-05-02 21:44:31 +00002239 def getLLDBLibraryEnvVal(self):
2240 """ Returns the path that the OS-specific library search environment variable
2241 (self.dylibPath) should be set to in order for a program to find the LLDB
2242 library. If an environment variable named self.dylibPath is already set,
2243 the new path is appended to it and returned.
2244 """
2245 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002246 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002247 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002248 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002249 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002250 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002251 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002252 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002253
Ed Maste437f8f62013-09-09 14:04:04 +00002254 def getLibcPlusPlusLibs(self):
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002255 if self.getPlatform() in ('freebsd', 'linux', 'netbsd'):
Ed Maste437f8f62013-09-09 14:04:04 +00002256 return ['libc++.so.1']
2257 else:
2258 return ['libc++.1.dylib','libc++abi.dylib']
2259
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002260# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2261# We change the test methods to create a new test method for each test for each debug info we are
2262# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2263# the new test method we remove the old method at the same time.
2264class LLDBTestCaseFactory(type):
2265 def __new__(cls, name, bases, attrs):
2266 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002267 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002268 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
2269 @dsym_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002270 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002271 def dsym_test_method(self, attrvalue=attrvalue):
2272 self.debug_info = "dsym"
2273 return attrvalue(self)
2274 dsym_method_name = attrname + "_dsym"
2275 dsym_test_method.__name__ = dsym_method_name
2276 newattrs[dsym_method_name] = dsym_test_method
2277
2278 @dwarf_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002279 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002280 def dwarf_test_method(self, attrvalue=attrvalue):
2281 self.debug_info = "dwarf"
2282 return attrvalue(self)
2283 dwarf_method_name = attrname + "_dwarf"
2284 dwarf_test_method.__name__ = dwarf_method_name
2285 newattrs[dwarf_method_name] = dwarf_test_method
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002286
2287 @dwo_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002288 @wraps(attrvalue)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002289 def dwo_test_method(self, attrvalue=attrvalue):
2290 self.debug_info = "dwo"
2291 return attrvalue(self)
2292 dwo_method_name = attrname + "_dwo"
2293 dwo_test_method.__name__ = dwo_method_name
2294 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002295 else:
2296 newattrs[attrname] = attrvalue
2297 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2298
Zachary Turner43a01e42015-10-20 21:06:05 +00002299# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2300@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002301class TestBase(Base):
2302 """
2303 This abstract base class is meant to be subclassed. It provides default
2304 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2305 among other things.
2306
2307 Important things for test class writers:
2308
2309 - Overwrite the mydir class attribute, otherwise your test class won't
2310 run. It specifies the relative directory to the top level 'test' so
2311 the test harness can change to the correct working directory before
2312 running your test.
2313
2314 - The setUp method sets up things to facilitate subsequent interactions
2315 with the debugger as part of the test. These include:
2316 - populate the test method name
2317 - create/get a debugger set with synchronous mode (self.dbg)
2318 - get the command interpreter from with the debugger (self.ci)
2319 - create a result object for use with the command interpreter
2320 (self.res)
2321 - plus other stuffs
2322
2323 - The tearDown method tries to perform some necessary cleanup on behalf
2324 of the test to return the debugger to a good state for the next test.
2325 These include:
2326 - execute any tearDown hooks registered by the test method with
2327 TestBase.addTearDownHook(); examples can be found in
2328 settings/TestSettings.py
2329 - kill the inferior process associated with each target, if any,
2330 and, then delete the target from the debugger's target list
2331 - perform build cleanup before running the next test method in the
2332 same test class; examples of registering for this service can be
2333 found in types/TestIntegerTypes.py with the call:
2334 - self.setTearDownCleanup(dictionary=d)
2335
2336 - Similarly setUpClass and tearDownClass perform classwise setup and
2337 teardown fixtures. The tearDownClass method invokes a default build
2338 cleanup for the entire test class; also, subclasses can implement the
2339 classmethod classCleanup(cls) to perform special class cleanup action.
2340
2341 - The instance methods runCmd and expect are used heavily by existing
2342 test cases to send a command to the command interpreter and to perform
2343 string/pattern matching on the output of such command execution. The
2344 expect method also provides a mode to peform string/pattern matching
2345 without running a command.
2346
2347 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2348 build the binaries used during a particular test scenario. A plugin
2349 should be provided for the sys.platform running the test suite. The
2350 Mac OS X implementation is located in plugins/darwin.py.
2351 """
2352
2353 # Maximum allowed attempts when launching the inferior process.
2354 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2355 maxLaunchCount = 3;
2356
2357 # Time to wait before the next launching attempt in second(s).
2358 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2359 timeWaitNextLaunch = 1.0;
2360
Enrico Granata165f8af2012-09-21 19:10:53 +00002361 # Returns the list of categories to which this test case belongs
2362 # by default, look for a ".categories" file, and read its contents
2363 # if no such file exists, traverse the hierarchy - we guarantee
2364 # a .categories to exist at the top level directory so we do not end up
2365 # looping endlessly - subclasses are free to define their own categories
2366 # in whatever way makes sense to them
2367 def getCategories(self):
2368 import inspect
2369 import os.path
2370 folder = inspect.getfile(self.__class__)
2371 folder = os.path.dirname(folder)
2372 while folder != '/':
2373 categories_file_name = os.path.join(folder,".categories")
2374 if os.path.exists(categories_file_name):
2375 categories_file = open(categories_file_name,'r')
2376 categories = categories_file.readline()
2377 categories_file.close()
2378 categories = str.replace(categories,'\n','')
2379 categories = str.replace(categories,'\r','')
2380 return categories.split(',')
2381 else:
2382 folder = os.path.dirname(folder)
2383 continue
2384
Johnny Chena74bb0a2011-08-01 18:46:13 +00002385 def setUp(self):
2386 #import traceback
2387 #traceback.print_stack()
2388
2389 # Works with the test driver to conditionally skip tests via decorators.
2390 Base.setUp(self)
2391
Johnny Chenf2b70232010-08-25 18:49:48 +00002392 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2393 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2394
Johnny Chen430eb762010-10-19 16:00:42 +00002395 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002396 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002397
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002398 # We want our debugger to be synchronous.
2399 self.dbg.SetAsync(False)
2400
2401 # Retrieve the associated command interpreter instance.
2402 self.ci = self.dbg.GetCommandInterpreter()
2403 if not self.ci:
2404 raise Exception('Could not get the command interpreter')
2405
2406 # And the result object.
2407 self.res = lldb.SBCommandReturnObject()
2408
Zachary Turner606e3a52015-12-08 01:15:30 +00002409 if lldb.remote_platform and configuration.lldb_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002410 remote_test_dir = lldbutil.join_remote_paths(
Zachary Turner606e3a52015-12-08 01:15:30 +00002411 configuration.lldb_platform_working_dir,
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002412 self.getArchitecture(),
2413 str(self.test_number),
2414 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002415 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002416 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002417 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002418
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002419 # This function removes all files from the current working directory while leaving
2420 # the directories in place. The cleaup is required to reduce the disk space required
2421 # by the test suit while leaving the directories untached is neccessary because
2422 # sub-directories might belong to an other test
2423 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002424 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002425 # TODO: Replace the heuristic to remove the files with a logic what collects the
2426 # list of files we have to remove during test runs.
2427 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002428 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002429 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002430 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002431 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002432
Greg Clayton35c91342014-11-17 18:40:27 +00002433 def registerSharedLibrariesWithTarget(self, target, shlibs):
2434 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2435
2436 Any modules in the target that have their remote install file specification set will
2437 get uploaded to the remote host. This function registers the local copies of the
2438 shared libraries with the target and sets their remote install locations so they will
2439 be uploaded when the target is run.
2440 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002441 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002442 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002443
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002444 shlib_environment_var = self.platformContext.shlib_environment_var
2445 shlib_prefix = self.platformContext.shlib_prefix
2446 shlib_extension = '.' + self.platformContext.shlib_extension
2447
2448 working_dir = self.get_process_working_directory()
2449 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2450 # Add any shared libraries to our target if remote so they get
2451 # uploaded into the working directory on the remote side
2452 for name in shlibs:
2453 # The path can be a full path to a shared library, or a make file name like "Foo" for
2454 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2455 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2456 # of the shared library accordingly
2457 if os.path.exists(name):
2458 local_shlib_path = name # name is the full path to the local shared library
2459 else:
2460 # Check relative names
2461 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2462 if not os.path.exists(local_shlib_path):
2463 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002464 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002465 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002466
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002467 # Make sure we found the local shared library in the above code
2468 self.assertTrue(os.path.exists(local_shlib_path))
2469
2470 # Add the shared library to our target
2471 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2472 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002473 # We must set the remote install location if we want the shared library
2474 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002475 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002476 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002477
2478 return environment
2479
Enrico Granata44818162012-10-24 01:23:57 +00002480 # utility methods that tests can use to access the current objects
2481 def target(self):
2482 if not self.dbg:
2483 raise Exception('Invalid debugger instance')
2484 return self.dbg.GetSelectedTarget()
2485
2486 def process(self):
2487 if not self.dbg:
2488 raise Exception('Invalid debugger instance')
2489 return self.dbg.GetSelectedTarget().GetProcess()
2490
2491 def thread(self):
2492 if not self.dbg:
2493 raise Exception('Invalid debugger instance')
2494 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2495
2496 def frame(self):
2497 if not self.dbg:
2498 raise Exception('Invalid debugger instance')
2499 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2500
Greg Claytonc6947512013-12-13 19:18:59 +00002501 def get_process_working_directory(self):
2502 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2503 if lldb.remote_platform:
2504 # Remote tests set the platform working directory up in TestBase.setUp()
2505 return lldb.remote_platform.GetWorkingDirectory()
2506 else:
2507 # local tests change directory into each test subdirectory
2508 return os.getcwd()
2509
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002510 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002511 #import traceback
2512 #traceback.print_stack()
2513
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002514 # Ensure all the references to SB objects have gone away so that we can
2515 # be sure that all test-specific resources have been freed before we
2516 # attempt to delete the targets.
2517 gc.collect()
2518
Johnny Chen3794ad92011-06-15 21:24:24 +00002519 # Delete the target(s) from the debugger as a general cleanup step.
2520 # This includes terminating the process for each target, if any.
2521 # We'd like to reuse the debugger for our next test without incurring
2522 # the initialization overhead.
2523 targets = []
2524 for target in self.dbg:
2525 if target:
2526 targets.append(target)
2527 process = target.GetProcess()
2528 if process:
2529 rc = self.invoke(process, "Kill")
2530 self.assertTrue(rc.Success(), PROCESS_KILLED)
2531 for target in targets:
2532 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002533
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002534 # Do this last, to make sure it's in reverse order from how we setup.
2535 Base.tearDown(self)
2536
Zachary Turner95812042015-03-26 18:54:21 +00002537 # This must be the last statement, otherwise teardown hooks or other
2538 # lines might depend on this still being active.
2539 del self.dbg
2540
Johnny Chen86268e42011-09-30 21:48:35 +00002541 def switch_to_thread_with_stop_reason(self, stop_reason):
2542 """
2543 Run the 'thread list' command, and select the thread with stop reason as
2544 'stop_reason'. If no such thread exists, no select action is done.
2545 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002546 from .lldbutil import stop_reason_to_str
Johnny Chen86268e42011-09-30 21:48:35 +00002547 self.runCmd('thread list')
2548 output = self.res.GetOutput()
2549 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2550 stop_reason_to_str(stop_reason))
2551 for line in output.splitlines():
2552 matched = thread_line_pattern.match(line)
2553 if matched:
2554 self.runCmd('thread select %s' % matched.group(1))
2555
Enrico Granata7594f142013-06-17 22:51:50 +00002556 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002557 """
2558 Ask the command interpreter to handle the command and then check its
2559 return status.
2560 """
2561 # Fail fast if 'cmd' is not meaningful.
2562 if not cmd or len(cmd) == 0:
2563 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002564
Johnny Chen8d55a342010-08-31 17:42:54 +00002565 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002566
Daniel Maleae0f8f572013-08-26 23:57:52 +00002567 if cmd.startswith("target create "):
2568 cmd = cmd.replace("target create ", "file ")
Daniel Maleae0f8f572013-08-26 23:57:52 +00002569
Johnny Chen63dfb272010-09-01 00:15:19 +00002570 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002571
Johnny Chen63dfb272010-09-01 00:15:19 +00002572 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002573 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002574
Johnny Chen150c3cc2010-10-15 01:18:29 +00002575 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002576 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002577 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002578 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002579 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002580 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002581 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002582 print("runCmd failed!", file=sbuf)
2583 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002584
Johnny Chenff3d01d2010-08-20 21:03:09 +00002585 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002586 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002587 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002588 # For process launch, wait some time before possible next try.
2589 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002590 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002591 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002592
Johnny Chen27f212d2010-08-19 23:26:59 +00002593 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002594 self.assertTrue(self.res.Succeeded(),
2595 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002596
Jim Ingham63dfc722012-09-22 00:05:11 +00002597 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2598 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2599
2600 Otherwise, all the arguments have the same meanings as for the expect function"""
2601
2602 trace = (True if traceAlways else trace)
2603
2604 if exe:
2605 # First run the command. If we are expecting error, set check=False.
2606 # Pass the assert message along since it provides more semantic info.
2607 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2608
2609 # Then compare the output against expected strings.
2610 output = self.res.GetError() if error else self.res.GetOutput()
2611
2612 # If error is True, the API client expects the command to fail!
2613 if error:
2614 self.assertFalse(self.res.Succeeded(),
2615 "Command '" + str + "' is expected to fail!")
2616 else:
2617 # No execution required, just compare str against the golden input.
2618 output = str
2619 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002620 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002621
2622 # The heading says either "Expecting" or "Not expecting".
2623 heading = "Expecting" if matching else "Not expecting"
2624
2625 for pattern in patterns:
2626 # Match Objects always have a boolean value of True.
2627 match_object = re.search(pattern, output)
2628 matched = bool(match_object)
2629 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002630 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2631 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002632 if matched:
2633 break
2634
2635 self.assertTrue(matched if matching else not matched,
2636 msg if msg else EXP_MSG(str, exe))
2637
2638 return match_object
2639
Enrico Granata7594f142013-06-17 22:51:50 +00002640 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 +00002641 """
2642 Similar to runCmd; with additional expect style output matching ability.
2643
2644 Ask the command interpreter to handle the command and then check its
2645 return status. The 'msg' parameter specifies an informational assert
2646 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002647 'startstr', matches the substrings contained in 'substrs', and regexp
2648 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002649
2650 If the keyword argument error is set to True, it signifies that the API
2651 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002652 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002653 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002654
2655 If the keyword argument matching is set to False, it signifies that the API
2656 client is expecting the output of the command not to match the golden
2657 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002658
2659 Finally, the required argument 'str' represents the lldb command to be
2660 sent to the command interpreter. In case the keyword argument 'exe' is
2661 set to False, the 'str' is treated as a string to be matched/not-matched
2662 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002663 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002664 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002665
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002666 if exe:
2667 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002668 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002669 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002670
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002671 # Then compare the output against expected strings.
2672 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002673
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002674 # If error is True, the API client expects the command to fail!
2675 if error:
2676 self.assertFalse(self.res.Succeeded(),
2677 "Command '" + str + "' is expected to fail!")
2678 else:
2679 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002680 if isinstance(str,lldb.SBCommandReturnObject):
2681 output = str.GetOutput()
2682 else:
2683 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002684 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002685 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002686
Johnny Chenea88e942010-09-21 21:08:53 +00002687 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002688 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002689
2690 # Start from the startstr, if specified.
2691 # If there's no startstr, set the initial state appropriately.
2692 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002693
Johnny Chen150c3cc2010-10-15 01:18:29 +00002694 if startstr:
2695 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002696 print("%s start string: %s" % (heading, startstr), file=sbuf)
2697 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002698
Johnny Chen86268e42011-09-30 21:48:35 +00002699 # Look for endstr, if specified.
2700 keepgoing = matched if matching else not matched
2701 if endstr:
2702 matched = output.endswith(endstr)
2703 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002704 print("%s end string: %s" % (heading, endstr), file=sbuf)
2705 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002706
Johnny Chenea88e942010-09-21 21:08:53 +00002707 # Look for sub strings, if specified.
2708 keepgoing = matched if matching else not matched
2709 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002710 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002711 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002712 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002713 print("%s sub string: %s" % (heading, str), file=sbuf)
2714 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002715 keepgoing = matched if matching else not matched
2716 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002717 break
2718
Johnny Chenea88e942010-09-21 21:08:53 +00002719 # Search for regular expression patterns, if specified.
2720 keepgoing = matched if matching else not matched
2721 if patterns and keepgoing:
2722 for pattern in patterns:
2723 # Match Objects always have a boolean value of True.
2724 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002725 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002726 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2727 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002728 keepgoing = matched if matching else not matched
2729 if not keepgoing:
2730 break
Johnny Chenea88e942010-09-21 21:08:53 +00002731
2732 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002733 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002734
Johnny Chenf3c59232010-08-25 22:52:45 +00002735 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002736 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002737 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002738
2739 method = getattr(obj, name)
2740 import inspect
2741 self.assertTrue(inspect.ismethod(method),
2742 name + "is a method name of object: " + str(obj))
2743 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002744 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002745 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002746 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002747
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002748 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2749 """Platform specific way to build the default binaries."""
Zachary Turner606e3a52015-12-08 01:15:30 +00002750 if configuration.skip_build_and_cleanup:
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002751 return
2752 module = builder_module()
2753 if target_is_android():
2754 dictionary = append_android_envs(dictionary)
2755 if self.debug_info is None:
2756 return self.buildDefault(architecture, compiler, dictionary, clean)
2757 elif self.debug_info == "dsym":
2758 return self.buildDsym(architecture, compiler, dictionary, clean)
2759 elif self.debug_info == "dwarf":
2760 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002761 elif self.debug_info == "dwo":
2762 return self.buildDwo(architecture, compiler, dictionary, clean)
2763 else:
2764 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002765
Johnny Chenf359cf22011-05-27 23:36:52 +00002766 # =================================================
2767 # Misc. helper methods for debugging test execution
2768 # =================================================
2769
Johnny Chen56b92a72011-07-11 19:15:11 +00002770 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002771 """Debug print a SBValue object, if traceAlways is True."""
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002772 from .lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002773
Johnny Chen8d55a342010-08-31 17:42:54 +00002774 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002775 return
2776
2777 err = sys.stderr
2778 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002779 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2780 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2781 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2782 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2783 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2784 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2785 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2786 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2787 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002788
Johnny Chen36c5eb12011-08-05 20:17:27 +00002789 def DebugSBType(self, type):
2790 """Debug print a SBType object, if traceAlways is True."""
2791 if not traceAlways:
2792 return
2793
2794 err = sys.stderr
2795 err.write(type.GetName() + ":\n")
2796 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2797 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2798 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2799
Johnny Chenb877f1e2011-03-12 01:18:19 +00002800 def DebugPExpect(self, child):
2801 """Debug the spwaned pexpect object."""
2802 if not traceAlways:
2803 return
2804
Zachary Turnerff890da2015-10-19 23:45:41 +00002805 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002806
2807 @classmethod
2808 def RemoveTempFile(cls, file):
2809 if os.path.exists(file):
2810 os.remove(file)