blob: 897cdeb12870bc45345bc5cf3b07b372556f639f [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
Johnny Chen90312a82010-09-21 22:34:45 +000043import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000044import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000045import re
Daniel Malea69207462013-06-05 21:07:02 +000046import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000047from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000048import time
Johnny Chena33a93c2010-08-30 23:08:52 +000049import types
Zachary Turner43a01e42015-10-20 21:06:05 +000050
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000051# Third-party modules
52import unittest2
Zachary Turner43a01e42015-10-20 21:06:05 +000053from six import add_metaclass
Zachary Turner814236d2015-10-21 17:48:52 +000054from six import StringIO as SixStringIO
55from six.moves.urllib import parse as urlparse
Zachary Turnercd236b82015-10-26 18:48:24 +000056import six
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000057
58# LLDB modules
59import lldb
60from . import lldbtest_config
61from . import lldbutil
62from . import test_categories
Siva Chandra8af91662015-06-05 00:22:49 +000063
Vince Harron85d19652015-05-21 19:09:29 +000064# dosep.py starts lots and lots of dotest instances
65# This option helps you find if two (or more) dotest instances are using the same
66# directory at the same time
67# Enable it to cause test failures and stderr messages if dotest instances try to run in
68# the same directory simultaneously
69# it is disabled by default because it litters the test directories with ".dirlock" files
70debug_confirm_directory_exclusivity = False
71
Johnny Chen707b3c92010-10-11 22:25:46 +000072# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000073# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000074
75# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000076if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
77 traceAlways = True
78else:
79 traceAlways = False
80
Johnny Chen707b3c92010-10-11 22:25:46 +000081# By default, doCleanup is True.
82if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
83 doCleanup = False
84else:
85 doCleanup = True
86
Johnny Chen8d55a342010-08-31 17:42:54 +000087
Johnny Chen00778092010-08-09 22:01:17 +000088#
89# Some commonly used assert messages.
90#
91
Johnny Chenaa902922010-09-17 22:45:27 +000092COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
93
Johnny Chen00778092010-08-09 22:01:17 +000094CURRENT_EXECUTABLE_SET = "Current executable set successfully"
95
Johnny Chen7d1d7532010-09-02 21:23:12 +000096PROCESS_IS_VALID = "Process is valid"
97
98PROCESS_KILLED = "Process is killed successfully"
99
Johnny Chend5f66fc2010-12-23 01:12:19 +0000100PROCESS_EXITED = "Process exited successfully"
101
102PROCESS_STOPPED = "Process status should be stopped"
103
Sean Callanan05834cd2015-07-01 23:56:30 +0000104RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000105
Johnny Chen17941842010-08-09 23:44:24 +0000106RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000107
Johnny Chen67af43f2010-10-05 19:27:32 +0000108BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
109
Johnny Chen17941842010-08-09 23:44:24 +0000110BREAKPOINT_CREATED = "Breakpoint created successfully"
111
Johnny Chenf10af382010-12-04 00:07:24 +0000112BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
113
Johnny Chene76896c2010-08-17 21:33:31 +0000114BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
115
Johnny Chen17941842010-08-09 23:44:24 +0000116BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000117
Johnny Chen703dbd02010-09-30 17:06:24 +0000118BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
119
Johnny Chen164f1e12010-10-15 18:07:09 +0000120BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
121
Greg Clayton5db6b792012-10-24 18:24:14 +0000122MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
123
Johnny Chen89109ed12011-06-27 20:05:23 +0000124OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
125
Johnny Chen5b3a3572010-12-09 18:22:12 +0000126SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
127
Johnny Chenc70b02a2010-09-22 23:00:20 +0000128STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
129
Johnny Chen1691a162011-04-15 16:44:48 +0000130STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
131
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000132STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
133
Johnny Chen5d6c4642010-11-10 23:46:38 +0000134STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000135
Johnny Chen5d6c4642010-11-10 23:46:38 +0000136STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
137 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000138
Johnny Chen2e431ce2010-10-20 18:38:48 +0000139STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
140
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000141STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
142
Johnny Chenc066ab42010-10-14 01:22:03 +0000143STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
144
Johnny Chen00778092010-08-09 22:01:17 +0000145STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
146
Johnny Chenf68cc122011-09-15 21:09:59 +0000147STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
148
Johnny Chen3c884a02010-08-24 22:07:56 +0000149DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
150
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000151VALID_BREAKPOINT = "Got a valid breakpoint"
152
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000153VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
154
Johnny Chen7209d84f2011-05-06 23:26:12 +0000155VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
156
Johnny Chen5ee88192010-08-27 23:47:36 +0000157VALID_FILESPEC = "Got a valid filespec"
158
Johnny Chen025d1b82010-12-08 01:25:21 +0000159VALID_MODULE = "Got a valid module"
160
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000161VALID_PROCESS = "Got a valid process"
162
Johnny Chen025d1b82010-12-08 01:25:21 +0000163VALID_SYMBOL = "Got a valid symbol"
164
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000165VALID_TARGET = "Got a valid target"
166
Matthew Gardinerc928de32014-10-22 07:22:56 +0000167VALID_PLATFORM = "Got a valid platform"
168
Johnny Chen15f247a2012-02-03 20:43:00 +0000169VALID_TYPE = "Got a valid type"
170
Johnny Chen5819ab42011-07-15 22:28:10 +0000171VALID_VARIABLE = "Got a valid variable"
172
Johnny Chen981463d2010-08-25 19:00:04 +0000173VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000174
Johnny Chenf68cc122011-09-15 21:09:59 +0000175WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000176
Sean Callanan05834cd2015-07-01 23:56:30 +0000177def CMD_MSG(str):
178 '''A generic "Command '%s' returns successfully" message generator.'''
179 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000180
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000181def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000182 '''A generic message generator for the completion mechanism.'''
183 return "'%s' successfully completes to '%s'" % (str_before, str_after)
184
Johnny Chenc0c67f22010-11-09 18:42:22 +0000185def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000186 '''A generic "'%s' returns expected result" message generator if exe.
187 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000188 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000189
Johnny Chen3343f042010-10-19 19:11:38 +0000190def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000191 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000192 return "Value of setting '%s' is correct" % setting
193
Johnny Chen27c41232010-08-26 21:49:29 +0000194def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000195 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000196 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000197
Johnny Chen47ceb032010-10-11 23:52:19 +0000198def line_number(filename, string_to_match):
199 """Helper function to return the line number of the first matched string."""
200 with open(filename, 'r') as f:
201 for i, line in enumerate(f):
202 if line.find(string_to_match) != -1:
203 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000204 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000205 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000206
Johnny Chen67af43f2010-10-05 19:27:32 +0000207def pointer_size():
208 """Return the pointer size of the host system."""
209 import ctypes
210 a_pointer = ctypes.c_void_p(0xffff)
211 return 8 * ctypes.sizeof(a_pointer)
212
Johnny Chen57816732012-02-09 02:01:59 +0000213def is_exe(fpath):
214 """Returns true if fpath is an executable."""
215 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
216
217def which(program):
218 """Returns the full path to a program; None otherwise."""
219 fpath, fname = os.path.split(program)
220 if fpath:
221 if is_exe(program):
222 return program
223 else:
224 for path in os.environ["PATH"].split(os.pathsep):
225 exe_file = os.path.join(path, program)
226 if is_exe(exe_file):
227 return exe_file
228 return None
229
Zachary Turner814236d2015-10-21 17:48:52 +0000230class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000231 """
232 A nice little context manager for recording the debugger interactions into
233 our session object. If trace flag is ON, it also emits the interactions
234 into the stderr.
235 """
236 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000237 """Create a SixStringIO instance; record the session obj and trace flag."""
238 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000239 # The test might not have undergone the 'setUp(self)' phase yet, so that
240 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000241 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000242 self.trace = trace
243
244 def __enter__(self):
245 """
246 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000247 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000248 """
249 return self
250
251 def __exit__(self, type, value, tb):
252 """
253 Context management protocol on exit from the body of the with statement.
254 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000255 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000256 """
257 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000258 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000259 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000260 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000261 self.close()
262
Zachary Turner43a01e42015-10-20 21:06:05 +0000263@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000264class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000265
266 @abc.abstractproperty
267 def pid(self):
268 """Returns process PID if has been launched already."""
269
270 @abc.abstractmethod
271 def launch(self, executable, args):
272 """Launches new process with given executable and args."""
273
274 @abc.abstractmethod
275 def terminate(self):
276 """Terminates previously launched process.."""
277
278class _LocalProcess(_BaseProcess):
279
280 def __init__(self, trace_on):
281 self._proc = None
282 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000283 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000284
285 @property
286 def pid(self):
287 return self._proc.pid
288
289 def launch(self, executable, args):
290 self._proc = Popen([executable] + args,
291 stdout = open(os.devnull) if not self._trace_on else None,
292 stdin = PIPE)
293
294 def terminate(self):
295 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000296 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000297 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
298 for sig in signals_to_try:
299 try:
300 self._proc.send_signal(getattr(signal, sig))
301 time.sleep(self._delayafterterminate)
302 if self._proc.poll() != None:
303 return
304 except ValueError:
305 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000306 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000307 time.sleep(self._delayafterterminate)
308 if self._proc.poll() != None:
309 return
310 self._proc.kill()
311 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000312
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000313 def poll(self):
314 return self._proc.poll()
315
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000316class _RemoteProcess(_BaseProcess):
317
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000318 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000319 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000320 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000321
322 @property
323 def pid(self):
324 return self._pid
325
326 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000327 if self._install_remote:
328 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000329 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000330
331 dst_file_spec = lldb.SBFileSpec(dst_path, False)
332 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
333 if err.Fail():
334 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
335 else:
336 dst_path = executable
337 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000338
339 launch_info = lldb.SBLaunchInfo(args)
340 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000341 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000342
343 # Redirect stdout and stderr to /dev/null
344 launch_info.AddSuppressFileAction(1, False, True)
345 launch_info.AddSuppressFileAction(2, False, True)
346
347 err = lldb.remote_platform.Launch(launch_info)
348 if err.Fail():
349 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
350 self._pid = launch_info.GetProcessID()
351
352 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000353 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000354
Johnny Chen690fcef2010-10-15 23:55:05 +0000355# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000356# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000357def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000358 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000359
360 If the exit code was non-zero it raises a CalledProcessError. The
361 CalledProcessError object will have the return code in the returncode
362 attribute and output in the output attribute.
363
364 The arguments are the same as for the Popen constructor. Example:
365
366 >>> check_output(["ls", "-l", "/dev/null"])
367 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
368
369 The stdout argument is not allowed as it is used internally.
370 To capture standard error in the result, use stderr=STDOUT.
371
372 >>> check_output(["/bin/sh", "-c",
373 ... "ls -l non_existent_file ; exit 0"],
374 ... stderr=STDOUT)
375 'ls: non_existent_file: No such file or directory\n'
376 """
377
378 # Assign the sender object to variable 'test' and remove it from kwargs.
379 test = kwargs.pop('sender', None)
380
Zachary Turner9ef307b2014-07-22 16:19:29 +0000381 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
382 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000383 output = ""
384 error = ""
385 for shellCommand in commandList:
386 if 'stdout' in kwargs:
387 raise ValueError('stdout argument not allowed, it will be overridden.')
388 if 'shell' in kwargs and kwargs['shell']==False:
389 raise ValueError('shell=False not allowed')
390 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, **kwargs)
391 pid = process.pid
392 this_output, this_error = process.communicate()
393 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000394
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000395 # Enable trace on failure return while tracking down FreeBSD buildbot issues
396 trace = traceAlways
397 if not trace and retcode and sys.platform.startswith("freebsd"):
398 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000399
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000400 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000401 print(file=sbuf)
402 print("os command:", shellCommand, file=sbuf)
403 print("with pid:", pid, file=sbuf)
404 print("stdout:", this_output, file=sbuf)
405 print("stderr:", this_error, file=sbuf)
406 print("retcode:", retcode, file=sbuf)
407 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000408
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000409 if retcode:
410 cmd = kwargs.get("args")
411 if cmd is None:
412 cmd = shellCommand
413 raise CalledProcessError(retcode, cmd)
414 output = output + this_output
415 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000416 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000417
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000418def getsource_if_available(obj):
419 """
420 Return the text of the source code for an object if available. Otherwise,
421 a print representation is returned.
422 """
423 import inspect
424 try:
425 return inspect.getsource(obj)
426 except:
427 return repr(obj)
428
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000429def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000430 if sys.platform.startswith("freebsd"):
431 return __import__("builder_freebsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000432 return __import__("builder_" + sys.platform)
433
Siva Chandra8af91662015-06-05 00:22:49 +0000434def run_adb_command(cmd, device_id):
435 device_id_args = []
436 if device_id:
437 device_id_args = ["-s", device_id]
438 full_cmd = ["adb"] + device_id_args + cmd
439 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
440 stdout, stderr = p.communicate()
441 return p.returncode, stdout, stderr
442
Chaoren Line9bbabc2015-07-18 00:37:55 +0000443def append_android_envs(dictionary):
444 if dictionary is None:
445 dictionary = {}
446 dictionary["OS"] = "Android"
447 if android_device_api() >= 16:
448 dictionary["PIE"] = 1
449 return dictionary
450
Chaoren Lin9070f532015-07-17 22:13:29 +0000451def target_is_android():
452 if not hasattr(target_is_android, 'result'):
453 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
454 match = re.match(".*-.*-.*-android", triple)
455 target_is_android.result = match is not None
456 return target_is_android.result
457
Siva Chandra8af91662015-06-05 00:22:49 +0000458def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000459 if not hasattr(android_device_api, 'result'):
460 assert lldb.platform_url is not None
461 device_id = None
462 parsed_url = urlparse.urlparse(lldb.platform_url)
463 if parsed_url.scheme == "adb":
464 device_id = parsed_url.netloc.split(":")[0]
465 retcode, stdout, stderr = run_adb_command(
466 ["shell", "getprop", "ro.build.version.sdk"], device_id)
467 if retcode == 0:
468 android_device_api.result = int(stdout)
469 else:
470 raise LookupError(
471 ">>> Unable to determine the API level of the Android device.\n"
472 ">>> stdout:\n%s\n"
473 ">>> stderr:\n%s\n" % (stdout, stderr))
474 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000475
Zachary Turnerabdb8392015-11-16 22:40:30 +0000476def check_expected_version(comparison, expected, actual):
477 def fn_leq(x,y): return x <= y
478 def fn_less(x,y): return x < y
479 def fn_geq(x,y): return x >= y
480 def fn_greater(x,y): return x > y
481 def fn_eq(x,y): return x == y
482 def fn_neq(x,y): return x != y
483
484 op_lookup = {
485 "==": fn_eq,
486 "=": fn_eq,
487 "!=": fn_neq,
488 "<>": fn_neq,
489 ">": fn_greater,
490 "<": fn_less,
491 ">=": fn_geq,
492 "<=": fn_leq
493 }
494 expected_str = '.'.join([str(x) for x in expected])
495 actual_str = '.'.join([str(x) for x in actual])
496
497 return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
498
Johnny Chena74bb0a2011-08-01 18:46:13 +0000499#
500# Decorators for categorizing test cases.
501#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000502from functools import wraps
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000503def add_test_categories(cat):
504 """Decorate an item with test categories"""
505 cat = test_categories.validate(cat, True)
506 def impl(func):
507 func.getCategories = lambda test: cat
508 return func
509 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000510
Johnny Chena74bb0a2011-08-01 18:46:13 +0000511def benchmarks_test(func):
512 """Decorate the item as a benchmarks test."""
513 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
514 raise Exception("@benchmarks_test can only be used to decorate a test method")
515 @wraps(func)
516 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000517 if not lldb.just_do_benchmarks_test:
518 self.skipTest("benchmarks tests")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000519 return func(self, *args, **kwargs)
520
521 # Mark this function as such to separate them from the regular tests.
522 wrapper.__benchmarks_test__ = True
523 return wrapper
524
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000525def no_debug_info_test(func):
526 """Decorate the item as a test what don't use any debug info. If this annotation is specified
527 then the test runner won't generate a separate test for each debug info format. """
528 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
529 raise Exception("@no_debug_info_test can only be used to decorate a test method")
530 @wraps(func)
531 def wrapper(self, *args, **kwargs):
532 return func(self, *args, **kwargs)
533
534 # Mark this function as such to separate them from the regular tests.
535 wrapper.__no_debug_info_test__ = True
536 return wrapper
537
Johnny Chenf1548d42012-04-06 00:56:05 +0000538def dsym_test(func):
539 """Decorate the item as a dsym test."""
540 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
541 raise Exception("@dsym_test can only be used to decorate a test method")
542 @wraps(func)
543 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000544 if lldb.dont_do_dsym_test:
545 self.skipTest("dsym tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000546 return func(self, *args, **kwargs)
547
548 # Mark this function as such to separate them from the regular tests.
549 wrapper.__dsym_test__ = True
550 return wrapper
551
552def dwarf_test(func):
553 """Decorate the item as a dwarf test."""
554 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
555 raise Exception("@dwarf_test can only be used to decorate a test method")
556 @wraps(func)
557 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000558 if lldb.dont_do_dwarf_test:
559 self.skipTest("dwarf tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000560 return func(self, *args, **kwargs)
561
562 # Mark this function as such to separate them from the regular tests.
563 wrapper.__dwarf_test__ = True
564 return wrapper
565
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000566def dwo_test(func):
567 """Decorate the item as a dwo test."""
568 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
569 raise Exception("@dwo_test can only be used to decorate a test method")
570 @wraps(func)
571 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000572 if lldb.dont_do_dwo_test:
573 self.skipTest("dwo tests")
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000574 return func(self, *args, **kwargs)
575
576 # Mark this function as such to separate them from the regular tests.
577 wrapper.__dwo_test__ = True
578 return wrapper
579
Todd Fialaa41d48c2014-04-28 04:49:40 +0000580def debugserver_test(func):
581 """Decorate the item as a debugserver test."""
582 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
583 raise Exception("@debugserver_test can only be used to decorate a test method")
584 @wraps(func)
585 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000586 if lldb.dont_do_debugserver_test:
587 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000588 return func(self, *args, **kwargs)
589
590 # Mark this function as such to separate them from the regular tests.
591 wrapper.__debugserver_test__ = True
592 return wrapper
593
594def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000595 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000596 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
597 raise Exception("@llgs_test can only be used to decorate a test method")
598 @wraps(func)
599 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000600 if lldb.dont_do_llgs_test:
601 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000602 return func(self, *args, **kwargs)
603
604 # Mark this function as such to separate them from the regular tests.
605 wrapper.__llgs_test__ = True
606 return wrapper
607
Daniel Maleae0f8f572013-08-26 23:57:52 +0000608def not_remote_testsuite_ready(func):
609 """Decorate the item as a test which is not ready yet for remote testsuite."""
610 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
611 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
612 @wraps(func)
613 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000614 if lldb.lldbtest_remote_sandbox or lldb.remote_platform:
615 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000616 return func(self, *args, **kwargs)
617
618 # Mark this function as such to separate them from the regular tests.
619 wrapper.__not_ready_for_remote_testsuite_test__ = True
620 return wrapper
621
Ed Maste433790a2014-04-23 12:55:41 +0000622def expectedFailure(expected_fn, bugnumber=None):
623 def expectedFailure_impl(func):
624 @wraps(func)
625 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000626 from unittest2 import case
627 self = args[0]
Ed Maste433790a2014-04-23 12:55:41 +0000628 if expected_fn(self):
Zachary Turner5cb8e672015-11-06 18:14:42 +0000629 xfail_func = unittest2.expectedFailure(func)
630 xfail_func(*args, **kwargs)
631 else:
632 func(*args, **kwargs)
Ed Maste433790a2014-04-23 12:55:41 +0000633 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000634 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
635 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000636 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000637 return expectedFailure_impl(bugnumber)
638 else:
639 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000640
Ying Chen0c352822015-11-16 23:41:02 +0000641# You can also pass not_in(list) to reverse the sense of the test for the arguments that
642# are simple lists, namely oslist, compiler, and debug_info.
643
644def not_in (iterable):
645 return lambda x : x not in iterable
646
647def check_list_or_lambda (list_or_lambda, value):
648 if six.callable(list_or_lambda):
649 return list_or_lambda(value)
650 else:
651 return list_or_lambda is None or value is None or value in list_or_lambda
652
Ying Chen7091c2c2015-04-21 01:15:47 +0000653# provide a function to xfail on defined oslist, compiler version, and archs
654# if none is specified for any argument, that argument won't be checked and thus means for all
655# for example,
656# @expectedFailureAll, xfail for all platform/compiler/arch,
657# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
658# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Zachary Turnerabdb8392015-11-16 22:40:30 +0000659def expectedFailureAll(bugnumber=None, oslist=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 +0000660 def fn(self):
Ying Chen0c352822015-11-16 23:41:02 +0000661 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
662 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000663 arch_passes = self.expectedArch(archs)
664 triple_passes = triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())
Ying Chen0c352822015-11-16 23:41:02 +0000665 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000666 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))
667 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
668
669 return (oslist_passes and
670 compiler_passes and
671 arch_passes and
672 triple_passes and
673 debug_info_passes and
674 swig_version_passes and
675 py_version_passes)
Ying Chen7091c2c2015-04-21 01:15:47 +0000676 return expectedFailure(fn, bugnumber)
677
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000678def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000679 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
680
681def expectedFailureDwo(bugnumber=None):
682 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000683
684def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000685 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000686
687def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
688 if compiler_version is None:
689 compiler_version=['=', None]
690 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
691
Vince Harron8974ce22015-03-13 19:54:54 +0000692# to XFAIL a specific clang versions, try this
693# @expectedFailureClang('bugnumber', ['<=', '3.4'])
694def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000695 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000696
697def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000698 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000699
Matt Kopec0de53f02013-03-15 19:10:12 +0000700def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000701 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000702
Ed Maste433790a2014-04-23 12:55:41 +0000703def expectedFailureArch(arch, bugnumber=None):
704 def fn(self):
705 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000706 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000707
Enrico Granatae6cedc12013-02-23 01:05:23 +0000708def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000709 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000710
Matt Kopecee969f92013-09-26 23:30:59 +0000711def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000712 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000713
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000714def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None):
Ed Maste433790a2014-04-23 12:55:41 +0000715 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000716 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000717 self.expectedCompiler(compilers) and
718 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000719 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000720
Chaoren Linf7160f32015-06-09 17:39:27 +0000721def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
722 def fn(self):
723 return (getHostPlatform() in oslist and
724 self.expectedCompiler(compilers))
725 return expectedFailure(fn, bugnumber)
726
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000727def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000728 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000729 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000730
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000731def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
732 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000733
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000734def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None):
735 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000736
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000737def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
738 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000739
Chaoren Linf7160f32015-06-09 17:39:27 +0000740def expectedFailureHostWindows(bugnumber=None, compilers=None):
741 return expectedFailureHostOS(['windows'], bugnumber, compilers)
742
Pavel Labath090152b2015-08-20 11:37:19 +0000743def matchAndroid(api_levels=None, archs=None):
744 def match(self):
745 if not target_is_android():
746 return False
747 if archs is not None and self.getArchitecture() not in archs:
748 return False
749 if api_levels is not None and android_device_api() not in api_levels:
750 return False
751 return True
752 return match
753
754
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000755def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000756 """ Mark a test as xfail for Android.
757
758 Arguments:
759 bugnumber - The LLVM pr associated with the problem.
760 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000761 for which a test is expected to fail. None means all API level.
762 arch - A sequence of architecture names specifying the architectures
763 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000764 """
Pavel Labath090152b2015-08-20 11:37:19 +0000765 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000766
Vince Harron7ac3ea42015-06-26 15:13:21 +0000767# if the test passes on the first try, we're done (success)
768# if the test fails once, then passes on the second try, raise an ExpectedFailure
769# if the test fails twice in a row, re-throw the exception from the second test run
770def expectedFlakey(expected_fn, bugnumber=None):
771 def expectedFailure_impl(func):
772 @wraps(func)
773 def wrapper(*args, **kwargs):
774 from unittest2 import case
775 self = args[0]
776 try:
777 func(*args, **kwargs)
Ying Chen0a7202b2015-07-01 22:44:27 +0000778 # don't retry if the test case is already decorated with xfail or skip
779 except (case._ExpectedFailure, case.SkipTest, case._UnexpectedSuccess):
780 raise
Vince Harron7ac3ea42015-06-26 15:13:21 +0000781 except Exception:
782 if expected_fn(self):
Ying Chen0a7202b2015-07-01 22:44:27 +0000783 # before retry, run tearDown for previous run and setup for next
Vince Harron7ac3ea42015-06-26 15:13:21 +0000784 try:
Ying Chen0a7202b2015-07-01 22:44:27 +0000785 self.tearDown()
786 self.setUp()
Vince Harron7ac3ea42015-06-26 15:13:21 +0000787 func(*args, **kwargs)
788 except Exception:
789 # oh snap! two failures in a row, record a failure/error
790 raise
791 # record the expected failure
792 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
793 else:
794 raise
795 return wrapper
796 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
797 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000798 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000799 return expectedFailure_impl(bugnumber)
800 else:
801 return expectedFailure_impl
802
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000803def expectedFlakeyDwarf(bugnumber=None):
804 def fn(self):
805 return self.debug_info == "dwarf"
806 return expectedFlakey(fn, bugnumber)
807
808def expectedFlakeyDsym(bugnumber=None):
809 def fn(self):
810 return self.debug_info == "dwarf"
811 return expectedFlakey(fn, bugnumber)
812
Vince Harron7ac3ea42015-06-26 15:13:21 +0000813def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
814 def fn(self):
815 return (self.getPlatform() in oslist and
816 self.expectedCompiler(compilers))
817 return expectedFlakey(fn, bugnumber)
818
819def expectedFlakeyDarwin(bugnumber=None, compilers=None):
820 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
821 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
822
823def expectedFlakeyLinux(bugnumber=None, compilers=None):
824 return expectedFlakeyOS(['linux'], bugnumber, compilers)
825
826def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
827 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
828
829def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
830 if compiler_version is None:
831 compiler_version=['=', None]
832 def fn(self):
833 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
834 return expectedFlakey(fn, bugnumber)
835
836# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
837def expectedFlakeyClang(bugnumber=None, compiler_version=None):
838 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
839
840# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
841def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
842 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
843
Pavel Labath63a579c2015-09-07 12:15:27 +0000844def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
845 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
846
Greg Clayton12514562013-12-05 22:22:32 +0000847def skipIfRemote(func):
848 """Decorate the item to skip tests if testing remotely."""
849 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
850 raise Exception("@skipIfRemote can only be used to decorate a test method")
851 @wraps(func)
852 def wrapper(*args, **kwargs):
853 from unittest2 import case
854 if lldb.remote_platform:
855 self = args[0]
856 self.skipTest("skip on remote platform")
857 else:
858 func(*args, **kwargs)
859 return wrapper
860
Siva Chandra4470f382015-06-17 22:32:27 +0000861def skipUnlessListedRemote(remote_list=None):
862 def myImpl(func):
863 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
864 raise Exception("@skipIfRemote can only be used to decorate a "
865 "test method")
866
867 @wraps(func)
868 def wrapper(*args, **kwargs):
869 if remote_list and lldb.remote_platform:
870 self = args[0]
871 triple = self.dbg.GetSelectedPlatform().GetTriple()
872 for r in remote_list:
873 if r in triple:
874 func(*args, **kwargs)
875 return
876 self.skipTest("skip on remote platform %s" % str(triple))
877 else:
878 func(*args, **kwargs)
879 return wrapper
880
881 return myImpl
882
Greg Clayton12514562013-12-05 22:22:32 +0000883def skipIfRemoteDueToDeadlock(func):
884 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
885 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
886 raise Exception("@skipIfRemote can only be used to decorate a test method")
887 @wraps(func)
888 def wrapper(*args, **kwargs):
889 from unittest2 import case
890 if lldb.remote_platform:
891 self = args[0]
892 self.skipTest("skip on remote platform (deadlocks)")
893 else:
894 func(*args, **kwargs)
895 return wrapper
896
Enrico Granatab633e432014-10-06 21:37:06 +0000897def skipIfNoSBHeaders(func):
898 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
899 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000900 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000901 @wraps(func)
902 def wrapper(*args, **kwargs):
903 from unittest2 import case
904 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000905 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000906 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000907 else:
908 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000909 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000910 if not os.path.exists(header):
911 self.skipTest("skip because LLDB.h header not found")
912 else:
913 func(*args, **kwargs)
914 return wrapper
915
Enrico Granata5f92a132015-11-05 00:46:25 +0000916def skipIfiOSSimulator(func):
917 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
918 return unittest2.skipIf(hasattr(lldb, 'remote_platform_name') and lldb.remote_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
919
Robert Flack13c7ad92015-03-30 14:12:17 +0000920def skipIfFreeBSD(func):
921 """Decorate the item to skip tests that should be skipped on FreeBSD."""
922 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000923
Greg Claytone0d0a762015-04-02 18:24:03 +0000924def getDarwinOSTriples():
925 return ['darwin', 'macosx', 'ios']
926
Daniel Maleab3d41a22013-07-09 00:08:01 +0000927def skipIfDarwin(func):
928 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000929 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000930
Robert Flack13c7ad92015-03-30 14:12:17 +0000931def skipIfLinux(func):
932 """Decorate the item to skip tests that should be skipped on Linux."""
933 return skipIfPlatform(["linux"])(func)
934
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000935def skipUnlessHostLinux(func):
936 """Decorate the item to skip tests that should be skipped on any non Linux host."""
937 return skipUnlessHostPlatform(["linux"])(func)
938
Robert Flack13c7ad92015-03-30 14:12:17 +0000939def skipIfWindows(func):
940 """Decorate the item to skip tests that should be skipped on Windows."""
941 return skipIfPlatform(["windows"])(func)
942
Chaoren Line6eea5d2015-06-08 22:13:28 +0000943def skipIfHostWindows(func):
944 """Decorate the item to skip tests that should be skipped on Windows."""
945 return skipIfHostPlatform(["windows"])(func)
946
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000947def skipUnlessWindows(func):
948 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
949 return skipUnlessPlatform(["windows"])(func)
950
Robert Flack13c7ad92015-03-30 14:12:17 +0000951def skipUnlessDarwin(func):
952 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000953 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000954
Ryan Brown57bee1e2015-09-14 22:45:11 +0000955def skipUnlessGoInstalled(func):
956 """Decorate the item to skip tests when no Go compiler is available."""
957 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
958 raise Exception("@skipIfGcc can only be used to decorate a test method")
959 @wraps(func)
960 def wrapper(*args, **kwargs):
961 from unittest2 import case
962 self = args[0]
963 compiler = self.getGoCompilerVersion()
964 if not compiler:
965 self.skipTest("skipping because go compiler not found")
966 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000967 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000968 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000969 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
970 if not match_version:
971 # Couldn't determine version.
972 self.skipTest(
973 "skipping because go version could not be parsed "
974 "out of {}".format(compiler))
975 else:
976 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000977 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000978 compiler_strict_version = StrictVersion(match_version.group(1))
979 if compiler_strict_version < min_strict_version:
980 self.skipTest(
981 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +0000982 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +0000983 compiler_strict_version,
984 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +0000985 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +0000986 return wrapper
987
Robert Flack068898c2015-04-09 18:07:58 +0000988def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +0000989 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +0000990 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
991 if platform.startswith('freebsd'):
992 platform = 'freebsd'
993 return platform
994
Robert Flack6e1fd352015-05-15 12:39:33 +0000995def getHostPlatform():
996 """Returns the host platform running the test suite."""
997 # Attempts to return a platform name matching a target Triple platform.
998 if sys.platform.startswith('linux'):
999 return 'linux'
1000 elif sys.platform.startswith('win32'):
1001 return 'windows'
1002 elif sys.platform.startswith('darwin'):
1003 return 'darwin'
1004 elif sys.platform.startswith('freebsd'):
1005 return 'freebsd'
1006 else:
1007 return sys.platform
1008
Robert Flackfb2f6c62015-04-17 08:02:18 +00001009def platformIsDarwin():
1010 """Returns true if the OS triple for the selected platform is any valid apple OS"""
1011 return getPlatform() in getDarwinOSTriples()
1012
Robert Flack6e1fd352015-05-15 12:39:33 +00001013def skipIfHostIncompatibleWithRemote(func):
1014 """Decorate the item to skip tests if binaries built on this host are incompatible."""
1015 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1016 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
1017 @wraps(func)
1018 def wrapper(*args, **kwargs):
1019 from unittest2 import case
1020 self = args[0]
1021 host_arch = self.getLldbArchitecture()
1022 host_platform = getHostPlatform()
1023 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +00001024 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +00001025 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
1026 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
1027 elif target_platform != host_platform:
1028 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
1029 else:
1030 func(*args, **kwargs)
1031 return wrapper
1032
Chaoren Line6eea5d2015-06-08 22:13:28 +00001033def skipIfHostPlatform(oslist):
1034 """Decorate the item to skip tests if running on one of the listed host platforms."""
1035 return unittest2.skipIf(getHostPlatform() in oslist,
1036 "skip on %s" % (", ".join(oslist)))
1037
1038def skipUnlessHostPlatform(oslist):
1039 """Decorate the item to skip tests unless running on one of the listed host platforms."""
1040 return unittest2.skipUnless(getHostPlatform() in oslist,
1041 "requires on of %s" % (", ".join(oslist)))
1042
Zachary Turner793d9972015-08-14 23:29:24 +00001043def skipUnlessArch(archlist):
1044 """Decorate the item to skip tests unless running on one of the listed architectures."""
1045 def myImpl(func):
1046 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1047 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1048
1049 @wraps(func)
1050 def wrapper(*args, **kwargs):
1051 self = args[0]
1052 if self.getArchitecture() not in archlist:
1053 self.skipTest("skipping for architecture %s (requires one of %s)" %
1054 (self.getArchitecture(), ", ".join(archlist)))
1055 else:
1056 func(*args, **kwargs)
1057 return wrapper
1058
1059 return myImpl
1060
Robert Flack13c7ad92015-03-30 14:12:17 +00001061def skipIfPlatform(oslist):
1062 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001063 return unittest2.skipIf(getPlatform() in oslist,
1064 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001065
1066def skipUnlessPlatform(oslist):
1067 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001068 return unittest2.skipUnless(getPlatform() in oslist,
1069 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001070
Daniel Malea48359902013-05-14 20:48:54 +00001071def skipIfLinuxClang(func):
1072 """Decorate the item to skip tests that should be skipped if building on
1073 Linux with clang.
1074 """
1075 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1076 raise Exception("@skipIfLinuxClang can only be used to decorate a test method")
1077 @wraps(func)
1078 def wrapper(*args, **kwargs):
1079 from unittest2 import case
1080 self = args[0]
1081 compiler = self.getCompiler()
Vince Harronc8492672015-05-04 02:59:19 +00001082 platform = self.getPlatform()
1083 if "clang" in compiler and platform == "linux":
Daniel Malea48359902013-05-14 20:48:54 +00001084 self.skipTest("skipping because Clang is used on Linux")
1085 else:
1086 func(*args, **kwargs)
1087 return wrapper
1088
Ying Chen7091c2c2015-04-21 01:15:47 +00001089# provide a function to skip on defined oslist, compiler version, and archs
1090# if none is specified for any argument, that argument won't be checked and thus means for all
1091# for example,
1092# @skipIf, skip for all platform/compiler/arch,
1093# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1094# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1095
1096# TODO: refactor current code, to make skipIfxxx functions to call this function
Zachary Turnerabdb8392015-11-16 22:40:30 +00001097def skipIf(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, debug_info=None, swig_version=None, py_version=None):
Ying Chen7091c2c2015-04-21 01:15:47 +00001098 def fn(self):
Zachary Turnerabdb8392015-11-16 22:40:30 +00001099 oslist_passes = oslist is None or self.getPlatform() in oslist
1100 compiler_passes = compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))
1101 arch_passes = self.expectedArch(archs)
1102 debug_info_passes = debug_info is None or self.debug_info in debug_info
1103 swig_version_passes = (swig_version is None) or (not hasattr(lldb, 'swig_version')) or (check_expected_version(swig_version[0], swig_version[1], lldb.swig_version))
1104 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
1105
1106 return (oslist_passes and
1107 compiler_passes and
1108 arch_passes and
1109 debug_info_passes and
1110 swig_version_passes and
1111 py_version_passes)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001112 return skipTestIfFn(fn, bugnumber, skipReason="skipping because os:%s compiler: %s %s arch: %s debug info: %s"%(oslist, compiler, compiler_version, archs, debug_info))
1113
1114def skipIfDebugInfo(bugnumber=None, debug_info=None):
1115 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1116
Greg Claytonedea2372015-10-07 20:01:13 +00001117def skipIfDWO(bugnumber=None):
1118 return skipIfDebugInfo(bugnumber, ["dwo"])
1119
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001120def skipIfDwarf(bugnumber=None):
1121 return skipIfDebugInfo(bugnumber, ["dwarf"])
1122
1123def skipIfDsym(bugnumber=None):
1124 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001125
1126def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1127 def skipTestIfFn_impl(func):
1128 @wraps(func)
1129 def wrapper(*args, **kwargs):
1130 from unittest2 import case
1131 self = args[0]
1132 if expected_fn(self):
1133 self.skipTest(skipReason)
1134 else:
1135 func(*args, **kwargs)
1136 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001137 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001138 return skipTestIfFn_impl(bugnumber)
1139 else:
1140 return skipTestIfFn_impl
1141
Daniel Maleabe230792013-01-24 23:52:09 +00001142def skipIfGcc(func):
1143 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1144 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001145 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001146 @wraps(func)
1147 def wrapper(*args, **kwargs):
1148 from unittest2 import case
1149 self = args[0]
1150 compiler = self.getCompiler()
1151 if "gcc" in compiler:
1152 self.skipTest("skipping because gcc is the test compiler")
1153 else:
1154 func(*args, **kwargs)
1155 return wrapper
1156
Matt Kopec0de53f02013-03-15 19:10:12 +00001157def skipIfIcc(func):
1158 """Decorate the item to skip tests that should be skipped if building with icc ."""
1159 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1160 raise Exception("@skipIfIcc can only be used to decorate a test method")
1161 @wraps(func)
1162 def wrapper(*args, **kwargs):
1163 from unittest2 import case
1164 self = args[0]
1165 compiler = self.getCompiler()
1166 if "icc" in compiler:
1167 self.skipTest("skipping because icc is the test compiler")
1168 else:
1169 func(*args, **kwargs)
1170 return wrapper
1171
Daniel Malea55faa402013-05-02 21:44:31 +00001172def skipIfi386(func):
1173 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1174 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1175 raise Exception("@skipIfi386 can only be used to decorate a test method")
1176 @wraps(func)
1177 def wrapper(*args, **kwargs):
1178 from unittest2 import case
1179 self = args[0]
1180 if "i386" == self.getArchitecture():
1181 self.skipTest("skipping because i386 is not a supported architecture")
1182 else:
1183 func(*args, **kwargs)
1184 return wrapper
1185
Pavel Labath090152b2015-08-20 11:37:19 +00001186def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001187 """Decorator to skip tests when the target is Android.
1188
1189 Arguments:
1190 api_levels - The API levels for which the test should be skipped. If
1191 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001192 arch - A sequence of architecture names specifying the architectures
1193 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001194 """
1195 def myImpl(func):
1196 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1197 raise Exception("@skipIfTargetAndroid can only be used to "
1198 "decorate a test method")
1199 @wraps(func)
1200 def wrapper(*args, **kwargs):
1201 from unittest2 import case
1202 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001203 if matchAndroid(api_levels, archs)(self):
1204 self.skipTest("skiped on Android target with API %d and architecture %s" %
1205 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001206 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001207 return wrapper
1208 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001209
Ilia Kd9953052015-03-12 07:19:41 +00001210def skipUnlessCompilerRt(func):
1211 """Decorate the item to skip tests if testing remotely."""
1212 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1213 raise Exception("@skipUnless can only be used to decorate a test method")
1214 @wraps(func)
1215 def wrapper(*args, **kwargs):
1216 from unittest2 import case
1217 import os.path
1218 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "projects", "compiler-rt")
1219 if not os.path.exists(compilerRtPath):
1220 self = args[0]
1221 self.skipTest("skip if compiler-rt not found")
1222 else:
1223 func(*args, **kwargs)
1224 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001225
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001226class _PlatformContext(object):
1227 """Value object class which contains platform-specific options."""
1228
1229 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1230 self.shlib_environment_var = shlib_environment_var
1231 self.shlib_prefix = shlib_prefix
1232 self.shlib_extension = shlib_extension
1233
1234
Johnny Chena74bb0a2011-08-01 18:46:13 +00001235class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001236 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001237 Abstract base for performing lldb (see TestBase) or other generic tests (see
1238 BenchBase for one example). lldbtest.Base works with the test driver to
1239 accomplish things.
1240
Johnny Chen8334dad2010-10-22 23:15:46 +00001241 """
Enrico Granata5020f952012-10-24 21:42:49 +00001242
Enrico Granata19186272012-10-24 21:44:48 +00001243 # The concrete subclass should override this attribute.
1244 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001245
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001246 # Keep track of the old current working directory.
1247 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001248
Greg Clayton4570d3e2013-12-10 23:19:29 +00001249 @staticmethod
1250 def compute_mydir(test_file):
1251 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1252
1253 mydir = TestBase.compute_mydir(__file__)'''
1254 test_dir = os.path.dirname(test_file)
1255 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1256
Johnny Chenfb4264c2011-08-01 19:50:58 +00001257 def TraceOn(self):
1258 """Returns True if we are in trace mode (tracing detailed test execution)."""
1259 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001260
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001261 @classmethod
1262 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001263 """
1264 Python unittest framework class setup fixture.
1265 Do current directory manipulation.
1266 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001267 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001268 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001269 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001270
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001271 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001272 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001273
1274 # Change current working directory if ${LLDB_TEST} is defined.
1275 # See also dotest.py which sets up ${LLDB_TEST}.
1276 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001277 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001278 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001279 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001280 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1281
Vince Harron85d19652015-05-21 19:09:29 +00001282 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001283 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001284 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1285 try:
1286 cls.dir_lock.try_acquire()
1287 # write the class that owns the lock into the lock file
1288 cls.dir_lock.handle.write(cls.__name__)
1289 except IOError as ioerror:
1290 # nothing else should have this directory lock
1291 # wait here until we get a lock
1292 cls.dir_lock.acquire()
1293 # read the previous owner from the lock file
1294 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001295 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 +00001296 raise ioerror
1297
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001298 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001299 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001300 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Robert Flackfb2f6c62015-04-17 08:02:18 +00001301 elif getPlatform() == "linux" or getPlatform() == "freebsd":
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001302 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001303 else:
1304 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001305
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001306 @classmethod
1307 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001308 """
1309 Python unittest framework class teardown fixture.
1310 Do class-wide cleanup.
1311 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001312
Johnny Chen0fddfb22011-11-17 19:57:27 +00001313 if doCleanup and not lldb.skip_build_and_cleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001314 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001315 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001316 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001317
Johnny Chen707b3c92010-10-11 22:25:46 +00001318 # Subclass might have specific cleanup function defined.
1319 if getattr(cls, "classCleanup", None):
1320 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001321 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001322 try:
1323 cls.classCleanup()
1324 except:
1325 exc_type, exc_value, exc_tb = sys.exc_info()
1326 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001327
Vince Harron85d19652015-05-21 19:09:29 +00001328 if debug_confirm_directory_exclusivity:
1329 cls.dir_lock.release()
1330 del cls.dir_lock
1331
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001332 # Restore old working directory.
1333 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001334 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001335 os.chdir(cls.oldcwd)
1336
Johnny Chena74bb0a2011-08-01 18:46:13 +00001337 @classmethod
1338 def skipLongRunningTest(cls):
1339 """
1340 By default, we skip long running test case.
1341 This can be overridden by passing '-l' to the test driver (dotest.py).
1342 """
1343 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1344 return False
1345 else:
1346 return True
Johnny Chened492022011-06-21 00:53:00 +00001347
Vince Harron6d3d0f12015-05-10 22:01:59 +00001348 def enableLogChannelsForCurrentTest(self):
1349 if len(lldbtest_config.channels) == 0:
1350 return
1351
1352 # if debug channels are specified in lldbtest_config.channels,
1353 # create a new set of log files for every test
1354 log_basename = self.getLogBasenameForCurrentTest()
1355
1356 # confirm that the file is writeable
1357 host_log_path = "{}-host.log".format(log_basename)
1358 open(host_log_path, 'w').close()
1359
1360 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1361 for channel_with_categories in lldbtest_config.channels:
1362 channel_then_categories = channel_with_categories.split(' ', 1)
1363 channel = channel_then_categories[0]
1364 if len(channel_then_categories) > 1:
1365 categories = channel_then_categories[1]
1366 else:
1367 categories = "default"
1368
1369 if channel == "gdb-remote":
1370 # communicate gdb-remote categories to debugserver
1371 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1372
1373 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1374 if not self.res.Succeeded():
1375 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1376
1377 # Communicate log path name to debugserver & lldb-server
1378 server_log_path = "{}-server.log".format(log_basename)
1379 open(server_log_path, 'w').close()
1380 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
1381
1382 # Communicate channels to lldb-server
1383 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
1384
1385 if len(lldbtest_config.channels) == 0:
1386 return
1387
1388 def disableLogChannelsForCurrentTest(self):
1389 # close all log files that we opened
1390 for channel_and_categories in lldbtest_config.channels:
1391 # channel format - <channel-name> [<category0> [<category1> ...]]
1392 channel = channel_and_categories.split(' ', 1)[0]
1393 self.ci.HandleCommand("log disable " + channel, self.res)
1394 if not self.res.Succeeded():
1395 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1396
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001397 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001398 """Fixture for unittest test case setup.
1399
1400 It works with the test driver to conditionally skip tests and does other
1401 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001402 #import traceback
1403 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001404
Daniel Malea9115f072013-08-06 15:02:32 +00001405 if "LIBCXX_PATH" in os.environ:
1406 self.libcxxPath = os.environ["LIBCXX_PATH"]
1407 else:
1408 self.libcxxPath = None
1409
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001410 if "LLDBMI_EXEC" in os.environ:
1411 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1412 else:
1413 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001414
Johnny Chenebe51722011-10-07 19:21:09 +00001415 # If we spawn an lldb process for test (via pexpect), do not load the
1416 # init file unless told otherwise.
1417 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1418 self.lldbOption = ""
1419 else:
1420 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001421
Johnny Chen985e7402011-08-01 21:13:26 +00001422 # Assign the test method name to self.testMethodName.
1423 #
1424 # For an example of the use of this attribute, look at test/types dir.
1425 # There are a bunch of test cases under test/types and we don't want the
1426 # module cacheing subsystem to be confused with executable name "a.out"
1427 # used for all the test cases.
1428 self.testMethodName = self._testMethodName
1429
Johnny Chen5ccbccf2011-07-30 01:39:58 +00001430 # Benchmarks test is decorated with @benchmarks_test,
1431 # which also sets the "__benchmarks_test__" attribute of the
1432 # function object to True.
1433 try:
1434 if lldb.just_do_benchmarks_test:
1435 testMethod = getattr(self, self._testMethodName)
1436 if getattr(testMethod, "__benchmarks_test__", False):
1437 pass
1438 else:
1439 self.skipTest("non benchmarks test")
Johnny Chen4533dad2011-05-31 23:21:42 +00001440 except AttributeError:
1441 pass
Johnny Chenf3e22ac2010-12-10 18:52:10 +00001442
Johnny Chen985e7402011-08-01 21:13:26 +00001443 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1444 # with it using pexpect.
1445 self.child = None
1446 self.child_prompt = "(lldb) "
1447 # If the child is interacting with the embedded script interpreter,
1448 # there are two exits required during tear down, first to quit the
1449 # embedded script interpreter and second to quit the lldb command
1450 # interpreter.
1451 self.child_in_script_interpreter = False
1452
Johnny Chenfb4264c2011-08-01 19:50:58 +00001453 # These are for customized teardown cleanup.
1454 self.dict = None
1455 self.doTearDownCleanup = False
1456 # And in rare cases where there are multiple teardown cleanups.
1457 self.dicts = []
1458 self.doTearDownCleanups = False
1459
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001460 # List of spawned subproces.Popen objects
1461 self.subprocesses = []
1462
Daniel Malea69207462013-06-05 21:07:02 +00001463 # List of forked process PIDs
1464 self.forkedProcessPids = []
1465
Johnny Chenfb4264c2011-08-01 19:50:58 +00001466 # Create a string buffer to record the session info, to be dumped into a
1467 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001468 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001469
Vince Harron1f160372015-05-21 18:51:20 +00001470 session_file = "{}.log".format(self.log_basename)
Zachary Turner8d13fab2015-11-07 01:08:15 +00001471 # Python 3 doesn't support unbuffered I/O in text mode. Open buffered.
1472 self.session = open(session_file, "w")
Johnny Chenfb4264c2011-08-01 19:50:58 +00001473
1474 # Optimistically set __errored__, __failed__, __expected__ to False
1475 # initially. If the test errored/failed, the session info
1476 # (self.session) is then dumped into a session specific file for
1477 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001478 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001479 self.__errored__ = False
1480 self.__failed__ = False
1481 self.__expected__ = False
1482 # We are also interested in unexpected success.
1483 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001484 # And skipped tests.
1485 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001486
1487 # See addTearDownHook(self, hook) which allows the client to add a hook
1488 # function to be run during tearDown() time.
1489 self.hooks = []
1490
1491 # See HideStdout(self).
1492 self.sys_stdout_hidden = False
1493
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001494 if self.platformContext:
1495 # set environment variable names for finding shared libraries
1496 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001497
Vince Harron6d3d0f12015-05-10 22:01:59 +00001498 # Create the debugger instance if necessary.
1499 try:
1500 self.dbg = lldb.DBG
1501 except AttributeError:
1502 self.dbg = lldb.SBDebugger.Create()
1503
1504 if not self.dbg:
1505 raise Exception('Invalid debugger instance')
1506
1507 # Retrieve the associated command interpreter instance.
1508 self.ci = self.dbg.GetCommandInterpreter()
1509 if not self.ci:
1510 raise Exception('Could not get the command interpreter')
1511
1512 # And the result object.
1513 self.res = lldb.SBCommandReturnObject()
1514
1515 self.enableLogChannelsForCurrentTest()
1516
Ying Chen0c352822015-11-16 23:41:02 +00001517 #Initialize debug_info
1518 self.debug_info = None
1519
Johnny Chen2a808582011-10-19 16:48:07 +00001520 def runHooks(self, child=None, child_prompt=None, use_cmd_api=False):
Johnny Chena737ba52011-10-19 01:06:21 +00001521 """Perform the run hooks to bring lldb debugger to the desired state.
1522
Johnny Chen2a808582011-10-19 16:48:07 +00001523 By default, expect a pexpect spawned child and child prompt to be
1524 supplied (use_cmd_api=False). If use_cmd_api is true, ignore the child
1525 and child prompt and use self.runCmd() to run the hooks one by one.
1526
Johnny Chena737ba52011-10-19 01:06:21 +00001527 Note that child is a process spawned by pexpect.spawn(). If not, your
1528 test case is mostly likely going to fail.
1529
1530 See also dotest.py where lldb.runHooks are processed/populated.
1531 """
1532 if not lldb.runHooks:
1533 self.skipTest("No runhooks specified for lldb, skip the test")
Johnny Chen2a808582011-10-19 16:48:07 +00001534 if use_cmd_api:
1535 for hook in lldb.runhooks:
1536 self.runCmd(hook)
1537 else:
1538 if not child or not child_prompt:
1539 self.fail("Both child and child_prompt need to be defined.")
1540 for hook in lldb.runHooks:
1541 child.sendline(hook)
1542 child.expect_exact(child_prompt)
Johnny Chena737ba52011-10-19 01:06:21 +00001543
Daniel Malea249287a2013-02-19 16:08:57 +00001544 def setAsync(self, value):
1545 """ Sets async mode to True/False and ensures it is reset after the testcase completes."""
1546 old_async = self.dbg.GetAsync()
1547 self.dbg.SetAsync(value)
1548 self.addTearDownHook(lambda: self.dbg.SetAsync(old_async))
1549
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001550 def cleanupSubprocesses(self):
1551 # Ensure any subprocesses are cleaned up
1552 for p in self.subprocesses:
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001553 p.terminate()
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001554 del p
1555 del self.subprocesses[:]
Daniel Malea69207462013-06-05 21:07:02 +00001556 # Ensure any forked processes are cleaned up
1557 for pid in self.forkedProcessPids:
1558 if os.path.exists("/proc/" + str(pid)):
1559 os.kill(pid, signal.SIGTERM)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001560
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001561 def spawnSubprocess(self, executable, args=[], install_remote=True):
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001562 """ Creates a subprocess.Popen object with the specified executable and arguments,
1563 saves it in self.subprocesses, and returns the object.
1564 NOTE: if using this function, ensure you also call:
1565
1566 self.addTearDownHook(self.cleanupSubprocesses)
1567
1568 otherwise the test suite will leak processes.
1569 """
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001570 proc = _RemoteProcess(install_remote) if lldb.remote_platform else _LocalProcess(self.TraceOn())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001571 proc.launch(executable, args)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001572 self.subprocesses.append(proc)
1573 return proc
1574
Daniel Malea69207462013-06-05 21:07:02 +00001575 def forkSubprocess(self, executable, args=[]):
1576 """ Fork a subprocess with its own group ID.
1577 NOTE: if using this function, ensure you also call:
1578
1579 self.addTearDownHook(self.cleanupSubprocesses)
1580
1581 otherwise the test suite will leak processes.
1582 """
1583 child_pid = os.fork()
1584 if child_pid == 0:
1585 # If more I/O support is required, this can be beefed up.
1586 fd = os.open(os.devnull, os.O_RDWR)
Daniel Malea69207462013-06-05 21:07:02 +00001587 os.dup2(fd, 1)
1588 os.dup2(fd, 2)
1589 # This call causes the child to have its of group ID
1590 os.setpgid(0,0)
1591 os.execvp(executable, [executable] + args)
1592 # Give the child time to get through the execvp() call
1593 time.sleep(0.1)
1594 self.forkedProcessPids.append(child_pid)
1595 return child_pid
1596
Johnny Chenfb4264c2011-08-01 19:50:58 +00001597 def HideStdout(self):
1598 """Hide output to stdout from the user.
1599
1600 During test execution, there might be cases where we don't want to show the
1601 standard output to the user. For example,
1602
Zachary Turner35d017f2015-10-23 17:04:29 +00001603 self.runCmd(r'''sc print("\n\n\tHello!\n")''')
Johnny Chenfb4264c2011-08-01 19:50:58 +00001604
1605 tests whether command abbreviation for 'script' works or not. There is no
1606 need to show the 'Hello' output to the user as long as the 'script' command
1607 succeeds and we are not in TraceOn() mode (see the '-t' option).
1608
1609 In this case, the test method calls self.HideStdout(self) to redirect the
1610 sys.stdout to a null device, and restores the sys.stdout upon teardown.
1611
1612 Note that you should only call this method at most once during a test case
1613 execution. Any subsequent call has no effect at all."""
1614 if self.sys_stdout_hidden:
1615 return
1616
1617 self.sys_stdout_hidden = True
1618 old_stdout = sys.stdout
1619 sys.stdout = open(os.devnull, 'w')
1620 def restore_stdout():
1621 sys.stdout = old_stdout
1622 self.addTearDownHook(restore_stdout)
1623
1624 # =======================================================================
1625 # Methods for customized teardown cleanups as well as execution of hooks.
1626 # =======================================================================
1627
1628 def setTearDownCleanup(self, dictionary=None):
1629 """Register a cleanup action at tearDown() time with a dictinary"""
1630 self.dict = dictionary
1631 self.doTearDownCleanup = True
1632
1633 def addTearDownCleanup(self, dictionary):
1634 """Add a cleanup action at tearDown() time with a dictinary"""
1635 self.dicts.append(dictionary)
1636 self.doTearDownCleanups = True
1637
1638 def addTearDownHook(self, hook):
1639 """
1640 Add a function to be run during tearDown() time.
1641
1642 Hooks are executed in a first come first serve manner.
1643 """
Zachary Turnercd236b82015-10-26 18:48:24 +00001644 if six.callable(hook):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001645 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001646 print("Adding tearDown hook:", getsource_if_available(hook), file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001647 self.hooks.append(hook)
Enrico Granataab0e8312014-11-05 21:31:57 +00001648
1649 return self
Johnny Chenfb4264c2011-08-01 19:50:58 +00001650
Jim Inghamda3a3862014-10-16 23:02:14 +00001651 def deletePexpectChild(self):
Johnny Chen985e7402011-08-01 21:13:26 +00001652 # This is for the case of directly spawning 'lldb' and interacting with it
1653 # using pexpect.
Johnny Chen985e7402011-08-01 21:13:26 +00001654 if self.child and self.child.isalive():
Zachary Turner9ef307b2014-07-22 16:19:29 +00001655 import pexpect
Johnny Chen985e7402011-08-01 21:13:26 +00001656 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001657 print("tearing down the child process....", file=sbuf)
Johnny Chen985e7402011-08-01 21:13:26 +00001658 try:
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001659 if self.child_in_script_interpreter:
1660 self.child.sendline('quit()')
1661 self.child.expect_exact(self.child_prompt)
1662 self.child.sendline('settings set interpreter.prompt-on-quit false')
1663 self.child.sendline('quit')
Johnny Chen985e7402011-08-01 21:13:26 +00001664 self.child.expect(pexpect.EOF)
Ilia K47448c22015-02-11 21:41:58 +00001665 except (ValueError, pexpect.ExceptionPexpect):
1666 # child is already terminated
1667 pass
1668 except OSError as exception:
1669 import errno
1670 if exception.errno != errno.EIO:
1671 # unexpected error
1672 raise
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001673 # child is already terminated
Johnny Chen985e7402011-08-01 21:13:26 +00001674 pass
Shawn Besteb3e9052014-11-06 17:52:15 +00001675 finally:
1676 # Give it one final blow to make sure the child is terminated.
1677 self.child.close()
Jim Inghamda3a3862014-10-16 23:02:14 +00001678
1679 def tearDown(self):
1680 """Fixture for unittest test case teardown."""
1681 #import traceback
1682 #traceback.print_stack()
1683
1684 self.deletePexpectChild()
1685
Johnny Chenfb4264c2011-08-01 19:50:58 +00001686 # Check and run any hook functions.
1687 for hook in reversed(self.hooks):
1688 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001689 print("Executing tearDown hook:", getsource_if_available(hook), file=sbuf)
Enrico Granataab0e8312014-11-05 21:31:57 +00001690 import inspect
1691 hook_argc = len(inspect.getargspec(hook).args)
Enrico Granata6e0566c2014-11-17 19:00:20 +00001692 if hook_argc == 0 or getattr(hook,'im_self',None):
Enrico Granataab0e8312014-11-05 21:31:57 +00001693 hook()
1694 elif hook_argc == 1:
1695 hook(self)
1696 else:
1697 hook() # try the plain call and hope it works
Johnny Chenfb4264c2011-08-01 19:50:58 +00001698
1699 del self.hooks
1700
1701 # Perform registered teardown cleanup.
1702 if doCleanup and self.doTearDownCleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00001703 self.cleanup(dictionary=self.dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001704
1705 # In rare cases where there are multiple teardown cleanups added.
1706 if doCleanup and self.doTearDownCleanups:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001707 if self.dicts:
1708 for dict in reversed(self.dicts):
Johnny Chen0fddfb22011-11-17 19:57:27 +00001709 self.cleanup(dictionary=dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001710
Vince Harron9753dd92015-05-10 15:22:09 +00001711 self.disableLogChannelsForCurrentTest()
1712
Johnny Chenfb4264c2011-08-01 19:50:58 +00001713 # =========================================================
1714 # Various callbacks to allow introspection of test progress
1715 # =========================================================
1716
1717 def markError(self):
1718 """Callback invoked when an error (unexpected exception) errored."""
1719 self.__errored__ = True
1720 with recording(self, False) as sbuf:
1721 # False because there's no need to write "ERROR" to the stderr twice.
1722 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001723 print("ERROR", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001724
Zachary Turnerb1490b62015-08-26 19:44:56 +00001725 def markCleanupError(self):
1726 """Callback invoked when an error occurs while a test is cleaning up."""
1727 self.__cleanup_errored__ = True
1728 with recording(self, False) as sbuf:
1729 # False because there's no need to write "CLEANUP_ERROR" to the stderr twice.
1730 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001731 print("CLEANUP_ERROR", file=sbuf)
Zachary Turnerb1490b62015-08-26 19:44:56 +00001732
Johnny Chenfb4264c2011-08-01 19:50:58 +00001733 def markFailure(self):
1734 """Callback invoked when a failure (test assertion failure) occurred."""
1735 self.__failed__ = True
1736 with recording(self, False) as sbuf:
1737 # False because there's no need to write "FAIL" to the stderr twice.
1738 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001739 print("FAIL", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001740
Enrico Granatae6cedc12013-02-23 01:05:23 +00001741 def markExpectedFailure(self,err,bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001742 """Callback invoked when an expected failure/error occurred."""
1743 self.__expected__ = True
1744 with recording(self, False) as sbuf:
1745 # False because there's no need to write "expected failure" to the
1746 # stderr twice.
1747 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001748 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001749 print("expected failure", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001750 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001751 print("expected failure (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001752
Johnny Chenc5cc6252011-08-15 23:09:08 +00001753 def markSkippedTest(self):
1754 """Callback invoked when a test is skipped."""
1755 self.__skipped__ = True
1756 with recording(self, False) as sbuf:
1757 # False because there's no need to write "skipped test" to the
1758 # stderr twice.
1759 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001760 print("skipped test", file=sbuf)
Johnny Chenc5cc6252011-08-15 23:09:08 +00001761
Enrico Granatae6cedc12013-02-23 01:05:23 +00001762 def markUnexpectedSuccess(self, bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001763 """Callback invoked when an unexpected success occurred."""
1764 self.__unexpected__ = True
1765 with recording(self, False) as sbuf:
1766 # False because there's no need to write "unexpected success" to the
1767 # stderr twice.
1768 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001769 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001770 print("unexpected success", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001771 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001772 print("unexpected success (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001773
Greg Clayton70995582015-01-07 22:25:50 +00001774 def getRerunArgs(self):
1775 return " -f %s.%s" % (self.__class__.__name__, self._testMethodName)
Vince Harron9753dd92015-05-10 15:22:09 +00001776
1777 def getLogBasenameForCurrentTest(self, prefix=None):
1778 """
1779 returns a partial path that can be used as the beginning of the name of multiple
1780 log files pertaining to this test
1781
1782 <session-dir>/<arch>-<compiler>-<test-file>.<test-class>.<test-method>
1783 """
1784 dname = os.path.join(os.environ["LLDB_TEST"],
1785 os.environ["LLDB_SESSION_DIRNAME"])
1786 if not os.path.isdir(dname):
1787 os.mkdir(dname)
1788
1789 compiler = self.getCompiler()
1790
1791 if compiler[1] == ':':
1792 compiler = compiler[2:]
Chaoren Lin636a0e32015-07-17 21:40:11 +00001793 if os.path.altsep is not None:
1794 compiler = compiler.replace(os.path.altsep, os.path.sep)
Vince Harron9753dd92015-05-10 15:22:09 +00001795
Vince Harron19e300f2015-05-12 00:50:54 +00001796 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), "_".join(compiler.split(os.path.sep)))
Vince Harron9753dd92015-05-10 15:22:09 +00001797 if len(fname) > 200:
Vince Harron19e300f2015-05-12 00:50:54 +00001798 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), compiler.split(os.path.sep)[-1])
Vince Harron9753dd92015-05-10 15:22:09 +00001799
1800 if prefix is not None:
1801 fname = "{}-{}".format(prefix, fname)
1802
1803 return os.path.join(dname, fname)
1804
Johnny Chenfb4264c2011-08-01 19:50:58 +00001805 def dumpSessionInfo(self):
1806 """
1807 Dump the debugger interactions leading to a test error/failure. This
1808 allows for more convenient postmortem analysis.
1809
1810 See also LLDBTestResult (dotest.py) which is a singlton class derived
1811 from TextTestResult and overwrites addError, addFailure, and
1812 addExpectedFailure methods to allow us to to mark the test instance as
1813 such.
1814 """
1815
1816 # We are here because self.tearDown() detected that this test instance
1817 # either errored or failed. The lldb.test_result singleton contains
1818 # two lists (erros and failures) which get populated by the unittest
1819 # framework. Look over there for stack trace information.
1820 #
1821 # The lists contain 2-tuples of TestCase instances and strings holding
1822 # formatted tracebacks.
1823 #
1824 # See http://docs.python.org/library/unittest.html#unittest.TestResult.
Vince Harron9753dd92015-05-10 15:22:09 +00001825
Vince Harron35b17dc2015-05-21 18:20:21 +00001826 # output tracebacks into session
Vince Harron9753dd92015-05-10 15:22:09 +00001827 pairs = []
Johnny Chenfb4264c2011-08-01 19:50:58 +00001828 if self.__errored__:
1829 pairs = lldb.test_result.errors
1830 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001831 elif self.__cleanup_errored__:
Zachary Turnerb1490b62015-08-26 19:44:56 +00001832 pairs = lldb.test_result.cleanup_errors
1833 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001834 elif self.__failed__:
1835 pairs = lldb.test_result.failures
1836 prefix = 'Failure'
1837 elif self.__expected__:
1838 pairs = lldb.test_result.expectedFailures
1839 prefix = 'ExpectedFailure'
Johnny Chenc5cc6252011-08-15 23:09:08 +00001840 elif self.__skipped__:
1841 prefix = 'SkippedTest'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001842 elif self.__unexpected__:
Vince Harron35b17dc2015-05-21 18:20:21 +00001843 prefix = 'UnexpectedSuccess'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001844 else:
Vince Harron35b17dc2015-05-21 18:20:21 +00001845 prefix = 'Success'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001846
Johnny Chenc5cc6252011-08-15 23:09:08 +00001847 if not self.__unexpected__ and not self.__skipped__:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001848 for test, traceback in pairs:
1849 if test is self:
Zachary Turnerff890da2015-10-19 23:45:41 +00001850 print(traceback, file=self.session)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001851
Vince Harron35b17dc2015-05-21 18:20:21 +00001852 # put footer (timestamp/rerun instructions) into session
Johnny Chen8082a002011-08-11 00:16:28 +00001853 testMethod = getattr(self, self._testMethodName)
1854 if getattr(testMethod, "__benchmarks_test__", False):
1855 benchmarks = True
1856 else:
1857 benchmarks = False
1858
Vince Harron35b17dc2015-05-21 18:20:21 +00001859 import datetime
Zachary Turnerff890da2015-10-19 23:45:41 +00001860 print("Session info generated @", datetime.datetime.now().ctime(), file=self.session)
1861 print("To rerun this test, issue the following command from the 'test' directory:\n", file=self.session)
1862 print("./dotest.py %s -v %s %s" % (self.getRunOptions(),
Vince Harron35b17dc2015-05-21 18:20:21 +00001863 ('+b' if benchmarks else '-t'),
Zachary Turnerff890da2015-10-19 23:45:41 +00001864 self.getRerunArgs()), file=self.session)
Vince Harron35b17dc2015-05-21 18:20:21 +00001865 self.session.close()
1866 del self.session
1867
1868 # process the log files
Vince Harron1f160372015-05-21 18:51:20 +00001869 log_files_for_this_test = glob.glob(self.log_basename + "*")
Vince Harron35b17dc2015-05-21 18:20:21 +00001870
1871 if prefix != 'Success' or lldbtest_config.log_success:
1872 # keep all log files, rename them to include prefix
1873 dst_log_basename = self.getLogBasenameForCurrentTest(prefix)
1874 for src in log_files_for_this_test:
Zachary Turner306278f2015-05-26 20:26:29 +00001875 if os.path.isfile(src):
1876 dst = src.replace(self.log_basename, dst_log_basename)
1877 if os.name == "nt" and os.path.isfile(dst):
1878 # On Windows, renaming a -> b will throw an exception if b exists. On non-Windows platforms
1879 # it silently replaces the destination. Ultimately this means that atomic renames are not
1880 # guaranteed to be possible on Windows, but we need this to work anyway, so just remove the
1881 # destination first if it already exists.
1882 os.remove(dst)
Zachary Turner5de068b2015-05-26 19:52:24 +00001883
Zachary Turner306278f2015-05-26 20:26:29 +00001884 os.rename(src, dst)
Vince Harron35b17dc2015-05-21 18:20:21 +00001885 else:
1886 # success! (and we don't want log files) delete log files
1887 for log_file in log_files_for_this_test:
Adrian McCarthya7292042015-09-04 20:48:48 +00001888 try:
1889 os.unlink(log_file)
1890 except:
1891 # We've seen consistent unlink failures on Windows, perhaps because the
1892 # just-created log file is being scanned by anti-virus. Empirically, this
1893 # sleep-and-retry approach allows tests to succeed much more reliably.
1894 # Attempts to figure out exactly what process was still holding a file handle
1895 # have failed because running instrumentation like Process Monitor seems to
1896 # slow things down enough that the problem becomes much less consistent.
1897 time.sleep(0.5)
1898 os.unlink(log_file)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001899
1900 # ====================================================
1901 # Config. methods supported through a plugin interface
1902 # (enables reading of the current test configuration)
1903 # ====================================================
1904
1905 def getArchitecture(self):
1906 """Returns the architecture in effect the test suite is running with."""
1907 module = builder_module()
Ed Maste0f434e62015-04-06 15:50:48 +00001908 arch = module.getArchitecture()
1909 if arch == 'amd64':
1910 arch = 'x86_64'
1911 return arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001912
Vince Harron02613762015-05-04 00:17:53 +00001913 def getLldbArchitecture(self):
1914 """Returns the architecture of the lldb binary."""
1915 if not hasattr(self, 'lldbArchitecture'):
1916
1917 # spawn local process
1918 command = [
Vince Harron790d95c2015-05-18 19:39:03 +00001919 lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001920 "-o",
Vince Harron790d95c2015-05-18 19:39:03 +00001921 "file " + lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001922 "-o",
1923 "quit"
1924 ]
1925
1926 output = check_output(command)
1927 str = output.decode("utf-8");
1928
1929 for line in str.splitlines():
1930 m = re.search("Current executable set to '.*' \\((.*)\\)\\.", line)
1931 if m:
1932 self.lldbArchitecture = m.group(1)
1933 break
1934
1935 return self.lldbArchitecture
1936
Johnny Chenfb4264c2011-08-01 19:50:58 +00001937 def getCompiler(self):
1938 """Returns the compiler in effect the test suite is running with."""
1939 module = builder_module()
1940 return module.getCompiler()
1941
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001942 def getCompilerBinary(self):
1943 """Returns the compiler binary the test suite is running with."""
1944 return self.getCompiler().split()[0]
1945
Daniel Malea0aea0162013-02-27 17:29:46 +00001946 def getCompilerVersion(self):
1947 """ Returns a string that represents the compiler version.
1948 Supports: llvm, clang.
1949 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00001950 from .lldbutil import which
Daniel Malea0aea0162013-02-27 17:29:46 +00001951 version = 'unknown'
1952
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001953 compiler = self.getCompilerBinary()
Zachary Turner9ef307b2014-07-22 16:19:29 +00001954 version_output = system([[which(compiler), "-v"]])[1]
Daniel Malea0aea0162013-02-27 17:29:46 +00001955 for line in version_output.split(os.linesep):
Greg Clayton2a844b72013-03-06 02:34:51 +00001956 m = re.search('version ([0-9\.]+)', line)
Daniel Malea0aea0162013-02-27 17:29:46 +00001957 if m:
1958 version = m.group(1)
1959 return version
1960
Ryan Brown57bee1e2015-09-14 22:45:11 +00001961 def getGoCompilerVersion(self):
1962 """ Returns a string that represents the go compiler version, or None if go is not found.
1963 """
1964 compiler = which("go")
1965 if compiler:
1966 version_output = system([[compiler, "version"]])[0]
1967 for line in version_output.split(os.linesep):
1968 m = re.search('go version (devel|go\\S+)', line)
1969 if m:
1970 return m.group(1)
1971 return None
1972
Greg Claytone0d0a762015-04-02 18:24:03 +00001973 def platformIsDarwin(self):
1974 """Returns true if the OS triple for the selected platform is any valid apple OS"""
Robert Flackfb2f6c62015-04-17 08:02:18 +00001975 return platformIsDarwin()
Vince Harron20952cc2015-04-03 01:00:06 +00001976
Robert Flack13c7ad92015-03-30 14:12:17 +00001977 def getPlatform(self):
Robert Flackfb2f6c62015-04-17 08:02:18 +00001978 """Returns the target platform the test suite is running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001979 return getPlatform()
Robert Flack13c7ad92015-03-30 14:12:17 +00001980
Daniel Maleaadaaec92013-08-06 20:51:41 +00001981 def isIntelCompiler(self):
1982 """ Returns true if using an Intel (ICC) compiler, false otherwise. """
1983 return any([x in self.getCompiler() for x in ["icc", "icpc", "icl"]])
1984
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001985 def expectedCompilerVersion(self, compiler_version):
1986 """Returns True iff compiler_version[1] matches the current compiler version.
1987 Use compiler_version[0] to specify the operator used to determine if a match has occurred.
1988 Any operator other than the following defaults to an equality test:
1989 '>', '>=', "=>", '<', '<=', '=<', '!=', "!" or 'not'
1990 """
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001991 if (compiler_version == None):
1992 return True
1993 operator = str(compiler_version[0])
1994 version = compiler_version[1]
1995
1996 if (version == None):
1997 return True
1998 if (operator == '>'):
1999 return self.getCompilerVersion() > version
2000 if (operator == '>=' or operator == '=>'):
2001 return self.getCompilerVersion() >= version
2002 if (operator == '<'):
2003 return self.getCompilerVersion() < version
2004 if (operator == '<=' or operator == '=<'):
2005 return self.getCompilerVersion() <= version
2006 if (operator == '!=' or operator == '!' or operator == 'not'):
2007 return str(version) not in str(self.getCompilerVersion())
2008 return str(version) in str(self.getCompilerVersion())
2009
2010 def expectedCompiler(self, compilers):
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00002011 """Returns True iff any element of compilers is a sub-string of the current compiler."""
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00002012 if (compilers == None):
2013 return True
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00002014
2015 for compiler in compilers:
2016 if compiler in self.getCompiler():
2017 return True
2018
2019 return False
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00002020
Ying Chen7091c2c2015-04-21 01:15:47 +00002021 def expectedArch(self, archs):
2022 """Returns True iff any element of archs is a sub-string of the current architecture."""
2023 if (archs == None):
2024 return True
2025
2026 for arch in archs:
2027 if arch in self.getArchitecture():
2028 return True
2029
2030 return False
2031
Johnny Chenfb4264c2011-08-01 19:50:58 +00002032 def getRunOptions(self):
2033 """Command line option for -A and -C to run this test again, called from
2034 self.dumpSessionInfo()."""
2035 arch = self.getArchitecture()
2036 comp = self.getCompiler()
Johnny Chenb7bdd102011-08-24 19:48:51 +00002037 if arch:
2038 option_str = "-A " + arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00002039 else:
Johnny Chenb7bdd102011-08-24 19:48:51 +00002040 option_str = ""
2041 if comp:
Johnny Chen531c0852012-03-16 20:44:00 +00002042 option_str += " -C " + comp
Johnny Chenb7bdd102011-08-24 19:48:51 +00002043 return option_str
Johnny Chenfb4264c2011-08-01 19:50:58 +00002044
2045 # ==================================================
2046 # Build methods supported through a plugin interface
2047 # ==================================================
2048
Ed Mastec97323e2014-04-01 18:47:58 +00002049 def getstdlibFlag(self):
2050 """ Returns the proper -stdlib flag, or empty if not required."""
Robert Flack4629c4b2015-05-15 18:54:32 +00002051 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Ed Mastec97323e2014-04-01 18:47:58 +00002052 stdlibflag = "-stdlib=libc++"
2053 else:
2054 stdlibflag = ""
2055 return stdlibflag
2056
Matt Kopec7663b3a2013-09-25 17:44:00 +00002057 def getstdFlag(self):
2058 """ Returns the proper stdflag. """
Daniel Malea55faa402013-05-02 21:44:31 +00002059 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
Daniel Malea0b7c6112013-05-06 19:31:31 +00002060 stdflag = "-std=c++0x"
Daniel Malea55faa402013-05-02 21:44:31 +00002061 else:
2062 stdflag = "-std=c++11"
Matt Kopec7663b3a2013-09-25 17:44:00 +00002063 return stdflag
2064
2065 def buildDriver(self, sources, exe_name):
2066 """ Platform-specific way to build a program that links with LLDB (via the liblldb.so
2067 or LLDB.framework).
2068 """
2069
2070 stdflag = self.getstdFlag()
Ed Mastec97323e2014-04-01 18:47:58 +00002071 stdlibflag = self.getstdlibFlag()
Greg Clayton22fd3b12015-10-26 17:52:16 +00002072
2073 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002074 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002075 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Daniel Malea55faa402013-05-02 21:44:31 +00002076 d = {'CXX_SOURCES' : sources,
2077 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002078 'CFLAGS_EXTRAS' : "%s %s" % (stdflag, stdlibflag),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002079 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2080 'LD_EXTRAS' : "%s -Wl,-rpath,%s" % (dsym, lib_dir),
Daniel Malea55faa402013-05-02 21:44:31 +00002081 }
Ed Maste372c24d2013-07-25 21:02:34 +00002082 elif sys.platform.startswith('freebsd') or sys.platform.startswith("linux") or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002083 d = {'CXX_SOURCES' : sources,
Daniel Malea55faa402013-05-02 21:44:31 +00002084 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002085 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002086 'LD_EXTRAS' : "-L%s -llldb" % lib_dir}
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002087 elif sys.platform.startswith('win'):
2088 d = {'CXX_SOURCES' : sources,
2089 'EXE' : exe_name,
2090 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002091 'LD_EXTRAS' : "-L%s -lliblldb" % os.environ["LLDB_IMPLIB_DIR"]}
Daniel Malea55faa402013-05-02 21:44:31 +00002092 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002093 print("Building LLDB Driver (%s) from sources %s" % (exe_name, sources))
Daniel Malea55faa402013-05-02 21:44:31 +00002094
2095 self.buildDefault(dictionary=d)
2096
Matt Kopec7663b3a2013-09-25 17:44:00 +00002097 def buildLibrary(self, sources, lib_name):
2098 """Platform specific way to build a default library. """
2099
2100 stdflag = self.getstdFlag()
2101
Greg Clayton22fd3b12015-10-26 17:52:16 +00002102 lib_dir = os.environ["LLDB_LIB_DIR"]
Robert Flack4629c4b2015-05-15 18:54:32 +00002103 if self.platformIsDarwin():
Greg Clayton22fd3b12015-10-26 17:52:16 +00002104 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Matt Kopec7663b3a2013-09-25 17:44:00 +00002105 d = {'DYLIB_CXX_SOURCES' : sources,
2106 'DYLIB_NAME' : lib_name,
2107 'CFLAGS_EXTRAS' : "%s -stdlib=libc++" % stdflag,
Greg Clayton22fd3b12015-10-26 17:52:16 +00002108 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2109 'LD_EXTRAS' : "%s -Wl,-rpath,%s -dynamiclib" % (dsym, lib_dir),
Matt Kopec7663b3a2013-09-25 17:44:00 +00002110 }
Robert Flack4629c4b2015-05-15 18:54:32 +00002111 elif self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux' or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Matt Kopec7663b3a2013-09-25 17:44:00 +00002112 d = {'DYLIB_CXX_SOURCES' : sources,
2113 'DYLIB_NAME' : lib_name,
2114 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002115 'LD_EXTRAS' : "-shared -L%s -llldb" % lib_dir}
Robert Flack4629c4b2015-05-15 18:54:32 +00002116 elif self.getPlatform() == 'windows':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002117 d = {'DYLIB_CXX_SOURCES' : sources,
2118 'DYLIB_NAME' : lib_name,
2119 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002120 'LD_EXTRAS' : "-shared -l%s\liblldb.lib" % self.os.environ["LLDB_IMPLIB_DIR"]}
Matt Kopec7663b3a2013-09-25 17:44:00 +00002121 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002122 print("Building LLDB Library (%s) from sources %s" % (lib_name, sources))
Matt Kopec7663b3a2013-09-25 17:44:00 +00002123
2124 self.buildDefault(dictionary=d)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002125
Daniel Malea55faa402013-05-02 21:44:31 +00002126 def buildProgram(self, sources, exe_name):
2127 """ Platform specific way to build an executable from C/C++ sources. """
2128 d = {'CXX_SOURCES' : sources,
2129 'EXE' : exe_name}
2130 self.buildDefault(dictionary=d)
2131
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002132 def buildDefault(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002133 """Platform specific way to build the default binaries."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002134 if lldb.skip_build_and_cleanup:
2135 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002136 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."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002144 if lldb.skip_build_and_cleanup:
2145 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002146 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002147 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002148 raise Exception("Don't know how to build binary with dsym")
2149
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002150 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002151 """Platform specific way to build binaries with dwarf maps."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002152 if lldb.skip_build_and_cleanup:
2153 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002154 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002155 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002156 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002157 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002158 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002159
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002160 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2161 """Platform specific way to build binaries with dwarf maps."""
2162 if lldb.skip_build_and_cleanup:
2163 return
2164 module = builder_module()
2165 if target_is_android():
2166 dictionary = append_android_envs(dictionary)
2167 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2168 raise Exception("Don't know how to build binary with dwo")
2169
Ryan Brown57bee1e2015-09-14 22:45:11 +00002170 def buildGo(self):
2171 """Build the default go binary.
2172 """
2173 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2174
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002175 def signBinary(self, binary_path):
2176 if sys.platform.startswith("darwin"):
2177 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2178 call(codesign_cmd, shell=True)
2179
Kuba Breckabeed8212014-09-04 01:03:18 +00002180 def findBuiltClang(self):
2181 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2182 paths_to_try = [
2183 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2184 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2185 "llvm-build/Release/x86_64/Release/bin/clang",
2186 "llvm-build/Debug/x86_64/Debug/bin/clang",
2187 ]
2188 lldb_root_path = os.path.join(os.path.dirname(__file__), "..")
2189 for p in paths_to_try:
2190 path = os.path.join(lldb_root_path, p)
2191 if os.path.exists(path):
2192 return path
Ilia Kd9953052015-03-12 07:19:41 +00002193
2194 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002195 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002196 if os.path.exists(path):
2197 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002198
2199 return os.environ["CC"]
2200
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002201 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002202 """ Returns a dictionary (which can be provided to build* functions above) which
2203 contains OS-specific build flags.
2204 """
2205 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002206 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002207
2208 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002209 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002210 use_libcxx = True
2211
2212 if use_libcxx and self.libcxxPath:
2213 cflags += "-stdlib=libc++ "
2214 if self.libcxxPath:
2215 libcxxInclude = os.path.join(self.libcxxPath, "include")
2216 libcxxLib = os.path.join(self.libcxxPath, "lib")
2217 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2218 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2219
Andrew Kaylor93132f52013-05-28 23:04:25 +00002220 if use_cpp11:
2221 cflags += "-std="
2222 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2223 cflags += "c++0x"
2224 else:
2225 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002226 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002227 cflags += " -stdlib=libc++"
2228 elif "clang" in self.getCompiler():
2229 cflags += " -stdlib=libstdc++"
2230
Andrew Kaylor93132f52013-05-28 23:04:25 +00002231 return {'CFLAGS_EXTRAS' : cflags,
2232 'LD_EXTRAS' : ldflags,
2233 }
2234
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002235 def cleanup(self, dictionary=None):
2236 """Platform specific way to do cleanup after build."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002237 if lldb.skip_build_and_cleanup:
2238 return
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002239 module = builder_module()
2240 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002241 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002242
Daniel Malea55faa402013-05-02 21:44:31 +00002243 def getLLDBLibraryEnvVal(self):
2244 """ Returns the path that the OS-specific library search environment variable
2245 (self.dylibPath) should be set to in order for a program to find the LLDB
2246 library. If an environment variable named self.dylibPath is already set,
2247 the new path is appended to it and returned.
2248 """
2249 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002250 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002251 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002252 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002253 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002254 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002255 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002256 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002257
Ed Maste437f8f62013-09-09 14:04:04 +00002258 def getLibcPlusPlusLibs(self):
Robert Flackfa5ad652015-05-13 20:17:34 +00002259 if self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux':
Ed Maste437f8f62013-09-09 14:04:04 +00002260 return ['libc++.so.1']
2261 else:
2262 return ['libc++.1.dylib','libc++abi.dylib']
2263
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002264# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2265# We change the test methods to create a new test method for each test for each debug info we are
2266# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2267# the new test method we remove the old method at the same time.
2268class LLDBTestCaseFactory(type):
2269 def __new__(cls, name, bases, attrs):
2270 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002271 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002272 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
2273 @dsym_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002274 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002275 def dsym_test_method(self, attrvalue=attrvalue):
2276 self.debug_info = "dsym"
2277 return attrvalue(self)
2278 dsym_method_name = attrname + "_dsym"
2279 dsym_test_method.__name__ = dsym_method_name
2280 newattrs[dsym_method_name] = dsym_test_method
2281
2282 @dwarf_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002283 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002284 def dwarf_test_method(self, attrvalue=attrvalue):
2285 self.debug_info = "dwarf"
2286 return attrvalue(self)
2287 dwarf_method_name = attrname + "_dwarf"
2288 dwarf_test_method.__name__ = dwarf_method_name
2289 newattrs[dwarf_method_name] = dwarf_test_method
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002290
2291 @dwo_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002292 @wraps(attrvalue)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002293 def dwo_test_method(self, attrvalue=attrvalue):
2294 self.debug_info = "dwo"
2295 return attrvalue(self)
2296 dwo_method_name = attrname + "_dwo"
2297 dwo_test_method.__name__ = dwo_method_name
2298 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002299 else:
2300 newattrs[attrname] = attrvalue
2301 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2302
Zachary Turner43a01e42015-10-20 21:06:05 +00002303# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2304@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002305class TestBase(Base):
2306 """
2307 This abstract base class is meant to be subclassed. It provides default
2308 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2309 among other things.
2310
2311 Important things for test class writers:
2312
2313 - Overwrite the mydir class attribute, otherwise your test class won't
2314 run. It specifies the relative directory to the top level 'test' so
2315 the test harness can change to the correct working directory before
2316 running your test.
2317
2318 - The setUp method sets up things to facilitate subsequent interactions
2319 with the debugger as part of the test. These include:
2320 - populate the test method name
2321 - create/get a debugger set with synchronous mode (self.dbg)
2322 - get the command interpreter from with the debugger (self.ci)
2323 - create a result object for use with the command interpreter
2324 (self.res)
2325 - plus other stuffs
2326
2327 - The tearDown method tries to perform some necessary cleanup on behalf
2328 of the test to return the debugger to a good state for the next test.
2329 These include:
2330 - execute any tearDown hooks registered by the test method with
2331 TestBase.addTearDownHook(); examples can be found in
2332 settings/TestSettings.py
2333 - kill the inferior process associated with each target, if any,
2334 and, then delete the target from the debugger's target list
2335 - perform build cleanup before running the next test method in the
2336 same test class; examples of registering for this service can be
2337 found in types/TestIntegerTypes.py with the call:
2338 - self.setTearDownCleanup(dictionary=d)
2339
2340 - Similarly setUpClass and tearDownClass perform classwise setup and
2341 teardown fixtures. The tearDownClass method invokes a default build
2342 cleanup for the entire test class; also, subclasses can implement the
2343 classmethod classCleanup(cls) to perform special class cleanup action.
2344
2345 - The instance methods runCmd and expect are used heavily by existing
2346 test cases to send a command to the command interpreter and to perform
2347 string/pattern matching on the output of such command execution. The
2348 expect method also provides a mode to peform string/pattern matching
2349 without running a command.
2350
2351 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2352 build the binaries used during a particular test scenario. A plugin
2353 should be provided for the sys.platform running the test suite. The
2354 Mac OS X implementation is located in plugins/darwin.py.
2355 """
2356
2357 # Maximum allowed attempts when launching the inferior process.
2358 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2359 maxLaunchCount = 3;
2360
2361 # Time to wait before the next launching attempt in second(s).
2362 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2363 timeWaitNextLaunch = 1.0;
2364
2365 def doDelay(self):
2366 """See option -w of dotest.py."""
2367 if ("LLDB_WAIT_BETWEEN_TEST_CASES" in os.environ and
2368 os.environ["LLDB_WAIT_BETWEEN_TEST_CASES"] == 'YES'):
2369 waitTime = 1.0
2370 if "LLDB_TIME_WAIT_BETWEEN_TEST_CASES" in os.environ:
2371 waitTime = float(os.environ["LLDB_TIME_WAIT_BETWEEN_TEST_CASES"])
2372 time.sleep(waitTime)
2373
Enrico Granata165f8af2012-09-21 19:10:53 +00002374 # Returns the list of categories to which this test case belongs
2375 # by default, look for a ".categories" file, and read its contents
2376 # if no such file exists, traverse the hierarchy - we guarantee
2377 # a .categories to exist at the top level directory so we do not end up
2378 # looping endlessly - subclasses are free to define their own categories
2379 # in whatever way makes sense to them
2380 def getCategories(self):
2381 import inspect
2382 import os.path
2383 folder = inspect.getfile(self.__class__)
2384 folder = os.path.dirname(folder)
2385 while folder != '/':
2386 categories_file_name = os.path.join(folder,".categories")
2387 if os.path.exists(categories_file_name):
2388 categories_file = open(categories_file_name,'r')
2389 categories = categories_file.readline()
2390 categories_file.close()
2391 categories = str.replace(categories,'\n','')
2392 categories = str.replace(categories,'\r','')
2393 return categories.split(',')
2394 else:
2395 folder = os.path.dirname(folder)
2396 continue
2397
Johnny Chena74bb0a2011-08-01 18:46:13 +00002398 def setUp(self):
2399 #import traceback
2400 #traceback.print_stack()
2401
2402 # Works with the test driver to conditionally skip tests via decorators.
2403 Base.setUp(self)
2404
Johnny Chena74bb0a2011-08-01 18:46:13 +00002405 try:
2406 if lldb.blacklist:
2407 className = self.__class__.__name__
2408 classAndMethodName = "%s.%s" % (className, self._testMethodName)
2409 if className in lldb.blacklist:
2410 self.skipTest(lldb.blacklist.get(className))
2411 elif classAndMethodName in lldb.blacklist:
2412 self.skipTest(lldb.blacklist.get(classAndMethodName))
2413 except AttributeError:
2414 pass
2415
Johnny Chened492022011-06-21 00:53:00 +00002416 # Insert some delay between successive test cases if specified.
2417 self.doDelay()
Johnny Chen0ed37c92010-10-07 02:04:14 +00002418
Johnny Chenf2b70232010-08-25 18:49:48 +00002419 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2420 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2421
Johnny Chen430eb762010-10-19 16:00:42 +00002422 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002423 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002424
Daniel Maleae0f8f572013-08-26 23:57:52 +00002425 #
2426 # Warning: MAJOR HACK AHEAD!
2427 # If we are running testsuite remotely (by checking lldb.lldbtest_remote_sandbox),
2428 # redefine the self.dbg.CreateTarget(filename) method to execute a "file filename"
2429 # command, instead. See also runCmd() where it decorates the "file filename" call
2430 # with additional functionality when running testsuite remotely.
2431 #
2432 if lldb.lldbtest_remote_sandbox:
2433 def DecoratedCreateTarget(arg):
2434 self.runCmd("file %s" % arg)
2435 target = self.dbg.GetSelectedTarget()
2436 #
Greg Claytonc6947512013-12-13 19:18:59 +00002437 # SBtarget.LaunchSimple () currently not working for remote platform?
Daniel Maleae0f8f572013-08-26 23:57:52 +00002438 # johnny @ 04/23/2012
2439 #
2440 def DecoratedLaunchSimple(argv, envp, wd):
2441 self.runCmd("run")
2442 return target.GetProcess()
2443 target.LaunchSimple = DecoratedLaunchSimple
2444
2445 return target
2446 self.dbg.CreateTarget = DecoratedCreateTarget
2447 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002448 print("self.dbg.Create is redefined to:\n%s" % getsource_if_available(DecoratedCreateTarget))
Daniel Maleae0f8f572013-08-26 23:57:52 +00002449
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002450 # We want our debugger to be synchronous.
2451 self.dbg.SetAsync(False)
2452
2453 # Retrieve the associated command interpreter instance.
2454 self.ci = self.dbg.GetCommandInterpreter()
2455 if not self.ci:
2456 raise Exception('Could not get the command interpreter')
2457
2458 # And the result object.
2459 self.res = lldb.SBCommandReturnObject()
2460
Johnny Chen44d24972012-04-16 18:55:15 +00002461 # Run global pre-flight code, if defined via the config file.
2462 if lldb.pre_flight:
2463 lldb.pre_flight(self)
2464
Enrico Granatabd0998a2015-10-02 22:53:32 +00002465 if lldb.remote_platform and lldb.remote_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002466 remote_test_dir = lldbutil.join_remote_paths(
2467 lldb.remote_platform_working_dir,
2468 self.getArchitecture(),
2469 str(self.test_number),
2470 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002471 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002472 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002473 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002474
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002475 # This function removes all files from the current working directory while leaving
2476 # the directories in place. The cleaup is required to reduce the disk space required
2477 # by the test suit while leaving the directories untached is neccessary because
2478 # sub-directories might belong to an other test
2479 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002480 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002481 # TODO: Replace the heuristic to remove the files with a logic what collects the
2482 # list of files we have to remove during test runs.
2483 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002484 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002485 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002486 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002487 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002488
Greg Clayton35c91342014-11-17 18:40:27 +00002489 def registerSharedLibrariesWithTarget(self, target, shlibs):
2490 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2491
2492 Any modules in the target that have their remote install file specification set will
2493 get uploaded to the remote host. This function registers the local copies of the
2494 shared libraries with the target and sets their remote install locations so they will
2495 be uploaded when the target is run.
2496 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002497 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002498 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002499
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002500 shlib_environment_var = self.platformContext.shlib_environment_var
2501 shlib_prefix = self.platformContext.shlib_prefix
2502 shlib_extension = '.' + self.platformContext.shlib_extension
2503
2504 working_dir = self.get_process_working_directory()
2505 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2506 # Add any shared libraries to our target if remote so they get
2507 # uploaded into the working directory on the remote side
2508 for name in shlibs:
2509 # The path can be a full path to a shared library, or a make file name like "Foo" for
2510 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2511 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2512 # of the shared library accordingly
2513 if os.path.exists(name):
2514 local_shlib_path = name # name is the full path to the local shared library
2515 else:
2516 # Check relative names
2517 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2518 if not os.path.exists(local_shlib_path):
2519 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002520 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002521 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002522
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002523 # Make sure we found the local shared library in the above code
2524 self.assertTrue(os.path.exists(local_shlib_path))
2525
2526 # Add the shared library to our target
2527 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2528 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002529 # We must set the remote install location if we want the shared library
2530 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002531 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002532 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002533
2534 return environment
2535
Enrico Granata44818162012-10-24 01:23:57 +00002536 # utility methods that tests can use to access the current objects
2537 def target(self):
2538 if not self.dbg:
2539 raise Exception('Invalid debugger instance')
2540 return self.dbg.GetSelectedTarget()
2541
2542 def process(self):
2543 if not self.dbg:
2544 raise Exception('Invalid debugger instance')
2545 return self.dbg.GetSelectedTarget().GetProcess()
2546
2547 def thread(self):
2548 if not self.dbg:
2549 raise Exception('Invalid debugger instance')
2550 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2551
2552 def frame(self):
2553 if not self.dbg:
2554 raise Exception('Invalid debugger instance')
2555 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2556
Greg Claytonc6947512013-12-13 19:18:59 +00002557 def get_process_working_directory(self):
2558 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2559 if lldb.remote_platform:
2560 # Remote tests set the platform working directory up in TestBase.setUp()
2561 return lldb.remote_platform.GetWorkingDirectory()
2562 else:
2563 # local tests change directory into each test subdirectory
2564 return os.getcwd()
2565
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002566 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002567 #import traceback
2568 #traceback.print_stack()
2569
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002570 # Ensure all the references to SB objects have gone away so that we can
2571 # be sure that all test-specific resources have been freed before we
2572 # attempt to delete the targets.
2573 gc.collect()
2574
Johnny Chen3794ad92011-06-15 21:24:24 +00002575 # Delete the target(s) from the debugger as a general cleanup step.
2576 # This includes terminating the process for each target, if any.
2577 # We'd like to reuse the debugger for our next test without incurring
2578 # the initialization overhead.
2579 targets = []
2580 for target in self.dbg:
2581 if target:
2582 targets.append(target)
2583 process = target.GetProcess()
2584 if process:
2585 rc = self.invoke(process, "Kill")
2586 self.assertTrue(rc.Success(), PROCESS_KILLED)
2587 for target in targets:
2588 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002589
Johnny Chen44d24972012-04-16 18:55:15 +00002590 # Run global post-flight code, if defined via the config file.
2591 if lldb.post_flight:
2592 lldb.post_flight(self)
2593
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002594 # Do this last, to make sure it's in reverse order from how we setup.
2595 Base.tearDown(self)
2596
Zachary Turner95812042015-03-26 18:54:21 +00002597 # This must be the last statement, otherwise teardown hooks or other
2598 # lines might depend on this still being active.
2599 del self.dbg
2600
Johnny Chen86268e42011-09-30 21:48:35 +00002601 def switch_to_thread_with_stop_reason(self, stop_reason):
2602 """
2603 Run the 'thread list' command, and select the thread with stop reason as
2604 'stop_reason'. If no such thread exists, no select action is done.
2605 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002606 from .lldbutil import stop_reason_to_str
Johnny Chen86268e42011-09-30 21:48:35 +00002607 self.runCmd('thread list')
2608 output = self.res.GetOutput()
2609 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2610 stop_reason_to_str(stop_reason))
2611 for line in output.splitlines():
2612 matched = thread_line_pattern.match(line)
2613 if matched:
2614 self.runCmd('thread select %s' % matched.group(1))
2615
Enrico Granata7594f142013-06-17 22:51:50 +00002616 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002617 """
2618 Ask the command interpreter to handle the command and then check its
2619 return status.
2620 """
2621 # Fail fast if 'cmd' is not meaningful.
2622 if not cmd or len(cmd) == 0:
2623 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002624
Johnny Chen8d55a342010-08-31 17:42:54 +00002625 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002626
Daniel Maleae0f8f572013-08-26 23:57:52 +00002627 # This is an opportunity to insert the 'platform target-install' command if we are told so
2628 # via the settig of lldb.lldbtest_remote_sandbox.
2629 if cmd.startswith("target create "):
2630 cmd = cmd.replace("target create ", "file ")
2631 if cmd.startswith("file ") and lldb.lldbtest_remote_sandbox:
2632 with recording(self, trace) as sbuf:
2633 the_rest = cmd.split("file ")[1]
2634 # Split the rest of the command line.
2635 atoms = the_rest.split()
2636 #
2637 # NOTE: This assumes that the options, if any, follow the file command,
2638 # instead of follow the specified target.
2639 #
2640 target = atoms[-1]
2641 # Now let's get the absolute pathname of our target.
2642 abs_target = os.path.abspath(target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002643 print("Found a file command, target (with absolute pathname)=%s" % abs_target, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002644 fpath, fname = os.path.split(abs_target)
2645 parent_dir = os.path.split(fpath)[0]
2646 platform_target_install_command = 'platform target-install %s %s' % (fpath, lldb.lldbtest_remote_sandbox)
Zachary Turnerff890da2015-10-19 23:45:41 +00002647 print("Insert this command to be run first: %s" % platform_target_install_command, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002648 self.ci.HandleCommand(platform_target_install_command, self.res)
2649 # And this is the file command we want to execute, instead.
2650 #
2651 # Warning: SIDE EFFECT AHEAD!!!
2652 # Populate the remote executable pathname into the lldb namespace,
2653 # so that test cases can grab this thing out of the namespace.
2654 #
2655 lldb.lldbtest_remote_sandboxed_executable = abs_target.replace(parent_dir, lldb.lldbtest_remote_sandbox)
2656 cmd = "file -P %s %s %s" % (lldb.lldbtest_remote_sandboxed_executable, the_rest.replace(target, ''), abs_target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002657 print("And this is the replaced file command: %s" % cmd, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002658
Johnny Chen63dfb272010-09-01 00:15:19 +00002659 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002660
Johnny Chen63dfb272010-09-01 00:15:19 +00002661 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002662 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002663
Johnny Chen150c3cc2010-10-15 01:18:29 +00002664 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002665 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002666 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002667 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002668 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002669 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002670 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002671 print("runCmd failed!", file=sbuf)
2672 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002673
Johnny Chenff3d01d2010-08-20 21:03:09 +00002674 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002675 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002676 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002677 # For process launch, wait some time before possible next try.
2678 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002679 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002680 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002681
Johnny Chen27f212d2010-08-19 23:26:59 +00002682 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002683 self.assertTrue(self.res.Succeeded(),
2684 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002685
Jim Ingham63dfc722012-09-22 00:05:11 +00002686 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2687 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2688
2689 Otherwise, all the arguments have the same meanings as for the expect function"""
2690
2691 trace = (True if traceAlways else trace)
2692
2693 if exe:
2694 # First run the command. If we are expecting error, set check=False.
2695 # Pass the assert message along since it provides more semantic info.
2696 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2697
2698 # Then compare the output against expected strings.
2699 output = self.res.GetError() if error else self.res.GetOutput()
2700
2701 # If error is True, the API client expects the command to fail!
2702 if error:
2703 self.assertFalse(self.res.Succeeded(),
2704 "Command '" + str + "' is expected to fail!")
2705 else:
2706 # No execution required, just compare str against the golden input.
2707 output = str
2708 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002709 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002710
2711 # The heading says either "Expecting" or "Not expecting".
2712 heading = "Expecting" if matching else "Not expecting"
2713
2714 for pattern in patterns:
2715 # Match Objects always have a boolean value of True.
2716 match_object = re.search(pattern, output)
2717 matched = bool(match_object)
2718 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002719 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2720 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002721 if matched:
2722 break
2723
2724 self.assertTrue(matched if matching else not matched,
2725 msg if msg else EXP_MSG(str, exe))
2726
2727 return match_object
2728
Enrico Granata7594f142013-06-17 22:51:50 +00002729 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 +00002730 """
2731 Similar to runCmd; with additional expect style output matching ability.
2732
2733 Ask the command interpreter to handle the command and then check its
2734 return status. The 'msg' parameter specifies an informational assert
2735 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002736 'startstr', matches the substrings contained in 'substrs', and regexp
2737 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002738
2739 If the keyword argument error is set to True, it signifies that the API
2740 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002741 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002742 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002743
2744 If the keyword argument matching is set to False, it signifies that the API
2745 client is expecting the output of the command not to match the golden
2746 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002747
2748 Finally, the required argument 'str' represents the lldb command to be
2749 sent to the command interpreter. In case the keyword argument 'exe' is
2750 set to False, the 'str' is treated as a string to be matched/not-matched
2751 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002752 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002753 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002754
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002755 if exe:
2756 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002757 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002758 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002759
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002760 # Then compare the output against expected strings.
2761 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002762
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002763 # If error is True, the API client expects the command to fail!
2764 if error:
2765 self.assertFalse(self.res.Succeeded(),
2766 "Command '" + str + "' is expected to fail!")
2767 else:
2768 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002769 if isinstance(str,lldb.SBCommandReturnObject):
2770 output = str.GetOutput()
2771 else:
2772 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002773 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002774 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002775
Johnny Chenea88e942010-09-21 21:08:53 +00002776 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002777 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002778
2779 # Start from the startstr, if specified.
2780 # If there's no startstr, set the initial state appropriately.
2781 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002782
Johnny Chen150c3cc2010-10-15 01:18:29 +00002783 if startstr:
2784 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002785 print("%s start string: %s" % (heading, startstr), file=sbuf)
2786 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002787
Johnny Chen86268e42011-09-30 21:48:35 +00002788 # Look for endstr, if specified.
2789 keepgoing = matched if matching else not matched
2790 if endstr:
2791 matched = output.endswith(endstr)
2792 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002793 print("%s end string: %s" % (heading, endstr), file=sbuf)
2794 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002795
Johnny Chenea88e942010-09-21 21:08:53 +00002796 # Look for sub strings, if specified.
2797 keepgoing = matched if matching else not matched
2798 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002799 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002800 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002801 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002802 print("%s sub string: %s" % (heading, str), file=sbuf)
2803 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002804 keepgoing = matched if matching else not matched
2805 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002806 break
2807
Johnny Chenea88e942010-09-21 21:08:53 +00002808 # Search for regular expression patterns, if specified.
2809 keepgoing = matched if matching else not matched
2810 if patterns and keepgoing:
2811 for pattern in patterns:
2812 # Match Objects always have a boolean value of True.
2813 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002814 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002815 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2816 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002817 keepgoing = matched if matching else not matched
2818 if not keepgoing:
2819 break
Johnny Chenea88e942010-09-21 21:08:53 +00002820
2821 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002822 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002823
Johnny Chenf3c59232010-08-25 22:52:45 +00002824 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002825 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002826 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002827
2828 method = getattr(obj, name)
2829 import inspect
2830 self.assertTrue(inspect.ismethod(method),
2831 name + "is a method name of object: " + str(obj))
2832 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002833 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002834 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002835 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002836
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002837 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2838 """Platform specific way to build the default binaries."""
2839 if lldb.skip_build_and_cleanup:
2840 return
2841 module = builder_module()
2842 if target_is_android():
2843 dictionary = append_android_envs(dictionary)
2844 if self.debug_info is None:
2845 return self.buildDefault(architecture, compiler, dictionary, clean)
2846 elif self.debug_info == "dsym":
2847 return self.buildDsym(architecture, compiler, dictionary, clean)
2848 elif self.debug_info == "dwarf":
2849 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002850 elif self.debug_info == "dwo":
2851 return self.buildDwo(architecture, compiler, dictionary, clean)
2852 else:
2853 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002854
Johnny Chenf359cf22011-05-27 23:36:52 +00002855 # =================================================
2856 # Misc. helper methods for debugging test execution
2857 # =================================================
2858
Johnny Chen56b92a72011-07-11 19:15:11 +00002859 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002860 """Debug print a SBValue object, if traceAlways is True."""
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002861 from .lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002862
Johnny Chen8d55a342010-08-31 17:42:54 +00002863 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002864 return
2865
2866 err = sys.stderr
2867 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002868 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2869 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2870 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2871 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2872 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2873 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2874 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2875 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2876 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002877
Johnny Chen36c5eb12011-08-05 20:17:27 +00002878 def DebugSBType(self, type):
2879 """Debug print a SBType object, if traceAlways is True."""
2880 if not traceAlways:
2881 return
2882
2883 err = sys.stderr
2884 err.write(type.GetName() + ":\n")
2885 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2886 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2887 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2888
Johnny Chenb877f1e2011-03-12 01:18:19 +00002889 def DebugPExpect(self, child):
2890 """Debug the spwaned pexpect object."""
2891 if not traceAlways:
2892 return
2893
Zachary Turnerff890da2015-10-19 23:45:41 +00002894 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002895
2896 @classmethod
2897 def RemoveTempFile(cls, file):
2898 if os.path.exists(file):
2899 os.remove(file)