blob: ca3616ad5b4b0a29563fdbb9f7a79e92f23167a0 [file] [log] [blame]
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001"""
2LLDB module which provides the abstract base class of lldb test case.
3
4The concrete subclass can override lldbtest.TesBase in order to inherit the
5common behavior for unitest.TestCase.setUp/tearDown implemented in this file.
6
7The subclass should override the attribute mydir in order for the python runtime
8to locate the individual test cases when running as part of a large test suite
9or when running each test case as a separate python invocation.
10
11./dotest.py provides a test driver which sets up the environment to run the
Johnny Chenc98892e2012-05-16 20:41:28 +000012entire of part of the test suite . Example:
Johnny Chenbf6ffa32010-07-03 03:41:59 +000013
Johnny Chenc98892e2012-05-16 20:41:28 +000014# Exercises the test suite in the types directory....
15/Volumes/data/lldb/svn/ToT/test $ ./dotest.py -A x86_64 types
Johnny Chen57b47382010-09-02 22:25:47 +000016...
Johnny Chend0190a62010-08-23 17:10:44 +000017
Johnny Chenc98892e2012-05-16 20:41:28 +000018Session logs for test failures/errors/unexpected successes will go into directory '2012-05-16-13_35_42'
19Command invoked: python ./dotest.py -A x86_64 types
20compilers=['clang']
Johnny Chend0190a62010-08-23 17:10:44 +000021
Johnny Chenc98892e2012-05-16 20:41:28 +000022Configuration: arch=x86_64 compiler=clang
Johnny Chend0190a62010-08-23 17:10:44 +000023----------------------------------------------------------------------
Johnny Chenc98892e2012-05-16 20:41:28 +000024Collected 72 tests
25
26........................................................................
27----------------------------------------------------------------------
28Ran 72 tests in 135.468s
Johnny Chend0190a62010-08-23 17:10:44 +000029
30OK
Johnny Chenbf6ffa32010-07-03 03:41:59 +000031$
32"""
33
Zachary Turnerff890da2015-10-19 23:45:41 +000034from __future__ import print_function
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000035from __future__ import absolute_import
Zachary Turnerff890da2015-10-19 23:45:41 +000036
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000037# System modules
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +000038import abc
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000039import collections
Zachary Turnerabdb8392015-11-16 22:40:30 +000040from distutils.version import LooseVersion
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +000041import gc
Vince Harron9753dd92015-05-10 15:22:09 +000042import glob
Zachary Turnerba105702015-11-16 23:58:20 +000043import inspect
Johnny Chen90312a82010-09-21 22:34:45 +000044import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000045import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000046import re
Daniel Malea69207462013-06-05 21:07:02 +000047import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000048from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000049import time
Johnny Chena33a93c2010-08-30 23:08:52 +000050import types
Zachary Turner43a01e42015-10-20 21:06:05 +000051
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000052# Third-party modules
53import unittest2
Zachary Turner43a01e42015-10-20 21:06:05 +000054from six import add_metaclass
Zachary Turner814236d2015-10-21 17:48:52 +000055from six import StringIO as SixStringIO
56from six.moves.urllib import parse as urlparse
Zachary Turnercd236b82015-10-26 18:48:24 +000057import six
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000058
59# LLDB modules
60import lldb
61from . import lldbtest_config
62from . import lldbutil
63from . import test_categories
Siva Chandra8af91662015-06-05 00:22:49 +000064
Vince Harron85d19652015-05-21 19:09:29 +000065# dosep.py starts lots and lots of dotest instances
66# This option helps you find if two (or more) dotest instances are using the same
67# directory at the same time
68# Enable it to cause test failures and stderr messages if dotest instances try to run in
69# the same directory simultaneously
70# it is disabled by default because it litters the test directories with ".dirlock" files
71debug_confirm_directory_exclusivity = False
72
Johnny Chen707b3c92010-10-11 22:25:46 +000073# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000074# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000075
76# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000077if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
78 traceAlways = True
79else:
80 traceAlways = False
81
Johnny Chen707b3c92010-10-11 22:25:46 +000082# By default, doCleanup is True.
83if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
84 doCleanup = False
85else:
86 doCleanup = True
87
Johnny Chen8d55a342010-08-31 17:42:54 +000088
Johnny Chen00778092010-08-09 22:01:17 +000089#
90# Some commonly used assert messages.
91#
92
Johnny Chenaa902922010-09-17 22:45:27 +000093COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
94
Johnny Chen00778092010-08-09 22:01:17 +000095CURRENT_EXECUTABLE_SET = "Current executable set successfully"
96
Johnny Chen7d1d7532010-09-02 21:23:12 +000097PROCESS_IS_VALID = "Process is valid"
98
99PROCESS_KILLED = "Process is killed successfully"
100
Johnny Chend5f66fc2010-12-23 01:12:19 +0000101PROCESS_EXITED = "Process exited successfully"
102
103PROCESS_STOPPED = "Process status should be stopped"
104
Sean Callanan05834cd2015-07-01 23:56:30 +0000105RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000106
Johnny Chen17941842010-08-09 23:44:24 +0000107RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000108
Johnny Chen67af43f2010-10-05 19:27:32 +0000109BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
110
Johnny Chen17941842010-08-09 23:44:24 +0000111BREAKPOINT_CREATED = "Breakpoint created successfully"
112
Johnny Chenf10af382010-12-04 00:07:24 +0000113BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
114
Johnny Chene76896c2010-08-17 21:33:31 +0000115BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
116
Johnny Chen17941842010-08-09 23:44:24 +0000117BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000118
Johnny Chen703dbd02010-09-30 17:06:24 +0000119BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
120
Johnny Chen164f1e12010-10-15 18:07:09 +0000121BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
122
Greg Clayton5db6b792012-10-24 18:24:14 +0000123MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
124
Johnny Chen89109ed12011-06-27 20:05:23 +0000125OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
126
Johnny Chen5b3a3572010-12-09 18:22:12 +0000127SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
128
Johnny Chenc70b02a2010-09-22 23:00:20 +0000129STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
130
Johnny Chen1691a162011-04-15 16:44:48 +0000131STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
132
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000133STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
134
Johnny Chen5d6c4642010-11-10 23:46:38 +0000135STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000136
Johnny Chen5d6c4642010-11-10 23:46:38 +0000137STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
138 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000139
Johnny Chen2e431ce2010-10-20 18:38:48 +0000140STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
141
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000142STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
143
Johnny Chenc066ab42010-10-14 01:22:03 +0000144STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
145
Johnny Chen00778092010-08-09 22:01:17 +0000146STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
147
Johnny Chenf68cc122011-09-15 21:09:59 +0000148STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
149
Johnny Chen3c884a02010-08-24 22:07:56 +0000150DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
151
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000152VALID_BREAKPOINT = "Got a valid breakpoint"
153
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000154VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
155
Johnny Chen7209d84f2011-05-06 23:26:12 +0000156VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
157
Johnny Chen5ee88192010-08-27 23:47:36 +0000158VALID_FILESPEC = "Got a valid filespec"
159
Johnny Chen025d1b82010-12-08 01:25:21 +0000160VALID_MODULE = "Got a valid module"
161
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000162VALID_PROCESS = "Got a valid process"
163
Johnny Chen025d1b82010-12-08 01:25:21 +0000164VALID_SYMBOL = "Got a valid symbol"
165
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000166VALID_TARGET = "Got a valid target"
167
Matthew Gardinerc928de32014-10-22 07:22:56 +0000168VALID_PLATFORM = "Got a valid platform"
169
Johnny Chen15f247a2012-02-03 20:43:00 +0000170VALID_TYPE = "Got a valid type"
171
Johnny Chen5819ab42011-07-15 22:28:10 +0000172VALID_VARIABLE = "Got a valid variable"
173
Johnny Chen981463d2010-08-25 19:00:04 +0000174VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000175
Johnny Chenf68cc122011-09-15 21:09:59 +0000176WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000177
Sean Callanan05834cd2015-07-01 23:56:30 +0000178def CMD_MSG(str):
179 '''A generic "Command '%s' returns successfully" message generator.'''
180 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000181
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000182def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000183 '''A generic message generator for the completion mechanism.'''
184 return "'%s' successfully completes to '%s'" % (str_before, str_after)
185
Johnny Chenc0c67f22010-11-09 18:42:22 +0000186def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000187 '''A generic "'%s' returns expected result" message generator if exe.
188 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000189 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000190
Johnny Chen3343f042010-10-19 19:11:38 +0000191def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000192 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000193 return "Value of setting '%s' is correct" % setting
194
Johnny Chen27c41232010-08-26 21:49:29 +0000195def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000196 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000197 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000198
Johnny Chen47ceb032010-10-11 23:52:19 +0000199def line_number(filename, string_to_match):
200 """Helper function to return the line number of the first matched string."""
201 with open(filename, 'r') as f:
202 for i, line in enumerate(f):
203 if line.find(string_to_match) != -1:
204 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000205 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000206 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000207
Johnny Chen67af43f2010-10-05 19:27:32 +0000208def pointer_size():
209 """Return the pointer size of the host system."""
210 import ctypes
211 a_pointer = ctypes.c_void_p(0xffff)
212 return 8 * ctypes.sizeof(a_pointer)
213
Johnny Chen57816732012-02-09 02:01:59 +0000214def is_exe(fpath):
215 """Returns true if fpath is an executable."""
216 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
217
218def which(program):
219 """Returns the full path to a program; None otherwise."""
220 fpath, fname = os.path.split(program)
221 if fpath:
222 if is_exe(program):
223 return program
224 else:
225 for path in os.environ["PATH"].split(os.pathsep):
226 exe_file = os.path.join(path, program)
227 if is_exe(exe_file):
228 return exe_file
229 return None
230
Zachary Turner814236d2015-10-21 17:48:52 +0000231class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000232 """
233 A nice little context manager for recording the debugger interactions into
234 our session object. If trace flag is ON, it also emits the interactions
235 into the stderr.
236 """
237 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000238 """Create a SixStringIO instance; record the session obj and trace flag."""
239 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000240 # The test might not have undergone the 'setUp(self)' phase yet, so that
241 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000242 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000243 self.trace = trace
244
245 def __enter__(self):
246 """
247 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000248 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000249 """
250 return self
251
252 def __exit__(self, type, value, tb):
253 """
254 Context management protocol on exit from the body of the with statement.
255 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000256 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000257 """
258 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000259 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000260 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000261 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000262 self.close()
263
Zachary Turner43a01e42015-10-20 21:06:05 +0000264@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000265class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000266
267 @abc.abstractproperty
268 def pid(self):
269 """Returns process PID if has been launched already."""
270
271 @abc.abstractmethod
272 def launch(self, executable, args):
273 """Launches new process with given executable and args."""
274
275 @abc.abstractmethod
276 def terminate(self):
277 """Terminates previously launched process.."""
278
279class _LocalProcess(_BaseProcess):
280
281 def __init__(self, trace_on):
282 self._proc = None
283 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000284 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000285
286 @property
287 def pid(self):
288 return self._proc.pid
289
290 def launch(self, executable, args):
291 self._proc = Popen([executable] + args,
292 stdout = open(os.devnull) if not self._trace_on else None,
293 stdin = PIPE)
294
295 def terminate(self):
296 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000297 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000298 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
299 for sig in signals_to_try:
300 try:
301 self._proc.send_signal(getattr(signal, sig))
302 time.sleep(self._delayafterterminate)
303 if self._proc.poll() != None:
304 return
305 except ValueError:
306 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000307 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000308 time.sleep(self._delayafterterminate)
309 if self._proc.poll() != None:
310 return
311 self._proc.kill()
312 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000313
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000314 def poll(self):
315 return self._proc.poll()
316
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000317class _RemoteProcess(_BaseProcess):
318
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000319 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000320 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000321 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000322
323 @property
324 def pid(self):
325 return self._pid
326
327 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000328 if self._install_remote:
329 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000330 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000331
332 dst_file_spec = lldb.SBFileSpec(dst_path, False)
333 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
334 if err.Fail():
335 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
336 else:
337 dst_path = executable
338 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000339
340 launch_info = lldb.SBLaunchInfo(args)
341 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000342 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000343
344 # Redirect stdout and stderr to /dev/null
345 launch_info.AddSuppressFileAction(1, False, True)
346 launch_info.AddSuppressFileAction(2, False, True)
347
348 err = lldb.remote_platform.Launch(launch_info)
349 if err.Fail():
350 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
351 self._pid = launch_info.GetProcessID()
352
353 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000354 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000355
Johnny Chen690fcef2010-10-15 23:55:05 +0000356# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000357# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000358def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000359 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000360
361 If the exit code was non-zero it raises a CalledProcessError. The
362 CalledProcessError object will have the return code in the returncode
363 attribute and output in the output attribute.
364
365 The arguments are the same as for the Popen constructor. Example:
366
367 >>> check_output(["ls", "-l", "/dev/null"])
368 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
369
370 The stdout argument is not allowed as it is used internally.
371 To capture standard error in the result, use stderr=STDOUT.
372
373 >>> check_output(["/bin/sh", "-c",
374 ... "ls -l non_existent_file ; exit 0"],
375 ... stderr=STDOUT)
376 'ls: non_existent_file: No such file or directory\n'
377 """
378
379 # Assign the sender object to variable 'test' and remove it from kwargs.
380 test = kwargs.pop('sender', None)
381
Zachary Turner9ef307b2014-07-22 16:19:29 +0000382 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
383 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000384 output = ""
385 error = ""
386 for shellCommand in commandList:
387 if 'stdout' in kwargs:
388 raise ValueError('stdout argument not allowed, it will be overridden.')
389 if 'shell' in kwargs and kwargs['shell']==False:
390 raise ValueError('shell=False not allowed')
Zachary Turner48ef8d4c2015-11-18 18:40:16 +0000391 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, universal_newlines=True, **kwargs)
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000392 pid = process.pid
393 this_output, this_error = process.communicate()
394 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000395
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000396 # Enable trace on failure return while tracking down FreeBSD buildbot issues
397 trace = traceAlways
398 if not trace and retcode and sys.platform.startswith("freebsd"):
399 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000400
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000401 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000402 print(file=sbuf)
403 print("os command:", shellCommand, file=sbuf)
404 print("with pid:", pid, file=sbuf)
405 print("stdout:", this_output, file=sbuf)
406 print("stderr:", this_error, file=sbuf)
407 print("retcode:", retcode, file=sbuf)
408 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000409
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000410 if retcode:
411 cmd = kwargs.get("args")
412 if cmd is None:
413 cmd = shellCommand
414 raise CalledProcessError(retcode, cmd)
415 output = output + this_output
416 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000417 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000418
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000419def getsource_if_available(obj):
420 """
421 Return the text of the source code for an object if available. Otherwise,
422 a print representation is returned.
423 """
424 import inspect
425 try:
426 return inspect.getsource(obj)
427 except:
428 return repr(obj)
429
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000430def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000431 if sys.platform.startswith("freebsd"):
432 return __import__("builder_freebsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000433 return __import__("builder_" + sys.platform)
434
Siva Chandra8af91662015-06-05 00:22:49 +0000435def run_adb_command(cmd, device_id):
436 device_id_args = []
437 if device_id:
438 device_id_args = ["-s", device_id]
439 full_cmd = ["adb"] + device_id_args + cmd
440 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
441 stdout, stderr = p.communicate()
442 return p.returncode, stdout, stderr
443
Chaoren Line9bbabc2015-07-18 00:37:55 +0000444def append_android_envs(dictionary):
445 if dictionary is None:
446 dictionary = {}
447 dictionary["OS"] = "Android"
448 if android_device_api() >= 16:
449 dictionary["PIE"] = 1
450 return dictionary
451
Chaoren Lin9070f532015-07-17 22:13:29 +0000452def target_is_android():
453 if not hasattr(target_is_android, 'result'):
454 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
455 match = re.match(".*-.*-.*-android", triple)
456 target_is_android.result = match is not None
457 return target_is_android.result
458
Siva Chandra8af91662015-06-05 00:22:49 +0000459def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000460 if not hasattr(android_device_api, 'result'):
461 assert lldb.platform_url is not None
462 device_id = None
463 parsed_url = urlparse.urlparse(lldb.platform_url)
464 if parsed_url.scheme == "adb":
465 device_id = parsed_url.netloc.split(":")[0]
466 retcode, stdout, stderr = run_adb_command(
467 ["shell", "getprop", "ro.build.version.sdk"], device_id)
468 if retcode == 0:
469 android_device_api.result = int(stdout)
470 else:
471 raise LookupError(
472 ">>> Unable to determine the API level of the Android device.\n"
473 ">>> stdout:\n%s\n"
474 ">>> stderr:\n%s\n" % (stdout, stderr))
475 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000476
Zachary Turnerabdb8392015-11-16 22:40:30 +0000477def check_expected_version(comparison, expected, actual):
478 def fn_leq(x,y): return x <= y
479 def fn_less(x,y): return x < y
480 def fn_geq(x,y): return x >= y
481 def fn_greater(x,y): return x > y
482 def fn_eq(x,y): return x == y
483 def fn_neq(x,y): return x != y
484
485 op_lookup = {
486 "==": fn_eq,
487 "=": fn_eq,
488 "!=": fn_neq,
489 "<>": fn_neq,
490 ">": fn_greater,
491 "<": fn_less,
492 ">=": fn_geq,
493 "<=": fn_leq
494 }
495 expected_str = '.'.join([str(x) for x in expected])
496 actual_str = '.'.join([str(x) for x in actual])
497
498 return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
499
Johnny Chena74bb0a2011-08-01 18:46:13 +0000500#
501# Decorators for categorizing test cases.
502#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000503from functools import wraps
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000504def add_test_categories(cat):
505 """Decorate an item with test categories"""
506 cat = test_categories.validate(cat, True)
507 def impl(func):
508 func.getCategories = lambda test: cat
509 return func
510 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000511
Johnny Chena74bb0a2011-08-01 18:46:13 +0000512def benchmarks_test(func):
513 """Decorate the item as a benchmarks test."""
514 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
515 raise Exception("@benchmarks_test can only be used to decorate a test method")
516 @wraps(func)
517 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000518 if not lldb.just_do_benchmarks_test:
519 self.skipTest("benchmarks tests")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000520 return func(self, *args, **kwargs)
521
522 # Mark this function as such to separate them from the regular tests.
523 wrapper.__benchmarks_test__ = True
524 return wrapper
525
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000526def no_debug_info_test(func):
527 """Decorate the item as a test what don't use any debug info. If this annotation is specified
528 then the test runner won't generate a separate test for each debug info format. """
529 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
530 raise Exception("@no_debug_info_test can only be used to decorate a test method")
531 @wraps(func)
532 def wrapper(self, *args, **kwargs):
533 return func(self, *args, **kwargs)
534
535 # Mark this function as such to separate them from the regular tests.
536 wrapper.__no_debug_info_test__ = True
537 return wrapper
538
Johnny Chenf1548d42012-04-06 00:56:05 +0000539def dsym_test(func):
540 """Decorate the item as a dsym test."""
541 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
542 raise Exception("@dsym_test can only be used to decorate a test method")
543 @wraps(func)
544 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000545 if lldb.dont_do_dsym_test:
546 self.skipTest("dsym tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000547 return func(self, *args, **kwargs)
548
549 # Mark this function as such to separate them from the regular tests.
550 wrapper.__dsym_test__ = True
551 return wrapper
552
553def dwarf_test(func):
554 """Decorate the item as a dwarf test."""
555 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
556 raise Exception("@dwarf_test can only be used to decorate a test method")
557 @wraps(func)
558 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000559 if lldb.dont_do_dwarf_test:
560 self.skipTest("dwarf tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000561 return func(self, *args, **kwargs)
562
563 # Mark this function as such to separate them from the regular tests.
564 wrapper.__dwarf_test__ = True
565 return wrapper
566
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000567def dwo_test(func):
568 """Decorate the item as a dwo test."""
569 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
570 raise Exception("@dwo_test can only be used to decorate a test method")
571 @wraps(func)
572 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000573 if lldb.dont_do_dwo_test:
574 self.skipTest("dwo tests")
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000575 return func(self, *args, **kwargs)
576
577 # Mark this function as such to separate them from the regular tests.
578 wrapper.__dwo_test__ = True
579 return wrapper
580
Todd Fialaa41d48c2014-04-28 04:49:40 +0000581def debugserver_test(func):
582 """Decorate the item as a debugserver test."""
583 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
584 raise Exception("@debugserver_test can only be used to decorate a test method")
585 @wraps(func)
586 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000587 if lldb.dont_do_debugserver_test:
588 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000589 return func(self, *args, **kwargs)
590
591 # Mark this function as such to separate them from the regular tests.
592 wrapper.__debugserver_test__ = True
593 return wrapper
594
595def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000596 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000597 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
598 raise Exception("@llgs_test can only be used to decorate a test method")
599 @wraps(func)
600 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000601 if lldb.dont_do_llgs_test:
602 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000603 return func(self, *args, **kwargs)
604
605 # Mark this function as such to separate them from the regular tests.
606 wrapper.__llgs_test__ = True
607 return wrapper
608
Daniel Maleae0f8f572013-08-26 23:57:52 +0000609def not_remote_testsuite_ready(func):
610 """Decorate the item as a test which is not ready yet for remote testsuite."""
611 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
612 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
613 @wraps(func)
614 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000615 if lldb.lldbtest_remote_sandbox or lldb.remote_platform:
616 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000617 return func(self, *args, **kwargs)
618
619 # Mark this function as such to separate them from the regular tests.
620 wrapper.__not_ready_for_remote_testsuite_test__ = True
621 return wrapper
622
Ed Maste433790a2014-04-23 12:55:41 +0000623def expectedFailure(expected_fn, bugnumber=None):
624 def expectedFailure_impl(func):
625 @wraps(func)
626 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000627 from unittest2 import case
628 self = args[0]
Ed Maste433790a2014-04-23 12:55:41 +0000629 if expected_fn(self):
Zachary Turner5cb8e672015-11-06 18:14:42 +0000630 xfail_func = unittest2.expectedFailure(func)
631 xfail_func(*args, **kwargs)
632 else:
633 func(*args, **kwargs)
Ed Maste433790a2014-04-23 12:55:41 +0000634 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000635 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
636 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000637 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000638 return expectedFailure_impl(bugnumber)
639 else:
640 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000641
Ying Chen0c352822015-11-16 23:41:02 +0000642# You can also pass not_in(list) to reverse the sense of the test for the arguments that
643# are simple lists, namely oslist, compiler, and debug_info.
644
645def not_in (iterable):
646 return lambda x : x not in iterable
647
648def check_list_or_lambda (list_or_lambda, value):
649 if six.callable(list_or_lambda):
650 return list_or_lambda(value)
651 else:
652 return list_or_lambda is None or value is None or value in list_or_lambda
653
Ying Chen7091c2c2015-04-21 01:15:47 +0000654# provide a function to xfail on defined oslist, compiler version, and archs
655# if none is specified for any argument, that argument won't be checked and thus means for all
656# for example,
657# @expectedFailureAll, xfail for all platform/compiler/arch,
658# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
659# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Zachary Turnerabdb8392015-11-16 22:40:30 +0000660def 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 +0000661 def fn(self):
Ying Chen0c352822015-11-16 23:41:02 +0000662 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
663 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000664 arch_passes = self.expectedArch(archs)
665 triple_passes = triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())
Ying Chen0c352822015-11-16 23:41:02 +0000666 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000667 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))
668 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
669
670 return (oslist_passes and
671 compiler_passes and
672 arch_passes and
673 triple_passes and
674 debug_info_passes and
675 swig_version_passes and
676 py_version_passes)
Ying Chen7091c2c2015-04-21 01:15:47 +0000677 return expectedFailure(fn, bugnumber)
678
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000679def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000680 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
681
682def expectedFailureDwo(bugnumber=None):
683 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000684
685def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000686 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000687
688def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
689 if compiler_version is None:
690 compiler_version=['=', None]
691 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
692
Vince Harron8974ce22015-03-13 19:54:54 +0000693# to XFAIL a specific clang versions, try this
694# @expectedFailureClang('bugnumber', ['<=', '3.4'])
695def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000696 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000697
698def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000699 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000700
Matt Kopec0de53f02013-03-15 19:10:12 +0000701def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000702 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000703
Ed Maste433790a2014-04-23 12:55:41 +0000704def expectedFailureArch(arch, bugnumber=None):
705 def fn(self):
706 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000707 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000708
Enrico Granatae6cedc12013-02-23 01:05:23 +0000709def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000710 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000711
Matt Kopecee969f92013-09-26 23:30:59 +0000712def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000713 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000714
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000715def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None):
Ed Maste433790a2014-04-23 12:55:41 +0000716 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000717 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000718 self.expectedCompiler(compilers) and
719 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000720 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000721
Chaoren Linf7160f32015-06-09 17:39:27 +0000722def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
723 def fn(self):
724 return (getHostPlatform() in oslist and
725 self.expectedCompiler(compilers))
726 return expectedFailure(fn, bugnumber)
727
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000728def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000729 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000730 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000731
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000732def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
733 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000734
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000735def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None):
736 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000737
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000738def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
739 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000740
Chaoren Linf7160f32015-06-09 17:39:27 +0000741def expectedFailureHostWindows(bugnumber=None, compilers=None):
742 return expectedFailureHostOS(['windows'], bugnumber, compilers)
743
Pavel Labath090152b2015-08-20 11:37:19 +0000744def matchAndroid(api_levels=None, archs=None):
745 def match(self):
746 if not target_is_android():
747 return False
748 if archs is not None and self.getArchitecture() not in archs:
749 return False
750 if api_levels is not None and android_device_api() not in api_levels:
751 return False
752 return True
753 return match
754
755
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000756def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000757 """ Mark a test as xfail for Android.
758
759 Arguments:
760 bugnumber - The LLVM pr associated with the problem.
761 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000762 for which a test is expected to fail. None means all API level.
763 arch - A sequence of architecture names specifying the architectures
764 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000765 """
Pavel Labath090152b2015-08-20 11:37:19 +0000766 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000767
Vince Harron7ac3ea42015-06-26 15:13:21 +0000768# if the test passes on the first try, we're done (success)
769# if the test fails once, then passes on the second try, raise an ExpectedFailure
770# if the test fails twice in a row, re-throw the exception from the second test run
771def expectedFlakey(expected_fn, bugnumber=None):
772 def expectedFailure_impl(func):
773 @wraps(func)
774 def wrapper(*args, **kwargs):
775 from unittest2 import case
776 self = args[0]
777 try:
778 func(*args, **kwargs)
Ying Chen0a7202b2015-07-01 22:44:27 +0000779 # don't retry if the test case is already decorated with xfail or skip
780 except (case._ExpectedFailure, case.SkipTest, case._UnexpectedSuccess):
781 raise
Vince Harron7ac3ea42015-06-26 15:13:21 +0000782 except Exception:
783 if expected_fn(self):
Ying Chen0a7202b2015-07-01 22:44:27 +0000784 # before retry, run tearDown for previous run and setup for next
Vince Harron7ac3ea42015-06-26 15:13:21 +0000785 try:
Ying Chen0a7202b2015-07-01 22:44:27 +0000786 self.tearDown()
787 self.setUp()
Vince Harron7ac3ea42015-06-26 15:13:21 +0000788 func(*args, **kwargs)
789 except Exception:
790 # oh snap! two failures in a row, record a failure/error
791 raise
792 # record the expected failure
793 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
794 else:
795 raise
796 return wrapper
797 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
798 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000799 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000800 return expectedFailure_impl(bugnumber)
801 else:
802 return expectedFailure_impl
803
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000804def expectedFlakeyDwarf(bugnumber=None):
805 def fn(self):
806 return self.debug_info == "dwarf"
807 return expectedFlakey(fn, bugnumber)
808
809def expectedFlakeyDsym(bugnumber=None):
810 def fn(self):
811 return self.debug_info == "dwarf"
812 return expectedFlakey(fn, bugnumber)
813
Vince Harron7ac3ea42015-06-26 15:13:21 +0000814def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
815 def fn(self):
816 return (self.getPlatform() in oslist and
817 self.expectedCompiler(compilers))
818 return expectedFlakey(fn, bugnumber)
819
820def expectedFlakeyDarwin(bugnumber=None, compilers=None):
821 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
822 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
823
824def expectedFlakeyLinux(bugnumber=None, compilers=None):
825 return expectedFlakeyOS(['linux'], bugnumber, compilers)
826
827def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
828 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
829
830def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
831 if compiler_version is None:
832 compiler_version=['=', None]
833 def fn(self):
834 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
835 return expectedFlakey(fn, bugnumber)
836
837# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
838def expectedFlakeyClang(bugnumber=None, compiler_version=None):
839 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
840
841# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
842def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
843 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
844
Pavel Labath63a579c2015-09-07 12:15:27 +0000845def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
846 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
847
Greg Clayton12514562013-12-05 22:22:32 +0000848def skipIfRemote(func):
849 """Decorate the item to skip tests if testing remotely."""
850 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
851 raise Exception("@skipIfRemote can only be used to decorate a test method")
852 @wraps(func)
853 def wrapper(*args, **kwargs):
854 from unittest2 import case
855 if lldb.remote_platform:
856 self = args[0]
857 self.skipTest("skip on remote platform")
858 else:
859 func(*args, **kwargs)
860 return wrapper
861
Siva Chandra4470f382015-06-17 22:32:27 +0000862def skipUnlessListedRemote(remote_list=None):
863 def myImpl(func):
864 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
865 raise Exception("@skipIfRemote can only be used to decorate a "
866 "test method")
867
868 @wraps(func)
869 def wrapper(*args, **kwargs):
870 if remote_list and lldb.remote_platform:
871 self = args[0]
872 triple = self.dbg.GetSelectedPlatform().GetTriple()
873 for r in remote_list:
874 if r in triple:
875 func(*args, **kwargs)
876 return
877 self.skipTest("skip on remote platform %s" % str(triple))
878 else:
879 func(*args, **kwargs)
880 return wrapper
881
882 return myImpl
883
Greg Clayton12514562013-12-05 22:22:32 +0000884def skipIfRemoteDueToDeadlock(func):
885 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
886 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
887 raise Exception("@skipIfRemote can only be used to decorate a test method")
888 @wraps(func)
889 def wrapper(*args, **kwargs):
890 from unittest2 import case
891 if lldb.remote_platform:
892 self = args[0]
893 self.skipTest("skip on remote platform (deadlocks)")
894 else:
895 func(*args, **kwargs)
896 return wrapper
897
Enrico Granatab633e432014-10-06 21:37:06 +0000898def skipIfNoSBHeaders(func):
899 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
900 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000901 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000902 @wraps(func)
903 def wrapper(*args, **kwargs):
904 from unittest2 import case
905 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000906 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000907 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000908 else:
909 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000910 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000911 if not os.path.exists(header):
912 self.skipTest("skip because LLDB.h header not found")
913 else:
914 func(*args, **kwargs)
915 return wrapper
916
Enrico Granata5f92a132015-11-05 00:46:25 +0000917def skipIfiOSSimulator(func):
918 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
919 return unittest2.skipIf(hasattr(lldb, 'remote_platform_name') and lldb.remote_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
920
Robert Flack13c7ad92015-03-30 14:12:17 +0000921def skipIfFreeBSD(func):
922 """Decorate the item to skip tests that should be skipped on FreeBSD."""
923 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000924
Greg Claytone0d0a762015-04-02 18:24:03 +0000925def getDarwinOSTriples():
926 return ['darwin', 'macosx', 'ios']
927
Daniel Maleab3d41a22013-07-09 00:08:01 +0000928def skipIfDarwin(func):
929 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000930 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000931
Robert Flack13c7ad92015-03-30 14:12:17 +0000932def skipIfLinux(func):
933 """Decorate the item to skip tests that should be skipped on Linux."""
934 return skipIfPlatform(["linux"])(func)
935
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000936def skipUnlessHostLinux(func):
937 """Decorate the item to skip tests that should be skipped on any non Linux host."""
938 return skipUnlessHostPlatform(["linux"])(func)
939
Robert Flack13c7ad92015-03-30 14:12:17 +0000940def skipIfWindows(func):
941 """Decorate the item to skip tests that should be skipped on Windows."""
942 return skipIfPlatform(["windows"])(func)
943
Chaoren Line6eea5d2015-06-08 22:13:28 +0000944def skipIfHostWindows(func):
945 """Decorate the item to skip tests that should be skipped on Windows."""
946 return skipIfHostPlatform(["windows"])(func)
947
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000948def skipUnlessWindows(func):
949 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
950 return skipUnlessPlatform(["windows"])(func)
951
Robert Flack13c7ad92015-03-30 14:12:17 +0000952def skipUnlessDarwin(func):
953 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000954 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000955
Ryan Brown57bee1e2015-09-14 22:45:11 +0000956def skipUnlessGoInstalled(func):
957 """Decorate the item to skip tests when no Go compiler is available."""
958 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
959 raise Exception("@skipIfGcc can only be used to decorate a test method")
960 @wraps(func)
961 def wrapper(*args, **kwargs):
962 from unittest2 import case
963 self = args[0]
964 compiler = self.getGoCompilerVersion()
965 if not compiler:
966 self.skipTest("skipping because go compiler not found")
967 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000968 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000969 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000970 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
971 if not match_version:
972 # Couldn't determine version.
973 self.skipTest(
974 "skipping because go version could not be parsed "
975 "out of {}".format(compiler))
976 else:
977 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000978 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000979 compiler_strict_version = StrictVersion(match_version.group(1))
980 if compiler_strict_version < min_strict_version:
981 self.skipTest(
982 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +0000983 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +0000984 compiler_strict_version,
985 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +0000986 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +0000987 return wrapper
988
Robert Flack068898c2015-04-09 18:07:58 +0000989def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +0000990 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +0000991 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
992 if platform.startswith('freebsd'):
993 platform = 'freebsd'
994 return platform
995
Robert Flack6e1fd352015-05-15 12:39:33 +0000996def getHostPlatform():
997 """Returns the host platform running the test suite."""
998 # Attempts to return a platform name matching a target Triple platform.
999 if sys.platform.startswith('linux'):
1000 return 'linux'
1001 elif sys.platform.startswith('win32'):
1002 return 'windows'
1003 elif sys.platform.startswith('darwin'):
1004 return 'darwin'
1005 elif sys.platform.startswith('freebsd'):
1006 return 'freebsd'
1007 else:
1008 return sys.platform
1009
Robert Flackfb2f6c62015-04-17 08:02:18 +00001010def platformIsDarwin():
1011 """Returns true if the OS triple for the selected platform is any valid apple OS"""
1012 return getPlatform() in getDarwinOSTriples()
1013
Robert Flack6e1fd352015-05-15 12:39:33 +00001014def skipIfHostIncompatibleWithRemote(func):
1015 """Decorate the item to skip tests if binaries built on this host are incompatible."""
1016 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1017 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
1018 @wraps(func)
1019 def wrapper(*args, **kwargs):
1020 from unittest2 import case
1021 self = args[0]
1022 host_arch = self.getLldbArchitecture()
1023 host_platform = getHostPlatform()
1024 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +00001025 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +00001026 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
1027 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
1028 elif target_platform != host_platform:
1029 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
1030 else:
1031 func(*args, **kwargs)
1032 return wrapper
1033
Chaoren Line6eea5d2015-06-08 22:13:28 +00001034def skipIfHostPlatform(oslist):
1035 """Decorate the item to skip tests if running on one of the listed host platforms."""
1036 return unittest2.skipIf(getHostPlatform() in oslist,
1037 "skip on %s" % (", ".join(oslist)))
1038
1039def skipUnlessHostPlatform(oslist):
1040 """Decorate the item to skip tests unless running on one of the listed host platforms."""
1041 return unittest2.skipUnless(getHostPlatform() in oslist,
1042 "requires on of %s" % (", ".join(oslist)))
1043
Zachary Turner793d9972015-08-14 23:29:24 +00001044def skipUnlessArch(archlist):
1045 """Decorate the item to skip tests unless running on one of the listed architectures."""
1046 def myImpl(func):
1047 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1048 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1049
1050 @wraps(func)
1051 def wrapper(*args, **kwargs):
1052 self = args[0]
1053 if self.getArchitecture() not in archlist:
1054 self.skipTest("skipping for architecture %s (requires one of %s)" %
1055 (self.getArchitecture(), ", ".join(archlist)))
1056 else:
1057 func(*args, **kwargs)
1058 return wrapper
1059
1060 return myImpl
1061
Robert Flack13c7ad92015-03-30 14:12:17 +00001062def skipIfPlatform(oslist):
1063 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001064 return unittest2.skipIf(getPlatform() in oslist,
1065 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001066
1067def skipUnlessPlatform(oslist):
1068 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001069 return unittest2.skipUnless(getPlatform() in oslist,
1070 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001071
Daniel Malea48359902013-05-14 20:48:54 +00001072def skipIfLinuxClang(func):
1073 """Decorate the item to skip tests that should be skipped if building on
1074 Linux with clang.
1075 """
1076 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1077 raise Exception("@skipIfLinuxClang can only be used to decorate a test method")
1078 @wraps(func)
1079 def wrapper(*args, **kwargs):
1080 from unittest2 import case
1081 self = args[0]
1082 compiler = self.getCompiler()
Vince Harronc8492672015-05-04 02:59:19 +00001083 platform = self.getPlatform()
1084 if "clang" in compiler and platform == "linux":
Daniel Malea48359902013-05-14 20:48:54 +00001085 self.skipTest("skipping because Clang is used on Linux")
1086 else:
1087 func(*args, **kwargs)
1088 return wrapper
1089
Ying Chen7091c2c2015-04-21 01:15:47 +00001090# provide a function to skip on defined oslist, compiler version, and archs
1091# if none is specified for any argument, that argument won't be checked and thus means for all
1092# for example,
1093# @skipIf, skip for all platform/compiler/arch,
1094# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1095# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1096
1097# TODO: refactor current code, to make skipIfxxx functions to call this function
Zachary Turnerabdb8392015-11-16 22:40:30 +00001098def 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 +00001099 def fn(self):
Zachary Turnerabdb8392015-11-16 22:40:30 +00001100 oslist_passes = oslist is None or self.getPlatform() in oslist
1101 compiler_passes = compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))
1102 arch_passes = self.expectedArch(archs)
1103 debug_info_passes = debug_info is None or self.debug_info in debug_info
1104 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))
1105 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
1106
1107 return (oslist_passes and
1108 compiler_passes and
1109 arch_passes and
1110 debug_info_passes and
1111 swig_version_passes and
1112 py_version_passes)
Zachary Turnerba105702015-11-16 23:58:20 +00001113
1114 local_vars = locals()
1115 args = [x for x in inspect.getargspec(skipIf).args]
1116 arg_vals = [eval(x, globals(), local_vars) for x in args]
1117 args = [x for x in zip(args, arg_vals) if x[1] is not None]
1118 reasons = ['%s=%s' % (x, str(y)) for (x,y) in args]
1119 return skipTestIfFn(fn, bugnumber, skipReason='skipping because ' + ' && '.join(reasons))
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001120
1121def skipIfDebugInfo(bugnumber=None, debug_info=None):
1122 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1123
Greg Claytonedea2372015-10-07 20:01:13 +00001124def skipIfDWO(bugnumber=None):
1125 return skipIfDebugInfo(bugnumber, ["dwo"])
1126
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001127def skipIfDwarf(bugnumber=None):
1128 return skipIfDebugInfo(bugnumber, ["dwarf"])
1129
1130def skipIfDsym(bugnumber=None):
1131 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001132
1133def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1134 def skipTestIfFn_impl(func):
1135 @wraps(func)
1136 def wrapper(*args, **kwargs):
1137 from unittest2 import case
1138 self = args[0]
1139 if expected_fn(self):
1140 self.skipTest(skipReason)
1141 else:
1142 func(*args, **kwargs)
1143 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001144 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001145 return skipTestIfFn_impl(bugnumber)
1146 else:
1147 return skipTestIfFn_impl
1148
Daniel Maleabe230792013-01-24 23:52:09 +00001149def skipIfGcc(func):
1150 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1151 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001152 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001153 @wraps(func)
1154 def wrapper(*args, **kwargs):
1155 from unittest2 import case
1156 self = args[0]
1157 compiler = self.getCompiler()
1158 if "gcc" in compiler:
1159 self.skipTest("skipping because gcc is the test compiler")
1160 else:
1161 func(*args, **kwargs)
1162 return wrapper
1163
Matt Kopec0de53f02013-03-15 19:10:12 +00001164def skipIfIcc(func):
1165 """Decorate the item to skip tests that should be skipped if building with icc ."""
1166 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1167 raise Exception("@skipIfIcc can only be used to decorate a test method")
1168 @wraps(func)
1169 def wrapper(*args, **kwargs):
1170 from unittest2 import case
1171 self = args[0]
1172 compiler = self.getCompiler()
1173 if "icc" in compiler:
1174 self.skipTest("skipping because icc is the test compiler")
1175 else:
1176 func(*args, **kwargs)
1177 return wrapper
1178
Daniel Malea55faa402013-05-02 21:44:31 +00001179def skipIfi386(func):
1180 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1181 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1182 raise Exception("@skipIfi386 can only be used to decorate a test method")
1183 @wraps(func)
1184 def wrapper(*args, **kwargs):
1185 from unittest2 import case
1186 self = args[0]
1187 if "i386" == self.getArchitecture():
1188 self.skipTest("skipping because i386 is not a supported architecture")
1189 else:
1190 func(*args, **kwargs)
1191 return wrapper
1192
Pavel Labath090152b2015-08-20 11:37:19 +00001193def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001194 """Decorator to skip tests when the target is Android.
1195
1196 Arguments:
1197 api_levels - The API levels for which the test should be skipped. If
1198 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001199 arch - A sequence of architecture names specifying the architectures
1200 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001201 """
1202 def myImpl(func):
1203 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1204 raise Exception("@skipIfTargetAndroid can only be used to "
1205 "decorate a test method")
1206 @wraps(func)
1207 def wrapper(*args, **kwargs):
1208 from unittest2 import case
1209 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001210 if matchAndroid(api_levels, archs)(self):
1211 self.skipTest("skiped on Android target with API %d and architecture %s" %
1212 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001213 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001214 return wrapper
1215 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001216
Ilia Kd9953052015-03-12 07:19:41 +00001217def skipUnlessCompilerRt(func):
1218 """Decorate the item to skip tests if testing remotely."""
1219 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1220 raise Exception("@skipUnless can only be used to decorate a test method")
1221 @wraps(func)
1222 def wrapper(*args, **kwargs):
1223 from unittest2 import case
1224 import os.path
1225 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "projects", "compiler-rt")
1226 if not os.path.exists(compilerRtPath):
1227 self = args[0]
1228 self.skipTest("skip if compiler-rt not found")
1229 else:
1230 func(*args, **kwargs)
1231 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001232
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001233class _PlatformContext(object):
1234 """Value object class which contains platform-specific options."""
1235
1236 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1237 self.shlib_environment_var = shlib_environment_var
1238 self.shlib_prefix = shlib_prefix
1239 self.shlib_extension = shlib_extension
1240
1241
Johnny Chena74bb0a2011-08-01 18:46:13 +00001242class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001243 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001244 Abstract base for performing lldb (see TestBase) or other generic tests (see
1245 BenchBase for one example). lldbtest.Base works with the test driver to
1246 accomplish things.
1247
Johnny Chen8334dad2010-10-22 23:15:46 +00001248 """
Enrico Granata5020f952012-10-24 21:42:49 +00001249
Enrico Granata19186272012-10-24 21:44:48 +00001250 # The concrete subclass should override this attribute.
1251 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001252
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001253 # Keep track of the old current working directory.
1254 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001255
Greg Clayton4570d3e2013-12-10 23:19:29 +00001256 @staticmethod
1257 def compute_mydir(test_file):
1258 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1259
1260 mydir = TestBase.compute_mydir(__file__)'''
1261 test_dir = os.path.dirname(test_file)
1262 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1263
Johnny Chenfb4264c2011-08-01 19:50:58 +00001264 def TraceOn(self):
1265 """Returns True if we are in trace mode (tracing detailed test execution)."""
1266 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001267
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001268 @classmethod
1269 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001270 """
1271 Python unittest framework class setup fixture.
1272 Do current directory manipulation.
1273 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001274 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001275 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001276 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001277
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001278 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001279 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001280
1281 # Change current working directory if ${LLDB_TEST} is defined.
1282 # See also dotest.py which sets up ${LLDB_TEST}.
1283 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001284 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001285 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001286 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001287 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1288
Vince Harron85d19652015-05-21 19:09:29 +00001289 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001290 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001291 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1292 try:
1293 cls.dir_lock.try_acquire()
1294 # write the class that owns the lock into the lock file
1295 cls.dir_lock.handle.write(cls.__name__)
1296 except IOError as ioerror:
1297 # nothing else should have this directory lock
1298 # wait here until we get a lock
1299 cls.dir_lock.acquire()
1300 # read the previous owner from the lock file
1301 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001302 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 +00001303 raise ioerror
1304
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001305 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001306 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001307 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Robert Flackfb2f6c62015-04-17 08:02:18 +00001308 elif getPlatform() == "linux" or getPlatform() == "freebsd":
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001309 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001310 else:
1311 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001312
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001313 @classmethod
1314 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001315 """
1316 Python unittest framework class teardown fixture.
1317 Do class-wide cleanup.
1318 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001319
Johnny Chen0fddfb22011-11-17 19:57:27 +00001320 if doCleanup and not lldb.skip_build_and_cleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001321 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001322 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001323 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001324
Johnny Chen707b3c92010-10-11 22:25:46 +00001325 # Subclass might have specific cleanup function defined.
1326 if getattr(cls, "classCleanup", None):
1327 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001328 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001329 try:
1330 cls.classCleanup()
1331 except:
1332 exc_type, exc_value, exc_tb = sys.exc_info()
1333 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001334
Vince Harron85d19652015-05-21 19:09:29 +00001335 if debug_confirm_directory_exclusivity:
1336 cls.dir_lock.release()
1337 del cls.dir_lock
1338
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001339 # Restore old working directory.
1340 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001341 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001342 os.chdir(cls.oldcwd)
1343
Johnny Chena74bb0a2011-08-01 18:46:13 +00001344 @classmethod
1345 def skipLongRunningTest(cls):
1346 """
1347 By default, we skip long running test case.
1348 This can be overridden by passing '-l' to the test driver (dotest.py).
1349 """
1350 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1351 return False
1352 else:
1353 return True
Johnny Chened492022011-06-21 00:53:00 +00001354
Vince Harron6d3d0f12015-05-10 22:01:59 +00001355 def enableLogChannelsForCurrentTest(self):
1356 if len(lldbtest_config.channels) == 0:
1357 return
1358
1359 # if debug channels are specified in lldbtest_config.channels,
1360 # create a new set of log files for every test
1361 log_basename = self.getLogBasenameForCurrentTest()
1362
1363 # confirm that the file is writeable
1364 host_log_path = "{}-host.log".format(log_basename)
1365 open(host_log_path, 'w').close()
1366
1367 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1368 for channel_with_categories in lldbtest_config.channels:
1369 channel_then_categories = channel_with_categories.split(' ', 1)
1370 channel = channel_then_categories[0]
1371 if len(channel_then_categories) > 1:
1372 categories = channel_then_categories[1]
1373 else:
1374 categories = "default"
1375
1376 if channel == "gdb-remote":
1377 # communicate gdb-remote categories to debugserver
1378 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1379
1380 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1381 if not self.res.Succeeded():
1382 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1383
1384 # Communicate log path name to debugserver & lldb-server
1385 server_log_path = "{}-server.log".format(log_basename)
1386 open(server_log_path, 'w').close()
1387 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
1388
1389 # Communicate channels to lldb-server
1390 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
1391
1392 if len(lldbtest_config.channels) == 0:
1393 return
1394
1395 def disableLogChannelsForCurrentTest(self):
1396 # close all log files that we opened
1397 for channel_and_categories in lldbtest_config.channels:
1398 # channel format - <channel-name> [<category0> [<category1> ...]]
1399 channel = channel_and_categories.split(' ', 1)[0]
1400 self.ci.HandleCommand("log disable " + channel, self.res)
1401 if not self.res.Succeeded():
1402 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1403
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001404 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001405 """Fixture for unittest test case setup.
1406
1407 It works with the test driver to conditionally skip tests and does other
1408 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001409 #import traceback
1410 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001411
Daniel Malea9115f072013-08-06 15:02:32 +00001412 if "LIBCXX_PATH" in os.environ:
1413 self.libcxxPath = os.environ["LIBCXX_PATH"]
1414 else:
1415 self.libcxxPath = None
1416
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001417 if "LLDBMI_EXEC" in os.environ:
1418 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1419 else:
1420 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001421
Johnny Chenebe51722011-10-07 19:21:09 +00001422 # If we spawn an lldb process for test (via pexpect), do not load the
1423 # init file unless told otherwise.
1424 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1425 self.lldbOption = ""
1426 else:
1427 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001428
Johnny Chen985e7402011-08-01 21:13:26 +00001429 # Assign the test method name to self.testMethodName.
1430 #
1431 # For an example of the use of this attribute, look at test/types dir.
1432 # There are a bunch of test cases under test/types and we don't want the
1433 # module cacheing subsystem to be confused with executable name "a.out"
1434 # used for all the test cases.
1435 self.testMethodName = self._testMethodName
1436
Johnny Chen5ccbccf2011-07-30 01:39:58 +00001437 # Benchmarks test is decorated with @benchmarks_test,
1438 # which also sets the "__benchmarks_test__" attribute of the
1439 # function object to True.
1440 try:
1441 if lldb.just_do_benchmarks_test:
1442 testMethod = getattr(self, self._testMethodName)
1443 if getattr(testMethod, "__benchmarks_test__", False):
1444 pass
1445 else:
1446 self.skipTest("non benchmarks test")
Johnny Chen4533dad2011-05-31 23:21:42 +00001447 except AttributeError:
1448 pass
Johnny Chenf3e22ac2010-12-10 18:52:10 +00001449
Johnny Chen985e7402011-08-01 21:13:26 +00001450 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1451 # with it using pexpect.
1452 self.child = None
1453 self.child_prompt = "(lldb) "
1454 # If the child is interacting with the embedded script interpreter,
1455 # there are two exits required during tear down, first to quit the
1456 # embedded script interpreter and second to quit the lldb command
1457 # interpreter.
1458 self.child_in_script_interpreter = False
1459
Johnny Chenfb4264c2011-08-01 19:50:58 +00001460 # These are for customized teardown cleanup.
1461 self.dict = None
1462 self.doTearDownCleanup = False
1463 # And in rare cases where there are multiple teardown cleanups.
1464 self.dicts = []
1465 self.doTearDownCleanups = False
1466
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001467 # List of spawned subproces.Popen objects
1468 self.subprocesses = []
1469
Daniel Malea69207462013-06-05 21:07:02 +00001470 # List of forked process PIDs
1471 self.forkedProcessPids = []
1472
Johnny Chenfb4264c2011-08-01 19:50:58 +00001473 # Create a string buffer to record the session info, to be dumped into a
1474 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001475 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001476
Vince Harron1f160372015-05-21 18:51:20 +00001477 session_file = "{}.log".format(self.log_basename)
Zachary Turner8d13fab2015-11-07 01:08:15 +00001478 # Python 3 doesn't support unbuffered I/O in text mode. Open buffered.
1479 self.session = open(session_file, "w")
Johnny Chenfb4264c2011-08-01 19:50:58 +00001480
1481 # Optimistically set __errored__, __failed__, __expected__ to False
1482 # initially. If the test errored/failed, the session info
1483 # (self.session) is then dumped into a session specific file for
1484 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001485 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001486 self.__errored__ = False
1487 self.__failed__ = False
1488 self.__expected__ = False
1489 # We are also interested in unexpected success.
1490 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001491 # And skipped tests.
1492 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001493
1494 # See addTearDownHook(self, hook) which allows the client to add a hook
1495 # function to be run during tearDown() time.
1496 self.hooks = []
1497
1498 # See HideStdout(self).
1499 self.sys_stdout_hidden = False
1500
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001501 if self.platformContext:
1502 # set environment variable names for finding shared libraries
1503 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001504
Vince Harron6d3d0f12015-05-10 22:01:59 +00001505 # Create the debugger instance if necessary.
1506 try:
1507 self.dbg = lldb.DBG
1508 except AttributeError:
1509 self.dbg = lldb.SBDebugger.Create()
1510
1511 if not self.dbg:
1512 raise Exception('Invalid debugger instance')
1513
1514 # Retrieve the associated command interpreter instance.
1515 self.ci = self.dbg.GetCommandInterpreter()
1516 if not self.ci:
1517 raise Exception('Could not get the command interpreter')
1518
1519 # And the result object.
1520 self.res = lldb.SBCommandReturnObject()
1521
1522 self.enableLogChannelsForCurrentTest()
1523
Ying Chen0c352822015-11-16 23:41:02 +00001524 #Initialize debug_info
1525 self.debug_info = None
1526
Johnny Chen2a808582011-10-19 16:48:07 +00001527 def runHooks(self, child=None, child_prompt=None, use_cmd_api=False):
Johnny Chena737ba52011-10-19 01:06:21 +00001528 """Perform the run hooks to bring lldb debugger to the desired state.
1529
Johnny Chen2a808582011-10-19 16:48:07 +00001530 By default, expect a pexpect spawned child and child prompt to be
1531 supplied (use_cmd_api=False). If use_cmd_api is true, ignore the child
1532 and child prompt and use self.runCmd() to run the hooks one by one.
1533
Johnny Chena737ba52011-10-19 01:06:21 +00001534 Note that child is a process spawned by pexpect.spawn(). If not, your
1535 test case is mostly likely going to fail.
1536
1537 See also dotest.py where lldb.runHooks are processed/populated.
1538 """
1539 if not lldb.runHooks:
1540 self.skipTest("No runhooks specified for lldb, skip the test")
Johnny Chen2a808582011-10-19 16:48:07 +00001541 if use_cmd_api:
1542 for hook in lldb.runhooks:
1543 self.runCmd(hook)
1544 else:
1545 if not child or not child_prompt:
1546 self.fail("Both child and child_prompt need to be defined.")
1547 for hook in lldb.runHooks:
1548 child.sendline(hook)
1549 child.expect_exact(child_prompt)
Johnny Chena737ba52011-10-19 01:06:21 +00001550
Daniel Malea249287a2013-02-19 16:08:57 +00001551 def setAsync(self, value):
1552 """ Sets async mode to True/False and ensures it is reset after the testcase completes."""
1553 old_async = self.dbg.GetAsync()
1554 self.dbg.SetAsync(value)
1555 self.addTearDownHook(lambda: self.dbg.SetAsync(old_async))
1556
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001557 def cleanupSubprocesses(self):
1558 # Ensure any subprocesses are cleaned up
1559 for p in self.subprocesses:
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001560 p.terminate()
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001561 del p
1562 del self.subprocesses[:]
Daniel Malea69207462013-06-05 21:07:02 +00001563 # Ensure any forked processes are cleaned up
1564 for pid in self.forkedProcessPids:
1565 if os.path.exists("/proc/" + str(pid)):
1566 os.kill(pid, signal.SIGTERM)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001567
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001568 def spawnSubprocess(self, executable, args=[], install_remote=True):
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001569 """ Creates a subprocess.Popen object with the specified executable and arguments,
1570 saves it in self.subprocesses, and returns the object.
1571 NOTE: if using this function, ensure you also call:
1572
1573 self.addTearDownHook(self.cleanupSubprocesses)
1574
1575 otherwise the test suite will leak processes.
1576 """
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001577 proc = _RemoteProcess(install_remote) if lldb.remote_platform else _LocalProcess(self.TraceOn())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001578 proc.launch(executable, args)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001579 self.subprocesses.append(proc)
1580 return proc
1581
Daniel Malea69207462013-06-05 21:07:02 +00001582 def forkSubprocess(self, executable, args=[]):
1583 """ Fork a subprocess with its own group ID.
1584 NOTE: if using this function, ensure you also call:
1585
1586 self.addTearDownHook(self.cleanupSubprocesses)
1587
1588 otherwise the test suite will leak processes.
1589 """
1590 child_pid = os.fork()
1591 if child_pid == 0:
1592 # If more I/O support is required, this can be beefed up.
1593 fd = os.open(os.devnull, os.O_RDWR)
Daniel Malea69207462013-06-05 21:07:02 +00001594 os.dup2(fd, 1)
1595 os.dup2(fd, 2)
1596 # This call causes the child to have its of group ID
1597 os.setpgid(0,0)
1598 os.execvp(executable, [executable] + args)
1599 # Give the child time to get through the execvp() call
1600 time.sleep(0.1)
1601 self.forkedProcessPids.append(child_pid)
1602 return child_pid
1603
Johnny Chenfb4264c2011-08-01 19:50:58 +00001604 def HideStdout(self):
1605 """Hide output to stdout from the user.
1606
1607 During test execution, there might be cases where we don't want to show the
1608 standard output to the user. For example,
1609
Zachary Turner35d017f2015-10-23 17:04:29 +00001610 self.runCmd(r'''sc print("\n\n\tHello!\n")''')
Johnny Chenfb4264c2011-08-01 19:50:58 +00001611
1612 tests whether command abbreviation for 'script' works or not. There is no
1613 need to show the 'Hello' output to the user as long as the 'script' command
1614 succeeds and we are not in TraceOn() mode (see the '-t' option).
1615
1616 In this case, the test method calls self.HideStdout(self) to redirect the
1617 sys.stdout to a null device, and restores the sys.stdout upon teardown.
1618
1619 Note that you should only call this method at most once during a test case
1620 execution. Any subsequent call has no effect at all."""
1621 if self.sys_stdout_hidden:
1622 return
1623
1624 self.sys_stdout_hidden = True
1625 old_stdout = sys.stdout
1626 sys.stdout = open(os.devnull, 'w')
1627 def restore_stdout():
1628 sys.stdout = old_stdout
1629 self.addTearDownHook(restore_stdout)
1630
1631 # =======================================================================
1632 # Methods for customized teardown cleanups as well as execution of hooks.
1633 # =======================================================================
1634
1635 def setTearDownCleanup(self, dictionary=None):
1636 """Register a cleanup action at tearDown() time with a dictinary"""
1637 self.dict = dictionary
1638 self.doTearDownCleanup = True
1639
1640 def addTearDownCleanup(self, dictionary):
1641 """Add a cleanup action at tearDown() time with a dictinary"""
1642 self.dicts.append(dictionary)
1643 self.doTearDownCleanups = True
1644
1645 def addTearDownHook(self, hook):
1646 """
1647 Add a function to be run during tearDown() time.
1648
1649 Hooks are executed in a first come first serve manner.
1650 """
Zachary Turnercd236b82015-10-26 18:48:24 +00001651 if six.callable(hook):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001652 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001653 print("Adding tearDown hook:", getsource_if_available(hook), file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001654 self.hooks.append(hook)
Enrico Granataab0e8312014-11-05 21:31:57 +00001655
1656 return self
Johnny Chenfb4264c2011-08-01 19:50:58 +00001657
Jim Inghamda3a3862014-10-16 23:02:14 +00001658 def deletePexpectChild(self):
Johnny Chen985e7402011-08-01 21:13:26 +00001659 # This is for the case of directly spawning 'lldb' and interacting with it
1660 # using pexpect.
Johnny Chen985e7402011-08-01 21:13:26 +00001661 if self.child and self.child.isalive():
Zachary Turner9ef307b2014-07-22 16:19:29 +00001662 import pexpect
Johnny Chen985e7402011-08-01 21:13:26 +00001663 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001664 print("tearing down the child process....", file=sbuf)
Johnny Chen985e7402011-08-01 21:13:26 +00001665 try:
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001666 if self.child_in_script_interpreter:
1667 self.child.sendline('quit()')
1668 self.child.expect_exact(self.child_prompt)
1669 self.child.sendline('settings set interpreter.prompt-on-quit false')
1670 self.child.sendline('quit')
Johnny Chen985e7402011-08-01 21:13:26 +00001671 self.child.expect(pexpect.EOF)
Ilia K47448c22015-02-11 21:41:58 +00001672 except (ValueError, pexpect.ExceptionPexpect):
1673 # child is already terminated
1674 pass
1675 except OSError as exception:
1676 import errno
1677 if exception.errno != errno.EIO:
1678 # unexpected error
1679 raise
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001680 # child is already terminated
Johnny Chen985e7402011-08-01 21:13:26 +00001681 pass
Shawn Besteb3e9052014-11-06 17:52:15 +00001682 finally:
1683 # Give it one final blow to make sure the child is terminated.
1684 self.child.close()
Jim Inghamda3a3862014-10-16 23:02:14 +00001685
1686 def tearDown(self):
1687 """Fixture for unittest test case teardown."""
1688 #import traceback
1689 #traceback.print_stack()
1690
1691 self.deletePexpectChild()
1692
Johnny Chenfb4264c2011-08-01 19:50:58 +00001693 # Check and run any hook functions.
1694 for hook in reversed(self.hooks):
1695 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001696 print("Executing tearDown hook:", getsource_if_available(hook), file=sbuf)
Enrico Granataab0e8312014-11-05 21:31:57 +00001697 import inspect
1698 hook_argc = len(inspect.getargspec(hook).args)
Enrico Granata6e0566c2014-11-17 19:00:20 +00001699 if hook_argc == 0 or getattr(hook,'im_self',None):
Enrico Granataab0e8312014-11-05 21:31:57 +00001700 hook()
1701 elif hook_argc == 1:
1702 hook(self)
1703 else:
1704 hook() # try the plain call and hope it works
Johnny Chenfb4264c2011-08-01 19:50:58 +00001705
1706 del self.hooks
1707
1708 # Perform registered teardown cleanup.
1709 if doCleanup and self.doTearDownCleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00001710 self.cleanup(dictionary=self.dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001711
1712 # In rare cases where there are multiple teardown cleanups added.
1713 if doCleanup and self.doTearDownCleanups:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001714 if self.dicts:
1715 for dict in reversed(self.dicts):
Johnny Chen0fddfb22011-11-17 19:57:27 +00001716 self.cleanup(dictionary=dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001717
Vince Harron9753dd92015-05-10 15:22:09 +00001718 self.disableLogChannelsForCurrentTest()
1719
Johnny Chenfb4264c2011-08-01 19:50:58 +00001720 # =========================================================
1721 # Various callbacks to allow introspection of test progress
1722 # =========================================================
1723
1724 def markError(self):
1725 """Callback invoked when an error (unexpected exception) errored."""
1726 self.__errored__ = True
1727 with recording(self, False) as sbuf:
1728 # False because there's no need to write "ERROR" to the stderr twice.
1729 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001730 print("ERROR", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001731
Zachary Turnerb1490b62015-08-26 19:44:56 +00001732 def markCleanupError(self):
1733 """Callback invoked when an error occurs while a test is cleaning up."""
1734 self.__cleanup_errored__ = True
1735 with recording(self, False) as sbuf:
1736 # False because there's no need to write "CLEANUP_ERROR" to the stderr twice.
1737 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001738 print("CLEANUP_ERROR", file=sbuf)
Zachary Turnerb1490b62015-08-26 19:44:56 +00001739
Johnny Chenfb4264c2011-08-01 19:50:58 +00001740 def markFailure(self):
1741 """Callback invoked when a failure (test assertion failure) occurred."""
1742 self.__failed__ = True
1743 with recording(self, False) as sbuf:
1744 # False because there's no need to write "FAIL" to the stderr twice.
1745 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001746 print("FAIL", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001747
Enrico Granatae6cedc12013-02-23 01:05:23 +00001748 def markExpectedFailure(self,err,bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001749 """Callback invoked when an expected failure/error occurred."""
1750 self.__expected__ = True
1751 with recording(self, False) as sbuf:
1752 # False because there's no need to write "expected failure" to the
1753 # stderr twice.
1754 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001755 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001756 print("expected failure", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001757 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001758 print("expected failure (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001759
Johnny Chenc5cc6252011-08-15 23:09:08 +00001760 def markSkippedTest(self):
1761 """Callback invoked when a test is skipped."""
1762 self.__skipped__ = True
1763 with recording(self, False) as sbuf:
1764 # False because there's no need to write "skipped test" to the
1765 # stderr twice.
1766 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001767 print("skipped test", file=sbuf)
Johnny Chenc5cc6252011-08-15 23:09:08 +00001768
Enrico Granatae6cedc12013-02-23 01:05:23 +00001769 def markUnexpectedSuccess(self, bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001770 """Callback invoked when an unexpected success occurred."""
1771 self.__unexpected__ = True
1772 with recording(self, False) as sbuf:
1773 # False because there's no need to write "unexpected success" to the
1774 # stderr twice.
1775 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001776 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001777 print("unexpected success", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001778 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001779 print("unexpected success (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001780
Greg Clayton70995582015-01-07 22:25:50 +00001781 def getRerunArgs(self):
1782 return " -f %s.%s" % (self.__class__.__name__, self._testMethodName)
Vince Harron9753dd92015-05-10 15:22:09 +00001783
1784 def getLogBasenameForCurrentTest(self, prefix=None):
1785 """
1786 returns a partial path that can be used as the beginning of the name of multiple
1787 log files pertaining to this test
1788
1789 <session-dir>/<arch>-<compiler>-<test-file>.<test-class>.<test-method>
1790 """
1791 dname = os.path.join(os.environ["LLDB_TEST"],
1792 os.environ["LLDB_SESSION_DIRNAME"])
1793 if not os.path.isdir(dname):
1794 os.mkdir(dname)
1795
1796 compiler = self.getCompiler()
1797
1798 if compiler[1] == ':':
1799 compiler = compiler[2:]
Chaoren Lin636a0e32015-07-17 21:40:11 +00001800 if os.path.altsep is not None:
1801 compiler = compiler.replace(os.path.altsep, os.path.sep)
Vince Harron9753dd92015-05-10 15:22:09 +00001802
Vince Harron19e300f2015-05-12 00:50:54 +00001803 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), "_".join(compiler.split(os.path.sep)))
Vince Harron9753dd92015-05-10 15:22:09 +00001804 if len(fname) > 200:
Vince Harron19e300f2015-05-12 00:50:54 +00001805 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), compiler.split(os.path.sep)[-1])
Vince Harron9753dd92015-05-10 15:22:09 +00001806
1807 if prefix is not None:
1808 fname = "{}-{}".format(prefix, fname)
1809
1810 return os.path.join(dname, fname)
1811
Johnny Chenfb4264c2011-08-01 19:50:58 +00001812 def dumpSessionInfo(self):
1813 """
1814 Dump the debugger interactions leading to a test error/failure. This
1815 allows for more convenient postmortem analysis.
1816
1817 See also LLDBTestResult (dotest.py) which is a singlton class derived
1818 from TextTestResult and overwrites addError, addFailure, and
1819 addExpectedFailure methods to allow us to to mark the test instance as
1820 such.
1821 """
1822
1823 # We are here because self.tearDown() detected that this test instance
1824 # either errored or failed. The lldb.test_result singleton contains
1825 # two lists (erros and failures) which get populated by the unittest
1826 # framework. Look over there for stack trace information.
1827 #
1828 # The lists contain 2-tuples of TestCase instances and strings holding
1829 # formatted tracebacks.
1830 #
1831 # See http://docs.python.org/library/unittest.html#unittest.TestResult.
Vince Harron9753dd92015-05-10 15:22:09 +00001832
Vince Harron35b17dc2015-05-21 18:20:21 +00001833 # output tracebacks into session
Vince Harron9753dd92015-05-10 15:22:09 +00001834 pairs = []
Johnny Chenfb4264c2011-08-01 19:50:58 +00001835 if self.__errored__:
1836 pairs = lldb.test_result.errors
1837 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001838 elif self.__cleanup_errored__:
Zachary Turnerb1490b62015-08-26 19:44:56 +00001839 pairs = lldb.test_result.cleanup_errors
1840 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001841 elif self.__failed__:
1842 pairs = lldb.test_result.failures
1843 prefix = 'Failure'
1844 elif self.__expected__:
1845 pairs = lldb.test_result.expectedFailures
1846 prefix = 'ExpectedFailure'
Johnny Chenc5cc6252011-08-15 23:09:08 +00001847 elif self.__skipped__:
1848 prefix = 'SkippedTest'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001849 elif self.__unexpected__:
Vince Harron35b17dc2015-05-21 18:20:21 +00001850 prefix = 'UnexpectedSuccess'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001851 else:
Vince Harron35b17dc2015-05-21 18:20:21 +00001852 prefix = 'Success'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001853
Johnny Chenc5cc6252011-08-15 23:09:08 +00001854 if not self.__unexpected__ and not self.__skipped__:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001855 for test, traceback in pairs:
1856 if test is self:
Zachary Turnerff890da2015-10-19 23:45:41 +00001857 print(traceback, file=self.session)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001858
Vince Harron35b17dc2015-05-21 18:20:21 +00001859 # put footer (timestamp/rerun instructions) into session
Johnny Chen8082a002011-08-11 00:16:28 +00001860 testMethod = getattr(self, self._testMethodName)
1861 if getattr(testMethod, "__benchmarks_test__", False):
1862 benchmarks = True
1863 else:
1864 benchmarks = False
1865
Vince Harron35b17dc2015-05-21 18:20:21 +00001866 import datetime
Zachary Turnerff890da2015-10-19 23:45:41 +00001867 print("Session info generated @", datetime.datetime.now().ctime(), file=self.session)
1868 print("To rerun this test, issue the following command from the 'test' directory:\n", file=self.session)
1869 print("./dotest.py %s -v %s %s" % (self.getRunOptions(),
Vince Harron35b17dc2015-05-21 18:20:21 +00001870 ('+b' if benchmarks else '-t'),
Zachary Turnerff890da2015-10-19 23:45:41 +00001871 self.getRerunArgs()), file=self.session)
Vince Harron35b17dc2015-05-21 18:20:21 +00001872 self.session.close()
1873 del self.session
1874
1875 # process the log files
Vince Harron1f160372015-05-21 18:51:20 +00001876 log_files_for_this_test = glob.glob(self.log_basename + "*")
Vince Harron35b17dc2015-05-21 18:20:21 +00001877
1878 if prefix != 'Success' or lldbtest_config.log_success:
1879 # keep all log files, rename them to include prefix
1880 dst_log_basename = self.getLogBasenameForCurrentTest(prefix)
1881 for src in log_files_for_this_test:
Zachary Turner306278f2015-05-26 20:26:29 +00001882 if os.path.isfile(src):
1883 dst = src.replace(self.log_basename, dst_log_basename)
1884 if os.name == "nt" and os.path.isfile(dst):
1885 # On Windows, renaming a -> b will throw an exception if b exists. On non-Windows platforms
1886 # it silently replaces the destination. Ultimately this means that atomic renames are not
1887 # guaranteed to be possible on Windows, but we need this to work anyway, so just remove the
1888 # destination first if it already exists.
1889 os.remove(dst)
Zachary Turner5de068b2015-05-26 19:52:24 +00001890
Zachary Turner306278f2015-05-26 20:26:29 +00001891 os.rename(src, dst)
Vince Harron35b17dc2015-05-21 18:20:21 +00001892 else:
1893 # success! (and we don't want log files) delete log files
1894 for log_file in log_files_for_this_test:
Adrian McCarthya7292042015-09-04 20:48:48 +00001895 try:
1896 os.unlink(log_file)
1897 except:
1898 # We've seen consistent unlink failures on Windows, perhaps because the
1899 # just-created log file is being scanned by anti-virus. Empirically, this
1900 # sleep-and-retry approach allows tests to succeed much more reliably.
1901 # Attempts to figure out exactly what process was still holding a file handle
1902 # have failed because running instrumentation like Process Monitor seems to
1903 # slow things down enough that the problem becomes much less consistent.
1904 time.sleep(0.5)
1905 os.unlink(log_file)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001906
1907 # ====================================================
1908 # Config. methods supported through a plugin interface
1909 # (enables reading of the current test configuration)
1910 # ====================================================
1911
1912 def getArchitecture(self):
1913 """Returns the architecture in effect the test suite is running with."""
1914 module = builder_module()
Ed Maste0f434e62015-04-06 15:50:48 +00001915 arch = module.getArchitecture()
1916 if arch == 'amd64':
1917 arch = 'x86_64'
1918 return arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001919
Vince Harron02613762015-05-04 00:17:53 +00001920 def getLldbArchitecture(self):
1921 """Returns the architecture of the lldb binary."""
1922 if not hasattr(self, 'lldbArchitecture'):
1923
1924 # spawn local process
1925 command = [
Vince Harron790d95c2015-05-18 19:39:03 +00001926 lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001927 "-o",
Vince Harron790d95c2015-05-18 19:39:03 +00001928 "file " + lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001929 "-o",
1930 "quit"
1931 ]
1932
1933 output = check_output(command)
1934 str = output.decode("utf-8");
1935
1936 for line in str.splitlines():
1937 m = re.search("Current executable set to '.*' \\((.*)\\)\\.", line)
1938 if m:
1939 self.lldbArchitecture = m.group(1)
1940 break
1941
1942 return self.lldbArchitecture
1943
Johnny Chenfb4264c2011-08-01 19:50:58 +00001944 def getCompiler(self):
1945 """Returns the compiler in effect the test suite is running with."""
1946 module = builder_module()
1947 return module.getCompiler()
1948
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001949 def getCompilerBinary(self):
1950 """Returns the compiler binary the test suite is running with."""
1951 return self.getCompiler().split()[0]
1952
Daniel Malea0aea0162013-02-27 17:29:46 +00001953 def getCompilerVersion(self):
1954 """ Returns a string that represents the compiler version.
1955 Supports: llvm, clang.
1956 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00001957 from .lldbutil import which
Daniel Malea0aea0162013-02-27 17:29:46 +00001958 version = 'unknown'
1959
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001960 compiler = self.getCompilerBinary()
Zachary Turner9ef307b2014-07-22 16:19:29 +00001961 version_output = system([[which(compiler), "-v"]])[1]
Daniel Malea0aea0162013-02-27 17:29:46 +00001962 for line in version_output.split(os.linesep):
Greg Clayton2a844b72013-03-06 02:34:51 +00001963 m = re.search('version ([0-9\.]+)', line)
Daniel Malea0aea0162013-02-27 17:29:46 +00001964 if m:
1965 version = m.group(1)
1966 return version
1967
Ryan Brown57bee1e2015-09-14 22:45:11 +00001968 def getGoCompilerVersion(self):
1969 """ Returns a string that represents the go compiler version, or None if go is not found.
1970 """
1971 compiler = which("go")
1972 if compiler:
1973 version_output = system([[compiler, "version"]])[0]
1974 for line in version_output.split(os.linesep):
1975 m = re.search('go version (devel|go\\S+)', line)
1976 if m:
1977 return m.group(1)
1978 return None
1979
Greg Claytone0d0a762015-04-02 18:24:03 +00001980 def platformIsDarwin(self):
1981 """Returns true if the OS triple for the selected platform is any valid apple OS"""
Robert Flackfb2f6c62015-04-17 08:02:18 +00001982 return platformIsDarwin()
Vince Harron20952cc2015-04-03 01:00:06 +00001983
Robert Flack13c7ad92015-03-30 14:12:17 +00001984 def getPlatform(self):
Robert Flackfb2f6c62015-04-17 08:02:18 +00001985 """Returns the target platform the test suite is running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001986 return getPlatform()
Robert Flack13c7ad92015-03-30 14:12:17 +00001987
Daniel Maleaadaaec92013-08-06 20:51:41 +00001988 def isIntelCompiler(self):
1989 """ Returns true if using an Intel (ICC) compiler, false otherwise. """
1990 return any([x in self.getCompiler() for x in ["icc", "icpc", "icl"]])
1991
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001992 def expectedCompilerVersion(self, compiler_version):
1993 """Returns True iff compiler_version[1] matches the current compiler version.
1994 Use compiler_version[0] to specify the operator used to determine if a match has occurred.
1995 Any operator other than the following defaults to an equality test:
1996 '>', '>=', "=>", '<', '<=', '=<', '!=', "!" or 'not'
1997 """
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001998 if (compiler_version == None):
1999 return True
2000 operator = str(compiler_version[0])
2001 version = compiler_version[1]
2002
2003 if (version == None):
2004 return True
2005 if (operator == '>'):
2006 return self.getCompilerVersion() > version
2007 if (operator == '>=' or operator == '=>'):
2008 return self.getCompilerVersion() >= version
2009 if (operator == '<'):
2010 return self.getCompilerVersion() < version
2011 if (operator == '<=' or operator == '=<'):
2012 return self.getCompilerVersion() <= version
2013 if (operator == '!=' or operator == '!' or operator == 'not'):
2014 return str(version) not in str(self.getCompilerVersion())
2015 return str(version) in str(self.getCompilerVersion())
2016
2017 def expectedCompiler(self, compilers):
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00002018 """Returns True iff any element of compilers is a sub-string of the current compiler."""
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00002019 if (compilers == None):
2020 return True
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00002021
2022 for compiler in compilers:
2023 if compiler in self.getCompiler():
2024 return True
2025
2026 return False
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00002027
Ying Chen7091c2c2015-04-21 01:15:47 +00002028 def expectedArch(self, archs):
2029 """Returns True iff any element of archs is a sub-string of the current architecture."""
2030 if (archs == None):
2031 return True
2032
2033 for arch in archs:
2034 if arch in self.getArchitecture():
2035 return True
2036
2037 return False
2038
Johnny Chenfb4264c2011-08-01 19:50:58 +00002039 def getRunOptions(self):
2040 """Command line option for -A and -C to run this test again, called from
2041 self.dumpSessionInfo()."""
2042 arch = self.getArchitecture()
2043 comp = self.getCompiler()
Johnny Chenb7bdd102011-08-24 19:48:51 +00002044 if arch:
2045 option_str = "-A " + arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00002046 else:
Johnny Chenb7bdd102011-08-24 19:48:51 +00002047 option_str = ""
2048 if comp:
Johnny Chen531c0852012-03-16 20:44:00 +00002049 option_str += " -C " + comp
Johnny Chenb7bdd102011-08-24 19:48:51 +00002050 return option_str
Johnny Chenfb4264c2011-08-01 19:50:58 +00002051
2052 # ==================================================
2053 # Build methods supported through a plugin interface
2054 # ==================================================
2055
Ed Mastec97323e2014-04-01 18:47:58 +00002056 def getstdlibFlag(self):
2057 """ Returns the proper -stdlib flag, or empty if not required."""
Robert Flack4629c4b2015-05-15 18:54:32 +00002058 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Ed Mastec97323e2014-04-01 18:47:58 +00002059 stdlibflag = "-stdlib=libc++"
2060 else:
2061 stdlibflag = ""
2062 return stdlibflag
2063
Matt Kopec7663b3a2013-09-25 17:44:00 +00002064 def getstdFlag(self):
2065 """ Returns the proper stdflag. """
Daniel Malea55faa402013-05-02 21:44:31 +00002066 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
Daniel Malea0b7c6112013-05-06 19:31:31 +00002067 stdflag = "-std=c++0x"
Daniel Malea55faa402013-05-02 21:44:31 +00002068 else:
2069 stdflag = "-std=c++11"
Matt Kopec7663b3a2013-09-25 17:44:00 +00002070 return stdflag
2071
2072 def buildDriver(self, sources, exe_name):
2073 """ Platform-specific way to build a program that links with LLDB (via the liblldb.so
2074 or LLDB.framework).
2075 """
2076
2077 stdflag = self.getstdFlag()
Ed Mastec97323e2014-04-01 18:47:58 +00002078 stdlibflag = self.getstdlibFlag()
Greg Clayton22fd3b12015-10-26 17:52:16 +00002079
2080 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002081 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002082 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Daniel Malea55faa402013-05-02 21:44:31 +00002083 d = {'CXX_SOURCES' : sources,
2084 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002085 'CFLAGS_EXTRAS' : "%s %s" % (stdflag, stdlibflag),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002086 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2087 'LD_EXTRAS' : "%s -Wl,-rpath,%s" % (dsym, lib_dir),
Daniel Malea55faa402013-05-02 21:44:31 +00002088 }
Ed Maste372c24d2013-07-25 21:02:34 +00002089 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 +00002090 d = {'CXX_SOURCES' : sources,
Daniel Malea55faa402013-05-02 21:44:31 +00002091 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002092 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002093 'LD_EXTRAS' : "-L%s -llldb" % lib_dir}
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002094 elif sys.platform.startswith('win'):
2095 d = {'CXX_SOURCES' : sources,
2096 'EXE' : exe_name,
2097 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002098 'LD_EXTRAS' : "-L%s -lliblldb" % os.environ["LLDB_IMPLIB_DIR"]}
Daniel Malea55faa402013-05-02 21:44:31 +00002099 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002100 print("Building LLDB Driver (%s) from sources %s" % (exe_name, sources))
Daniel Malea55faa402013-05-02 21:44:31 +00002101
2102 self.buildDefault(dictionary=d)
2103
Matt Kopec7663b3a2013-09-25 17:44:00 +00002104 def buildLibrary(self, sources, lib_name):
2105 """Platform specific way to build a default library. """
2106
2107 stdflag = self.getstdFlag()
2108
Greg Clayton22fd3b12015-10-26 17:52:16 +00002109 lib_dir = os.environ["LLDB_LIB_DIR"]
Robert Flack4629c4b2015-05-15 18:54:32 +00002110 if self.platformIsDarwin():
Greg Clayton22fd3b12015-10-26 17:52:16 +00002111 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Matt Kopec7663b3a2013-09-25 17:44:00 +00002112 d = {'DYLIB_CXX_SOURCES' : sources,
2113 'DYLIB_NAME' : lib_name,
2114 'CFLAGS_EXTRAS' : "%s -stdlib=libc++" % stdflag,
Greg Clayton22fd3b12015-10-26 17:52:16 +00002115 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2116 'LD_EXTRAS' : "%s -Wl,-rpath,%s -dynamiclib" % (dsym, lib_dir),
Matt Kopec7663b3a2013-09-25 17:44:00 +00002117 }
Robert Flack4629c4b2015-05-15 18:54:32 +00002118 elif self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux' or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Matt Kopec7663b3a2013-09-25 17:44:00 +00002119 d = {'DYLIB_CXX_SOURCES' : sources,
2120 'DYLIB_NAME' : lib_name,
2121 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002122 'LD_EXTRAS' : "-shared -L%s -llldb" % lib_dir}
Robert Flack4629c4b2015-05-15 18:54:32 +00002123 elif self.getPlatform() == 'windows':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002124 d = {'DYLIB_CXX_SOURCES' : sources,
2125 'DYLIB_NAME' : lib_name,
2126 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002127 'LD_EXTRAS' : "-shared -l%s\liblldb.lib" % self.os.environ["LLDB_IMPLIB_DIR"]}
Matt Kopec7663b3a2013-09-25 17:44:00 +00002128 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002129 print("Building LLDB Library (%s) from sources %s" % (lib_name, sources))
Matt Kopec7663b3a2013-09-25 17:44:00 +00002130
2131 self.buildDefault(dictionary=d)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002132
Daniel Malea55faa402013-05-02 21:44:31 +00002133 def buildProgram(self, sources, exe_name):
2134 """ Platform specific way to build an executable from C/C++ sources. """
2135 d = {'CXX_SOURCES' : sources,
2136 'EXE' : exe_name}
2137 self.buildDefault(dictionary=d)
2138
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002139 def buildDefault(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002140 """Platform specific way to build the default binaries."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002141 if lldb.skip_build_and_cleanup:
2142 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002143 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002144 if target_is_android():
2145 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002146 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002147 raise Exception("Don't know how to build default binary")
2148
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002149 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002150 """Platform specific way to build binaries with dsym info."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002151 if lldb.skip_build_and_cleanup:
2152 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002153 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002154 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002155 raise Exception("Don't know how to build binary with dsym")
2156
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002157 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002158 """Platform specific way to build binaries with dwarf maps."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002159 if lldb.skip_build_and_cleanup:
2160 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002161 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002162 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002163 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002164 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002165 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002166
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002167 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2168 """Platform specific way to build binaries with dwarf maps."""
2169 if lldb.skip_build_and_cleanup:
2170 return
2171 module = builder_module()
2172 if target_is_android():
2173 dictionary = append_android_envs(dictionary)
2174 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2175 raise Exception("Don't know how to build binary with dwo")
2176
Ryan Brown57bee1e2015-09-14 22:45:11 +00002177 def buildGo(self):
2178 """Build the default go binary.
2179 """
2180 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2181
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002182 def signBinary(self, binary_path):
2183 if sys.platform.startswith("darwin"):
2184 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2185 call(codesign_cmd, shell=True)
2186
Kuba Breckabeed8212014-09-04 01:03:18 +00002187 def findBuiltClang(self):
2188 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2189 paths_to_try = [
2190 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2191 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2192 "llvm-build/Release/x86_64/Release/bin/clang",
2193 "llvm-build/Debug/x86_64/Debug/bin/clang",
2194 ]
2195 lldb_root_path = os.path.join(os.path.dirname(__file__), "..")
2196 for p in paths_to_try:
2197 path = os.path.join(lldb_root_path, p)
2198 if os.path.exists(path):
2199 return path
Ilia Kd9953052015-03-12 07:19:41 +00002200
2201 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002202 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002203 if os.path.exists(path):
2204 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002205
2206 return os.environ["CC"]
2207
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002208 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002209 """ Returns a dictionary (which can be provided to build* functions above) which
2210 contains OS-specific build flags.
2211 """
2212 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002213 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002214
2215 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002216 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002217 use_libcxx = True
2218
2219 if use_libcxx and self.libcxxPath:
2220 cflags += "-stdlib=libc++ "
2221 if self.libcxxPath:
2222 libcxxInclude = os.path.join(self.libcxxPath, "include")
2223 libcxxLib = os.path.join(self.libcxxPath, "lib")
2224 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2225 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2226
Andrew Kaylor93132f52013-05-28 23:04:25 +00002227 if use_cpp11:
2228 cflags += "-std="
2229 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2230 cflags += "c++0x"
2231 else:
2232 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002233 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002234 cflags += " -stdlib=libc++"
2235 elif "clang" in self.getCompiler():
2236 cflags += " -stdlib=libstdc++"
2237
Andrew Kaylor93132f52013-05-28 23:04:25 +00002238 return {'CFLAGS_EXTRAS' : cflags,
2239 'LD_EXTRAS' : ldflags,
2240 }
2241
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002242 def cleanup(self, dictionary=None):
2243 """Platform specific way to do cleanup after build."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002244 if lldb.skip_build_and_cleanup:
2245 return
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002246 module = builder_module()
2247 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002248 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002249
Daniel Malea55faa402013-05-02 21:44:31 +00002250 def getLLDBLibraryEnvVal(self):
2251 """ Returns the path that the OS-specific library search environment variable
2252 (self.dylibPath) should be set to in order for a program to find the LLDB
2253 library. If an environment variable named self.dylibPath is already set,
2254 the new path is appended to it and returned.
2255 """
2256 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002257 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002258 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002259 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002260 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002261 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002262 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002263 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002264
Ed Maste437f8f62013-09-09 14:04:04 +00002265 def getLibcPlusPlusLibs(self):
Robert Flackfa5ad652015-05-13 20:17:34 +00002266 if self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux':
Ed Maste437f8f62013-09-09 14:04:04 +00002267 return ['libc++.so.1']
2268 else:
2269 return ['libc++.1.dylib','libc++abi.dylib']
2270
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002271# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2272# We change the test methods to create a new test method for each test for each debug info we are
2273# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2274# the new test method we remove the old method at the same time.
2275class LLDBTestCaseFactory(type):
2276 def __new__(cls, name, bases, attrs):
2277 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002278 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002279 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
2280 @dsym_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002281 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002282 def dsym_test_method(self, attrvalue=attrvalue):
2283 self.debug_info = "dsym"
2284 return attrvalue(self)
2285 dsym_method_name = attrname + "_dsym"
2286 dsym_test_method.__name__ = dsym_method_name
2287 newattrs[dsym_method_name] = dsym_test_method
2288
2289 @dwarf_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002290 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002291 def dwarf_test_method(self, attrvalue=attrvalue):
2292 self.debug_info = "dwarf"
2293 return attrvalue(self)
2294 dwarf_method_name = attrname + "_dwarf"
2295 dwarf_test_method.__name__ = dwarf_method_name
2296 newattrs[dwarf_method_name] = dwarf_test_method
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002297
2298 @dwo_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002299 @wraps(attrvalue)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002300 def dwo_test_method(self, attrvalue=attrvalue):
2301 self.debug_info = "dwo"
2302 return attrvalue(self)
2303 dwo_method_name = attrname + "_dwo"
2304 dwo_test_method.__name__ = dwo_method_name
2305 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002306 else:
2307 newattrs[attrname] = attrvalue
2308 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2309
Zachary Turner43a01e42015-10-20 21:06:05 +00002310# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2311@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002312class TestBase(Base):
2313 """
2314 This abstract base class is meant to be subclassed. It provides default
2315 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2316 among other things.
2317
2318 Important things for test class writers:
2319
2320 - Overwrite the mydir class attribute, otherwise your test class won't
2321 run. It specifies the relative directory to the top level 'test' so
2322 the test harness can change to the correct working directory before
2323 running your test.
2324
2325 - The setUp method sets up things to facilitate subsequent interactions
2326 with the debugger as part of the test. These include:
2327 - populate the test method name
2328 - create/get a debugger set with synchronous mode (self.dbg)
2329 - get the command interpreter from with the debugger (self.ci)
2330 - create a result object for use with the command interpreter
2331 (self.res)
2332 - plus other stuffs
2333
2334 - The tearDown method tries to perform some necessary cleanup on behalf
2335 of the test to return the debugger to a good state for the next test.
2336 These include:
2337 - execute any tearDown hooks registered by the test method with
2338 TestBase.addTearDownHook(); examples can be found in
2339 settings/TestSettings.py
2340 - kill the inferior process associated with each target, if any,
2341 and, then delete the target from the debugger's target list
2342 - perform build cleanup before running the next test method in the
2343 same test class; examples of registering for this service can be
2344 found in types/TestIntegerTypes.py with the call:
2345 - self.setTearDownCleanup(dictionary=d)
2346
2347 - Similarly setUpClass and tearDownClass perform classwise setup and
2348 teardown fixtures. The tearDownClass method invokes a default build
2349 cleanup for the entire test class; also, subclasses can implement the
2350 classmethod classCleanup(cls) to perform special class cleanup action.
2351
2352 - The instance methods runCmd and expect are used heavily by existing
2353 test cases to send a command to the command interpreter and to perform
2354 string/pattern matching on the output of such command execution. The
2355 expect method also provides a mode to peform string/pattern matching
2356 without running a command.
2357
2358 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2359 build the binaries used during a particular test scenario. A plugin
2360 should be provided for the sys.platform running the test suite. The
2361 Mac OS X implementation is located in plugins/darwin.py.
2362 """
2363
2364 # Maximum allowed attempts when launching the inferior process.
2365 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2366 maxLaunchCount = 3;
2367
2368 # Time to wait before the next launching attempt in second(s).
2369 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2370 timeWaitNextLaunch = 1.0;
2371
2372 def doDelay(self):
2373 """See option -w of dotest.py."""
2374 if ("LLDB_WAIT_BETWEEN_TEST_CASES" in os.environ and
2375 os.environ["LLDB_WAIT_BETWEEN_TEST_CASES"] == 'YES'):
2376 waitTime = 1.0
2377 if "LLDB_TIME_WAIT_BETWEEN_TEST_CASES" in os.environ:
2378 waitTime = float(os.environ["LLDB_TIME_WAIT_BETWEEN_TEST_CASES"])
2379 time.sleep(waitTime)
2380
Enrico Granata165f8af2012-09-21 19:10:53 +00002381 # Returns the list of categories to which this test case belongs
2382 # by default, look for a ".categories" file, and read its contents
2383 # if no such file exists, traverse the hierarchy - we guarantee
2384 # a .categories to exist at the top level directory so we do not end up
2385 # looping endlessly - subclasses are free to define their own categories
2386 # in whatever way makes sense to them
2387 def getCategories(self):
2388 import inspect
2389 import os.path
2390 folder = inspect.getfile(self.__class__)
2391 folder = os.path.dirname(folder)
2392 while folder != '/':
2393 categories_file_name = os.path.join(folder,".categories")
2394 if os.path.exists(categories_file_name):
2395 categories_file = open(categories_file_name,'r')
2396 categories = categories_file.readline()
2397 categories_file.close()
2398 categories = str.replace(categories,'\n','')
2399 categories = str.replace(categories,'\r','')
2400 return categories.split(',')
2401 else:
2402 folder = os.path.dirname(folder)
2403 continue
2404
Johnny Chena74bb0a2011-08-01 18:46:13 +00002405 def setUp(self):
2406 #import traceback
2407 #traceback.print_stack()
2408
2409 # Works with the test driver to conditionally skip tests via decorators.
2410 Base.setUp(self)
2411
Johnny Chena74bb0a2011-08-01 18:46:13 +00002412 try:
2413 if lldb.blacklist:
2414 className = self.__class__.__name__
2415 classAndMethodName = "%s.%s" % (className, self._testMethodName)
2416 if className in lldb.blacklist:
2417 self.skipTest(lldb.blacklist.get(className))
2418 elif classAndMethodName in lldb.blacklist:
2419 self.skipTest(lldb.blacklist.get(classAndMethodName))
2420 except AttributeError:
2421 pass
2422
Johnny Chened492022011-06-21 00:53:00 +00002423 # Insert some delay between successive test cases if specified.
2424 self.doDelay()
Johnny Chen0ed37c92010-10-07 02:04:14 +00002425
Johnny Chenf2b70232010-08-25 18:49:48 +00002426 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2427 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2428
Johnny Chen430eb762010-10-19 16:00:42 +00002429 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002430 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002431
Daniel Maleae0f8f572013-08-26 23:57:52 +00002432 #
2433 # Warning: MAJOR HACK AHEAD!
2434 # If we are running testsuite remotely (by checking lldb.lldbtest_remote_sandbox),
2435 # redefine the self.dbg.CreateTarget(filename) method to execute a "file filename"
2436 # command, instead. See also runCmd() where it decorates the "file filename" call
2437 # with additional functionality when running testsuite remotely.
2438 #
2439 if lldb.lldbtest_remote_sandbox:
2440 def DecoratedCreateTarget(arg):
2441 self.runCmd("file %s" % arg)
2442 target = self.dbg.GetSelectedTarget()
2443 #
Greg Claytonc6947512013-12-13 19:18:59 +00002444 # SBtarget.LaunchSimple () currently not working for remote platform?
Daniel Maleae0f8f572013-08-26 23:57:52 +00002445 # johnny @ 04/23/2012
2446 #
2447 def DecoratedLaunchSimple(argv, envp, wd):
2448 self.runCmd("run")
2449 return target.GetProcess()
2450 target.LaunchSimple = DecoratedLaunchSimple
2451
2452 return target
2453 self.dbg.CreateTarget = DecoratedCreateTarget
2454 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002455 print("self.dbg.Create is redefined to:\n%s" % getsource_if_available(DecoratedCreateTarget))
Daniel Maleae0f8f572013-08-26 23:57:52 +00002456
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002457 # We want our debugger to be synchronous.
2458 self.dbg.SetAsync(False)
2459
2460 # Retrieve the associated command interpreter instance.
2461 self.ci = self.dbg.GetCommandInterpreter()
2462 if not self.ci:
2463 raise Exception('Could not get the command interpreter')
2464
2465 # And the result object.
2466 self.res = lldb.SBCommandReturnObject()
2467
Johnny Chen44d24972012-04-16 18:55:15 +00002468 # Run global pre-flight code, if defined via the config file.
2469 if lldb.pre_flight:
2470 lldb.pre_flight(self)
2471
Enrico Granatabd0998a2015-10-02 22:53:32 +00002472 if lldb.remote_platform and lldb.remote_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002473 remote_test_dir = lldbutil.join_remote_paths(
2474 lldb.remote_platform_working_dir,
2475 self.getArchitecture(),
2476 str(self.test_number),
2477 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002478 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002479 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002480 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002481
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002482 # This function removes all files from the current working directory while leaving
2483 # the directories in place. The cleaup is required to reduce the disk space required
2484 # by the test suit while leaving the directories untached is neccessary because
2485 # sub-directories might belong to an other test
2486 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002487 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002488 # TODO: Replace the heuristic to remove the files with a logic what collects the
2489 # list of files we have to remove during test runs.
2490 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002491 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002492 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002493 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002494 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002495
Greg Clayton35c91342014-11-17 18:40:27 +00002496 def registerSharedLibrariesWithTarget(self, target, shlibs):
2497 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2498
2499 Any modules in the target that have their remote install file specification set will
2500 get uploaded to the remote host. This function registers the local copies of the
2501 shared libraries with the target and sets their remote install locations so they will
2502 be uploaded when the target is run.
2503 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002504 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002505 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002506
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002507 shlib_environment_var = self.platformContext.shlib_environment_var
2508 shlib_prefix = self.platformContext.shlib_prefix
2509 shlib_extension = '.' + self.platformContext.shlib_extension
2510
2511 working_dir = self.get_process_working_directory()
2512 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2513 # Add any shared libraries to our target if remote so they get
2514 # uploaded into the working directory on the remote side
2515 for name in shlibs:
2516 # The path can be a full path to a shared library, or a make file name like "Foo" for
2517 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2518 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2519 # of the shared library accordingly
2520 if os.path.exists(name):
2521 local_shlib_path = name # name is the full path to the local shared library
2522 else:
2523 # Check relative names
2524 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2525 if not os.path.exists(local_shlib_path):
2526 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002527 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002528 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002529
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002530 # Make sure we found the local shared library in the above code
2531 self.assertTrue(os.path.exists(local_shlib_path))
2532
2533 # Add the shared library to our target
2534 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2535 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002536 # We must set the remote install location if we want the shared library
2537 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002538 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002539 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002540
2541 return environment
2542
Enrico Granata44818162012-10-24 01:23:57 +00002543 # utility methods that tests can use to access the current objects
2544 def target(self):
2545 if not self.dbg:
2546 raise Exception('Invalid debugger instance')
2547 return self.dbg.GetSelectedTarget()
2548
2549 def process(self):
2550 if not self.dbg:
2551 raise Exception('Invalid debugger instance')
2552 return self.dbg.GetSelectedTarget().GetProcess()
2553
2554 def thread(self):
2555 if not self.dbg:
2556 raise Exception('Invalid debugger instance')
2557 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2558
2559 def frame(self):
2560 if not self.dbg:
2561 raise Exception('Invalid debugger instance')
2562 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2563
Greg Claytonc6947512013-12-13 19:18:59 +00002564 def get_process_working_directory(self):
2565 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2566 if lldb.remote_platform:
2567 # Remote tests set the platform working directory up in TestBase.setUp()
2568 return lldb.remote_platform.GetWorkingDirectory()
2569 else:
2570 # local tests change directory into each test subdirectory
2571 return os.getcwd()
2572
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002573 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002574 #import traceback
2575 #traceback.print_stack()
2576
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002577 # Ensure all the references to SB objects have gone away so that we can
2578 # be sure that all test-specific resources have been freed before we
2579 # attempt to delete the targets.
2580 gc.collect()
2581
Johnny Chen3794ad92011-06-15 21:24:24 +00002582 # Delete the target(s) from the debugger as a general cleanup step.
2583 # This includes terminating the process for each target, if any.
2584 # We'd like to reuse the debugger for our next test without incurring
2585 # the initialization overhead.
2586 targets = []
2587 for target in self.dbg:
2588 if target:
2589 targets.append(target)
2590 process = target.GetProcess()
2591 if process:
2592 rc = self.invoke(process, "Kill")
2593 self.assertTrue(rc.Success(), PROCESS_KILLED)
2594 for target in targets:
2595 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002596
Johnny Chen44d24972012-04-16 18:55:15 +00002597 # Run global post-flight code, if defined via the config file.
2598 if lldb.post_flight:
2599 lldb.post_flight(self)
2600
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002601 # Do this last, to make sure it's in reverse order from how we setup.
2602 Base.tearDown(self)
2603
Zachary Turner95812042015-03-26 18:54:21 +00002604 # This must be the last statement, otherwise teardown hooks or other
2605 # lines might depend on this still being active.
2606 del self.dbg
2607
Johnny Chen86268e42011-09-30 21:48:35 +00002608 def switch_to_thread_with_stop_reason(self, stop_reason):
2609 """
2610 Run the 'thread list' command, and select the thread with stop reason as
2611 'stop_reason'. If no such thread exists, no select action is done.
2612 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002613 from .lldbutil import stop_reason_to_str
Johnny Chen86268e42011-09-30 21:48:35 +00002614 self.runCmd('thread list')
2615 output = self.res.GetOutput()
2616 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2617 stop_reason_to_str(stop_reason))
2618 for line in output.splitlines():
2619 matched = thread_line_pattern.match(line)
2620 if matched:
2621 self.runCmd('thread select %s' % matched.group(1))
2622
Enrico Granata7594f142013-06-17 22:51:50 +00002623 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002624 """
2625 Ask the command interpreter to handle the command and then check its
2626 return status.
2627 """
2628 # Fail fast if 'cmd' is not meaningful.
2629 if not cmd or len(cmd) == 0:
2630 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002631
Johnny Chen8d55a342010-08-31 17:42:54 +00002632 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002633
Daniel Maleae0f8f572013-08-26 23:57:52 +00002634 # This is an opportunity to insert the 'platform target-install' command if we are told so
2635 # via the settig of lldb.lldbtest_remote_sandbox.
2636 if cmd.startswith("target create "):
2637 cmd = cmd.replace("target create ", "file ")
2638 if cmd.startswith("file ") and lldb.lldbtest_remote_sandbox:
2639 with recording(self, trace) as sbuf:
2640 the_rest = cmd.split("file ")[1]
2641 # Split the rest of the command line.
2642 atoms = the_rest.split()
2643 #
2644 # NOTE: This assumes that the options, if any, follow the file command,
2645 # instead of follow the specified target.
2646 #
2647 target = atoms[-1]
2648 # Now let's get the absolute pathname of our target.
2649 abs_target = os.path.abspath(target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002650 print("Found a file command, target (with absolute pathname)=%s" % abs_target, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002651 fpath, fname = os.path.split(abs_target)
2652 parent_dir = os.path.split(fpath)[0]
2653 platform_target_install_command = 'platform target-install %s %s' % (fpath, lldb.lldbtest_remote_sandbox)
Zachary Turnerff890da2015-10-19 23:45:41 +00002654 print("Insert this command to be run first: %s" % platform_target_install_command, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002655 self.ci.HandleCommand(platform_target_install_command, self.res)
2656 # And this is the file command we want to execute, instead.
2657 #
2658 # Warning: SIDE EFFECT AHEAD!!!
2659 # Populate the remote executable pathname into the lldb namespace,
2660 # so that test cases can grab this thing out of the namespace.
2661 #
2662 lldb.lldbtest_remote_sandboxed_executable = abs_target.replace(parent_dir, lldb.lldbtest_remote_sandbox)
2663 cmd = "file -P %s %s %s" % (lldb.lldbtest_remote_sandboxed_executable, the_rest.replace(target, ''), abs_target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002664 print("And this is the replaced file command: %s" % cmd, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002665
Johnny Chen63dfb272010-09-01 00:15:19 +00002666 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002667
Johnny Chen63dfb272010-09-01 00:15:19 +00002668 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002669 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002670
Johnny Chen150c3cc2010-10-15 01:18:29 +00002671 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002672 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002673 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002674 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002675 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002676 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002677 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002678 print("runCmd failed!", file=sbuf)
2679 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002680
Johnny Chenff3d01d2010-08-20 21:03:09 +00002681 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002682 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002683 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002684 # For process launch, wait some time before possible next try.
2685 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002686 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002687 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002688
Johnny Chen27f212d2010-08-19 23:26:59 +00002689 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002690 self.assertTrue(self.res.Succeeded(),
2691 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002692
Jim Ingham63dfc722012-09-22 00:05:11 +00002693 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2694 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2695
2696 Otherwise, all the arguments have the same meanings as for the expect function"""
2697
2698 trace = (True if traceAlways else trace)
2699
2700 if exe:
2701 # First run the command. If we are expecting error, set check=False.
2702 # Pass the assert message along since it provides more semantic info.
2703 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2704
2705 # Then compare the output against expected strings.
2706 output = self.res.GetError() if error else self.res.GetOutput()
2707
2708 # If error is True, the API client expects the command to fail!
2709 if error:
2710 self.assertFalse(self.res.Succeeded(),
2711 "Command '" + str + "' is expected to fail!")
2712 else:
2713 # No execution required, just compare str against the golden input.
2714 output = str
2715 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002716 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002717
2718 # The heading says either "Expecting" or "Not expecting".
2719 heading = "Expecting" if matching else "Not expecting"
2720
2721 for pattern in patterns:
2722 # Match Objects always have a boolean value of True.
2723 match_object = re.search(pattern, output)
2724 matched = bool(match_object)
2725 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002726 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2727 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002728 if matched:
2729 break
2730
2731 self.assertTrue(matched if matching else not matched,
2732 msg if msg else EXP_MSG(str, exe))
2733
2734 return match_object
2735
Enrico Granata7594f142013-06-17 22:51:50 +00002736 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 +00002737 """
2738 Similar to runCmd; with additional expect style output matching ability.
2739
2740 Ask the command interpreter to handle the command and then check its
2741 return status. The 'msg' parameter specifies an informational assert
2742 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002743 'startstr', matches the substrings contained in 'substrs', and regexp
2744 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002745
2746 If the keyword argument error is set to True, it signifies that the API
2747 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002748 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002749 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002750
2751 If the keyword argument matching is set to False, it signifies that the API
2752 client is expecting the output of the command not to match the golden
2753 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002754
2755 Finally, the required argument 'str' represents the lldb command to be
2756 sent to the command interpreter. In case the keyword argument 'exe' is
2757 set to False, the 'str' is treated as a string to be matched/not-matched
2758 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002759 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002760 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002761
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002762 if exe:
2763 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002764 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002765 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002766
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002767 # Then compare the output against expected strings.
2768 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002769
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002770 # If error is True, the API client expects the command to fail!
2771 if error:
2772 self.assertFalse(self.res.Succeeded(),
2773 "Command '" + str + "' is expected to fail!")
2774 else:
2775 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002776 if isinstance(str,lldb.SBCommandReturnObject):
2777 output = str.GetOutput()
2778 else:
2779 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002780 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002781 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002782
Johnny Chenea88e942010-09-21 21:08:53 +00002783 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002784 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002785
2786 # Start from the startstr, if specified.
2787 # If there's no startstr, set the initial state appropriately.
2788 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002789
Johnny Chen150c3cc2010-10-15 01:18:29 +00002790 if startstr:
2791 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002792 print("%s start string: %s" % (heading, startstr), file=sbuf)
2793 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002794
Johnny Chen86268e42011-09-30 21:48:35 +00002795 # Look for endstr, if specified.
2796 keepgoing = matched if matching else not matched
2797 if endstr:
2798 matched = output.endswith(endstr)
2799 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002800 print("%s end string: %s" % (heading, endstr), file=sbuf)
2801 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002802
Johnny Chenea88e942010-09-21 21:08:53 +00002803 # Look for sub strings, if specified.
2804 keepgoing = matched if matching else not matched
2805 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002806 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002807 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002808 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002809 print("%s sub string: %s" % (heading, str), file=sbuf)
2810 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002811 keepgoing = matched if matching else not matched
2812 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002813 break
2814
Johnny Chenea88e942010-09-21 21:08:53 +00002815 # Search for regular expression patterns, if specified.
2816 keepgoing = matched if matching else not matched
2817 if patterns and keepgoing:
2818 for pattern in patterns:
2819 # Match Objects always have a boolean value of True.
2820 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002821 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002822 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2823 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002824 keepgoing = matched if matching else not matched
2825 if not keepgoing:
2826 break
Johnny Chenea88e942010-09-21 21:08:53 +00002827
2828 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002829 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002830
Johnny Chenf3c59232010-08-25 22:52:45 +00002831 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002832 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002833 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002834
2835 method = getattr(obj, name)
2836 import inspect
2837 self.assertTrue(inspect.ismethod(method),
2838 name + "is a method name of object: " + str(obj))
2839 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002840 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002841 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002842 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002843
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002844 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2845 """Platform specific way to build the default binaries."""
2846 if lldb.skip_build_and_cleanup:
2847 return
2848 module = builder_module()
2849 if target_is_android():
2850 dictionary = append_android_envs(dictionary)
2851 if self.debug_info is None:
2852 return self.buildDefault(architecture, compiler, dictionary, clean)
2853 elif self.debug_info == "dsym":
2854 return self.buildDsym(architecture, compiler, dictionary, clean)
2855 elif self.debug_info == "dwarf":
2856 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002857 elif self.debug_info == "dwo":
2858 return self.buildDwo(architecture, compiler, dictionary, clean)
2859 else:
2860 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002861
Johnny Chenf359cf22011-05-27 23:36:52 +00002862 # =================================================
2863 # Misc. helper methods for debugging test execution
2864 # =================================================
2865
Johnny Chen56b92a72011-07-11 19:15:11 +00002866 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002867 """Debug print a SBValue object, if traceAlways is True."""
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002868 from .lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002869
Johnny Chen8d55a342010-08-31 17:42:54 +00002870 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002871 return
2872
2873 err = sys.stderr
2874 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002875 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2876 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2877 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2878 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2879 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2880 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2881 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2882 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2883 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002884
Johnny Chen36c5eb12011-08-05 20:17:27 +00002885 def DebugSBType(self, type):
2886 """Debug print a SBType object, if traceAlways is True."""
2887 if not traceAlways:
2888 return
2889
2890 err = sys.stderr
2891 err.write(type.GetName() + ":\n")
2892 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2893 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2894 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2895
Johnny Chenb877f1e2011-03-12 01:18:19 +00002896 def DebugPExpect(self, child):
2897 """Debug the spwaned pexpect object."""
2898 if not traceAlways:
2899 return
2900
Zachary Turnerff890da2015-10-19 23:45:41 +00002901 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002902
2903 @classmethod
2904 def RemoveTempFile(cls, file):
2905 if os.path.exists(file):
2906 os.remove(file)