blob: 77caab5f6f04f8d05d3c6d757282fe5d6b111341 [file] [log] [blame]
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001"""
2LLDB module which provides the abstract base class of lldb test case.
3
4The concrete subclass can override lldbtest.TesBase in order to inherit the
5common behavior for unitest.TestCase.setUp/tearDown implemented in this file.
6
7The subclass should override the attribute mydir in order for the python runtime
8to locate the individual test cases when running as part of a large test suite
9or when running each test case as a separate python invocation.
10
11./dotest.py provides a test driver which sets up the environment to run the
Johnny Chenc98892e2012-05-16 20:41:28 +000012entire of part of the test suite . Example:
Johnny Chenbf6ffa32010-07-03 03:41:59 +000013
Johnny Chenc98892e2012-05-16 20:41:28 +000014# Exercises the test suite in the types directory....
15/Volumes/data/lldb/svn/ToT/test $ ./dotest.py -A x86_64 types
Johnny Chen57b47382010-09-02 22:25:47 +000016...
Johnny Chend0190a62010-08-23 17:10:44 +000017
Johnny Chenc98892e2012-05-16 20:41:28 +000018Session logs for test failures/errors/unexpected successes will go into directory '2012-05-16-13_35_42'
19Command invoked: python ./dotest.py -A x86_64 types
20compilers=['clang']
Johnny Chend0190a62010-08-23 17:10:44 +000021
Johnny Chenc98892e2012-05-16 20:41:28 +000022Configuration: arch=x86_64 compiler=clang
Johnny Chend0190a62010-08-23 17:10:44 +000023----------------------------------------------------------------------
Johnny Chenc98892e2012-05-16 20:41:28 +000024Collected 72 tests
25
26........................................................................
27----------------------------------------------------------------------
28Ran 72 tests in 135.468s
Johnny Chend0190a62010-08-23 17:10:44 +000029
30OK
Johnny Chenbf6ffa32010-07-03 03:41:59 +000031$
32"""
33
Zachary Turnerff890da2015-10-19 23:45:41 +000034from __future__ import print_function
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000035from __future__ import absolute_import
Zachary Turnerff890da2015-10-19 23:45:41 +000036
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000037# System modules
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +000038import abc
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000039import collections
Zachary Turnerabdb8392015-11-16 22:40:30 +000040from distutils.version import LooseVersion
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +000041import gc
Vince Harron9753dd92015-05-10 15:22:09 +000042import glob
Zachary Turnerba105702015-11-16 23:58:20 +000043import inspect
Johnny Chen90312a82010-09-21 22:34:45 +000044import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000045import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000046import re
Daniel Malea69207462013-06-05 21:07:02 +000047import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000048from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000049import time
Johnny Chena33a93c2010-08-30 23:08:52 +000050import types
Zachary Turner43a01e42015-10-20 21:06:05 +000051
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000052# Third-party modules
53import unittest2
Zachary Turner43a01e42015-10-20 21:06:05 +000054from six import add_metaclass
Zachary Turner814236d2015-10-21 17:48:52 +000055from six import StringIO as SixStringIO
56from six.moves.urllib import parse as urlparse
Zachary Turnercd236b82015-10-26 18:48:24 +000057import six
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000058
59# LLDB modules
60import lldb
Zachary Turner606e3a52015-12-08 01:15:30 +000061from . import configuration
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000062from . import lldbtest_config
63from . import lldbutil
64from . import test_categories
Siva Chandra8af91662015-06-05 00:22:49 +000065
Todd Fiala9187f272015-12-11 18:06:47 +000066from .result_formatter import EventBuilder
67
Vince Harron85d19652015-05-21 19:09:29 +000068# dosep.py starts lots and lots of dotest instances
69# This option helps you find if two (or more) dotest instances are using the same
70# directory at the same time
71# Enable it to cause test failures and stderr messages if dotest instances try to run in
72# the same directory simultaneously
73# it is disabled by default because it litters the test directories with ".dirlock" files
74debug_confirm_directory_exclusivity = False
75
Johnny Chen707b3c92010-10-11 22:25:46 +000076# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000077# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000078
79# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000080if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
81 traceAlways = True
82else:
83 traceAlways = False
84
Johnny Chen707b3c92010-10-11 22:25:46 +000085# By default, doCleanup is True.
86if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
87 doCleanup = False
88else:
89 doCleanup = True
90
Johnny Chen8d55a342010-08-31 17:42:54 +000091
Johnny Chen00778092010-08-09 22:01:17 +000092#
93# Some commonly used assert messages.
94#
95
Johnny Chenaa902922010-09-17 22:45:27 +000096COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
97
Johnny Chen00778092010-08-09 22:01:17 +000098CURRENT_EXECUTABLE_SET = "Current executable set successfully"
99
Johnny Chen7d1d7532010-09-02 21:23:12 +0000100PROCESS_IS_VALID = "Process is valid"
101
102PROCESS_KILLED = "Process is killed successfully"
103
Johnny Chend5f66fc2010-12-23 01:12:19 +0000104PROCESS_EXITED = "Process exited successfully"
105
106PROCESS_STOPPED = "Process status should be stopped"
107
Sean Callanan05834cd2015-07-01 23:56:30 +0000108RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000109
Johnny Chen17941842010-08-09 23:44:24 +0000110RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000111
Johnny Chen67af43f2010-10-05 19:27:32 +0000112BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
113
Johnny Chen17941842010-08-09 23:44:24 +0000114BREAKPOINT_CREATED = "Breakpoint created successfully"
115
Johnny Chenf10af382010-12-04 00:07:24 +0000116BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
117
Johnny Chene76896c2010-08-17 21:33:31 +0000118BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
119
Johnny Chen17941842010-08-09 23:44:24 +0000120BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000121
Johnny Chen703dbd02010-09-30 17:06:24 +0000122BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
123
Johnny Chen164f1e12010-10-15 18:07:09 +0000124BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
125
Greg Clayton5db6b792012-10-24 18:24:14 +0000126MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
127
Johnny Chen89109ed12011-06-27 20:05:23 +0000128OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
129
Johnny Chen5b3a3572010-12-09 18:22:12 +0000130SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
131
Johnny Chenc70b02a2010-09-22 23:00:20 +0000132STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
133
Johnny Chen1691a162011-04-15 16:44:48 +0000134STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
135
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000136STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
137
Johnny Chen5d6c4642010-11-10 23:46:38 +0000138STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000139
Johnny Chen5d6c4642010-11-10 23:46:38 +0000140STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
141 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000142
Johnny Chen2e431ce2010-10-20 18:38:48 +0000143STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
144
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000145STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
146
Johnny Chenc066ab42010-10-14 01:22:03 +0000147STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
148
Johnny Chen00778092010-08-09 22:01:17 +0000149STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
150
Johnny Chenf68cc122011-09-15 21:09:59 +0000151STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
152
Johnny Chen3c884a02010-08-24 22:07:56 +0000153DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
154
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000155VALID_BREAKPOINT = "Got a valid breakpoint"
156
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000157VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
158
Johnny Chen7209d84f2011-05-06 23:26:12 +0000159VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
160
Johnny Chen5ee88192010-08-27 23:47:36 +0000161VALID_FILESPEC = "Got a valid filespec"
162
Johnny Chen025d1b82010-12-08 01:25:21 +0000163VALID_MODULE = "Got a valid module"
164
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000165VALID_PROCESS = "Got a valid process"
166
Johnny Chen025d1b82010-12-08 01:25:21 +0000167VALID_SYMBOL = "Got a valid symbol"
168
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000169VALID_TARGET = "Got a valid target"
170
Matthew Gardinerc928de32014-10-22 07:22:56 +0000171VALID_PLATFORM = "Got a valid platform"
172
Johnny Chen15f247a2012-02-03 20:43:00 +0000173VALID_TYPE = "Got a valid type"
174
Johnny Chen5819ab42011-07-15 22:28:10 +0000175VALID_VARIABLE = "Got a valid variable"
176
Johnny Chen981463d2010-08-25 19:00:04 +0000177VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000178
Johnny Chenf68cc122011-09-15 21:09:59 +0000179WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000180
Sean Callanan05834cd2015-07-01 23:56:30 +0000181def CMD_MSG(str):
182 '''A generic "Command '%s' returns successfully" message generator.'''
183 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000184
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000185def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000186 '''A generic message generator for the completion mechanism.'''
187 return "'%s' successfully completes to '%s'" % (str_before, str_after)
188
Johnny Chenc0c67f22010-11-09 18:42:22 +0000189def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000190 '''A generic "'%s' returns expected result" message generator if exe.
191 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000192 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000193
Johnny Chen3343f042010-10-19 19:11:38 +0000194def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000195 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000196 return "Value of setting '%s' is correct" % setting
197
Johnny Chen27c41232010-08-26 21:49:29 +0000198def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000199 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000200 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000201
Johnny Chen47ceb032010-10-11 23:52:19 +0000202def line_number(filename, string_to_match):
203 """Helper function to return the line number of the first matched string."""
204 with open(filename, 'r') as f:
205 for i, line in enumerate(f):
206 if line.find(string_to_match) != -1:
207 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000208 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000209 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000210
Johnny Chen67af43f2010-10-05 19:27:32 +0000211def pointer_size():
212 """Return the pointer size of the host system."""
213 import ctypes
214 a_pointer = ctypes.c_void_p(0xffff)
215 return 8 * ctypes.sizeof(a_pointer)
216
Johnny Chen57816732012-02-09 02:01:59 +0000217def is_exe(fpath):
218 """Returns true if fpath is an executable."""
219 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
220
221def which(program):
222 """Returns the full path to a program; None otherwise."""
223 fpath, fname = os.path.split(program)
224 if fpath:
225 if is_exe(program):
226 return program
227 else:
228 for path in os.environ["PATH"].split(os.pathsep):
229 exe_file = os.path.join(path, program)
230 if is_exe(exe_file):
231 return exe_file
232 return None
233
Zachary Turner814236d2015-10-21 17:48:52 +0000234class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000235 """
236 A nice little context manager for recording the debugger interactions into
237 our session object. If trace flag is ON, it also emits the interactions
238 into the stderr.
239 """
240 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000241 """Create a SixStringIO instance; record the session obj and trace flag."""
242 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000243 # The test might not have undergone the 'setUp(self)' phase yet, so that
244 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000245 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000246 self.trace = trace
247
248 def __enter__(self):
249 """
250 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000251 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000252 """
253 return self
254
255 def __exit__(self, type, value, tb):
256 """
257 Context management protocol on exit from the body of the with statement.
258 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000259 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000260 """
261 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000262 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000263 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000264 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000265 self.close()
266
Zachary Turner43a01e42015-10-20 21:06:05 +0000267@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000268class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000269
270 @abc.abstractproperty
271 def pid(self):
272 """Returns process PID if has been launched already."""
273
274 @abc.abstractmethod
275 def launch(self, executable, args):
276 """Launches new process with given executable and args."""
277
278 @abc.abstractmethod
279 def terminate(self):
280 """Terminates previously launched process.."""
281
282class _LocalProcess(_BaseProcess):
283
284 def __init__(self, trace_on):
285 self._proc = None
286 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000287 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000288
289 @property
290 def pid(self):
291 return self._proc.pid
292
293 def launch(self, executable, args):
294 self._proc = Popen([executable] + args,
295 stdout = open(os.devnull) if not self._trace_on else None,
296 stdin = PIPE)
297
298 def terminate(self):
299 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000300 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000301 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
302 for sig in signals_to_try:
303 try:
304 self._proc.send_signal(getattr(signal, sig))
305 time.sleep(self._delayafterterminate)
306 if self._proc.poll() != None:
307 return
308 except ValueError:
309 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000310 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000311 time.sleep(self._delayafterterminate)
312 if self._proc.poll() != None:
313 return
314 self._proc.kill()
315 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000316
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000317 def poll(self):
318 return self._proc.poll()
319
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000320class _RemoteProcess(_BaseProcess):
321
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000322 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000323 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000324 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000325
326 @property
327 def pid(self):
328 return self._pid
329
330 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000331 if self._install_remote:
332 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000333 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000334
335 dst_file_spec = lldb.SBFileSpec(dst_path, False)
336 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
337 if err.Fail():
338 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
339 else:
340 dst_path = executable
341 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000342
343 launch_info = lldb.SBLaunchInfo(args)
344 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000345 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000346
347 # Redirect stdout and stderr to /dev/null
348 launch_info.AddSuppressFileAction(1, False, True)
349 launch_info.AddSuppressFileAction(2, False, True)
350
351 err = lldb.remote_platform.Launch(launch_info)
352 if err.Fail():
353 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
354 self._pid = launch_info.GetProcessID()
355
356 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000357 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000358
Johnny Chen690fcef2010-10-15 23:55:05 +0000359# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000360# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000361def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000362 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000363
364 If the exit code was non-zero it raises a CalledProcessError. The
365 CalledProcessError object will have the return code in the returncode
366 attribute and output in the output attribute.
367
368 The arguments are the same as for the Popen constructor. Example:
369
370 >>> check_output(["ls", "-l", "/dev/null"])
371 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
372
373 The stdout argument is not allowed as it is used internally.
374 To capture standard error in the result, use stderr=STDOUT.
375
376 >>> check_output(["/bin/sh", "-c",
377 ... "ls -l non_existent_file ; exit 0"],
378 ... stderr=STDOUT)
379 'ls: non_existent_file: No such file or directory\n'
380 """
381
382 # Assign the sender object to variable 'test' and remove it from kwargs.
383 test = kwargs.pop('sender', None)
384
Zachary Turner9ef307b2014-07-22 16:19:29 +0000385 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
386 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000387 output = ""
388 error = ""
389 for shellCommand in commandList:
390 if 'stdout' in kwargs:
391 raise ValueError('stdout argument not allowed, it will be overridden.')
392 if 'shell' in kwargs and kwargs['shell']==False:
393 raise ValueError('shell=False not allowed')
Zachary Turner48ef8d4c2015-11-18 18:40:16 +0000394 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, universal_newlines=True, **kwargs)
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000395 pid = process.pid
396 this_output, this_error = process.communicate()
397 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000398
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000399 # Enable trace on failure return while tracking down FreeBSD buildbot issues
400 trace = traceAlways
401 if not trace and retcode and sys.platform.startswith("freebsd"):
402 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000403
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000404 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000405 print(file=sbuf)
406 print("os command:", shellCommand, file=sbuf)
407 print("with pid:", pid, file=sbuf)
408 print("stdout:", this_output, file=sbuf)
409 print("stderr:", this_error, file=sbuf)
410 print("retcode:", retcode, file=sbuf)
411 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000412
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000413 if retcode:
414 cmd = kwargs.get("args")
415 if cmd is None:
416 cmd = shellCommand
417 raise CalledProcessError(retcode, cmd)
418 output = output + this_output
419 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000420 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000421
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000422def getsource_if_available(obj):
423 """
424 Return the text of the source code for an object if available. Otherwise,
425 a print representation is returned.
426 """
427 import inspect
428 try:
429 return inspect.getsource(obj)
430 except:
431 return repr(obj)
432
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000433def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000434 if sys.platform.startswith("freebsd"):
435 return __import__("builder_freebsd")
Kamil Rytarowski0b655da2015-12-05 18:46:56 +0000436 if sys.platform.startswith("netbsd"):
437 return __import__("builder_netbsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000438 return __import__("builder_" + sys.platform)
439
Siva Chandra8af91662015-06-05 00:22:49 +0000440def run_adb_command(cmd, device_id):
441 device_id_args = []
442 if device_id:
443 device_id_args = ["-s", device_id]
444 full_cmd = ["adb"] + device_id_args + cmd
445 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
446 stdout, stderr = p.communicate()
447 return p.returncode, stdout, stderr
448
Chaoren Line9bbabc2015-07-18 00:37:55 +0000449def append_android_envs(dictionary):
450 if dictionary is None:
451 dictionary = {}
452 dictionary["OS"] = "Android"
453 if android_device_api() >= 16:
454 dictionary["PIE"] = 1
455 return dictionary
456
Chaoren Lin9070f532015-07-17 22:13:29 +0000457def target_is_android():
458 if not hasattr(target_is_android, 'result'):
459 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
460 match = re.match(".*-.*-.*-android", triple)
461 target_is_android.result = match is not None
462 return target_is_android.result
463
Siva Chandra8af91662015-06-05 00:22:49 +0000464def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000465 if not hasattr(android_device_api, 'result'):
Zachary Turner606e3a52015-12-08 01:15:30 +0000466 assert configuration.lldb_platform_url is not None
Chaoren Lin9070f532015-07-17 22:13:29 +0000467 device_id = None
Zachary Turner606e3a52015-12-08 01:15:30 +0000468 parsed_url = urlparse.urlparse(configuration.lldb_platform_url)
Ying Chenca922bb2015-11-18 19:03:20 +0000469 host_name = parsed_url.netloc.split(":")[0]
470 if host_name != 'localhost':
471 device_id = host_name
472 if device_id.startswith('[') and device_id.endswith(']'):
473 device_id = device_id[1:-1]
Chaoren Lin9070f532015-07-17 22:13:29 +0000474 retcode, stdout, stderr = run_adb_command(
475 ["shell", "getprop", "ro.build.version.sdk"], device_id)
476 if retcode == 0:
477 android_device_api.result = int(stdout)
478 else:
479 raise LookupError(
480 ">>> Unable to determine the API level of the Android device.\n"
481 ">>> stdout:\n%s\n"
482 ">>> stderr:\n%s\n" % (stdout, stderr))
483 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000484
Zachary Turnerabdb8392015-11-16 22:40:30 +0000485def check_expected_version(comparison, expected, actual):
486 def fn_leq(x,y): return x <= y
487 def fn_less(x,y): return x < y
488 def fn_geq(x,y): return x >= y
489 def fn_greater(x,y): return x > y
490 def fn_eq(x,y): return x == y
491 def fn_neq(x,y): return x != y
492
493 op_lookup = {
494 "==": fn_eq,
495 "=": fn_eq,
496 "!=": fn_neq,
497 "<>": fn_neq,
498 ">": fn_greater,
499 "<": fn_less,
500 ">=": fn_geq,
501 "<=": fn_leq
502 }
503 expected_str = '.'.join([str(x) for x in expected])
504 actual_str = '.'.join([str(x) for x in actual])
505
506 return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
507
Johnny Chena74bb0a2011-08-01 18:46:13 +0000508#
509# Decorators for categorizing test cases.
510#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000511from functools import wraps
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000512def add_test_categories(cat):
513 """Decorate an item with test categories"""
514 cat = test_categories.validate(cat, True)
515 def impl(func):
516 func.getCategories = lambda test: cat
517 return func
518 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000519
Johnny Chena74bb0a2011-08-01 18:46:13 +0000520def benchmarks_test(func):
521 """Decorate the item as a benchmarks test."""
522 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
523 raise Exception("@benchmarks_test can only be used to decorate a test method")
524 @wraps(func)
525 def wrapper(self, *args, **kwargs):
Zachary Turneraad25fb2015-12-08 18:36:05 +0000526 self.skipTest("benchmarks test")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000527 return func(self, *args, **kwargs)
528
529 # Mark this function as such to separate them from the regular tests.
530 wrapper.__benchmarks_test__ = True
531 return wrapper
532
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000533def no_debug_info_test(func):
534 """Decorate the item as a test what don't use any debug info. If this annotation is specified
535 then the test runner won't generate a separate test for each debug info format. """
536 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
537 raise Exception("@no_debug_info_test can only be used to decorate a test method")
538 @wraps(func)
539 def wrapper(self, *args, **kwargs):
540 return func(self, *args, **kwargs)
541
542 # Mark this function as such to separate them from the regular tests.
543 wrapper.__no_debug_info_test__ = True
544 return wrapper
545
Johnny Chenf1548d42012-04-06 00:56:05 +0000546def dsym_test(func):
547 """Decorate the item as a dsym test."""
548 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
549 raise Exception("@dsym_test can only be used to decorate a test method")
550 @wraps(func)
551 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000552 if configuration.dont_do_dsym_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000553 self.skipTest("dsym tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000554 return func(self, *args, **kwargs)
555
556 # Mark this function as such to separate them from the regular tests.
557 wrapper.__dsym_test__ = True
558 return wrapper
559
560def dwarf_test(func):
561 """Decorate the item as a dwarf test."""
562 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
563 raise Exception("@dwarf_test can only be used to decorate a test method")
564 @wraps(func)
565 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000566 if configuration.dont_do_dwarf_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000567 self.skipTest("dwarf tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000568 return func(self, *args, **kwargs)
569
570 # Mark this function as such to separate them from the regular tests.
571 wrapper.__dwarf_test__ = True
572 return wrapper
573
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000574def dwo_test(func):
575 """Decorate the item as a dwo test."""
576 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
577 raise Exception("@dwo_test can only be used to decorate a test method")
578 @wraps(func)
579 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000580 if configuration.dont_do_dwo_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000581 self.skipTest("dwo tests")
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000582 return func(self, *args, **kwargs)
583
584 # Mark this function as such to separate them from the regular tests.
585 wrapper.__dwo_test__ = True
586 return wrapper
587
Todd Fialaa41d48c2014-04-28 04:49:40 +0000588def debugserver_test(func):
589 """Decorate the item as a debugserver test."""
590 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
591 raise Exception("@debugserver_test can only be used to decorate a test method")
592 @wraps(func)
593 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000594 if configuration.dont_do_debugserver_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000595 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000596 return func(self, *args, **kwargs)
597
598 # Mark this function as such to separate them from the regular tests.
599 wrapper.__debugserver_test__ = True
600 return wrapper
601
602def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000603 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000604 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
605 raise Exception("@llgs_test can only be used to decorate a test method")
606 @wraps(func)
607 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000608 if configuration.dont_do_llgs_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000609 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000610 return func(self, *args, **kwargs)
611
612 # Mark this function as such to separate them from the regular tests.
613 wrapper.__llgs_test__ = True
614 return wrapper
615
Daniel Maleae0f8f572013-08-26 23:57:52 +0000616def not_remote_testsuite_ready(func):
617 """Decorate the item as a test which is not ready yet for remote testsuite."""
618 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
619 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
620 @wraps(func)
621 def wrapper(self, *args, **kwargs):
Zachary Turnerd865c6b2015-12-08 22:15:48 +0000622 if lldb.remote_platform:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000623 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000624 return func(self, *args, **kwargs)
625
626 # Mark this function as such to separate them from the regular tests.
627 wrapper.__not_ready_for_remote_testsuite_test__ = True
628 return wrapper
629
Ed Maste433790a2014-04-23 12:55:41 +0000630def expectedFailure(expected_fn, bugnumber=None):
631 def expectedFailure_impl(func):
632 @wraps(func)
633 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000634 from unittest2 import case
635 self = args[0]
Ed Maste433790a2014-04-23 12:55:41 +0000636 if expected_fn(self):
Zachary Turner5cb8e672015-11-06 18:14:42 +0000637 xfail_func = unittest2.expectedFailure(func)
638 xfail_func(*args, **kwargs)
639 else:
640 func(*args, **kwargs)
Ed Maste433790a2014-04-23 12:55:41 +0000641 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000642 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
643 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000644 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000645 return expectedFailure_impl(bugnumber)
646 else:
647 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000648
Ying Chen0c352822015-11-16 23:41:02 +0000649# You can also pass not_in(list) to reverse the sense of the test for the arguments that
650# are simple lists, namely oslist, compiler, and debug_info.
651
652def not_in (iterable):
653 return lambda x : x not in iterable
654
Siva Chandra7dcad312015-11-20 20:30:36 +0000655def check_list_or_lambda (list_or_lambda, value):
656 if six.callable(list_or_lambda):
657 return list_or_lambda(value)
658 else:
659 return list_or_lambda is None or value is None or value in list_or_lambda
Ying Chen0c352822015-11-16 23:41:02 +0000660
Ying Chen7091c2c2015-04-21 01:15:47 +0000661# provide a function to xfail on defined oslist, compiler version, and archs
662# if none is specified for any argument, that argument won't be checked and thus means for all
663# for example,
664# @expectedFailureAll, xfail for all platform/compiler/arch,
665# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
666# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Pavel Labath7ead0b92015-12-09 10:54:18 +0000667def 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 +0000668 def fn(self):
Siva Chandra7dcad312015-11-20 20:30:36 +0000669 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
Pavel Labath7ead0b92015-12-09 10:54:18 +0000670 hostoslist_passes = check_list_or_lambda(hostoslist, getHostPlatform())
Siva Chandra7dcad312015-11-20 20:30:36 +0000671 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000672 arch_passes = self.expectedArch(archs)
673 triple_passes = triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())
Siva Chandra7dcad312015-11-20 20:30:36 +0000674 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000675 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))
676 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
677
678 return (oslist_passes and
Pavel Labath7ead0b92015-12-09 10:54:18 +0000679 hostoslist_passes and
Zachary Turnerabdb8392015-11-16 22:40:30 +0000680 compiler_passes and
681 arch_passes and
682 triple_passes and
683 debug_info_passes and
684 swig_version_passes and
685 py_version_passes)
Ying Chen7091c2c2015-04-21 01:15:47 +0000686 return expectedFailure(fn, bugnumber)
687
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000688def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000689 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
690
691def expectedFailureDwo(bugnumber=None):
692 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000693
694def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000695 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000696
697def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
698 if compiler_version is None:
699 compiler_version=['=', None]
700 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
701
Vince Harron8974ce22015-03-13 19:54:54 +0000702# to XFAIL a specific clang versions, try this
703# @expectedFailureClang('bugnumber', ['<=', '3.4'])
704def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000705 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000706
707def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000708 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000709
Matt Kopec0de53f02013-03-15 19:10:12 +0000710def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000711 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000712
Ed Maste433790a2014-04-23 12:55:41 +0000713def expectedFailureArch(arch, bugnumber=None):
714 def fn(self):
715 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000716 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000717
Enrico Granatae6cedc12013-02-23 01:05:23 +0000718def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000719 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000720
Matt Kopecee969f92013-09-26 23:30:59 +0000721def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000722 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000723
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000724def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None):
Ed Maste433790a2014-04-23 12:55:41 +0000725 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000726 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000727 self.expectedCompiler(compilers) and
728 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000729 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000730
Chaoren Linf7160f32015-06-09 17:39:27 +0000731def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
732 def fn(self):
733 return (getHostPlatform() in oslist and
734 self.expectedCompiler(compilers))
735 return expectedFailure(fn, bugnumber)
736
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000737def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000738 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000739 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000740
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000741def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
742 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000743
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000744def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None):
745 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000746
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000747def expectedFailureNetBSD(bugnumber=None, compilers=None, debug_info=None):
748 return expectedFailureOS(['netbsd'], bugnumber, compilers, debug_info=debug_info)
749
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000750def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
751 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000752
Chaoren Linf7160f32015-06-09 17:39:27 +0000753def expectedFailureHostWindows(bugnumber=None, compilers=None):
754 return expectedFailureHostOS(['windows'], bugnumber, compilers)
755
Pavel Labath090152b2015-08-20 11:37:19 +0000756def matchAndroid(api_levels=None, archs=None):
757 def match(self):
758 if not target_is_android():
759 return False
760 if archs is not None and self.getArchitecture() not in archs:
761 return False
762 if api_levels is not None and android_device_api() not in api_levels:
763 return False
764 return True
765 return match
766
767
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000768def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000769 """ Mark a test as xfail for Android.
770
771 Arguments:
772 bugnumber - The LLVM pr associated with the problem.
773 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000774 for which a test is expected to fail. None means all API level.
775 arch - A sequence of architecture names specifying the architectures
776 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000777 """
Pavel Labath090152b2015-08-20 11:37:19 +0000778 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000779
Vince Harron7ac3ea42015-06-26 15:13:21 +0000780# if the test passes on the first try, we're done (success)
781# if the test fails once, then passes on the second try, raise an ExpectedFailure
782# if the test fails twice in a row, re-throw the exception from the second test run
783def expectedFlakey(expected_fn, bugnumber=None):
784 def expectedFailure_impl(func):
785 @wraps(func)
786 def wrapper(*args, **kwargs):
787 from unittest2 import case
788 self = args[0]
Todd Fiala9187f272015-12-11 18:06:47 +0000789 if expected_fn(self):
790 # Send event marking test as explicitly eligible for rerunning.
791 if configuration.results_formatter_object is not None:
792 # Mark this test as rerunnable.
793 configuration.results_formatter_object.handle_event(
794 EventBuilder.event_for_mark_test_rerun_eligible(self))
Vince Harron7ac3ea42015-06-26 15:13:21 +0000795 try:
796 func(*args, **kwargs)
Ying Chen0a7202b2015-07-01 22:44:27 +0000797 # don't retry if the test case is already decorated with xfail or skip
798 except (case._ExpectedFailure, case.SkipTest, case._UnexpectedSuccess):
799 raise
Vince Harron7ac3ea42015-06-26 15:13:21 +0000800 except Exception:
801 if expected_fn(self):
Ying Chen0a7202b2015-07-01 22:44:27 +0000802 # before retry, run tearDown for previous run and setup for next
Vince Harron7ac3ea42015-06-26 15:13:21 +0000803 try:
Ying Chen0a7202b2015-07-01 22:44:27 +0000804 self.tearDown()
805 self.setUp()
Vince Harron7ac3ea42015-06-26 15:13:21 +0000806 func(*args, **kwargs)
807 except Exception:
808 # oh snap! two failures in a row, record a failure/error
809 raise
810 # record the expected failure
811 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
812 else:
813 raise
814 return wrapper
815 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
816 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000817 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000818 return expectedFailure_impl(bugnumber)
819 else:
820 return expectedFailure_impl
821
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000822def expectedFlakeyDwarf(bugnumber=None):
823 def fn(self):
824 return self.debug_info == "dwarf"
825 return expectedFlakey(fn, bugnumber)
826
827def expectedFlakeyDsym(bugnumber=None):
828 def fn(self):
829 return self.debug_info == "dwarf"
830 return expectedFlakey(fn, bugnumber)
831
Vince Harron7ac3ea42015-06-26 15:13:21 +0000832def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
833 def fn(self):
834 return (self.getPlatform() in oslist and
835 self.expectedCompiler(compilers))
836 return expectedFlakey(fn, bugnumber)
837
838def expectedFlakeyDarwin(bugnumber=None, compilers=None):
839 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
840 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
841
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000842def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
843 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
844
Vince Harron7ac3ea42015-06-26 15:13:21 +0000845def expectedFlakeyLinux(bugnumber=None, compilers=None):
846 return expectedFlakeyOS(['linux'], bugnumber, compilers)
847
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000848def expectedFlakeyNetBSD(bugnumber=None, compilers=None):
849 return expectedFlakeyOS(['netbsd'], bugnumber, compilers)
Vince Harron7ac3ea42015-06-26 15:13:21 +0000850
851def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
852 if compiler_version is None:
853 compiler_version=['=', None]
854 def fn(self):
855 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
856 return expectedFlakey(fn, bugnumber)
857
858# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
859def expectedFlakeyClang(bugnumber=None, compiler_version=None):
860 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
861
862# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
863def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
864 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
865
Pavel Labath63a579c2015-09-07 12:15:27 +0000866def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
867 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
868
Greg Clayton12514562013-12-05 22:22:32 +0000869def skipIfRemote(func):
870 """Decorate the item to skip tests if testing remotely."""
871 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
872 raise Exception("@skipIfRemote can only be used to decorate a test method")
873 @wraps(func)
874 def wrapper(*args, **kwargs):
875 from unittest2 import case
876 if lldb.remote_platform:
877 self = args[0]
878 self.skipTest("skip on remote platform")
879 else:
880 func(*args, **kwargs)
881 return wrapper
882
Siva Chandra4470f382015-06-17 22:32:27 +0000883def skipUnlessListedRemote(remote_list=None):
884 def myImpl(func):
885 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
886 raise Exception("@skipIfRemote can only be used to decorate a "
887 "test method")
888
889 @wraps(func)
890 def wrapper(*args, **kwargs):
891 if remote_list and lldb.remote_platform:
892 self = args[0]
893 triple = self.dbg.GetSelectedPlatform().GetTriple()
894 for r in remote_list:
895 if r in triple:
896 func(*args, **kwargs)
897 return
898 self.skipTest("skip on remote platform %s" % str(triple))
899 else:
900 func(*args, **kwargs)
901 return wrapper
902
903 return myImpl
904
Greg Clayton12514562013-12-05 22:22:32 +0000905def skipIfRemoteDueToDeadlock(func):
906 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
907 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
908 raise Exception("@skipIfRemote can only be used to decorate a test method")
909 @wraps(func)
910 def wrapper(*args, **kwargs):
911 from unittest2 import case
912 if lldb.remote_platform:
913 self = args[0]
914 self.skipTest("skip on remote platform (deadlocks)")
915 else:
916 func(*args, **kwargs)
917 return wrapper
918
Enrico Granatab633e432014-10-06 21:37:06 +0000919def skipIfNoSBHeaders(func):
920 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
921 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000922 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000923 @wraps(func)
924 def wrapper(*args, **kwargs):
925 from unittest2 import case
926 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000927 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000928 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000929 else:
930 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000931 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000932 if not os.path.exists(header):
933 self.skipTest("skip because LLDB.h header not found")
934 else:
935 func(*args, **kwargs)
936 return wrapper
937
Enrico Granata5f92a132015-11-05 00:46:25 +0000938def skipIfiOSSimulator(func):
939 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
Zachary Turner606e3a52015-12-08 01:15:30 +0000940 return unittest2.skipIf(configuration.lldb_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
Enrico Granata5f92a132015-11-05 00:46:25 +0000941
Robert Flack13c7ad92015-03-30 14:12:17 +0000942def skipIfFreeBSD(func):
943 """Decorate the item to skip tests that should be skipped on FreeBSD."""
944 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000945
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000946def skipIfNetBSD(func):
947 """Decorate the item to skip tests that should be skipped on NetBSD."""
948 return skipIfPlatform(["netbsd"])(func)
949
Greg Claytone0d0a762015-04-02 18:24:03 +0000950def getDarwinOSTriples():
951 return ['darwin', 'macosx', 'ios']
952
Daniel Maleab3d41a22013-07-09 00:08:01 +0000953def skipIfDarwin(func):
954 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000955 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000956
Robert Flack13c7ad92015-03-30 14:12:17 +0000957def skipIfLinux(func):
958 """Decorate the item to skip tests that should be skipped on Linux."""
959 return skipIfPlatform(["linux"])(func)
960
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000961def skipUnlessHostLinux(func):
962 """Decorate the item to skip tests that should be skipped on any non Linux host."""
963 return skipUnlessHostPlatform(["linux"])(func)
964
Robert Flack13c7ad92015-03-30 14:12:17 +0000965def skipIfWindows(func):
966 """Decorate the item to skip tests that should be skipped on Windows."""
967 return skipIfPlatform(["windows"])(func)
968
Chaoren Line6eea5d2015-06-08 22:13:28 +0000969def skipIfHostWindows(func):
970 """Decorate the item to skip tests that should be skipped on Windows."""
971 return skipIfHostPlatform(["windows"])(func)
972
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000973def skipUnlessWindows(func):
974 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
975 return skipUnlessPlatform(["windows"])(func)
976
Robert Flack13c7ad92015-03-30 14:12:17 +0000977def skipUnlessDarwin(func):
978 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000979 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000980
Ryan Brown57bee1e2015-09-14 22:45:11 +0000981def skipUnlessGoInstalled(func):
982 """Decorate the item to skip tests when no Go compiler is available."""
983 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
984 raise Exception("@skipIfGcc can only be used to decorate a test method")
985 @wraps(func)
986 def wrapper(*args, **kwargs):
987 from unittest2 import case
988 self = args[0]
989 compiler = self.getGoCompilerVersion()
990 if not compiler:
991 self.skipTest("skipping because go compiler not found")
992 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000993 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000994 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000995 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
996 if not match_version:
997 # Couldn't determine version.
998 self.skipTest(
999 "skipping because go version could not be parsed "
1000 "out of {}".format(compiler))
1001 else:
1002 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +00001003 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +00001004 compiler_strict_version = StrictVersion(match_version.group(1))
1005 if compiler_strict_version < min_strict_version:
1006 self.skipTest(
1007 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +00001008 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +00001009 compiler_strict_version,
1010 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +00001011 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +00001012 return wrapper
1013
Robert Flack068898c2015-04-09 18:07:58 +00001014def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +00001015 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001016 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
1017 if platform.startswith('freebsd'):
1018 platform = 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001019 elif platform.startswith('netbsd'):
1020 platform = 'netbsd'
Robert Flack068898c2015-04-09 18:07:58 +00001021 return platform
1022
Robert Flack6e1fd352015-05-15 12:39:33 +00001023def getHostPlatform():
1024 """Returns the host platform running the test suite."""
1025 # Attempts to return a platform name matching a target Triple platform.
1026 if sys.platform.startswith('linux'):
1027 return 'linux'
1028 elif sys.platform.startswith('win32'):
1029 return 'windows'
1030 elif sys.platform.startswith('darwin'):
1031 return 'darwin'
1032 elif sys.platform.startswith('freebsd'):
1033 return 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001034 elif sys.platform.startswith('netbsd'):
1035 return 'netbsd'
Robert Flack6e1fd352015-05-15 12:39:33 +00001036 else:
1037 return sys.platform
1038
Robert Flackfb2f6c62015-04-17 08:02:18 +00001039def platformIsDarwin():
1040 """Returns true if the OS triple for the selected platform is any valid apple OS"""
1041 return getPlatform() in getDarwinOSTriples()
1042
Robert Flack6e1fd352015-05-15 12:39:33 +00001043def skipIfHostIncompatibleWithRemote(func):
1044 """Decorate the item to skip tests if binaries built on this host are incompatible."""
1045 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1046 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
1047 @wraps(func)
1048 def wrapper(*args, **kwargs):
1049 from unittest2 import case
1050 self = args[0]
1051 host_arch = self.getLldbArchitecture()
1052 host_platform = getHostPlatform()
1053 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +00001054 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +00001055 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
1056 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
1057 elif target_platform != host_platform:
1058 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
1059 else:
1060 func(*args, **kwargs)
1061 return wrapper
1062
Chaoren Line6eea5d2015-06-08 22:13:28 +00001063def skipIfHostPlatform(oslist):
1064 """Decorate the item to skip tests if running on one of the listed host platforms."""
1065 return unittest2.skipIf(getHostPlatform() in oslist,
1066 "skip on %s" % (", ".join(oslist)))
1067
1068def skipUnlessHostPlatform(oslist):
1069 """Decorate the item to skip tests unless running on one of the listed host platforms."""
1070 return unittest2.skipUnless(getHostPlatform() in oslist,
1071 "requires on of %s" % (", ".join(oslist)))
1072
Zachary Turner793d9972015-08-14 23:29:24 +00001073def skipUnlessArch(archlist):
1074 """Decorate the item to skip tests unless running on one of the listed architectures."""
1075 def myImpl(func):
1076 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1077 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1078
1079 @wraps(func)
1080 def wrapper(*args, **kwargs):
1081 self = args[0]
1082 if self.getArchitecture() not in archlist:
1083 self.skipTest("skipping for architecture %s (requires one of %s)" %
1084 (self.getArchitecture(), ", ".join(archlist)))
1085 else:
1086 func(*args, **kwargs)
1087 return wrapper
1088
1089 return myImpl
1090
Robert Flack13c7ad92015-03-30 14:12:17 +00001091def skipIfPlatform(oslist):
1092 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001093 return unittest2.skipIf(getPlatform() in oslist,
1094 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001095
1096def skipUnlessPlatform(oslist):
1097 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001098 return unittest2.skipUnless(getPlatform() in oslist,
1099 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001100
Daniel Malea48359902013-05-14 20:48:54 +00001101def skipIfLinuxClang(func):
1102 """Decorate the item to skip tests that should be skipped if building on
1103 Linux with clang.
1104 """
1105 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1106 raise Exception("@skipIfLinuxClang can only be used to decorate a test method")
1107 @wraps(func)
1108 def wrapper(*args, **kwargs):
1109 from unittest2 import case
1110 self = args[0]
1111 compiler = self.getCompiler()
Vince Harronc8492672015-05-04 02:59:19 +00001112 platform = self.getPlatform()
1113 if "clang" in compiler and platform == "linux":
Daniel Malea48359902013-05-14 20:48:54 +00001114 self.skipTest("skipping because Clang is used on Linux")
1115 else:
1116 func(*args, **kwargs)
1117 return wrapper
1118
Ying Chen7091c2c2015-04-21 01:15:47 +00001119# provide a function to skip on defined oslist, compiler version, and archs
1120# if none is specified for any argument, that argument won't be checked and thus means for all
1121# for example,
1122# @skipIf, skip for all platform/compiler/arch,
1123# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1124# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1125
1126# TODO: refactor current code, to make skipIfxxx functions to call this function
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001127def 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 +00001128 def fn(self):
Siva Chandra7dcad312015-11-20 20:30:36 +00001129 oslist_passes = oslist is None or self.getPlatform() in oslist
1130 compiler_passes = compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))
Zachary Turnerabdb8392015-11-16 22:40:30 +00001131 arch_passes = self.expectedArch(archs)
Siva Chandra7dcad312015-11-20 20:30:36 +00001132 debug_info_passes = debug_info is None or self.debug_info in debug_info
Zachary Turnerabdb8392015-11-16 22:40:30 +00001133 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))
1134 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 +00001135 remote_passes = (remote is None) or (remote == (lldb.remote_platform is not None))
Zachary Turnerabdb8392015-11-16 22:40:30 +00001136
1137 return (oslist_passes and
1138 compiler_passes and
1139 arch_passes and
1140 debug_info_passes and
1141 swig_version_passes and
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001142 py_version_passes and
1143 remote_passes)
Zachary Turnerba105702015-11-16 23:58:20 +00001144
1145 local_vars = locals()
1146 args = [x for x in inspect.getargspec(skipIf).args]
1147 arg_vals = [eval(x, globals(), local_vars) for x in args]
1148 args = [x for x in zip(args, arg_vals) if x[1] is not None]
1149 reasons = ['%s=%s' % (x, str(y)) for (x,y) in args]
1150 return skipTestIfFn(fn, bugnumber, skipReason='skipping because ' + ' && '.join(reasons))
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001151
1152def skipIfDebugInfo(bugnumber=None, debug_info=None):
1153 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1154
Greg Claytonedea2372015-10-07 20:01:13 +00001155def skipIfDWO(bugnumber=None):
1156 return skipIfDebugInfo(bugnumber, ["dwo"])
1157
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001158def skipIfDwarf(bugnumber=None):
1159 return skipIfDebugInfo(bugnumber, ["dwarf"])
1160
1161def skipIfDsym(bugnumber=None):
1162 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001163
1164def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1165 def skipTestIfFn_impl(func):
1166 @wraps(func)
1167 def wrapper(*args, **kwargs):
1168 from unittest2 import case
1169 self = args[0]
1170 if expected_fn(self):
1171 self.skipTest(skipReason)
1172 else:
1173 func(*args, **kwargs)
1174 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001175 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001176 return skipTestIfFn_impl(bugnumber)
1177 else:
1178 return skipTestIfFn_impl
1179
Daniel Maleabe230792013-01-24 23:52:09 +00001180def skipIfGcc(func):
1181 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1182 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001183 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001184 @wraps(func)
1185 def wrapper(*args, **kwargs):
1186 from unittest2 import case
1187 self = args[0]
1188 compiler = self.getCompiler()
1189 if "gcc" in compiler:
1190 self.skipTest("skipping because gcc is the test compiler")
1191 else:
1192 func(*args, **kwargs)
1193 return wrapper
1194
Matt Kopec0de53f02013-03-15 19:10:12 +00001195def skipIfIcc(func):
1196 """Decorate the item to skip tests that should be skipped if building with icc ."""
1197 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1198 raise Exception("@skipIfIcc can only be used to decorate a test method")
1199 @wraps(func)
1200 def wrapper(*args, **kwargs):
1201 from unittest2 import case
1202 self = args[0]
1203 compiler = self.getCompiler()
1204 if "icc" in compiler:
1205 self.skipTest("skipping because icc is the test compiler")
1206 else:
1207 func(*args, **kwargs)
1208 return wrapper
1209
Daniel Malea55faa402013-05-02 21:44:31 +00001210def skipIfi386(func):
1211 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1212 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1213 raise Exception("@skipIfi386 can only be used to decorate a test method")
1214 @wraps(func)
1215 def wrapper(*args, **kwargs):
1216 from unittest2 import case
1217 self = args[0]
1218 if "i386" == self.getArchitecture():
1219 self.skipTest("skipping because i386 is not a supported architecture")
1220 else:
1221 func(*args, **kwargs)
1222 return wrapper
1223
Pavel Labath090152b2015-08-20 11:37:19 +00001224def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001225 """Decorator to skip tests when the target is Android.
1226
1227 Arguments:
1228 api_levels - The API levels for which the test should be skipped. If
1229 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001230 arch - A sequence of architecture names specifying the architectures
1231 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001232 """
1233 def myImpl(func):
1234 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1235 raise Exception("@skipIfTargetAndroid can only be used to "
1236 "decorate a test method")
1237 @wraps(func)
1238 def wrapper(*args, **kwargs):
1239 from unittest2 import case
1240 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001241 if matchAndroid(api_levels, archs)(self):
1242 self.skipTest("skiped on Android target with API %d and architecture %s" %
1243 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001244 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001245 return wrapper
1246 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001247
Ilia Kd9953052015-03-12 07:19:41 +00001248def skipUnlessCompilerRt(func):
1249 """Decorate the item to skip tests if testing remotely."""
1250 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1251 raise Exception("@skipUnless can only be used to decorate a test method")
1252 @wraps(func)
1253 def wrapper(*args, **kwargs):
1254 from unittest2 import case
1255 import os.path
Enrico Granata55d99f02015-11-19 21:45:07 +00001256 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "llvm","projects","compiler-rt")
1257 print(compilerRtPath)
Ilia Kd9953052015-03-12 07:19:41 +00001258 if not os.path.exists(compilerRtPath):
1259 self = args[0]
1260 self.skipTest("skip if compiler-rt not found")
1261 else:
1262 func(*args, **kwargs)
1263 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001264
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001265class _PlatformContext(object):
1266 """Value object class which contains platform-specific options."""
1267
1268 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1269 self.shlib_environment_var = shlib_environment_var
1270 self.shlib_prefix = shlib_prefix
1271 self.shlib_extension = shlib_extension
1272
1273
Johnny Chena74bb0a2011-08-01 18:46:13 +00001274class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001275 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001276 Abstract base for performing lldb (see TestBase) or other generic tests (see
1277 BenchBase for one example). lldbtest.Base works with the test driver to
1278 accomplish things.
1279
Johnny Chen8334dad2010-10-22 23:15:46 +00001280 """
Enrico Granata5020f952012-10-24 21:42:49 +00001281
Enrico Granata19186272012-10-24 21:44:48 +00001282 # The concrete subclass should override this attribute.
1283 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001284
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001285 # Keep track of the old current working directory.
1286 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001287
Greg Clayton4570d3e2013-12-10 23:19:29 +00001288 @staticmethod
1289 def compute_mydir(test_file):
1290 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1291
1292 mydir = TestBase.compute_mydir(__file__)'''
1293 test_dir = os.path.dirname(test_file)
1294 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1295
Johnny Chenfb4264c2011-08-01 19:50:58 +00001296 def TraceOn(self):
1297 """Returns True if we are in trace mode (tracing detailed test execution)."""
1298 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001299
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001300 @classmethod
1301 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001302 """
1303 Python unittest framework class setup fixture.
1304 Do current directory manipulation.
1305 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001306 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001307 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001308 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001309
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001310 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001311 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001312
1313 # Change current working directory if ${LLDB_TEST} is defined.
1314 # See also dotest.py which sets up ${LLDB_TEST}.
1315 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001316 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001317 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001318 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001319 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1320
Vince Harron85d19652015-05-21 19:09:29 +00001321 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001322 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001323 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1324 try:
1325 cls.dir_lock.try_acquire()
1326 # write the class that owns the lock into the lock file
1327 cls.dir_lock.handle.write(cls.__name__)
1328 except IOError as ioerror:
1329 # nothing else should have this directory lock
1330 # wait here until we get a lock
1331 cls.dir_lock.acquire()
1332 # read the previous owner from the lock file
1333 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001334 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 +00001335 raise ioerror
1336
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001337 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001338 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001339 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001340 elif getPlatform() in ("freebsd", "linux", "netbsd"):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001341 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001342 else:
1343 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001344
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001345 @classmethod
1346 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001347 """
1348 Python unittest framework class teardown fixture.
1349 Do class-wide cleanup.
1350 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001351
Zachary Turner742afdb2015-12-11 19:21:49 +00001352 if doCleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001353 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001354 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001355 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001356
Johnny Chen707b3c92010-10-11 22:25:46 +00001357 # Subclass might have specific cleanup function defined.
1358 if getattr(cls, "classCleanup", None):
1359 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001360 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001361 try:
1362 cls.classCleanup()
1363 except:
1364 exc_type, exc_value, exc_tb = sys.exc_info()
1365 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001366
Vince Harron85d19652015-05-21 19:09:29 +00001367 if debug_confirm_directory_exclusivity:
1368 cls.dir_lock.release()
1369 del cls.dir_lock
1370
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001371 # Restore old working directory.
1372 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001373 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001374 os.chdir(cls.oldcwd)
1375
Johnny Chena74bb0a2011-08-01 18:46:13 +00001376 @classmethod
1377 def skipLongRunningTest(cls):
1378 """
1379 By default, we skip long running test case.
1380 This can be overridden by passing '-l' to the test driver (dotest.py).
1381 """
1382 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1383 return False
1384 else:
1385 return True
Johnny Chened492022011-06-21 00:53:00 +00001386
Vince Harron6d3d0f12015-05-10 22:01:59 +00001387 def enableLogChannelsForCurrentTest(self):
1388 if len(lldbtest_config.channels) == 0:
1389 return
1390
1391 # if debug channels are specified in lldbtest_config.channels,
1392 # create a new set of log files for every test
1393 log_basename = self.getLogBasenameForCurrentTest()
1394
1395 # confirm that the file is writeable
1396 host_log_path = "{}-host.log".format(log_basename)
1397 open(host_log_path, 'w').close()
1398
1399 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1400 for channel_with_categories in lldbtest_config.channels:
1401 channel_then_categories = channel_with_categories.split(' ', 1)
1402 channel = channel_then_categories[0]
1403 if len(channel_then_categories) > 1:
1404 categories = channel_then_categories[1]
1405 else:
1406 categories = "default"
1407
1408 if channel == "gdb-remote":
1409 # communicate gdb-remote categories to debugserver
1410 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1411
1412 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1413 if not self.res.Succeeded():
1414 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1415
1416 # Communicate log path name to debugserver & lldb-server
1417 server_log_path = "{}-server.log".format(log_basename)
1418 open(server_log_path, 'w').close()
1419 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
1420
1421 # Communicate channels to lldb-server
1422 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
1423
1424 if len(lldbtest_config.channels) == 0:
1425 return
1426
1427 def disableLogChannelsForCurrentTest(self):
1428 # close all log files that we opened
1429 for channel_and_categories in lldbtest_config.channels:
1430 # channel format - <channel-name> [<category0> [<category1> ...]]
1431 channel = channel_and_categories.split(' ', 1)[0]
1432 self.ci.HandleCommand("log disable " + channel, self.res)
1433 if not self.res.Succeeded():
1434 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1435
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001436 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001437 """Fixture for unittest test case setup.
1438
1439 It works with the test driver to conditionally skip tests and does other
1440 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001441 #import traceback
1442 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001443
Daniel Malea9115f072013-08-06 15:02:32 +00001444 if "LIBCXX_PATH" in os.environ:
1445 self.libcxxPath = os.environ["LIBCXX_PATH"]
1446 else:
1447 self.libcxxPath = None
1448
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001449 if "LLDBMI_EXEC" in os.environ:
1450 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1451 else:
1452 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001453
Johnny Chenebe51722011-10-07 19:21:09 +00001454 # If we spawn an lldb process for test (via pexpect), do not load the
1455 # init file unless told otherwise.
1456 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1457 self.lldbOption = ""
1458 else:
1459 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001460
Johnny Chen985e7402011-08-01 21:13:26 +00001461 # Assign the test method name to self.testMethodName.
1462 #
1463 # For an example of the use of this attribute, look at test/types dir.
1464 # There are a bunch of test cases under test/types and we don't want the
1465 # module cacheing subsystem to be confused with executable name "a.out"
1466 # used for all the test cases.
1467 self.testMethodName = self._testMethodName
1468
Johnny Chen985e7402011-08-01 21:13:26 +00001469 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1470 # with it using pexpect.
1471 self.child = None
1472 self.child_prompt = "(lldb) "
1473 # If the child is interacting with the embedded script interpreter,
1474 # there are two exits required during tear down, first to quit the
1475 # embedded script interpreter and second to quit the lldb command
1476 # interpreter.
1477 self.child_in_script_interpreter = False
1478
Johnny Chenfb4264c2011-08-01 19:50:58 +00001479 # These are for customized teardown cleanup.
1480 self.dict = None
1481 self.doTearDownCleanup = False
1482 # And in rare cases where there are multiple teardown cleanups.
1483 self.dicts = []
1484 self.doTearDownCleanups = False
1485
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001486 # List of spawned subproces.Popen objects
1487 self.subprocesses = []
1488
Daniel Malea69207462013-06-05 21:07:02 +00001489 # List of forked process PIDs
1490 self.forkedProcessPids = []
1491
Johnny Chenfb4264c2011-08-01 19:50:58 +00001492 # Create a string buffer to record the session info, to be dumped into a
1493 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001494 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001495
Vince Harron1f160372015-05-21 18:51:20 +00001496 session_file = "{}.log".format(self.log_basename)
Zachary Turner8d13fab2015-11-07 01:08:15 +00001497 # Python 3 doesn't support unbuffered I/O in text mode. Open buffered.
1498 self.session = open(session_file, "w")
Johnny Chenfb4264c2011-08-01 19:50:58 +00001499
1500 # Optimistically set __errored__, __failed__, __expected__ to False
1501 # initially. If the test errored/failed, the session info
1502 # (self.session) is then dumped into a session specific file for
1503 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001504 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001505 self.__errored__ = False
1506 self.__failed__ = False
1507 self.__expected__ = False
1508 # We are also interested in unexpected success.
1509 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001510 # And skipped tests.
1511 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001512
1513 # See addTearDownHook(self, hook) which allows the client to add a hook
1514 # function to be run during tearDown() time.
1515 self.hooks = []
1516
1517 # See HideStdout(self).
1518 self.sys_stdout_hidden = False
1519
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001520 if self.platformContext:
1521 # set environment variable names for finding shared libraries
1522 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001523
Vince Harron6d3d0f12015-05-10 22:01:59 +00001524 # Create the debugger instance if necessary.
1525 try:
1526 self.dbg = lldb.DBG
1527 except AttributeError:
1528 self.dbg = lldb.SBDebugger.Create()
1529
1530 if not self.dbg:
1531 raise Exception('Invalid debugger instance')
1532
1533 # Retrieve the associated command interpreter instance.
1534 self.ci = self.dbg.GetCommandInterpreter()
1535 if not self.ci:
1536 raise Exception('Could not get the command interpreter')
1537
1538 # And the result object.
1539 self.res = lldb.SBCommandReturnObject()
1540
1541 self.enableLogChannelsForCurrentTest()
1542
Ying Chen0c352822015-11-16 23:41:02 +00001543 #Initialize debug_info
1544 self.debug_info = None
1545
Daniel Malea249287a2013-02-19 16:08:57 +00001546 def setAsync(self, value):
1547 """ Sets async mode to True/False and ensures it is reset after the testcase completes."""
1548 old_async = self.dbg.GetAsync()
1549 self.dbg.SetAsync(value)
1550 self.addTearDownHook(lambda: self.dbg.SetAsync(old_async))
1551
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001552 def cleanupSubprocesses(self):
1553 # Ensure any subprocesses are cleaned up
1554 for p in self.subprocesses:
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001555 p.terminate()
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001556 del p
1557 del self.subprocesses[:]
Daniel Malea69207462013-06-05 21:07:02 +00001558 # Ensure any forked processes are cleaned up
1559 for pid in self.forkedProcessPids:
1560 if os.path.exists("/proc/" + str(pid)):
1561 os.kill(pid, signal.SIGTERM)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001562
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001563 def spawnSubprocess(self, executable, args=[], install_remote=True):
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001564 """ Creates a subprocess.Popen object with the specified executable and arguments,
1565 saves it in self.subprocesses, and returns the object.
1566 NOTE: if using this function, ensure you also call:
1567
1568 self.addTearDownHook(self.cleanupSubprocesses)
1569
1570 otherwise the test suite will leak processes.
1571 """
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001572 proc = _RemoteProcess(install_remote) if lldb.remote_platform else _LocalProcess(self.TraceOn())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001573 proc.launch(executable, args)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001574 self.subprocesses.append(proc)
1575 return proc
1576
Daniel Malea69207462013-06-05 21:07:02 +00001577 def forkSubprocess(self, executable, args=[]):
1578 """ Fork a subprocess with its own group ID.
1579 NOTE: if using this function, ensure you also call:
1580
1581 self.addTearDownHook(self.cleanupSubprocesses)
1582
1583 otherwise the test suite will leak processes.
1584 """
1585 child_pid = os.fork()
1586 if child_pid == 0:
1587 # If more I/O support is required, this can be beefed up.
1588 fd = os.open(os.devnull, os.O_RDWR)
Daniel Malea69207462013-06-05 21:07:02 +00001589 os.dup2(fd, 1)
1590 os.dup2(fd, 2)
1591 # This call causes the child to have its of group ID
1592 os.setpgid(0,0)
1593 os.execvp(executable, [executable] + args)
1594 # Give the child time to get through the execvp() call
1595 time.sleep(0.1)
1596 self.forkedProcessPids.append(child_pid)
1597 return child_pid
1598
Johnny Chenfb4264c2011-08-01 19:50:58 +00001599 def HideStdout(self):
1600 """Hide output to stdout from the user.
1601
1602 During test execution, there might be cases where we don't want to show the
1603 standard output to the user. For example,
1604
Zachary Turner35d017f2015-10-23 17:04:29 +00001605 self.runCmd(r'''sc print("\n\n\tHello!\n")''')
Johnny Chenfb4264c2011-08-01 19:50:58 +00001606
1607 tests whether command abbreviation for 'script' works or not. There is no
1608 need to show the 'Hello' output to the user as long as the 'script' command
1609 succeeds and we are not in TraceOn() mode (see the '-t' option).
1610
1611 In this case, the test method calls self.HideStdout(self) to redirect the
1612 sys.stdout to a null device, and restores the sys.stdout upon teardown.
1613
1614 Note that you should only call this method at most once during a test case
1615 execution. Any subsequent call has no effect at all."""
1616 if self.sys_stdout_hidden:
1617 return
1618
1619 self.sys_stdout_hidden = True
1620 old_stdout = sys.stdout
1621 sys.stdout = open(os.devnull, 'w')
1622 def restore_stdout():
1623 sys.stdout = old_stdout
1624 self.addTearDownHook(restore_stdout)
1625
1626 # =======================================================================
1627 # Methods for customized teardown cleanups as well as execution of hooks.
1628 # =======================================================================
1629
1630 def setTearDownCleanup(self, dictionary=None):
1631 """Register a cleanup action at tearDown() time with a dictinary"""
1632 self.dict = dictionary
1633 self.doTearDownCleanup = True
1634
1635 def addTearDownCleanup(self, dictionary):
1636 """Add a cleanup action at tearDown() time with a dictinary"""
1637 self.dicts.append(dictionary)
1638 self.doTearDownCleanups = True
1639
1640 def addTearDownHook(self, hook):
1641 """
1642 Add a function to be run during tearDown() time.
1643
1644 Hooks are executed in a first come first serve manner.
1645 """
Zachary Turnercd236b82015-10-26 18:48:24 +00001646 if six.callable(hook):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001647 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001648 print("Adding tearDown hook:", getsource_if_available(hook), file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001649 self.hooks.append(hook)
Enrico Granataab0e8312014-11-05 21:31:57 +00001650
1651 return self
Johnny Chenfb4264c2011-08-01 19:50:58 +00001652
Jim Inghamda3a3862014-10-16 23:02:14 +00001653 def deletePexpectChild(self):
Johnny Chen985e7402011-08-01 21:13:26 +00001654 # This is for the case of directly spawning 'lldb' and interacting with it
1655 # using pexpect.
Johnny Chen985e7402011-08-01 21:13:26 +00001656 if self.child and self.child.isalive():
Zachary Turner9ef307b2014-07-22 16:19:29 +00001657 import pexpect
Johnny Chen985e7402011-08-01 21:13:26 +00001658 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001659 print("tearing down the child process....", file=sbuf)
Johnny Chen985e7402011-08-01 21:13:26 +00001660 try:
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001661 if self.child_in_script_interpreter:
1662 self.child.sendline('quit()')
1663 self.child.expect_exact(self.child_prompt)
1664 self.child.sendline('settings set interpreter.prompt-on-quit false')
1665 self.child.sendline('quit')
Johnny Chen985e7402011-08-01 21:13:26 +00001666 self.child.expect(pexpect.EOF)
Ilia K47448c22015-02-11 21:41:58 +00001667 except (ValueError, pexpect.ExceptionPexpect):
1668 # child is already terminated
1669 pass
1670 except OSError as exception:
1671 import errno
1672 if exception.errno != errno.EIO:
1673 # unexpected error
1674 raise
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001675 # child is already terminated
Johnny Chen985e7402011-08-01 21:13:26 +00001676 pass
Shawn Besteb3e9052014-11-06 17:52:15 +00001677 finally:
1678 # Give it one final blow to make sure the child is terminated.
1679 self.child.close()
Jim Inghamda3a3862014-10-16 23:02:14 +00001680
1681 def tearDown(self):
1682 """Fixture for unittest test case teardown."""
1683 #import traceback
1684 #traceback.print_stack()
1685
1686 self.deletePexpectChild()
1687
Johnny Chenfb4264c2011-08-01 19:50:58 +00001688 # Check and run any hook functions.
1689 for hook in reversed(self.hooks):
1690 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001691 print("Executing tearDown hook:", getsource_if_available(hook), file=sbuf)
Enrico Granataab0e8312014-11-05 21:31:57 +00001692 import inspect
1693 hook_argc = len(inspect.getargspec(hook).args)
Enrico Granata6e0566c2014-11-17 19:00:20 +00001694 if hook_argc == 0 or getattr(hook,'im_self',None):
Enrico Granataab0e8312014-11-05 21:31:57 +00001695 hook()
1696 elif hook_argc == 1:
1697 hook(self)
1698 else:
1699 hook() # try the plain call and hope it works
Johnny Chenfb4264c2011-08-01 19:50:58 +00001700
1701 del self.hooks
1702
1703 # Perform registered teardown cleanup.
1704 if doCleanup and self.doTearDownCleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00001705 self.cleanup(dictionary=self.dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001706
1707 # In rare cases where there are multiple teardown cleanups added.
1708 if doCleanup and self.doTearDownCleanups:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001709 if self.dicts:
1710 for dict in reversed(self.dicts):
Johnny Chen0fddfb22011-11-17 19:57:27 +00001711 self.cleanup(dictionary=dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001712
Vince Harron9753dd92015-05-10 15:22:09 +00001713 self.disableLogChannelsForCurrentTest()
1714
Johnny Chenfb4264c2011-08-01 19:50:58 +00001715 # =========================================================
1716 # Various callbacks to allow introspection of test progress
1717 # =========================================================
1718
1719 def markError(self):
1720 """Callback invoked when an error (unexpected exception) errored."""
1721 self.__errored__ = True
1722 with recording(self, False) as sbuf:
1723 # False because there's no need to write "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("ERROR", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001726
Zachary Turnerb1490b62015-08-26 19:44:56 +00001727 def markCleanupError(self):
1728 """Callback invoked when an error occurs while a test is cleaning up."""
1729 self.__cleanup_errored__ = True
1730 with recording(self, False) as sbuf:
1731 # False because there's no need to write "CLEANUP_ERROR" 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("CLEANUP_ERROR", file=sbuf)
Zachary Turnerb1490b62015-08-26 19:44:56 +00001734
Johnny Chenfb4264c2011-08-01 19:50:58 +00001735 def markFailure(self):
1736 """Callback invoked when a failure (test assertion failure) occurred."""
1737 self.__failed__ = True
1738 with recording(self, False) as sbuf:
1739 # False because there's no need to write "FAIL" to the stderr twice.
1740 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001741 print("FAIL", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001742
Enrico Granatae6cedc12013-02-23 01:05:23 +00001743 def markExpectedFailure(self,err,bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001744 """Callback invoked when an expected failure/error occurred."""
1745 self.__expected__ = True
1746 with recording(self, False) as sbuf:
1747 # False because there's no need to write "expected failure" to the
1748 # stderr twice.
1749 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001750 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001751 print("expected failure", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001752 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001753 print("expected failure (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001754
Johnny Chenc5cc6252011-08-15 23:09:08 +00001755 def markSkippedTest(self):
1756 """Callback invoked when a test is skipped."""
1757 self.__skipped__ = True
1758 with recording(self, False) as sbuf:
1759 # False because there's no need to write "skipped test" to the
1760 # stderr twice.
1761 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001762 print("skipped test", file=sbuf)
Johnny Chenc5cc6252011-08-15 23:09:08 +00001763
Enrico Granatae6cedc12013-02-23 01:05:23 +00001764 def markUnexpectedSuccess(self, bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001765 """Callback invoked when an unexpected success occurred."""
1766 self.__unexpected__ = True
1767 with recording(self, False) as sbuf:
1768 # False because there's no need to write "unexpected success" to the
1769 # stderr twice.
1770 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001771 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001772 print("unexpected success", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001773 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001774 print("unexpected success (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001775
Greg Clayton70995582015-01-07 22:25:50 +00001776 def getRerunArgs(self):
1777 return " -f %s.%s" % (self.__class__.__name__, self._testMethodName)
Vince Harron9753dd92015-05-10 15:22:09 +00001778
1779 def getLogBasenameForCurrentTest(self, prefix=None):
1780 """
1781 returns a partial path that can be used as the beginning of the name of multiple
1782 log files pertaining to this test
1783
1784 <session-dir>/<arch>-<compiler>-<test-file>.<test-class>.<test-method>
1785 """
1786 dname = os.path.join(os.environ["LLDB_TEST"],
1787 os.environ["LLDB_SESSION_DIRNAME"])
1788 if not os.path.isdir(dname):
1789 os.mkdir(dname)
1790
1791 compiler = self.getCompiler()
1792
1793 if compiler[1] == ':':
1794 compiler = compiler[2:]
Chaoren Lin636a0e32015-07-17 21:40:11 +00001795 if os.path.altsep is not None:
1796 compiler = compiler.replace(os.path.altsep, os.path.sep)
Vince Harron9753dd92015-05-10 15:22:09 +00001797
Vince Harron19e300f2015-05-12 00:50:54 +00001798 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), "_".join(compiler.split(os.path.sep)))
Vince Harron9753dd92015-05-10 15:22:09 +00001799 if len(fname) > 200:
Vince Harron19e300f2015-05-12 00:50:54 +00001800 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), compiler.split(os.path.sep)[-1])
Vince Harron9753dd92015-05-10 15:22:09 +00001801
1802 if prefix is not None:
1803 fname = "{}-{}".format(prefix, fname)
1804
1805 return os.path.join(dname, fname)
1806
Johnny Chenfb4264c2011-08-01 19:50:58 +00001807 def dumpSessionInfo(self):
1808 """
1809 Dump the debugger interactions leading to a test error/failure. This
1810 allows for more convenient postmortem analysis.
1811
1812 See also LLDBTestResult (dotest.py) which is a singlton class derived
1813 from TextTestResult and overwrites addError, addFailure, and
1814 addExpectedFailure methods to allow us to to mark the test instance as
1815 such.
1816 """
1817
1818 # We are here because self.tearDown() detected that this test instance
1819 # either errored or failed. The lldb.test_result singleton contains
1820 # two lists (erros and failures) which get populated by the unittest
1821 # framework. Look over there for stack trace information.
1822 #
1823 # The lists contain 2-tuples of TestCase instances and strings holding
1824 # formatted tracebacks.
1825 #
1826 # See http://docs.python.org/library/unittest.html#unittest.TestResult.
Vince Harron9753dd92015-05-10 15:22:09 +00001827
Vince Harron35b17dc2015-05-21 18:20:21 +00001828 # output tracebacks into session
Vince Harron9753dd92015-05-10 15:22:09 +00001829 pairs = []
Johnny Chenfb4264c2011-08-01 19:50:58 +00001830 if self.__errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001831 pairs = configuration.test_result.errors
Johnny Chenfb4264c2011-08-01 19:50:58 +00001832 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001833 elif self.__cleanup_errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001834 pairs = configuration.test_result.cleanup_errors
Zachary Turnerb1490b62015-08-26 19:44:56 +00001835 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001836 elif self.__failed__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001837 pairs = configuration.test_result.failures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001838 prefix = 'Failure'
1839 elif self.__expected__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001840 pairs = configuration.test_result.expectedFailures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001841 prefix = 'ExpectedFailure'
Johnny Chenc5cc6252011-08-15 23:09:08 +00001842 elif self.__skipped__:
1843 prefix = 'SkippedTest'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001844 elif self.__unexpected__:
Vince Harron35b17dc2015-05-21 18:20:21 +00001845 prefix = 'UnexpectedSuccess'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001846 else:
Vince Harron35b17dc2015-05-21 18:20:21 +00001847 prefix = 'Success'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001848
Johnny Chenc5cc6252011-08-15 23:09:08 +00001849 if not self.__unexpected__ and not self.__skipped__:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001850 for test, traceback in pairs:
1851 if test is self:
Zachary Turnerff890da2015-10-19 23:45:41 +00001852 print(traceback, file=self.session)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001853
Vince Harron35b17dc2015-05-21 18:20:21 +00001854 # put footer (timestamp/rerun instructions) into session
Johnny Chen8082a002011-08-11 00:16:28 +00001855 testMethod = getattr(self, self._testMethodName)
1856 if getattr(testMethod, "__benchmarks_test__", False):
1857 benchmarks = True
1858 else:
1859 benchmarks = False
1860
Vince Harron35b17dc2015-05-21 18:20:21 +00001861 import datetime
Zachary Turnerff890da2015-10-19 23:45:41 +00001862 print("Session info generated @", datetime.datetime.now().ctime(), file=self.session)
1863 print("To rerun this test, issue the following command from the 'test' directory:\n", file=self.session)
1864 print("./dotest.py %s -v %s %s" % (self.getRunOptions(),
Vince Harron35b17dc2015-05-21 18:20:21 +00001865 ('+b' if benchmarks else '-t'),
Zachary Turnerff890da2015-10-19 23:45:41 +00001866 self.getRerunArgs()), file=self.session)
Vince Harron35b17dc2015-05-21 18:20:21 +00001867 self.session.close()
1868 del self.session
1869
1870 # process the log files
Vince Harron1f160372015-05-21 18:51:20 +00001871 log_files_for_this_test = glob.glob(self.log_basename + "*")
Vince Harron35b17dc2015-05-21 18:20:21 +00001872
1873 if prefix != 'Success' or lldbtest_config.log_success:
1874 # keep all log files, rename them to include prefix
1875 dst_log_basename = self.getLogBasenameForCurrentTest(prefix)
1876 for src in log_files_for_this_test:
Zachary Turner306278f2015-05-26 20:26:29 +00001877 if os.path.isfile(src):
1878 dst = src.replace(self.log_basename, dst_log_basename)
1879 if os.name == "nt" and os.path.isfile(dst):
1880 # On Windows, renaming a -> b will throw an exception if b exists. On non-Windows platforms
1881 # it silently replaces the destination. Ultimately this means that atomic renames are not
1882 # guaranteed to be possible on Windows, but we need this to work anyway, so just remove the
1883 # destination first if it already exists.
1884 os.remove(dst)
Zachary Turner5de068b2015-05-26 19:52:24 +00001885
Zachary Turner306278f2015-05-26 20:26:29 +00001886 os.rename(src, dst)
Vince Harron35b17dc2015-05-21 18:20:21 +00001887 else:
1888 # success! (and we don't want log files) delete log files
1889 for log_file in log_files_for_this_test:
Adrian McCarthya7292042015-09-04 20:48:48 +00001890 try:
1891 os.unlink(log_file)
1892 except:
1893 # We've seen consistent unlink failures on Windows, perhaps because the
1894 # just-created log file is being scanned by anti-virus. Empirically, this
1895 # sleep-and-retry approach allows tests to succeed much more reliably.
1896 # Attempts to figure out exactly what process was still holding a file handle
1897 # have failed because running instrumentation like Process Monitor seems to
1898 # slow things down enough that the problem becomes much less consistent.
1899 time.sleep(0.5)
1900 os.unlink(log_file)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001901
1902 # ====================================================
1903 # Config. methods supported through a plugin interface
1904 # (enables reading of the current test configuration)
1905 # ====================================================
1906
1907 def getArchitecture(self):
1908 """Returns the architecture in effect the test suite is running with."""
1909 module = builder_module()
Ed Maste0f434e62015-04-06 15:50:48 +00001910 arch = module.getArchitecture()
1911 if arch == 'amd64':
1912 arch = 'x86_64'
1913 return arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001914
Vince Harron02613762015-05-04 00:17:53 +00001915 def getLldbArchitecture(self):
1916 """Returns the architecture of the lldb binary."""
1917 if not hasattr(self, 'lldbArchitecture'):
1918
1919 # spawn local process
1920 command = [
Vince Harron790d95c2015-05-18 19:39:03 +00001921 lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001922 "-o",
Vince Harron790d95c2015-05-18 19:39:03 +00001923 "file " + lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001924 "-o",
1925 "quit"
1926 ]
1927
1928 output = check_output(command)
1929 str = output.decode("utf-8");
1930
1931 for line in str.splitlines():
1932 m = re.search("Current executable set to '.*' \\((.*)\\)\\.", line)
1933 if m:
1934 self.lldbArchitecture = m.group(1)
1935 break
1936
1937 return self.lldbArchitecture
1938
Johnny Chenfb4264c2011-08-01 19:50:58 +00001939 def getCompiler(self):
1940 """Returns the compiler in effect the test suite is running with."""
1941 module = builder_module()
1942 return module.getCompiler()
1943
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001944 def getCompilerBinary(self):
1945 """Returns the compiler binary the test suite is running with."""
1946 return self.getCompiler().split()[0]
1947
Daniel Malea0aea0162013-02-27 17:29:46 +00001948 def getCompilerVersion(self):
1949 """ Returns a string that represents the compiler version.
1950 Supports: llvm, clang.
1951 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00001952 from .lldbutil import which
Daniel Malea0aea0162013-02-27 17:29:46 +00001953 version = 'unknown'
1954
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001955 compiler = self.getCompilerBinary()
Zachary Turner9ef307b2014-07-22 16:19:29 +00001956 version_output = system([[which(compiler), "-v"]])[1]
Daniel Malea0aea0162013-02-27 17:29:46 +00001957 for line in version_output.split(os.linesep):
Greg Clayton2a844b72013-03-06 02:34:51 +00001958 m = re.search('version ([0-9\.]+)', line)
Daniel Malea0aea0162013-02-27 17:29:46 +00001959 if m:
1960 version = m.group(1)
1961 return version
1962
Ryan Brown57bee1e2015-09-14 22:45:11 +00001963 def getGoCompilerVersion(self):
1964 """ Returns a string that represents the go compiler version, or None if go is not found.
1965 """
1966 compiler = which("go")
1967 if compiler:
1968 version_output = system([[compiler, "version"]])[0]
1969 for line in version_output.split(os.linesep):
1970 m = re.search('go version (devel|go\\S+)', line)
1971 if m:
1972 return m.group(1)
1973 return None
1974
Greg Claytone0d0a762015-04-02 18:24:03 +00001975 def platformIsDarwin(self):
1976 """Returns true if the OS triple for the selected platform is any valid apple OS"""
Robert Flackfb2f6c62015-04-17 08:02:18 +00001977 return platformIsDarwin()
Vince Harron20952cc2015-04-03 01:00:06 +00001978
Robert Flack13c7ad92015-03-30 14:12:17 +00001979 def getPlatform(self):
Robert Flackfb2f6c62015-04-17 08:02:18 +00001980 """Returns the target platform the test suite is running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001981 return getPlatform()
Robert Flack13c7ad92015-03-30 14:12:17 +00001982
Daniel Maleaadaaec92013-08-06 20:51:41 +00001983 def isIntelCompiler(self):
1984 """ Returns true if using an Intel (ICC) compiler, false otherwise. """
1985 return any([x in self.getCompiler() for x in ["icc", "icpc", "icl"]])
1986
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001987 def expectedCompilerVersion(self, compiler_version):
1988 """Returns True iff compiler_version[1] matches the current compiler version.
1989 Use compiler_version[0] to specify the operator used to determine if a match has occurred.
1990 Any operator other than the following defaults to an equality test:
1991 '>', '>=', "=>", '<', '<=', '=<', '!=', "!" or 'not'
1992 """
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001993 if (compiler_version == None):
1994 return True
1995 operator = str(compiler_version[0])
1996 version = compiler_version[1]
1997
1998 if (version == None):
1999 return True
2000 if (operator == '>'):
2001 return self.getCompilerVersion() > version
2002 if (operator == '>=' or operator == '=>'):
2003 return self.getCompilerVersion() >= version
2004 if (operator == '<'):
2005 return self.getCompilerVersion() < version
2006 if (operator == '<=' or operator == '=<'):
2007 return self.getCompilerVersion() <= version
2008 if (operator == '!=' or operator == '!' or operator == 'not'):
2009 return str(version) not in str(self.getCompilerVersion())
2010 return str(version) in str(self.getCompilerVersion())
2011
2012 def expectedCompiler(self, compilers):
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00002013 """Returns True iff any element of compilers is a sub-string of the current compiler."""
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00002014 if (compilers == None):
2015 return True
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00002016
2017 for compiler in compilers:
2018 if compiler in self.getCompiler():
2019 return True
2020
2021 return False
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00002022
Ying Chen7091c2c2015-04-21 01:15:47 +00002023 def expectedArch(self, archs):
2024 """Returns True iff any element of archs is a sub-string of the current architecture."""
2025 if (archs == None):
2026 return True
2027
2028 for arch in archs:
2029 if arch in self.getArchitecture():
2030 return True
2031
2032 return False
2033
Johnny Chenfb4264c2011-08-01 19:50:58 +00002034 def getRunOptions(self):
2035 """Command line option for -A and -C to run this test again, called from
2036 self.dumpSessionInfo()."""
2037 arch = self.getArchitecture()
2038 comp = self.getCompiler()
Johnny Chenb7bdd102011-08-24 19:48:51 +00002039 if arch:
2040 option_str = "-A " + arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00002041 else:
Johnny Chenb7bdd102011-08-24 19:48:51 +00002042 option_str = ""
2043 if comp:
Johnny Chen531c0852012-03-16 20:44:00 +00002044 option_str += " -C " + comp
Johnny Chenb7bdd102011-08-24 19:48:51 +00002045 return option_str
Johnny Chenfb4264c2011-08-01 19:50:58 +00002046
2047 # ==================================================
2048 # Build methods supported through a plugin interface
2049 # ==================================================
2050
Ed Mastec97323e2014-04-01 18:47:58 +00002051 def getstdlibFlag(self):
2052 """ Returns the proper -stdlib flag, or empty if not required."""
Robert Flack4629c4b2015-05-15 18:54:32 +00002053 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Ed Mastec97323e2014-04-01 18:47:58 +00002054 stdlibflag = "-stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002055 else: # this includes NetBSD
Ed Mastec97323e2014-04-01 18:47:58 +00002056 stdlibflag = ""
2057 return stdlibflag
2058
Matt Kopec7663b3a2013-09-25 17:44:00 +00002059 def getstdFlag(self):
2060 """ Returns the proper stdflag. """
Daniel Malea55faa402013-05-02 21:44:31 +00002061 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
Daniel Malea0b7c6112013-05-06 19:31:31 +00002062 stdflag = "-std=c++0x"
Daniel Malea55faa402013-05-02 21:44:31 +00002063 else:
2064 stdflag = "-std=c++11"
Matt Kopec7663b3a2013-09-25 17:44:00 +00002065 return stdflag
2066
2067 def buildDriver(self, sources, exe_name):
2068 """ Platform-specific way to build a program that links with LLDB (via the liblldb.so
2069 or LLDB.framework).
2070 """
2071
2072 stdflag = self.getstdFlag()
Ed Mastec97323e2014-04-01 18:47:58 +00002073 stdlibflag = self.getstdlibFlag()
Greg Clayton22fd3b12015-10-26 17:52:16 +00002074
2075 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002076 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002077 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Daniel Malea55faa402013-05-02 21:44:31 +00002078 d = {'CXX_SOURCES' : sources,
2079 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002080 'CFLAGS_EXTRAS' : "%s %s" % (stdflag, stdlibflag),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002081 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2082 'LD_EXTRAS' : "%s -Wl,-rpath,%s" % (dsym, lib_dir),
Daniel Malea55faa402013-05-02 21:44:31 +00002083 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002084 elif sys.platform.rstrip('0123456789') in ('freebsd', 'linux', 'netbsd') or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002085 d = {'CXX_SOURCES' : sources,
Daniel Malea55faa402013-05-02 21:44:31 +00002086 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002087 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002088 'LD_EXTRAS' : "-L%s -llldb" % lib_dir}
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002089 elif sys.platform.startswith('win'):
2090 d = {'CXX_SOURCES' : sources,
2091 'EXE' : exe_name,
2092 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002093 'LD_EXTRAS' : "-L%s -lliblldb" % os.environ["LLDB_IMPLIB_DIR"]}
Daniel Malea55faa402013-05-02 21:44:31 +00002094 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002095 print("Building LLDB Driver (%s) from sources %s" % (exe_name, sources))
Daniel Malea55faa402013-05-02 21:44:31 +00002096
2097 self.buildDefault(dictionary=d)
2098
Matt Kopec7663b3a2013-09-25 17:44:00 +00002099 def buildLibrary(self, sources, lib_name):
2100 """Platform specific way to build a default library. """
2101
2102 stdflag = self.getstdFlag()
2103
Greg Clayton22fd3b12015-10-26 17:52:16 +00002104 lib_dir = os.environ["LLDB_LIB_DIR"]
Robert Flack4629c4b2015-05-15 18:54:32 +00002105 if self.platformIsDarwin():
Greg Clayton22fd3b12015-10-26 17:52:16 +00002106 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Matt Kopec7663b3a2013-09-25 17:44:00 +00002107 d = {'DYLIB_CXX_SOURCES' : sources,
2108 'DYLIB_NAME' : lib_name,
2109 'CFLAGS_EXTRAS' : "%s -stdlib=libc++" % stdflag,
Greg Clayton22fd3b12015-10-26 17:52:16 +00002110 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2111 'LD_EXTRAS' : "%s -Wl,-rpath,%s -dynamiclib" % (dsym, lib_dir),
Matt Kopec7663b3a2013-09-25 17:44:00 +00002112 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002113 elif self.getPlatform() in ('freebsd', 'linux', 'netbsd') or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Matt Kopec7663b3a2013-09-25 17:44:00 +00002114 d = {'DYLIB_CXX_SOURCES' : sources,
2115 'DYLIB_NAME' : lib_name,
2116 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002117 'LD_EXTRAS' : "-shared -L%s -llldb" % lib_dir}
Robert Flack4629c4b2015-05-15 18:54:32 +00002118 elif self.getPlatform() == 'windows':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002119 d = {'DYLIB_CXX_SOURCES' : sources,
2120 'DYLIB_NAME' : lib_name,
2121 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002122 'LD_EXTRAS' : "-shared -l%s\liblldb.lib" % self.os.environ["LLDB_IMPLIB_DIR"]}
Matt Kopec7663b3a2013-09-25 17:44:00 +00002123 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002124 print("Building LLDB Library (%s) from sources %s" % (lib_name, sources))
Matt Kopec7663b3a2013-09-25 17:44:00 +00002125
2126 self.buildDefault(dictionary=d)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002127
Daniel Malea55faa402013-05-02 21:44:31 +00002128 def buildProgram(self, sources, exe_name):
2129 """ Platform specific way to build an executable from C/C++ sources. """
2130 d = {'CXX_SOURCES' : sources,
2131 'EXE' : exe_name}
2132 self.buildDefault(dictionary=d)
2133
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002134 def buildDefault(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002135 """Platform specific way to build the default binaries."""
2136 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002137 if target_is_android():
2138 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002139 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002140 raise Exception("Don't know how to build default binary")
2141
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002142 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002143 """Platform specific way to build binaries with dsym info."""
2144 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002145 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002146 raise Exception("Don't know how to build binary with dsym")
2147
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002148 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002149 """Platform specific way to build binaries with dwarf maps."""
2150 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002151 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002152 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002153 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002154 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002155
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002156 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2157 """Platform specific way to build binaries with dwarf maps."""
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002158 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."""
2233 module = builder_module()
2234 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002235 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002236
Daniel Malea55faa402013-05-02 21:44:31 +00002237 def getLLDBLibraryEnvVal(self):
2238 """ Returns the path that the OS-specific library search environment variable
2239 (self.dylibPath) should be set to in order for a program to find the LLDB
2240 library. If an environment variable named self.dylibPath is already set,
2241 the new path is appended to it and returned.
2242 """
2243 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002244 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002245 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002246 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002247 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002248 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002249 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002250 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002251
Ed Maste437f8f62013-09-09 14:04:04 +00002252 def getLibcPlusPlusLibs(self):
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002253 if self.getPlatform() in ('freebsd', 'linux', 'netbsd'):
Ed Maste437f8f62013-09-09 14:04:04 +00002254 return ['libc++.so.1']
2255 else:
2256 return ['libc++.1.dylib','libc++abi.dylib']
2257
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002258# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2259# We change the test methods to create a new test method for each test for each debug info we are
2260# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2261# the new test method we remove the old method at the same time.
2262class LLDBTestCaseFactory(type):
2263 def __new__(cls, name, bases, attrs):
2264 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002265 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002266 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
2267 @dsym_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002268 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002269 def dsym_test_method(self, attrvalue=attrvalue):
2270 self.debug_info = "dsym"
2271 return attrvalue(self)
2272 dsym_method_name = attrname + "_dsym"
2273 dsym_test_method.__name__ = dsym_method_name
2274 newattrs[dsym_method_name] = dsym_test_method
2275
2276 @dwarf_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002277 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002278 def dwarf_test_method(self, attrvalue=attrvalue):
2279 self.debug_info = "dwarf"
2280 return attrvalue(self)
2281 dwarf_method_name = attrname + "_dwarf"
2282 dwarf_test_method.__name__ = dwarf_method_name
2283 newattrs[dwarf_method_name] = dwarf_test_method
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002284
2285 @dwo_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002286 @wraps(attrvalue)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002287 def dwo_test_method(self, attrvalue=attrvalue):
2288 self.debug_info = "dwo"
2289 return attrvalue(self)
2290 dwo_method_name = attrname + "_dwo"
2291 dwo_test_method.__name__ = dwo_method_name
2292 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002293 else:
2294 newattrs[attrname] = attrvalue
2295 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2296
Zachary Turner43a01e42015-10-20 21:06:05 +00002297# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2298@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002299class TestBase(Base):
2300 """
2301 This abstract base class is meant to be subclassed. It provides default
2302 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2303 among other things.
2304
2305 Important things for test class writers:
2306
2307 - Overwrite the mydir class attribute, otherwise your test class won't
2308 run. It specifies the relative directory to the top level 'test' so
2309 the test harness can change to the correct working directory before
2310 running your test.
2311
2312 - The setUp method sets up things to facilitate subsequent interactions
2313 with the debugger as part of the test. These include:
2314 - populate the test method name
2315 - create/get a debugger set with synchronous mode (self.dbg)
2316 - get the command interpreter from with the debugger (self.ci)
2317 - create a result object for use with the command interpreter
2318 (self.res)
2319 - plus other stuffs
2320
2321 - The tearDown method tries to perform some necessary cleanup on behalf
2322 of the test to return the debugger to a good state for the next test.
2323 These include:
2324 - execute any tearDown hooks registered by the test method with
2325 TestBase.addTearDownHook(); examples can be found in
2326 settings/TestSettings.py
2327 - kill the inferior process associated with each target, if any,
2328 and, then delete the target from the debugger's target list
2329 - perform build cleanup before running the next test method in the
2330 same test class; examples of registering for this service can be
2331 found in types/TestIntegerTypes.py with the call:
2332 - self.setTearDownCleanup(dictionary=d)
2333
2334 - Similarly setUpClass and tearDownClass perform classwise setup and
2335 teardown fixtures. The tearDownClass method invokes a default build
2336 cleanup for the entire test class; also, subclasses can implement the
2337 classmethod classCleanup(cls) to perform special class cleanup action.
2338
2339 - The instance methods runCmd and expect are used heavily by existing
2340 test cases to send a command to the command interpreter and to perform
2341 string/pattern matching on the output of such command execution. The
2342 expect method also provides a mode to peform string/pattern matching
2343 without running a command.
2344
2345 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2346 build the binaries used during a particular test scenario. A plugin
2347 should be provided for the sys.platform running the test suite. The
2348 Mac OS X implementation is located in plugins/darwin.py.
2349 """
2350
2351 # Maximum allowed attempts when launching the inferior process.
2352 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2353 maxLaunchCount = 3;
2354
2355 # Time to wait before the next launching attempt in second(s).
2356 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2357 timeWaitNextLaunch = 1.0;
2358
Enrico Granata165f8af2012-09-21 19:10:53 +00002359 # Returns the list of categories to which this test case belongs
2360 # by default, look for a ".categories" file, and read its contents
2361 # if no such file exists, traverse the hierarchy - we guarantee
2362 # a .categories to exist at the top level directory so we do not end up
2363 # looping endlessly - subclasses are free to define their own categories
2364 # in whatever way makes sense to them
2365 def getCategories(self):
2366 import inspect
2367 import os.path
2368 folder = inspect.getfile(self.__class__)
2369 folder = os.path.dirname(folder)
2370 while folder != '/':
2371 categories_file_name = os.path.join(folder,".categories")
2372 if os.path.exists(categories_file_name):
2373 categories_file = open(categories_file_name,'r')
2374 categories = categories_file.readline()
2375 categories_file.close()
2376 categories = str.replace(categories,'\n','')
2377 categories = str.replace(categories,'\r','')
2378 return categories.split(',')
2379 else:
2380 folder = os.path.dirname(folder)
2381 continue
2382
Johnny Chena74bb0a2011-08-01 18:46:13 +00002383 def setUp(self):
2384 #import traceback
2385 #traceback.print_stack()
2386
2387 # Works with the test driver to conditionally skip tests via decorators.
2388 Base.setUp(self)
2389
Johnny Chenf2b70232010-08-25 18:49:48 +00002390 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2391 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2392
Johnny Chen430eb762010-10-19 16:00:42 +00002393 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002394 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002395
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002396 # We want our debugger to be synchronous.
2397 self.dbg.SetAsync(False)
2398
2399 # Retrieve the associated command interpreter instance.
2400 self.ci = self.dbg.GetCommandInterpreter()
2401 if not self.ci:
2402 raise Exception('Could not get the command interpreter')
2403
2404 # And the result object.
2405 self.res = lldb.SBCommandReturnObject()
2406
Zachary Turner606e3a52015-12-08 01:15:30 +00002407 if lldb.remote_platform and configuration.lldb_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002408 remote_test_dir = lldbutil.join_remote_paths(
Zachary Turner606e3a52015-12-08 01:15:30 +00002409 configuration.lldb_platform_working_dir,
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002410 self.getArchitecture(),
2411 str(self.test_number),
2412 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002413 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002414 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002415 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002416
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002417 # This function removes all files from the current working directory while leaving
2418 # the directories in place. The cleaup is required to reduce the disk space required
2419 # by the test suit while leaving the directories untached is neccessary because
2420 # sub-directories might belong to an other test
2421 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002422 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002423 # TODO: Replace the heuristic to remove the files with a logic what collects the
2424 # list of files we have to remove during test runs.
2425 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002426 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002427 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002428 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002429 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002430
Greg Clayton35c91342014-11-17 18:40:27 +00002431 def registerSharedLibrariesWithTarget(self, target, shlibs):
2432 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2433
2434 Any modules in the target that have their remote install file specification set will
2435 get uploaded to the remote host. This function registers the local copies of the
2436 shared libraries with the target and sets their remote install locations so they will
2437 be uploaded when the target is run.
2438 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002439 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002440 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002441
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002442 shlib_environment_var = self.platformContext.shlib_environment_var
2443 shlib_prefix = self.platformContext.shlib_prefix
2444 shlib_extension = '.' + self.platformContext.shlib_extension
2445
2446 working_dir = self.get_process_working_directory()
2447 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2448 # Add any shared libraries to our target if remote so they get
2449 # uploaded into the working directory on the remote side
2450 for name in shlibs:
2451 # The path can be a full path to a shared library, or a make file name like "Foo" for
2452 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2453 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2454 # of the shared library accordingly
2455 if os.path.exists(name):
2456 local_shlib_path = name # name is the full path to the local shared library
2457 else:
2458 # Check relative names
2459 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2460 if not os.path.exists(local_shlib_path):
2461 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002462 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002463 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002464
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002465 # Make sure we found the local shared library in the above code
2466 self.assertTrue(os.path.exists(local_shlib_path))
2467
2468 # Add the shared library to our target
2469 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2470 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002471 # We must set the remote install location if we want the shared library
2472 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002473 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002474 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002475
2476 return environment
2477
Enrico Granata44818162012-10-24 01:23:57 +00002478 # utility methods that tests can use to access the current objects
2479 def target(self):
2480 if not self.dbg:
2481 raise Exception('Invalid debugger instance')
2482 return self.dbg.GetSelectedTarget()
2483
2484 def process(self):
2485 if not self.dbg:
2486 raise Exception('Invalid debugger instance')
2487 return self.dbg.GetSelectedTarget().GetProcess()
2488
2489 def thread(self):
2490 if not self.dbg:
2491 raise Exception('Invalid debugger instance')
2492 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2493
2494 def frame(self):
2495 if not self.dbg:
2496 raise Exception('Invalid debugger instance')
2497 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2498
Greg Claytonc6947512013-12-13 19:18:59 +00002499 def get_process_working_directory(self):
2500 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2501 if lldb.remote_platform:
2502 # Remote tests set the platform working directory up in TestBase.setUp()
2503 return lldb.remote_platform.GetWorkingDirectory()
2504 else:
2505 # local tests change directory into each test subdirectory
2506 return os.getcwd()
2507
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002508 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002509 #import traceback
2510 #traceback.print_stack()
2511
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002512 # Ensure all the references to SB objects have gone away so that we can
2513 # be sure that all test-specific resources have been freed before we
2514 # attempt to delete the targets.
2515 gc.collect()
2516
Johnny Chen3794ad92011-06-15 21:24:24 +00002517 # Delete the target(s) from the debugger as a general cleanup step.
2518 # This includes terminating the process for each target, if any.
2519 # We'd like to reuse the debugger for our next test without incurring
2520 # the initialization overhead.
2521 targets = []
2522 for target in self.dbg:
2523 if target:
2524 targets.append(target)
2525 process = target.GetProcess()
2526 if process:
2527 rc = self.invoke(process, "Kill")
2528 self.assertTrue(rc.Success(), PROCESS_KILLED)
2529 for target in targets:
2530 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002531
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002532 # Do this last, to make sure it's in reverse order from how we setup.
2533 Base.tearDown(self)
2534
Zachary Turner95812042015-03-26 18:54:21 +00002535 # This must be the last statement, otherwise teardown hooks or other
2536 # lines might depend on this still being active.
2537 del self.dbg
2538
Johnny Chen86268e42011-09-30 21:48:35 +00002539 def switch_to_thread_with_stop_reason(self, stop_reason):
2540 """
2541 Run the 'thread list' command, and select the thread with stop reason as
2542 'stop_reason'. If no such thread exists, no select action is done.
2543 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002544 from .lldbutil import stop_reason_to_str
Johnny Chen86268e42011-09-30 21:48:35 +00002545 self.runCmd('thread list')
2546 output = self.res.GetOutput()
2547 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2548 stop_reason_to_str(stop_reason))
2549 for line in output.splitlines():
2550 matched = thread_line_pattern.match(line)
2551 if matched:
2552 self.runCmd('thread select %s' % matched.group(1))
2553
Enrico Granata7594f142013-06-17 22:51:50 +00002554 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002555 """
2556 Ask the command interpreter to handle the command and then check its
2557 return status.
2558 """
2559 # Fail fast if 'cmd' is not meaningful.
2560 if not cmd or len(cmd) == 0:
2561 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002562
Johnny Chen8d55a342010-08-31 17:42:54 +00002563 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002564
Daniel Maleae0f8f572013-08-26 23:57:52 +00002565 if cmd.startswith("target create "):
2566 cmd = cmd.replace("target create ", "file ")
Daniel Maleae0f8f572013-08-26 23:57:52 +00002567
Johnny Chen63dfb272010-09-01 00:15:19 +00002568 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002569
Johnny Chen63dfb272010-09-01 00:15:19 +00002570 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002571 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002572
Johnny Chen150c3cc2010-10-15 01:18:29 +00002573 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002574 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002575 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002576 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002577 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002578 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002579 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002580 print("runCmd failed!", file=sbuf)
2581 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002582
Johnny Chenff3d01d2010-08-20 21:03:09 +00002583 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002584 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002585 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002586 # For process launch, wait some time before possible next try.
2587 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002588 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002589 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002590
Johnny Chen27f212d2010-08-19 23:26:59 +00002591 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002592 self.assertTrue(self.res.Succeeded(),
2593 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002594
Jim Ingham63dfc722012-09-22 00:05:11 +00002595 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2596 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2597
2598 Otherwise, all the arguments have the same meanings as for the expect function"""
2599
2600 trace = (True if traceAlways else trace)
2601
2602 if exe:
2603 # First run the command. If we are expecting error, set check=False.
2604 # Pass the assert message along since it provides more semantic info.
2605 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2606
2607 # Then compare the output against expected strings.
2608 output = self.res.GetError() if error else self.res.GetOutput()
2609
2610 # If error is True, the API client expects the command to fail!
2611 if error:
2612 self.assertFalse(self.res.Succeeded(),
2613 "Command '" + str + "' is expected to fail!")
2614 else:
2615 # No execution required, just compare str against the golden input.
2616 output = str
2617 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002618 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002619
2620 # The heading says either "Expecting" or "Not expecting".
2621 heading = "Expecting" if matching else "Not expecting"
2622
2623 for pattern in patterns:
2624 # Match Objects always have a boolean value of True.
2625 match_object = re.search(pattern, output)
2626 matched = bool(match_object)
2627 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002628 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2629 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002630 if matched:
2631 break
2632
2633 self.assertTrue(matched if matching else not matched,
2634 msg if msg else EXP_MSG(str, exe))
2635
2636 return match_object
2637
Enrico Granata7594f142013-06-17 22:51:50 +00002638 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 +00002639 """
2640 Similar to runCmd; with additional expect style output matching ability.
2641
2642 Ask the command interpreter to handle the command and then check its
2643 return status. The 'msg' parameter specifies an informational assert
2644 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002645 'startstr', matches the substrings contained in 'substrs', and regexp
2646 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002647
2648 If the keyword argument error is set to True, it signifies that the API
2649 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002650 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002651 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002652
2653 If the keyword argument matching is set to False, it signifies that the API
2654 client is expecting the output of the command not to match the golden
2655 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002656
2657 Finally, the required argument 'str' represents the lldb command to be
2658 sent to the command interpreter. In case the keyword argument 'exe' is
2659 set to False, the 'str' is treated as a string to be matched/not-matched
2660 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002661 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002662 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002663
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002664 if exe:
2665 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002666 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002667 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002668
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002669 # Then compare the output against expected strings.
2670 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002671
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002672 # If error is True, the API client expects the command to fail!
2673 if error:
2674 self.assertFalse(self.res.Succeeded(),
2675 "Command '" + str + "' is expected to fail!")
2676 else:
2677 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002678 if isinstance(str,lldb.SBCommandReturnObject):
2679 output = str.GetOutput()
2680 else:
2681 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002682 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002683 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002684
Johnny Chenea88e942010-09-21 21:08:53 +00002685 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002686 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002687
2688 # Start from the startstr, if specified.
2689 # If there's no startstr, set the initial state appropriately.
2690 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002691
Johnny Chen150c3cc2010-10-15 01:18:29 +00002692 if startstr:
2693 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002694 print("%s start string: %s" % (heading, startstr), file=sbuf)
2695 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002696
Johnny Chen86268e42011-09-30 21:48:35 +00002697 # Look for endstr, if specified.
2698 keepgoing = matched if matching else not matched
2699 if endstr:
2700 matched = output.endswith(endstr)
2701 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002702 print("%s end string: %s" % (heading, endstr), file=sbuf)
2703 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002704
Johnny Chenea88e942010-09-21 21:08:53 +00002705 # Look for sub strings, if specified.
2706 keepgoing = matched if matching else not matched
2707 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002708 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002709 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002710 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002711 print("%s sub string: %s" % (heading, str), file=sbuf)
2712 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002713 keepgoing = matched if matching else not matched
2714 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002715 break
2716
Johnny Chenea88e942010-09-21 21:08:53 +00002717 # Search for regular expression patterns, if specified.
2718 keepgoing = matched if matching else not matched
2719 if patterns and keepgoing:
2720 for pattern in patterns:
2721 # Match Objects always have a boolean value of True.
2722 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002723 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002724 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2725 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002726 keepgoing = matched if matching else not matched
2727 if not keepgoing:
2728 break
Johnny Chenea88e942010-09-21 21:08:53 +00002729
2730 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002731 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002732
Johnny Chenf3c59232010-08-25 22:52:45 +00002733 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002734 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002735 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002736
2737 method = getattr(obj, name)
2738 import inspect
2739 self.assertTrue(inspect.ismethod(method),
2740 name + "is a method name of object: " + str(obj))
2741 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002742 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002743 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002744 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002745
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002746 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2747 """Platform specific way to build the default binaries."""
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002748 module = builder_module()
2749 if target_is_android():
2750 dictionary = append_android_envs(dictionary)
2751 if self.debug_info is None:
2752 return self.buildDefault(architecture, compiler, dictionary, clean)
2753 elif self.debug_info == "dsym":
2754 return self.buildDsym(architecture, compiler, dictionary, clean)
2755 elif self.debug_info == "dwarf":
2756 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002757 elif self.debug_info == "dwo":
2758 return self.buildDwo(architecture, compiler, dictionary, clean)
2759 else:
2760 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002761
Johnny Chenf359cf22011-05-27 23:36:52 +00002762 # =================================================
2763 # Misc. helper methods for debugging test execution
2764 # =================================================
2765
Johnny Chen56b92a72011-07-11 19:15:11 +00002766 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002767 """Debug print a SBValue object, if traceAlways is True."""
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002768 from .lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002769
Johnny Chen8d55a342010-08-31 17:42:54 +00002770 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002771 return
2772
2773 err = sys.stderr
2774 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002775 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2776 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2777 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2778 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2779 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2780 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2781 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2782 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2783 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002784
Johnny Chen36c5eb12011-08-05 20:17:27 +00002785 def DebugSBType(self, type):
2786 """Debug print a SBType object, if traceAlways is True."""
2787 if not traceAlways:
2788 return
2789
2790 err = sys.stderr
2791 err.write(type.GetName() + ":\n")
2792 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2793 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2794 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2795
Johnny Chenb877f1e2011-03-12 01:18:19 +00002796 def DebugPExpect(self, child):
2797 """Debug the spwaned pexpect object."""
2798 if not traceAlways:
2799 return
2800
Zachary Turnerff890da2015-10-19 23:45:41 +00002801 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002802
2803 @classmethod
2804 def RemoveTempFile(cls, file):
2805 if os.path.exists(file):
2806 os.remove(file)