blob: 01d6ead0ce2e823546c88b21c1101dd9d3b6395d [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
35
Zachary Turner43a01e42015-10-20 21:06:05 +000036import lldb_shared
37
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +000038import abc
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +000039import gc
Vince Harron9753dd92015-05-10 15:22:09 +000040import glob
Johnny Chen90312a82010-09-21 22:34:45 +000041import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000042import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000043import re
Daniel Malea69207462013-06-05 21:07:02 +000044import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000045from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000046import time
Johnny Chena33a93c2010-08-30 23:08:52 +000047import types
Johnny Chen73258832010-08-05 23:42:46 +000048import unittest2
Johnny Chenbf6ffa32010-07-03 03:41:59 +000049import lldb
Vince Harron9753dd92015-05-10 15:22:09 +000050import lldbtest_config
Chaoren Lin3e2bdb42015-05-11 17:53:39 +000051import lldbutil
Zachary Turner43a01e42015-10-20 21:06:05 +000052
53from six import add_metaclass
Zachary Turner814236d2015-10-21 17:48:52 +000054from six import StringIO as SixStringIO
55from six.moves.urllib import parse as urlparse
Siva Chandra8af91662015-06-05 00:22:49 +000056
Vince Harron85d19652015-05-21 19:09:29 +000057# dosep.py starts lots and lots of dotest instances
58# This option helps you find if two (or more) dotest instances are using the same
59# directory at the same time
60# Enable it to cause test failures and stderr messages if dotest instances try to run in
61# the same directory simultaneously
62# it is disabled by default because it litters the test directories with ".dirlock" files
63debug_confirm_directory_exclusivity = False
64
Johnny Chen707b3c92010-10-11 22:25:46 +000065# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000066# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000067
68# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000069if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
70 traceAlways = True
71else:
72 traceAlways = False
73
Johnny Chen707b3c92010-10-11 22:25:46 +000074# By default, doCleanup is True.
75if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
76 doCleanup = False
77else:
78 doCleanup = True
79
Johnny Chen8d55a342010-08-31 17:42:54 +000080
Johnny Chen00778092010-08-09 22:01:17 +000081#
82# Some commonly used assert messages.
83#
84
Johnny Chenaa902922010-09-17 22:45:27 +000085COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
86
Johnny Chen00778092010-08-09 22:01:17 +000087CURRENT_EXECUTABLE_SET = "Current executable set successfully"
88
Johnny Chen7d1d7532010-09-02 21:23:12 +000089PROCESS_IS_VALID = "Process is valid"
90
91PROCESS_KILLED = "Process is killed successfully"
92
Johnny Chend5f66fc2010-12-23 01:12:19 +000093PROCESS_EXITED = "Process exited successfully"
94
95PROCESS_STOPPED = "Process status should be stopped"
96
Sean Callanan05834cd2015-07-01 23:56:30 +000097RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +000098
Johnny Chen17941842010-08-09 23:44:24 +000099RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000100
Johnny Chen67af43f2010-10-05 19:27:32 +0000101BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
102
Johnny Chen17941842010-08-09 23:44:24 +0000103BREAKPOINT_CREATED = "Breakpoint created successfully"
104
Johnny Chenf10af382010-12-04 00:07:24 +0000105BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
106
Johnny Chene76896c2010-08-17 21:33:31 +0000107BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
108
Johnny Chen17941842010-08-09 23:44:24 +0000109BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000110
Johnny Chen703dbd02010-09-30 17:06:24 +0000111BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
112
Johnny Chen164f1e12010-10-15 18:07:09 +0000113BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
114
Greg Clayton5db6b792012-10-24 18:24:14 +0000115MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
116
Johnny Chen89109ed12011-06-27 20:05:23 +0000117OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
118
Johnny Chen5b3a3572010-12-09 18:22:12 +0000119SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
120
Johnny Chenc70b02a2010-09-22 23:00:20 +0000121STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
122
Johnny Chen1691a162011-04-15 16:44:48 +0000123STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
124
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000125STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
126
Johnny Chen5d6c4642010-11-10 23:46:38 +0000127STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000128
Johnny Chen5d6c4642010-11-10 23:46:38 +0000129STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
130 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000131
Johnny Chen2e431ce2010-10-20 18:38:48 +0000132STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
133
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000134STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
135
Johnny Chenc066ab42010-10-14 01:22:03 +0000136STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
137
Johnny Chen00778092010-08-09 22:01:17 +0000138STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
139
Johnny Chenf68cc122011-09-15 21:09:59 +0000140STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
141
Johnny Chen3c884a02010-08-24 22:07:56 +0000142DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
143
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000144VALID_BREAKPOINT = "Got a valid breakpoint"
145
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000146VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
147
Johnny Chen7209d84f2011-05-06 23:26:12 +0000148VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
149
Johnny Chen5ee88192010-08-27 23:47:36 +0000150VALID_FILESPEC = "Got a valid filespec"
151
Johnny Chen025d1b82010-12-08 01:25:21 +0000152VALID_MODULE = "Got a valid module"
153
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000154VALID_PROCESS = "Got a valid process"
155
Johnny Chen025d1b82010-12-08 01:25:21 +0000156VALID_SYMBOL = "Got a valid symbol"
157
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000158VALID_TARGET = "Got a valid target"
159
Matthew Gardinerc928de32014-10-22 07:22:56 +0000160VALID_PLATFORM = "Got a valid platform"
161
Johnny Chen15f247a2012-02-03 20:43:00 +0000162VALID_TYPE = "Got a valid type"
163
Johnny Chen5819ab42011-07-15 22:28:10 +0000164VALID_VARIABLE = "Got a valid variable"
165
Johnny Chen981463d2010-08-25 19:00:04 +0000166VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000167
Johnny Chenf68cc122011-09-15 21:09:59 +0000168WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000169
Sean Callanan05834cd2015-07-01 23:56:30 +0000170def CMD_MSG(str):
171 '''A generic "Command '%s' returns successfully" message generator.'''
172 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000173
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000174def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000175 '''A generic message generator for the completion mechanism.'''
176 return "'%s' successfully completes to '%s'" % (str_before, str_after)
177
Johnny Chenc0c67f22010-11-09 18:42:22 +0000178def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000179 '''A generic "'%s' returns expected result" message generator if exe.
180 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000181 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000182
Johnny Chen3343f042010-10-19 19:11:38 +0000183def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000184 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000185 return "Value of setting '%s' is correct" % setting
186
Johnny Chen27c41232010-08-26 21:49:29 +0000187def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000188 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000189 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000190
Johnny Chen47ceb032010-10-11 23:52:19 +0000191def line_number(filename, string_to_match):
192 """Helper function to return the line number of the first matched string."""
193 with open(filename, 'r') as f:
194 for i, line in enumerate(f):
195 if line.find(string_to_match) != -1:
196 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000197 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000198 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000199
Johnny Chen67af43f2010-10-05 19:27:32 +0000200def pointer_size():
201 """Return the pointer size of the host system."""
202 import ctypes
203 a_pointer = ctypes.c_void_p(0xffff)
204 return 8 * ctypes.sizeof(a_pointer)
205
Johnny Chen57816732012-02-09 02:01:59 +0000206def is_exe(fpath):
207 """Returns true if fpath is an executable."""
208 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
209
210def which(program):
211 """Returns the full path to a program; None otherwise."""
212 fpath, fname = os.path.split(program)
213 if fpath:
214 if is_exe(program):
215 return program
216 else:
217 for path in os.environ["PATH"].split(os.pathsep):
218 exe_file = os.path.join(path, program)
219 if is_exe(exe_file):
220 return exe_file
221 return None
222
Zachary Turner814236d2015-10-21 17:48:52 +0000223class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000224 """
225 A nice little context manager for recording the debugger interactions into
226 our session object. If trace flag is ON, it also emits the interactions
227 into the stderr.
228 """
229 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000230 """Create a SixStringIO instance; record the session obj and trace flag."""
231 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000232 # The test might not have undergone the 'setUp(self)' phase yet, so that
233 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000234 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000235 self.trace = trace
236
237 def __enter__(self):
238 """
239 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000240 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000241 """
242 return self
243
244 def __exit__(self, type, value, tb):
245 """
246 Context management protocol on exit from the body of the with statement.
247 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000248 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000249 """
250 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000251 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000252 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000253 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000254 self.close()
255
Zachary Turner43a01e42015-10-20 21:06:05 +0000256@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000257class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000258
259 @abc.abstractproperty
260 def pid(self):
261 """Returns process PID if has been launched already."""
262
263 @abc.abstractmethod
264 def launch(self, executable, args):
265 """Launches new process with given executable and args."""
266
267 @abc.abstractmethod
268 def terminate(self):
269 """Terminates previously launched process.."""
270
271class _LocalProcess(_BaseProcess):
272
273 def __init__(self, trace_on):
274 self._proc = None
275 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000276 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000277
278 @property
279 def pid(self):
280 return self._proc.pid
281
282 def launch(self, executable, args):
283 self._proc = Popen([executable] + args,
284 stdout = open(os.devnull) if not self._trace_on else None,
285 stdin = PIPE)
286
287 def terminate(self):
288 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000289 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000290 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
291 for sig in signals_to_try:
292 try:
293 self._proc.send_signal(getattr(signal, sig))
294 time.sleep(self._delayafterterminate)
295 if self._proc.poll() != None:
296 return
297 except ValueError:
298 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000299 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000300 time.sleep(self._delayafterterminate)
301 if self._proc.poll() != None:
302 return
303 self._proc.kill()
304 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000305
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000306 def poll(self):
307 return self._proc.poll()
308
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000309class _RemoteProcess(_BaseProcess):
310
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000311 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000312 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000313 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000314
315 @property
316 def pid(self):
317 return self._pid
318
319 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000320 if self._install_remote:
321 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000322 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000323
324 dst_file_spec = lldb.SBFileSpec(dst_path, False)
325 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
326 if err.Fail():
327 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
328 else:
329 dst_path = executable
330 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000331
332 launch_info = lldb.SBLaunchInfo(args)
333 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000334 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000335
336 # Redirect stdout and stderr to /dev/null
337 launch_info.AddSuppressFileAction(1, False, True)
338 launch_info.AddSuppressFileAction(2, False, True)
339
340 err = lldb.remote_platform.Launch(launch_info)
341 if err.Fail():
342 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
343 self._pid = launch_info.GetProcessID()
344
345 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000346 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000347
Johnny Chen690fcef2010-10-15 23:55:05 +0000348# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000349# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000350def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000351 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000352
353 If the exit code was non-zero it raises a CalledProcessError. The
354 CalledProcessError object will have the return code in the returncode
355 attribute and output in the output attribute.
356
357 The arguments are the same as for the Popen constructor. Example:
358
359 >>> check_output(["ls", "-l", "/dev/null"])
360 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
361
362 The stdout argument is not allowed as it is used internally.
363 To capture standard error in the result, use stderr=STDOUT.
364
365 >>> check_output(["/bin/sh", "-c",
366 ... "ls -l non_existent_file ; exit 0"],
367 ... stderr=STDOUT)
368 'ls: non_existent_file: No such file or directory\n'
369 """
370
371 # Assign the sender object to variable 'test' and remove it from kwargs.
372 test = kwargs.pop('sender', None)
373
Zachary Turner9ef307b2014-07-22 16:19:29 +0000374 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
375 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000376 output = ""
377 error = ""
378 for shellCommand in commandList:
379 if 'stdout' in kwargs:
380 raise ValueError('stdout argument not allowed, it will be overridden.')
381 if 'shell' in kwargs and kwargs['shell']==False:
382 raise ValueError('shell=False not allowed')
383 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, **kwargs)
384 pid = process.pid
385 this_output, this_error = process.communicate()
386 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000387
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000388 # Enable trace on failure return while tracking down FreeBSD buildbot issues
389 trace = traceAlways
390 if not trace and retcode and sys.platform.startswith("freebsd"):
391 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000392
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000393 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000394 print(file=sbuf)
395 print("os command:", shellCommand, file=sbuf)
396 print("with pid:", pid, file=sbuf)
397 print("stdout:", this_output, file=sbuf)
398 print("stderr:", this_error, file=sbuf)
399 print("retcode:", retcode, file=sbuf)
400 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000401
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000402 if retcode:
403 cmd = kwargs.get("args")
404 if cmd is None:
405 cmd = shellCommand
406 raise CalledProcessError(retcode, cmd)
407 output = output + this_output
408 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000409 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000410
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000411def getsource_if_available(obj):
412 """
413 Return the text of the source code for an object if available. Otherwise,
414 a print representation is returned.
415 """
416 import inspect
417 try:
418 return inspect.getsource(obj)
419 except:
420 return repr(obj)
421
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000422def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000423 if sys.platform.startswith("freebsd"):
424 return __import__("builder_freebsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000425 return __import__("builder_" + sys.platform)
426
Siva Chandra8af91662015-06-05 00:22:49 +0000427def run_adb_command(cmd, device_id):
428 device_id_args = []
429 if device_id:
430 device_id_args = ["-s", device_id]
431 full_cmd = ["adb"] + device_id_args + cmd
432 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
433 stdout, stderr = p.communicate()
434 return p.returncode, stdout, stderr
435
Chaoren Line9bbabc2015-07-18 00:37:55 +0000436def append_android_envs(dictionary):
437 if dictionary is None:
438 dictionary = {}
439 dictionary["OS"] = "Android"
440 if android_device_api() >= 16:
441 dictionary["PIE"] = 1
442 return dictionary
443
Chaoren Lin9070f532015-07-17 22:13:29 +0000444def target_is_android():
445 if not hasattr(target_is_android, 'result'):
446 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
447 match = re.match(".*-.*-.*-android", triple)
448 target_is_android.result = match is not None
449 return target_is_android.result
450
Siva Chandra8af91662015-06-05 00:22:49 +0000451def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000452 if not hasattr(android_device_api, 'result'):
453 assert lldb.platform_url is not None
454 device_id = None
455 parsed_url = urlparse.urlparse(lldb.platform_url)
456 if parsed_url.scheme == "adb":
457 device_id = parsed_url.netloc.split(":")[0]
458 retcode, stdout, stderr = run_adb_command(
459 ["shell", "getprop", "ro.build.version.sdk"], device_id)
460 if retcode == 0:
461 android_device_api.result = int(stdout)
462 else:
463 raise LookupError(
464 ">>> Unable to determine the API level of the Android device.\n"
465 ">>> stdout:\n%s\n"
466 ">>> stderr:\n%s\n" % (stdout, stderr))
467 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000468
Johnny Chena74bb0a2011-08-01 18:46:13 +0000469#
470# Decorators for categorizing test cases.
471#
472
473from functools import wraps
474def python_api_test(func):
475 """Decorate the item as a Python API only test."""
476 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
477 raise Exception("@python_api_test can only be used to decorate a test method")
478 @wraps(func)
479 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000480 if lldb.dont_do_python_api_test:
481 self.skipTest("python api tests")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000482 return func(self, *args, **kwargs)
483
484 # Mark this function as such to separate them from lldb command line tests.
485 wrapper.__python_api_test__ = True
486 return wrapper
487
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +0000488def lldbmi_test(func):
489 """Decorate the item as a lldb-mi only test."""
490 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
491 raise Exception("@lldbmi_test can only be used to decorate a test method")
492 @wraps(func)
493 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000494 if lldb.dont_do_lldbmi_test:
495 self.skipTest("lldb-mi tests")
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +0000496 return func(self, *args, **kwargs)
497
498 # Mark this function as such to separate them from lldb command line tests.
499 wrapper.__lldbmi_test__ = True
500 return wrapper
501
Johnny Chena74bb0a2011-08-01 18:46:13 +0000502def benchmarks_test(func):
503 """Decorate the item as a benchmarks test."""
504 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
505 raise Exception("@benchmarks_test can only be used to decorate a test method")
506 @wraps(func)
507 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000508 if not lldb.just_do_benchmarks_test:
509 self.skipTest("benchmarks tests")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000510 return func(self, *args, **kwargs)
511
512 # Mark this function as such to separate them from the regular tests.
513 wrapper.__benchmarks_test__ = True
514 return wrapper
515
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000516def no_debug_info_test(func):
517 """Decorate the item as a test what don't use any debug info. If this annotation is specified
518 then the test runner won't generate a separate test for each debug info format. """
519 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
520 raise Exception("@no_debug_info_test can only be used to decorate a test method")
521 @wraps(func)
522 def wrapper(self, *args, **kwargs):
523 return func(self, *args, **kwargs)
524
525 # Mark this function as such to separate them from the regular tests.
526 wrapper.__no_debug_info_test__ = True
527 return wrapper
528
Johnny Chenf1548d42012-04-06 00:56:05 +0000529def dsym_test(func):
530 """Decorate the item as a dsym test."""
531 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
532 raise Exception("@dsym_test can only be used to decorate a test method")
533 @wraps(func)
534 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000535 if lldb.dont_do_dsym_test:
536 self.skipTest("dsym tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000537 return func(self, *args, **kwargs)
538
539 # Mark this function as such to separate them from the regular tests.
540 wrapper.__dsym_test__ = True
541 return wrapper
542
543def dwarf_test(func):
544 """Decorate the item as a dwarf test."""
545 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
546 raise Exception("@dwarf_test can only be used to decorate a test method")
547 @wraps(func)
548 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000549 if lldb.dont_do_dwarf_test:
550 self.skipTest("dwarf tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000551 return func(self, *args, **kwargs)
552
553 # Mark this function as such to separate them from the regular tests.
554 wrapper.__dwarf_test__ = True
555 return wrapper
556
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000557def dwo_test(func):
558 """Decorate the item as a dwo test."""
559 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
560 raise Exception("@dwo_test can only be used to decorate a test method")
561 @wraps(func)
562 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000563 if lldb.dont_do_dwo_test:
564 self.skipTest("dwo tests")
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000565 return func(self, *args, **kwargs)
566
567 # Mark this function as such to separate them from the regular tests.
568 wrapper.__dwo_test__ = True
569 return wrapper
570
Todd Fialaa41d48c2014-04-28 04:49:40 +0000571def debugserver_test(func):
572 """Decorate the item as a debugserver test."""
573 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
574 raise Exception("@debugserver_test can only be used to decorate a test method")
575 @wraps(func)
576 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000577 if lldb.dont_do_debugserver_test:
578 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000579 return func(self, *args, **kwargs)
580
581 # Mark this function as such to separate them from the regular tests.
582 wrapper.__debugserver_test__ = True
583 return wrapper
584
585def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000586 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000587 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
588 raise Exception("@llgs_test can only be used to decorate a test method")
589 @wraps(func)
590 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000591 if lldb.dont_do_llgs_test:
592 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000593 return func(self, *args, **kwargs)
594
595 # Mark this function as such to separate them from the regular tests.
596 wrapper.__llgs_test__ = True
597 return wrapper
598
Daniel Maleae0f8f572013-08-26 23:57:52 +0000599def not_remote_testsuite_ready(func):
600 """Decorate the item as a test which is not ready yet for remote testsuite."""
601 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
602 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
603 @wraps(func)
604 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000605 if lldb.lldbtest_remote_sandbox or lldb.remote_platform:
606 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000607 return func(self, *args, **kwargs)
608
609 # Mark this function as such to separate them from the regular tests.
610 wrapper.__not_ready_for_remote_testsuite_test__ = True
611 return wrapper
612
Ed Maste433790a2014-04-23 12:55:41 +0000613def expectedFailure(expected_fn, bugnumber=None):
614 def expectedFailure_impl(func):
615 @wraps(func)
616 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000617 from unittest2 import case
618 self = args[0]
Enrico Granata43f62132013-02-23 01:28:30 +0000619 try:
Ed Maste433790a2014-04-23 12:55:41 +0000620 func(*args, **kwargs)
Enrico Granata43f62132013-02-23 01:28:30 +0000621 except Exception:
Ed Maste433790a2014-04-23 12:55:41 +0000622 if expected_fn(self):
623 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
Enrico Granata43f62132013-02-23 01:28:30 +0000624 else:
625 raise
Ed Maste433790a2014-04-23 12:55:41 +0000626 if expected_fn(self):
627 raise case._UnexpectedSuccess(sys.exc_info(), bugnumber)
628 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000629 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
630 # return decorator in this case, so it will be used to decorating original method
631 if callable(bugnumber):
632 return expectedFailure_impl(bugnumber)
633 else:
634 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000635
Ying Chen7091c2c2015-04-21 01:15:47 +0000636# provide a function to xfail on defined oslist, compiler version, and archs
637# if none is specified for any argument, that argument won't be checked and thus means for all
638# for example,
639# @expectedFailureAll, xfail for all platform/compiler/arch,
640# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
641# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000642def expectedFailureAll(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, triple=None, debug_info=None):
Ying Chen7091c2c2015-04-21 01:15:47 +0000643 def fn(self):
644 return ((oslist is None or self.getPlatform() in oslist) and
645 (compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))) and
Tamas Berghammercf6f92a2015-09-07 15:50:19 +0000646 self.expectedArch(archs) and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000647 (triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())) and
648 (debug_info is None or self.debug_info in debug_info))
Ying Chen7091c2c2015-04-21 01:15:47 +0000649 return expectedFailure(fn, bugnumber)
650
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000651def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000652 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
653
654def expectedFailureDwo(bugnumber=None):
655 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000656
657def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000658 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000659
660def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
661 if compiler_version is None:
662 compiler_version=['=', None]
663 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
664
Vince Harron8974ce22015-03-13 19:54:54 +0000665# to XFAIL a specific clang versions, try this
666# @expectedFailureClang('bugnumber', ['<=', '3.4'])
667def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000668 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000669
670def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000671 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000672
Matt Kopec0de53f02013-03-15 19:10:12 +0000673def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000674 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000675
Ed Maste433790a2014-04-23 12:55:41 +0000676def expectedFailureArch(arch, bugnumber=None):
677 def fn(self):
678 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000679 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000680
Enrico Granatae6cedc12013-02-23 01:05:23 +0000681def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000682 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000683
Matt Kopecee969f92013-09-26 23:30:59 +0000684def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000685 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000686
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000687def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None):
Ed Maste433790a2014-04-23 12:55:41 +0000688 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000689 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000690 self.expectedCompiler(compilers) and
691 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000692 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000693
Chaoren Linf7160f32015-06-09 17:39:27 +0000694def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
695 def fn(self):
696 return (getHostPlatform() in oslist and
697 self.expectedCompiler(compilers))
698 return expectedFailure(fn, bugnumber)
699
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000700def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000701 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000702 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000703
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000704def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
705 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000706
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000707def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None):
708 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000709
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000710def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
711 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000712
Chaoren Linf7160f32015-06-09 17:39:27 +0000713def expectedFailureHostWindows(bugnumber=None, compilers=None):
714 return expectedFailureHostOS(['windows'], bugnumber, compilers)
715
Pavel Labath090152b2015-08-20 11:37:19 +0000716def matchAndroid(api_levels=None, archs=None):
717 def match(self):
718 if not target_is_android():
719 return False
720 if archs is not None and self.getArchitecture() not in archs:
721 return False
722 if api_levels is not None and android_device_api() not in api_levels:
723 return False
724 return True
725 return match
726
727
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000728def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000729 """ Mark a test as xfail for Android.
730
731 Arguments:
732 bugnumber - The LLVM pr associated with the problem.
733 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000734 for which a test is expected to fail. None means all API level.
735 arch - A sequence of architecture names specifying the architectures
736 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000737 """
Pavel Labath090152b2015-08-20 11:37:19 +0000738 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000739
Vince Harron7ac3ea42015-06-26 15:13:21 +0000740# if the test passes on the first try, we're done (success)
741# if the test fails once, then passes on the second try, raise an ExpectedFailure
742# if the test fails twice in a row, re-throw the exception from the second test run
743def expectedFlakey(expected_fn, bugnumber=None):
744 def expectedFailure_impl(func):
745 @wraps(func)
746 def wrapper(*args, **kwargs):
747 from unittest2 import case
748 self = args[0]
749 try:
750 func(*args, **kwargs)
Ying Chen0a7202b2015-07-01 22:44:27 +0000751 # don't retry if the test case is already decorated with xfail or skip
752 except (case._ExpectedFailure, case.SkipTest, case._UnexpectedSuccess):
753 raise
Vince Harron7ac3ea42015-06-26 15:13:21 +0000754 except Exception:
755 if expected_fn(self):
Ying Chen0a7202b2015-07-01 22:44:27 +0000756 # before retry, run tearDown for previous run and setup for next
Vince Harron7ac3ea42015-06-26 15:13:21 +0000757 try:
Ying Chen0a7202b2015-07-01 22:44:27 +0000758 self.tearDown()
759 self.setUp()
Vince Harron7ac3ea42015-06-26 15:13:21 +0000760 func(*args, **kwargs)
761 except Exception:
762 # oh snap! two failures in a row, record a failure/error
763 raise
764 # record the expected failure
765 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
766 else:
767 raise
768 return wrapper
769 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
770 # return decorator in this case, so it will be used to decorating original method
771 if callable(bugnumber):
772 return expectedFailure_impl(bugnumber)
773 else:
774 return expectedFailure_impl
775
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000776def expectedFlakeyDwarf(bugnumber=None):
777 def fn(self):
778 return self.debug_info == "dwarf"
779 return expectedFlakey(fn, bugnumber)
780
781def expectedFlakeyDsym(bugnumber=None):
782 def fn(self):
783 return self.debug_info == "dwarf"
784 return expectedFlakey(fn, bugnumber)
785
Vince Harron7ac3ea42015-06-26 15:13:21 +0000786def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
787 def fn(self):
788 return (self.getPlatform() in oslist and
789 self.expectedCompiler(compilers))
790 return expectedFlakey(fn, bugnumber)
791
792def expectedFlakeyDarwin(bugnumber=None, compilers=None):
793 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
794 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
795
796def expectedFlakeyLinux(bugnumber=None, compilers=None):
797 return expectedFlakeyOS(['linux'], bugnumber, compilers)
798
799def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
800 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
801
802def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
803 if compiler_version is None:
804 compiler_version=['=', None]
805 def fn(self):
806 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
807 return expectedFlakey(fn, bugnumber)
808
809# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
810def expectedFlakeyClang(bugnumber=None, compiler_version=None):
811 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
812
813# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
814def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
815 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
816
Pavel Labath63a579c2015-09-07 12:15:27 +0000817def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
818 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
819
Greg Clayton12514562013-12-05 22:22:32 +0000820def skipIfRemote(func):
821 """Decorate the item to skip tests if testing remotely."""
822 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
823 raise Exception("@skipIfRemote can only be used to decorate a test method")
824 @wraps(func)
825 def wrapper(*args, **kwargs):
826 from unittest2 import case
827 if lldb.remote_platform:
828 self = args[0]
829 self.skipTest("skip on remote platform")
830 else:
831 func(*args, **kwargs)
832 return wrapper
833
Siva Chandra4470f382015-06-17 22:32:27 +0000834def skipUnlessListedRemote(remote_list=None):
835 def myImpl(func):
836 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
837 raise Exception("@skipIfRemote can only be used to decorate a "
838 "test method")
839
840 @wraps(func)
841 def wrapper(*args, **kwargs):
842 if remote_list and lldb.remote_platform:
843 self = args[0]
844 triple = self.dbg.GetSelectedPlatform().GetTriple()
845 for r in remote_list:
846 if r in triple:
847 func(*args, **kwargs)
848 return
849 self.skipTest("skip on remote platform %s" % str(triple))
850 else:
851 func(*args, **kwargs)
852 return wrapper
853
854 return myImpl
855
Greg Clayton12514562013-12-05 22:22:32 +0000856def skipIfRemoteDueToDeadlock(func):
857 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
858 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
859 raise Exception("@skipIfRemote can only be used to decorate a test method")
860 @wraps(func)
861 def wrapper(*args, **kwargs):
862 from unittest2 import case
863 if lldb.remote_platform:
864 self = args[0]
865 self.skipTest("skip on remote platform (deadlocks)")
866 else:
867 func(*args, **kwargs)
868 return wrapper
869
Enrico Granatab633e432014-10-06 21:37:06 +0000870def skipIfNoSBHeaders(func):
871 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
872 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000873 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000874 @wraps(func)
875 def wrapper(*args, **kwargs):
876 from unittest2 import case
877 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000878 if sys.platform.startswith("darwin"):
879 header = os.path.join(self.lib_dir, 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
880 else:
881 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000882 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000883 if not os.path.exists(header):
884 self.skipTest("skip because LLDB.h header not found")
885 else:
886 func(*args, **kwargs)
887 return wrapper
888
Robert Flack13c7ad92015-03-30 14:12:17 +0000889def skipIfFreeBSD(func):
890 """Decorate the item to skip tests that should be skipped on FreeBSD."""
891 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000892
Greg Claytone0d0a762015-04-02 18:24:03 +0000893def getDarwinOSTriples():
894 return ['darwin', 'macosx', 'ios']
895
Daniel Maleab3d41a22013-07-09 00:08:01 +0000896def skipIfDarwin(func):
897 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000898 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000899
Robert Flack13c7ad92015-03-30 14:12:17 +0000900def skipIfLinux(func):
901 """Decorate the item to skip tests that should be skipped on Linux."""
902 return skipIfPlatform(["linux"])(func)
903
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000904def skipUnlessHostLinux(func):
905 """Decorate the item to skip tests that should be skipped on any non Linux host."""
906 return skipUnlessHostPlatform(["linux"])(func)
907
Robert Flack13c7ad92015-03-30 14:12:17 +0000908def skipIfWindows(func):
909 """Decorate the item to skip tests that should be skipped on Windows."""
910 return skipIfPlatform(["windows"])(func)
911
Chaoren Line6eea5d2015-06-08 22:13:28 +0000912def skipIfHostWindows(func):
913 """Decorate the item to skip tests that should be skipped on Windows."""
914 return skipIfHostPlatform(["windows"])(func)
915
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000916def skipUnlessWindows(func):
917 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
918 return skipUnlessPlatform(["windows"])(func)
919
Robert Flack13c7ad92015-03-30 14:12:17 +0000920def skipUnlessDarwin(func):
921 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000922 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000923
Ryan Brown57bee1e2015-09-14 22:45:11 +0000924def skipUnlessGoInstalled(func):
925 """Decorate the item to skip tests when no Go compiler is available."""
926 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
927 raise Exception("@skipIfGcc can only be used to decorate a test method")
928 @wraps(func)
929 def wrapper(*args, **kwargs):
930 from unittest2 import case
931 self = args[0]
932 compiler = self.getGoCompilerVersion()
933 if not compiler:
934 self.skipTest("skipping because go compiler not found")
935 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000936 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000937 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000938 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
939 if not match_version:
940 # Couldn't determine version.
941 self.skipTest(
942 "skipping because go version could not be parsed "
943 "out of {}".format(compiler))
944 else:
945 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000946 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000947 compiler_strict_version = StrictVersion(match_version.group(1))
948 if compiler_strict_version < min_strict_version:
949 self.skipTest(
950 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +0000951 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +0000952 compiler_strict_version,
953 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +0000954 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +0000955 return wrapper
956
Robert Flack068898c2015-04-09 18:07:58 +0000957def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +0000958 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +0000959 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
960 if platform.startswith('freebsd'):
961 platform = 'freebsd'
962 return platform
963
Robert Flack6e1fd352015-05-15 12:39:33 +0000964def getHostPlatform():
965 """Returns the host platform running the test suite."""
966 # Attempts to return a platform name matching a target Triple platform.
967 if sys.platform.startswith('linux'):
968 return 'linux'
969 elif sys.platform.startswith('win32'):
970 return 'windows'
971 elif sys.platform.startswith('darwin'):
972 return 'darwin'
973 elif sys.platform.startswith('freebsd'):
974 return 'freebsd'
975 else:
976 return sys.platform
977
Robert Flackfb2f6c62015-04-17 08:02:18 +0000978def platformIsDarwin():
979 """Returns true if the OS triple for the selected platform is any valid apple OS"""
980 return getPlatform() in getDarwinOSTriples()
981
Robert Flack6e1fd352015-05-15 12:39:33 +0000982def skipIfHostIncompatibleWithRemote(func):
983 """Decorate the item to skip tests if binaries built on this host are incompatible."""
984 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
985 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
986 @wraps(func)
987 def wrapper(*args, **kwargs):
988 from unittest2 import case
989 self = args[0]
990 host_arch = self.getLldbArchitecture()
991 host_platform = getHostPlatform()
992 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +0000993 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +0000994 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
995 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
996 elif target_platform != host_platform:
997 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
998 else:
999 func(*args, **kwargs)
1000 return wrapper
1001
Chaoren Line6eea5d2015-06-08 22:13:28 +00001002def skipIfHostPlatform(oslist):
1003 """Decorate the item to skip tests if running on one of the listed host platforms."""
1004 return unittest2.skipIf(getHostPlatform() in oslist,
1005 "skip on %s" % (", ".join(oslist)))
1006
1007def skipUnlessHostPlatform(oslist):
1008 """Decorate the item to skip tests unless running on one of the listed host platforms."""
1009 return unittest2.skipUnless(getHostPlatform() in oslist,
1010 "requires on of %s" % (", ".join(oslist)))
1011
Zachary Turner793d9972015-08-14 23:29:24 +00001012def skipUnlessArch(archlist):
1013 """Decorate the item to skip tests unless running on one of the listed architectures."""
1014 def myImpl(func):
1015 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1016 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1017
1018 @wraps(func)
1019 def wrapper(*args, **kwargs):
1020 self = args[0]
1021 if self.getArchitecture() not in archlist:
1022 self.skipTest("skipping for architecture %s (requires one of %s)" %
1023 (self.getArchitecture(), ", ".join(archlist)))
1024 else:
1025 func(*args, **kwargs)
1026 return wrapper
1027
1028 return myImpl
1029
Robert Flack13c7ad92015-03-30 14:12:17 +00001030def skipIfPlatform(oslist):
1031 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001032 return unittest2.skipIf(getPlatform() in oslist,
1033 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001034
1035def skipUnlessPlatform(oslist):
1036 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001037 return unittest2.skipUnless(getPlatform() in oslist,
1038 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001039
Daniel Malea48359902013-05-14 20:48:54 +00001040def skipIfLinuxClang(func):
1041 """Decorate the item to skip tests that should be skipped if building on
1042 Linux with clang.
1043 """
1044 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1045 raise Exception("@skipIfLinuxClang can only be used to decorate a test method")
1046 @wraps(func)
1047 def wrapper(*args, **kwargs):
1048 from unittest2 import case
1049 self = args[0]
1050 compiler = self.getCompiler()
Vince Harronc8492672015-05-04 02:59:19 +00001051 platform = self.getPlatform()
1052 if "clang" in compiler and platform == "linux":
Daniel Malea48359902013-05-14 20:48:54 +00001053 self.skipTest("skipping because Clang is used on Linux")
1054 else:
1055 func(*args, **kwargs)
1056 return wrapper
1057
Ying Chen7091c2c2015-04-21 01:15:47 +00001058# provide a function to skip on defined oslist, compiler version, and archs
1059# if none is specified for any argument, that argument won't be checked and thus means for all
1060# for example,
1061# @skipIf, skip for all platform/compiler/arch,
1062# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1063# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1064
1065# TODO: refactor current code, to make skipIfxxx functions to call this function
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001066def skipIf(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, debug_info=None):
Ying Chen7091c2c2015-04-21 01:15:47 +00001067 def fn(self):
1068 return ((oslist is None or self.getPlatform() in oslist) and
1069 (compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))) and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001070 self.expectedArch(archs) and
1071 (debug_info is None or self.debug_info in debug_info))
1072 return skipTestIfFn(fn, bugnumber, skipReason="skipping because os:%s compiler: %s %s arch: %s debug info: %s"%(oslist, compiler, compiler_version, archs, debug_info))
1073
1074def skipIfDebugInfo(bugnumber=None, debug_info=None):
1075 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1076
Greg Claytonedea2372015-10-07 20:01:13 +00001077def skipIfDWO(bugnumber=None):
1078 return skipIfDebugInfo(bugnumber, ["dwo"])
1079
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001080def skipIfDwarf(bugnumber=None):
1081 return skipIfDebugInfo(bugnumber, ["dwarf"])
1082
1083def skipIfDsym(bugnumber=None):
1084 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001085
1086def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1087 def skipTestIfFn_impl(func):
1088 @wraps(func)
1089 def wrapper(*args, **kwargs):
1090 from unittest2 import case
1091 self = args[0]
1092 if expected_fn(self):
1093 self.skipTest(skipReason)
1094 else:
1095 func(*args, **kwargs)
1096 return wrapper
1097 if callable(bugnumber):
1098 return skipTestIfFn_impl(bugnumber)
1099 else:
1100 return skipTestIfFn_impl
1101
Daniel Maleabe230792013-01-24 23:52:09 +00001102def skipIfGcc(func):
1103 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1104 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001105 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001106 @wraps(func)
1107 def wrapper(*args, **kwargs):
1108 from unittest2 import case
1109 self = args[0]
1110 compiler = self.getCompiler()
1111 if "gcc" in compiler:
1112 self.skipTest("skipping because gcc is the test compiler")
1113 else:
1114 func(*args, **kwargs)
1115 return wrapper
1116
Matt Kopec0de53f02013-03-15 19:10:12 +00001117def skipIfIcc(func):
1118 """Decorate the item to skip tests that should be skipped if building with icc ."""
1119 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1120 raise Exception("@skipIfIcc can only be used to decorate a test method")
1121 @wraps(func)
1122 def wrapper(*args, **kwargs):
1123 from unittest2 import case
1124 self = args[0]
1125 compiler = self.getCompiler()
1126 if "icc" in compiler:
1127 self.skipTest("skipping because icc is the test compiler")
1128 else:
1129 func(*args, **kwargs)
1130 return wrapper
1131
Daniel Malea55faa402013-05-02 21:44:31 +00001132def skipIfi386(func):
1133 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1134 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1135 raise Exception("@skipIfi386 can only be used to decorate a test method")
1136 @wraps(func)
1137 def wrapper(*args, **kwargs):
1138 from unittest2 import case
1139 self = args[0]
1140 if "i386" == self.getArchitecture():
1141 self.skipTest("skipping because i386 is not a supported architecture")
1142 else:
1143 func(*args, **kwargs)
1144 return wrapper
1145
Pavel Labath090152b2015-08-20 11:37:19 +00001146def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001147 """Decorator to skip tests when the target is Android.
1148
1149 Arguments:
1150 api_levels - The API levels for which the test should be skipped. If
1151 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001152 arch - A sequence of architecture names specifying the architectures
1153 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001154 """
1155 def myImpl(func):
1156 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1157 raise Exception("@skipIfTargetAndroid can only be used to "
1158 "decorate a test method")
1159 @wraps(func)
1160 def wrapper(*args, **kwargs):
1161 from unittest2 import case
1162 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001163 if matchAndroid(api_levels, archs)(self):
1164 self.skipTest("skiped on Android target with API %d and architecture %s" %
1165 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001166 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001167 return wrapper
1168 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001169
Ilia Kd9953052015-03-12 07:19:41 +00001170def skipUnlessCompilerRt(func):
1171 """Decorate the item to skip tests if testing remotely."""
1172 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1173 raise Exception("@skipUnless can only be used to decorate a test method")
1174 @wraps(func)
1175 def wrapper(*args, **kwargs):
1176 from unittest2 import case
1177 import os.path
1178 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "projects", "compiler-rt")
1179 if not os.path.exists(compilerRtPath):
1180 self = args[0]
1181 self.skipTest("skip if compiler-rt not found")
1182 else:
1183 func(*args, **kwargs)
1184 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001185
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001186class _PlatformContext(object):
1187 """Value object class which contains platform-specific options."""
1188
1189 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1190 self.shlib_environment_var = shlib_environment_var
1191 self.shlib_prefix = shlib_prefix
1192 self.shlib_extension = shlib_extension
1193
1194
Johnny Chena74bb0a2011-08-01 18:46:13 +00001195class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001196 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001197 Abstract base for performing lldb (see TestBase) or other generic tests (see
1198 BenchBase for one example). lldbtest.Base works with the test driver to
1199 accomplish things.
1200
Johnny Chen8334dad2010-10-22 23:15:46 +00001201 """
Enrico Granata5020f952012-10-24 21:42:49 +00001202
Enrico Granata19186272012-10-24 21:44:48 +00001203 # The concrete subclass should override this attribute.
1204 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001205
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001206 # Keep track of the old current working directory.
1207 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001208
Greg Clayton4570d3e2013-12-10 23:19:29 +00001209 @staticmethod
1210 def compute_mydir(test_file):
1211 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1212
1213 mydir = TestBase.compute_mydir(__file__)'''
1214 test_dir = os.path.dirname(test_file)
1215 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1216
Johnny Chenfb4264c2011-08-01 19:50:58 +00001217 def TraceOn(self):
1218 """Returns True if we are in trace mode (tracing detailed test execution)."""
1219 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001220
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001221 @classmethod
1222 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001223 """
1224 Python unittest framework class setup fixture.
1225 Do current directory manipulation.
1226 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001227 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001228 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001229 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001230
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001231 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001232 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001233
1234 # Change current working directory if ${LLDB_TEST} is defined.
1235 # See also dotest.py which sets up ${LLDB_TEST}.
1236 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001237 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001238 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001239 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001240 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1241
Vince Harron85d19652015-05-21 19:09:29 +00001242 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001243 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001244 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1245 try:
1246 cls.dir_lock.try_acquire()
1247 # write the class that owns the lock into the lock file
1248 cls.dir_lock.handle.write(cls.__name__)
1249 except IOError as ioerror:
1250 # nothing else should have this directory lock
1251 # wait here until we get a lock
1252 cls.dir_lock.acquire()
1253 # read the previous owner from the lock file
1254 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001255 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 +00001256 raise ioerror
1257
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001258 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001259 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001260 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Robert Flackfb2f6c62015-04-17 08:02:18 +00001261 elif getPlatform() == "linux" or getPlatform() == "freebsd":
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001262 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001263 else:
1264 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001265
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001266 @classmethod
1267 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001268 """
1269 Python unittest framework class teardown fixture.
1270 Do class-wide cleanup.
1271 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001272
Johnny Chen0fddfb22011-11-17 19:57:27 +00001273 if doCleanup and not lldb.skip_build_and_cleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001274 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001275 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001276 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001277
Johnny Chen707b3c92010-10-11 22:25:46 +00001278 # Subclass might have specific cleanup function defined.
1279 if getattr(cls, "classCleanup", None):
1280 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001281 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001282 try:
1283 cls.classCleanup()
1284 except:
1285 exc_type, exc_value, exc_tb = sys.exc_info()
1286 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001287
Vince Harron85d19652015-05-21 19:09:29 +00001288 if debug_confirm_directory_exclusivity:
1289 cls.dir_lock.release()
1290 del cls.dir_lock
1291
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001292 # Restore old working directory.
1293 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001294 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001295 os.chdir(cls.oldcwd)
1296
Johnny Chena74bb0a2011-08-01 18:46:13 +00001297 @classmethod
1298 def skipLongRunningTest(cls):
1299 """
1300 By default, we skip long running test case.
1301 This can be overridden by passing '-l' to the test driver (dotest.py).
1302 """
1303 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1304 return False
1305 else:
1306 return True
Johnny Chened492022011-06-21 00:53:00 +00001307
Vince Harron6d3d0f12015-05-10 22:01:59 +00001308 def enableLogChannelsForCurrentTest(self):
1309 if len(lldbtest_config.channels) == 0:
1310 return
1311
1312 # if debug channels are specified in lldbtest_config.channels,
1313 # create a new set of log files for every test
1314 log_basename = self.getLogBasenameForCurrentTest()
1315
1316 # confirm that the file is writeable
1317 host_log_path = "{}-host.log".format(log_basename)
1318 open(host_log_path, 'w').close()
1319
1320 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1321 for channel_with_categories in lldbtest_config.channels:
1322 channel_then_categories = channel_with_categories.split(' ', 1)
1323 channel = channel_then_categories[0]
1324 if len(channel_then_categories) > 1:
1325 categories = channel_then_categories[1]
1326 else:
1327 categories = "default"
1328
1329 if channel == "gdb-remote":
1330 # communicate gdb-remote categories to debugserver
1331 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1332
1333 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1334 if not self.res.Succeeded():
1335 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1336
1337 # Communicate log path name to debugserver & lldb-server
1338 server_log_path = "{}-server.log".format(log_basename)
1339 open(server_log_path, 'w').close()
1340 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
1341
1342 # Communicate channels to lldb-server
1343 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
1344
1345 if len(lldbtest_config.channels) == 0:
1346 return
1347
1348 def disableLogChannelsForCurrentTest(self):
1349 # close all log files that we opened
1350 for channel_and_categories in lldbtest_config.channels:
1351 # channel format - <channel-name> [<category0> [<category1> ...]]
1352 channel = channel_and_categories.split(' ', 1)[0]
1353 self.ci.HandleCommand("log disable " + channel, self.res)
1354 if not self.res.Succeeded():
1355 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1356
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001357 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001358 """Fixture for unittest test case setup.
1359
1360 It works with the test driver to conditionally skip tests and does other
1361 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001362 #import traceback
1363 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001364
Daniel Malea9115f072013-08-06 15:02:32 +00001365 if "LIBCXX_PATH" in os.environ:
1366 self.libcxxPath = os.environ["LIBCXX_PATH"]
1367 else:
1368 self.libcxxPath = None
1369
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001370 if "LLDBMI_EXEC" in os.environ:
1371 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1372 else:
1373 self.lldbMiExec = None
1374 self.dont_do_lldbmi_test = True
Vince Harron790d95c2015-05-18 19:39:03 +00001375
Johnny Chenebe51722011-10-07 19:21:09 +00001376 # If we spawn an lldb process for test (via pexpect), do not load the
1377 # init file unless told otherwise.
1378 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1379 self.lldbOption = ""
1380 else:
1381 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001382
Johnny Chen985e7402011-08-01 21:13:26 +00001383 # Assign the test method name to self.testMethodName.
1384 #
1385 # For an example of the use of this attribute, look at test/types dir.
1386 # There are a bunch of test cases under test/types and we don't want the
1387 # module cacheing subsystem to be confused with executable name "a.out"
1388 # used for all the test cases.
1389 self.testMethodName = self._testMethodName
1390
Johnny Chenf3e22ac2010-12-10 18:52:10 +00001391 # Python API only test is decorated with @python_api_test,
1392 # which also sets the "__python_api_test__" attribute of the
1393 # function object to True.
Johnny Chen4533dad2011-05-31 23:21:42 +00001394 try:
1395 if lldb.just_do_python_api_test:
1396 testMethod = getattr(self, self._testMethodName)
1397 if getattr(testMethod, "__python_api_test__", False):
1398 pass
1399 else:
Johnny Chen5ccbccf2011-07-30 01:39:58 +00001400 self.skipTest("non python api test")
1401 except AttributeError:
1402 pass
1403
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001404 # lldb-mi only test is decorated with @lldbmi_test,
1405 # which also sets the "__lldbmi_test__" attribute of the
1406 # function object to True.
1407 try:
1408 if lldb.just_do_lldbmi_test:
1409 testMethod = getattr(self, self._testMethodName)
1410 if getattr(testMethod, "__lldbmi_test__", False):
1411 pass
1412 else:
1413 self.skipTest("non lldb-mi test")
1414 except AttributeError:
1415 pass
1416
Johnny Chen5ccbccf2011-07-30 01:39:58 +00001417 # Benchmarks test is decorated with @benchmarks_test,
1418 # which also sets the "__benchmarks_test__" attribute of the
1419 # function object to True.
1420 try:
1421 if lldb.just_do_benchmarks_test:
1422 testMethod = getattr(self, self._testMethodName)
1423 if getattr(testMethod, "__benchmarks_test__", False):
1424 pass
1425 else:
1426 self.skipTest("non benchmarks test")
Johnny Chen4533dad2011-05-31 23:21:42 +00001427 except AttributeError:
1428 pass
Johnny Chenf3e22ac2010-12-10 18:52:10 +00001429
Johnny Chen985e7402011-08-01 21:13:26 +00001430 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1431 # with it using pexpect.
1432 self.child = None
1433 self.child_prompt = "(lldb) "
1434 # If the child is interacting with the embedded script interpreter,
1435 # there are two exits required during tear down, first to quit the
1436 # embedded script interpreter and second to quit the lldb command
1437 # interpreter.
1438 self.child_in_script_interpreter = False
1439
Johnny Chenfb4264c2011-08-01 19:50:58 +00001440 # These are for customized teardown cleanup.
1441 self.dict = None
1442 self.doTearDownCleanup = False
1443 # And in rare cases where there are multiple teardown cleanups.
1444 self.dicts = []
1445 self.doTearDownCleanups = False
1446
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001447 # List of spawned subproces.Popen objects
1448 self.subprocesses = []
1449
Daniel Malea69207462013-06-05 21:07:02 +00001450 # List of forked process PIDs
1451 self.forkedProcessPids = []
1452
Johnny Chenfb4264c2011-08-01 19:50:58 +00001453 # Create a string buffer to record the session info, to be dumped into a
1454 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001455 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001456
Vince Harron1f160372015-05-21 18:51:20 +00001457 session_file = "{}.log".format(self.log_basename)
Vince Harron35b17dc2015-05-21 18:20:21 +00001458 unbuffered = 0 # 0 is the constant for unbuffered
Vince Harron1f160372015-05-21 18:51:20 +00001459 self.session = open(session_file, "w", unbuffered)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001460
1461 # Optimistically set __errored__, __failed__, __expected__ to False
1462 # initially. If the test errored/failed, the session info
1463 # (self.session) is then dumped into a session specific file for
1464 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001465 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001466 self.__errored__ = False
1467 self.__failed__ = False
1468 self.__expected__ = False
1469 # We are also interested in unexpected success.
1470 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001471 # And skipped tests.
1472 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001473
1474 # See addTearDownHook(self, hook) which allows the client to add a hook
1475 # function to be run during tearDown() time.
1476 self.hooks = []
1477
1478 # See HideStdout(self).
1479 self.sys_stdout_hidden = False
1480
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001481 if self.platformContext:
1482 # set environment variable names for finding shared libraries
1483 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001484
Vince Harron6d3d0f12015-05-10 22:01:59 +00001485 # Create the debugger instance if necessary.
1486 try:
1487 self.dbg = lldb.DBG
1488 except AttributeError:
1489 self.dbg = lldb.SBDebugger.Create()
1490
1491 if not self.dbg:
1492 raise Exception('Invalid debugger instance')
1493
1494 # Retrieve the associated command interpreter instance.
1495 self.ci = self.dbg.GetCommandInterpreter()
1496 if not self.ci:
1497 raise Exception('Could not get the command interpreter')
1498
1499 # And the result object.
1500 self.res = lldb.SBCommandReturnObject()
1501
1502 self.enableLogChannelsForCurrentTest()
1503
Johnny Chen2a808582011-10-19 16:48:07 +00001504 def runHooks(self, child=None, child_prompt=None, use_cmd_api=False):
Johnny Chena737ba52011-10-19 01:06:21 +00001505 """Perform the run hooks to bring lldb debugger to the desired state.
1506
Johnny Chen2a808582011-10-19 16:48:07 +00001507 By default, expect a pexpect spawned child and child prompt to be
1508 supplied (use_cmd_api=False). If use_cmd_api is true, ignore the child
1509 and child prompt and use self.runCmd() to run the hooks one by one.
1510
Johnny Chena737ba52011-10-19 01:06:21 +00001511 Note that child is a process spawned by pexpect.spawn(). If not, your
1512 test case is mostly likely going to fail.
1513
1514 See also dotest.py where lldb.runHooks are processed/populated.
1515 """
1516 if not lldb.runHooks:
1517 self.skipTest("No runhooks specified for lldb, skip the test")
Johnny Chen2a808582011-10-19 16:48:07 +00001518 if use_cmd_api:
1519 for hook in lldb.runhooks:
1520 self.runCmd(hook)
1521 else:
1522 if not child or not child_prompt:
1523 self.fail("Both child and child_prompt need to be defined.")
1524 for hook in lldb.runHooks:
1525 child.sendline(hook)
1526 child.expect_exact(child_prompt)
Johnny Chena737ba52011-10-19 01:06:21 +00001527
Daniel Malea249287a2013-02-19 16:08:57 +00001528 def setAsync(self, value):
1529 """ Sets async mode to True/False and ensures it is reset after the testcase completes."""
1530 old_async = self.dbg.GetAsync()
1531 self.dbg.SetAsync(value)
1532 self.addTearDownHook(lambda: self.dbg.SetAsync(old_async))
1533
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001534 def cleanupSubprocesses(self):
1535 # Ensure any subprocesses are cleaned up
1536 for p in self.subprocesses:
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001537 p.terminate()
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001538 del p
1539 del self.subprocesses[:]
Daniel Malea69207462013-06-05 21:07:02 +00001540 # Ensure any forked processes are cleaned up
1541 for pid in self.forkedProcessPids:
1542 if os.path.exists("/proc/" + str(pid)):
1543 os.kill(pid, signal.SIGTERM)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001544
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001545 def spawnSubprocess(self, executable, args=[], install_remote=True):
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001546 """ Creates a subprocess.Popen object with the specified executable and arguments,
1547 saves it in self.subprocesses, and returns the object.
1548 NOTE: if using this function, ensure you also call:
1549
1550 self.addTearDownHook(self.cleanupSubprocesses)
1551
1552 otherwise the test suite will leak processes.
1553 """
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001554 proc = _RemoteProcess(install_remote) if lldb.remote_platform else _LocalProcess(self.TraceOn())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001555 proc.launch(executable, args)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001556 self.subprocesses.append(proc)
1557 return proc
1558
Daniel Malea69207462013-06-05 21:07:02 +00001559 def forkSubprocess(self, executable, args=[]):
1560 """ Fork a subprocess with its own group ID.
1561 NOTE: if using this function, ensure you also call:
1562
1563 self.addTearDownHook(self.cleanupSubprocesses)
1564
1565 otherwise the test suite will leak processes.
1566 """
1567 child_pid = os.fork()
1568 if child_pid == 0:
1569 # If more I/O support is required, this can be beefed up.
1570 fd = os.open(os.devnull, os.O_RDWR)
Daniel Malea69207462013-06-05 21:07:02 +00001571 os.dup2(fd, 1)
1572 os.dup2(fd, 2)
1573 # This call causes the child to have its of group ID
1574 os.setpgid(0,0)
1575 os.execvp(executable, [executable] + args)
1576 # Give the child time to get through the execvp() call
1577 time.sleep(0.1)
1578 self.forkedProcessPids.append(child_pid)
1579 return child_pid
1580
Johnny Chenfb4264c2011-08-01 19:50:58 +00001581 def HideStdout(self):
1582 """Hide output to stdout from the user.
1583
1584 During test execution, there might be cases where we don't want to show the
1585 standard output to the user. For example,
1586
Zachary Turner35d017f2015-10-23 17:04:29 +00001587 self.runCmd(r'''sc print("\n\n\tHello!\n")''')
Johnny Chenfb4264c2011-08-01 19:50:58 +00001588
1589 tests whether command abbreviation for 'script' works or not. There is no
1590 need to show the 'Hello' output to the user as long as the 'script' command
1591 succeeds and we are not in TraceOn() mode (see the '-t' option).
1592
1593 In this case, the test method calls self.HideStdout(self) to redirect the
1594 sys.stdout to a null device, and restores the sys.stdout upon teardown.
1595
1596 Note that you should only call this method at most once during a test case
1597 execution. Any subsequent call has no effect at all."""
1598 if self.sys_stdout_hidden:
1599 return
1600
1601 self.sys_stdout_hidden = True
1602 old_stdout = sys.stdout
1603 sys.stdout = open(os.devnull, 'w')
1604 def restore_stdout():
1605 sys.stdout = old_stdout
1606 self.addTearDownHook(restore_stdout)
1607
1608 # =======================================================================
1609 # Methods for customized teardown cleanups as well as execution of hooks.
1610 # =======================================================================
1611
1612 def setTearDownCleanup(self, dictionary=None):
1613 """Register a cleanup action at tearDown() time with a dictinary"""
1614 self.dict = dictionary
1615 self.doTearDownCleanup = True
1616
1617 def addTearDownCleanup(self, dictionary):
1618 """Add a cleanup action at tearDown() time with a dictinary"""
1619 self.dicts.append(dictionary)
1620 self.doTearDownCleanups = True
1621
1622 def addTearDownHook(self, hook):
1623 """
1624 Add a function to be run during tearDown() time.
1625
1626 Hooks are executed in a first come first serve manner.
1627 """
1628 if callable(hook):
1629 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001630 print("Adding tearDown hook:", getsource_if_available(hook), file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001631 self.hooks.append(hook)
Enrico Granataab0e8312014-11-05 21:31:57 +00001632
1633 return self
Johnny Chenfb4264c2011-08-01 19:50:58 +00001634
Jim Inghamda3a3862014-10-16 23:02:14 +00001635 def deletePexpectChild(self):
Johnny Chen985e7402011-08-01 21:13:26 +00001636 # This is for the case of directly spawning 'lldb' and interacting with it
1637 # using pexpect.
Johnny Chen985e7402011-08-01 21:13:26 +00001638 if self.child and self.child.isalive():
Zachary Turner9ef307b2014-07-22 16:19:29 +00001639 import pexpect
Johnny Chen985e7402011-08-01 21:13:26 +00001640 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001641 print("tearing down the child process....", file=sbuf)
Johnny Chen985e7402011-08-01 21:13:26 +00001642 try:
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001643 if self.child_in_script_interpreter:
1644 self.child.sendline('quit()')
1645 self.child.expect_exact(self.child_prompt)
1646 self.child.sendline('settings set interpreter.prompt-on-quit false')
1647 self.child.sendline('quit')
Johnny Chen985e7402011-08-01 21:13:26 +00001648 self.child.expect(pexpect.EOF)
Ilia K47448c22015-02-11 21:41:58 +00001649 except (ValueError, pexpect.ExceptionPexpect):
1650 # child is already terminated
1651 pass
1652 except OSError as exception:
1653 import errno
1654 if exception.errno != errno.EIO:
1655 # unexpected error
1656 raise
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001657 # child is already terminated
Johnny Chen985e7402011-08-01 21:13:26 +00001658 pass
Shawn Besteb3e9052014-11-06 17:52:15 +00001659 finally:
1660 # Give it one final blow to make sure the child is terminated.
1661 self.child.close()
Jim Inghamda3a3862014-10-16 23:02:14 +00001662
1663 def tearDown(self):
1664 """Fixture for unittest test case teardown."""
1665 #import traceback
1666 #traceback.print_stack()
1667
1668 self.deletePexpectChild()
1669
Johnny Chenfb4264c2011-08-01 19:50:58 +00001670 # Check and run any hook functions.
1671 for hook in reversed(self.hooks):
1672 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001673 print("Executing tearDown hook:", getsource_if_available(hook), file=sbuf)
Enrico Granataab0e8312014-11-05 21:31:57 +00001674 import inspect
1675 hook_argc = len(inspect.getargspec(hook).args)
Enrico Granata6e0566c2014-11-17 19:00:20 +00001676 if hook_argc == 0 or getattr(hook,'im_self',None):
Enrico Granataab0e8312014-11-05 21:31:57 +00001677 hook()
1678 elif hook_argc == 1:
1679 hook(self)
1680 else:
1681 hook() # try the plain call and hope it works
Johnny Chenfb4264c2011-08-01 19:50:58 +00001682
1683 del self.hooks
1684
1685 # Perform registered teardown cleanup.
1686 if doCleanup and self.doTearDownCleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00001687 self.cleanup(dictionary=self.dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001688
1689 # In rare cases where there are multiple teardown cleanups added.
1690 if doCleanup and self.doTearDownCleanups:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001691 if self.dicts:
1692 for dict in reversed(self.dicts):
Johnny Chen0fddfb22011-11-17 19:57:27 +00001693 self.cleanup(dictionary=dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001694
Vince Harron9753dd92015-05-10 15:22:09 +00001695 self.disableLogChannelsForCurrentTest()
1696
Johnny Chenfb4264c2011-08-01 19:50:58 +00001697 # =========================================================
1698 # Various callbacks to allow introspection of test progress
1699 # =========================================================
1700
1701 def markError(self):
1702 """Callback invoked when an error (unexpected exception) errored."""
1703 self.__errored__ = True
1704 with recording(self, False) as sbuf:
1705 # False because there's no need to write "ERROR" to the stderr twice.
1706 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001707 print("ERROR", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001708
Zachary Turnerb1490b62015-08-26 19:44:56 +00001709 def markCleanupError(self):
1710 """Callback invoked when an error occurs while a test is cleaning up."""
1711 self.__cleanup_errored__ = True
1712 with recording(self, False) as sbuf:
1713 # False because there's no need to write "CLEANUP_ERROR" to the stderr twice.
1714 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001715 print("CLEANUP_ERROR", file=sbuf)
Zachary Turnerb1490b62015-08-26 19:44:56 +00001716
Johnny Chenfb4264c2011-08-01 19:50:58 +00001717 def markFailure(self):
1718 """Callback invoked when a failure (test assertion failure) occurred."""
1719 self.__failed__ = True
1720 with recording(self, False) as sbuf:
1721 # False because there's no need to write "FAIL" to the stderr twice.
1722 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001723 print("FAIL", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001724
Enrico Granatae6cedc12013-02-23 01:05:23 +00001725 def markExpectedFailure(self,err,bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001726 """Callback invoked when an expected failure/error occurred."""
1727 self.__expected__ = True
1728 with recording(self, False) as sbuf:
1729 # False because there's no need to write "expected failure" to the
1730 # stderr twice.
1731 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001732 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001733 print("expected failure", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001734 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001735 print("expected failure (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001736
Johnny Chenc5cc6252011-08-15 23:09:08 +00001737 def markSkippedTest(self):
1738 """Callback invoked when a test is skipped."""
1739 self.__skipped__ = True
1740 with recording(self, False) as sbuf:
1741 # False because there's no need to write "skipped test" to the
1742 # stderr twice.
1743 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001744 print("skipped test", file=sbuf)
Johnny Chenc5cc6252011-08-15 23:09:08 +00001745
Enrico Granatae6cedc12013-02-23 01:05:23 +00001746 def markUnexpectedSuccess(self, bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001747 """Callback invoked when an unexpected success occurred."""
1748 self.__unexpected__ = True
1749 with recording(self, False) as sbuf:
1750 # False because there's no need to write "unexpected success" to the
1751 # stderr twice.
1752 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001753 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001754 print("unexpected success", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001755 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001756 print("unexpected success (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001757
Greg Clayton70995582015-01-07 22:25:50 +00001758 def getRerunArgs(self):
1759 return " -f %s.%s" % (self.__class__.__name__, self._testMethodName)
Vince Harron9753dd92015-05-10 15:22:09 +00001760
1761 def getLogBasenameForCurrentTest(self, prefix=None):
1762 """
1763 returns a partial path that can be used as the beginning of the name of multiple
1764 log files pertaining to this test
1765
1766 <session-dir>/<arch>-<compiler>-<test-file>.<test-class>.<test-method>
1767 """
1768 dname = os.path.join(os.environ["LLDB_TEST"],
1769 os.environ["LLDB_SESSION_DIRNAME"])
1770 if not os.path.isdir(dname):
1771 os.mkdir(dname)
1772
1773 compiler = self.getCompiler()
1774
1775 if compiler[1] == ':':
1776 compiler = compiler[2:]
Chaoren Lin636a0e32015-07-17 21:40:11 +00001777 if os.path.altsep is not None:
1778 compiler = compiler.replace(os.path.altsep, os.path.sep)
Vince Harron9753dd92015-05-10 15:22:09 +00001779
Vince Harron19e300f2015-05-12 00:50:54 +00001780 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), "_".join(compiler.split(os.path.sep)))
Vince Harron9753dd92015-05-10 15:22:09 +00001781 if len(fname) > 200:
Vince Harron19e300f2015-05-12 00:50:54 +00001782 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), compiler.split(os.path.sep)[-1])
Vince Harron9753dd92015-05-10 15:22:09 +00001783
1784 if prefix is not None:
1785 fname = "{}-{}".format(prefix, fname)
1786
1787 return os.path.join(dname, fname)
1788
Johnny Chenfb4264c2011-08-01 19:50:58 +00001789 def dumpSessionInfo(self):
1790 """
1791 Dump the debugger interactions leading to a test error/failure. This
1792 allows for more convenient postmortem analysis.
1793
1794 See also LLDBTestResult (dotest.py) which is a singlton class derived
1795 from TextTestResult and overwrites addError, addFailure, and
1796 addExpectedFailure methods to allow us to to mark the test instance as
1797 such.
1798 """
1799
1800 # We are here because self.tearDown() detected that this test instance
1801 # either errored or failed. The lldb.test_result singleton contains
1802 # two lists (erros and failures) which get populated by the unittest
1803 # framework. Look over there for stack trace information.
1804 #
1805 # The lists contain 2-tuples of TestCase instances and strings holding
1806 # formatted tracebacks.
1807 #
1808 # See http://docs.python.org/library/unittest.html#unittest.TestResult.
Vince Harron9753dd92015-05-10 15:22:09 +00001809
Vince Harron35b17dc2015-05-21 18:20:21 +00001810 # output tracebacks into session
Vince Harron9753dd92015-05-10 15:22:09 +00001811 pairs = []
Johnny Chenfb4264c2011-08-01 19:50:58 +00001812 if self.__errored__:
1813 pairs = lldb.test_result.errors
1814 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001815 elif self.__cleanup_errored__:
Zachary Turnerb1490b62015-08-26 19:44:56 +00001816 pairs = lldb.test_result.cleanup_errors
1817 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001818 elif self.__failed__:
1819 pairs = lldb.test_result.failures
1820 prefix = 'Failure'
1821 elif self.__expected__:
1822 pairs = lldb.test_result.expectedFailures
1823 prefix = 'ExpectedFailure'
Johnny Chenc5cc6252011-08-15 23:09:08 +00001824 elif self.__skipped__:
1825 prefix = 'SkippedTest'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001826 elif self.__unexpected__:
Vince Harron35b17dc2015-05-21 18:20:21 +00001827 prefix = 'UnexpectedSuccess'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001828 else:
Vince Harron35b17dc2015-05-21 18:20:21 +00001829 prefix = 'Success'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001830
Johnny Chenc5cc6252011-08-15 23:09:08 +00001831 if not self.__unexpected__ and not self.__skipped__:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001832 for test, traceback in pairs:
1833 if test is self:
Zachary Turnerff890da2015-10-19 23:45:41 +00001834 print(traceback, file=self.session)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001835
Vince Harron35b17dc2015-05-21 18:20:21 +00001836 # put footer (timestamp/rerun instructions) into session
Johnny Chen8082a002011-08-11 00:16:28 +00001837 testMethod = getattr(self, self._testMethodName)
1838 if getattr(testMethod, "__benchmarks_test__", False):
1839 benchmarks = True
1840 else:
1841 benchmarks = False
1842
Vince Harron35b17dc2015-05-21 18:20:21 +00001843 import datetime
Zachary Turnerff890da2015-10-19 23:45:41 +00001844 print("Session info generated @", datetime.datetime.now().ctime(), file=self.session)
1845 print("To rerun this test, issue the following command from the 'test' directory:\n", file=self.session)
1846 print("./dotest.py %s -v %s %s" % (self.getRunOptions(),
Vince Harron35b17dc2015-05-21 18:20:21 +00001847 ('+b' if benchmarks else '-t'),
Zachary Turnerff890da2015-10-19 23:45:41 +00001848 self.getRerunArgs()), file=self.session)
Vince Harron35b17dc2015-05-21 18:20:21 +00001849 self.session.close()
1850 del self.session
1851
1852 # process the log files
Vince Harron1f160372015-05-21 18:51:20 +00001853 log_files_for_this_test = glob.glob(self.log_basename + "*")
Vince Harron35b17dc2015-05-21 18:20:21 +00001854
1855 if prefix != 'Success' or lldbtest_config.log_success:
1856 # keep all log files, rename them to include prefix
1857 dst_log_basename = self.getLogBasenameForCurrentTest(prefix)
1858 for src in log_files_for_this_test:
Zachary Turner306278f2015-05-26 20:26:29 +00001859 if os.path.isfile(src):
1860 dst = src.replace(self.log_basename, dst_log_basename)
1861 if os.name == "nt" and os.path.isfile(dst):
1862 # On Windows, renaming a -> b will throw an exception if b exists. On non-Windows platforms
1863 # it silently replaces the destination. Ultimately this means that atomic renames are not
1864 # guaranteed to be possible on Windows, but we need this to work anyway, so just remove the
1865 # destination first if it already exists.
1866 os.remove(dst)
Zachary Turner5de068b2015-05-26 19:52:24 +00001867
Zachary Turner306278f2015-05-26 20:26:29 +00001868 os.rename(src, dst)
Vince Harron35b17dc2015-05-21 18:20:21 +00001869 else:
1870 # success! (and we don't want log files) delete log files
1871 for log_file in log_files_for_this_test:
Adrian McCarthya7292042015-09-04 20:48:48 +00001872 try:
1873 os.unlink(log_file)
1874 except:
1875 # We've seen consistent unlink failures on Windows, perhaps because the
1876 # just-created log file is being scanned by anti-virus. Empirically, this
1877 # sleep-and-retry approach allows tests to succeed much more reliably.
1878 # Attempts to figure out exactly what process was still holding a file handle
1879 # have failed because running instrumentation like Process Monitor seems to
1880 # slow things down enough that the problem becomes much less consistent.
1881 time.sleep(0.5)
1882 os.unlink(log_file)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001883
1884 # ====================================================
1885 # Config. methods supported through a plugin interface
1886 # (enables reading of the current test configuration)
1887 # ====================================================
1888
1889 def getArchitecture(self):
1890 """Returns the architecture in effect the test suite is running with."""
1891 module = builder_module()
Ed Maste0f434e62015-04-06 15:50:48 +00001892 arch = module.getArchitecture()
1893 if arch == 'amd64':
1894 arch = 'x86_64'
1895 return arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001896
Vince Harron02613762015-05-04 00:17:53 +00001897 def getLldbArchitecture(self):
1898 """Returns the architecture of the lldb binary."""
1899 if not hasattr(self, 'lldbArchitecture'):
1900
1901 # spawn local process
1902 command = [
Vince Harron790d95c2015-05-18 19:39:03 +00001903 lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001904 "-o",
Vince Harron790d95c2015-05-18 19:39:03 +00001905 "file " + lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001906 "-o",
1907 "quit"
1908 ]
1909
1910 output = check_output(command)
1911 str = output.decode("utf-8");
1912
1913 for line in str.splitlines():
1914 m = re.search("Current executable set to '.*' \\((.*)\\)\\.", line)
1915 if m:
1916 self.lldbArchitecture = m.group(1)
1917 break
1918
1919 return self.lldbArchitecture
1920
Johnny Chenfb4264c2011-08-01 19:50:58 +00001921 def getCompiler(self):
1922 """Returns the compiler in effect the test suite is running with."""
1923 module = builder_module()
1924 return module.getCompiler()
1925
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001926 def getCompilerBinary(self):
1927 """Returns the compiler binary the test suite is running with."""
1928 return self.getCompiler().split()[0]
1929
Daniel Malea0aea0162013-02-27 17:29:46 +00001930 def getCompilerVersion(self):
1931 """ Returns a string that represents the compiler version.
1932 Supports: llvm, clang.
1933 """
1934 from lldbutil import which
1935 version = 'unknown'
1936
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001937 compiler = self.getCompilerBinary()
Zachary Turner9ef307b2014-07-22 16:19:29 +00001938 version_output = system([[which(compiler), "-v"]])[1]
Daniel Malea0aea0162013-02-27 17:29:46 +00001939 for line in version_output.split(os.linesep):
Greg Clayton2a844b72013-03-06 02:34:51 +00001940 m = re.search('version ([0-9\.]+)', line)
Daniel Malea0aea0162013-02-27 17:29:46 +00001941 if m:
1942 version = m.group(1)
1943 return version
1944
Ryan Brown57bee1e2015-09-14 22:45:11 +00001945 def getGoCompilerVersion(self):
1946 """ Returns a string that represents the go compiler version, or None if go is not found.
1947 """
1948 compiler = which("go")
1949 if compiler:
1950 version_output = system([[compiler, "version"]])[0]
1951 for line in version_output.split(os.linesep):
1952 m = re.search('go version (devel|go\\S+)', line)
1953 if m:
1954 return m.group(1)
1955 return None
1956
Greg Claytone0d0a762015-04-02 18:24:03 +00001957 def platformIsDarwin(self):
1958 """Returns true if the OS triple for the selected platform is any valid apple OS"""
Robert Flackfb2f6c62015-04-17 08:02:18 +00001959 return platformIsDarwin()
Vince Harron20952cc2015-04-03 01:00:06 +00001960
Robert Flack13c7ad92015-03-30 14:12:17 +00001961 def getPlatform(self):
Robert Flackfb2f6c62015-04-17 08:02:18 +00001962 """Returns the target platform the test suite is running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001963 return getPlatform()
Robert Flack13c7ad92015-03-30 14:12:17 +00001964
Daniel Maleaadaaec92013-08-06 20:51:41 +00001965 def isIntelCompiler(self):
1966 """ Returns true if using an Intel (ICC) compiler, false otherwise. """
1967 return any([x in self.getCompiler() for x in ["icc", "icpc", "icl"]])
1968
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001969 def expectedCompilerVersion(self, compiler_version):
1970 """Returns True iff compiler_version[1] matches the current compiler version.
1971 Use compiler_version[0] to specify the operator used to determine if a match has occurred.
1972 Any operator other than the following defaults to an equality test:
1973 '>', '>=', "=>", '<', '<=', '=<', '!=', "!" or 'not'
1974 """
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001975 if (compiler_version == None):
1976 return True
1977 operator = str(compiler_version[0])
1978 version = compiler_version[1]
1979
1980 if (version == None):
1981 return True
1982 if (operator == '>'):
1983 return self.getCompilerVersion() > version
1984 if (operator == '>=' or operator == '=>'):
1985 return self.getCompilerVersion() >= version
1986 if (operator == '<'):
1987 return self.getCompilerVersion() < version
1988 if (operator == '<=' or operator == '=<'):
1989 return self.getCompilerVersion() <= version
1990 if (operator == '!=' or operator == '!' or operator == 'not'):
1991 return str(version) not in str(self.getCompilerVersion())
1992 return str(version) in str(self.getCompilerVersion())
1993
1994 def expectedCompiler(self, compilers):
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001995 """Returns True iff any element of compilers is a sub-string of the current compiler."""
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001996 if (compilers == None):
1997 return True
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001998
1999 for compiler in compilers:
2000 if compiler in self.getCompiler():
2001 return True
2002
2003 return False
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00002004
Ying Chen7091c2c2015-04-21 01:15:47 +00002005 def expectedArch(self, archs):
2006 """Returns True iff any element of archs is a sub-string of the current architecture."""
2007 if (archs == None):
2008 return True
2009
2010 for arch in archs:
2011 if arch in self.getArchitecture():
2012 return True
2013
2014 return False
2015
Johnny Chenfb4264c2011-08-01 19:50:58 +00002016 def getRunOptions(self):
2017 """Command line option for -A and -C to run this test again, called from
2018 self.dumpSessionInfo()."""
2019 arch = self.getArchitecture()
2020 comp = self.getCompiler()
Johnny Chenb7bdd102011-08-24 19:48:51 +00002021 if arch:
2022 option_str = "-A " + arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00002023 else:
Johnny Chenb7bdd102011-08-24 19:48:51 +00002024 option_str = ""
2025 if comp:
Johnny Chen531c0852012-03-16 20:44:00 +00002026 option_str += " -C " + comp
Johnny Chenb7bdd102011-08-24 19:48:51 +00002027 return option_str
Johnny Chenfb4264c2011-08-01 19:50:58 +00002028
2029 # ==================================================
2030 # Build methods supported through a plugin interface
2031 # ==================================================
2032
Ed Mastec97323e2014-04-01 18:47:58 +00002033 def getstdlibFlag(self):
2034 """ Returns the proper -stdlib flag, or empty if not required."""
Robert Flack4629c4b2015-05-15 18:54:32 +00002035 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Ed Mastec97323e2014-04-01 18:47:58 +00002036 stdlibflag = "-stdlib=libc++"
2037 else:
2038 stdlibflag = ""
2039 return stdlibflag
2040
Matt Kopec7663b3a2013-09-25 17:44:00 +00002041 def getstdFlag(self):
2042 """ Returns the proper stdflag. """
Daniel Malea55faa402013-05-02 21:44:31 +00002043 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
Daniel Malea0b7c6112013-05-06 19:31:31 +00002044 stdflag = "-std=c++0x"
Daniel Malea55faa402013-05-02 21:44:31 +00002045 else:
2046 stdflag = "-std=c++11"
Matt Kopec7663b3a2013-09-25 17:44:00 +00002047 return stdflag
2048
2049 def buildDriver(self, sources, exe_name):
2050 """ Platform-specific way to build a program that links with LLDB (via the liblldb.so
2051 or LLDB.framework).
2052 """
2053
2054 stdflag = self.getstdFlag()
Ed Mastec97323e2014-04-01 18:47:58 +00002055 stdlibflag = self.getstdlibFlag()
Daniel Malea55faa402013-05-02 21:44:31 +00002056
2057 if sys.platform.startswith("darwin"):
2058 dsym = os.path.join(self.lib_dir, 'LLDB.framework', 'LLDB')
2059 d = {'CXX_SOURCES' : sources,
2060 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002061 'CFLAGS_EXTRAS' : "%s %s" % (stdflag, stdlibflag),
Daniel Malea55faa402013-05-02 21:44:31 +00002062 'FRAMEWORK_INCLUDES' : "-F%s" % self.lib_dir,
Stefanus Du Toit04004442013-07-30 19:19:49 +00002063 'LD_EXTRAS' : "%s -Wl,-rpath,%s" % (dsym, self.lib_dir),
Daniel Malea55faa402013-05-02 21:44:31 +00002064 }
Ed Maste372c24d2013-07-25 21:02:34 +00002065 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 +00002066 d = {'CXX_SOURCES' : sources,
Daniel Malea55faa402013-05-02 21:44:31 +00002067 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002068 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Daniel Malea55faa402013-05-02 21:44:31 +00002069 'LD_EXTRAS' : "-L%s -llldb" % self.lib_dir}
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002070 elif sys.platform.startswith('win'):
2071 d = {'CXX_SOURCES' : sources,
2072 'EXE' : exe_name,
2073 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
2074 'LD_EXTRAS' : "-L%s -lliblldb" % self.implib_dir}
Daniel Malea55faa402013-05-02 21:44:31 +00002075 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002076 print("Building LLDB Driver (%s) from sources %s" % (exe_name, sources))
Daniel Malea55faa402013-05-02 21:44:31 +00002077
2078 self.buildDefault(dictionary=d)
2079
Matt Kopec7663b3a2013-09-25 17:44:00 +00002080 def buildLibrary(self, sources, lib_name):
2081 """Platform specific way to build a default library. """
2082
2083 stdflag = self.getstdFlag()
2084
Robert Flack4629c4b2015-05-15 18:54:32 +00002085 if self.platformIsDarwin():
Matt Kopec7663b3a2013-09-25 17:44:00 +00002086 dsym = os.path.join(self.lib_dir, 'LLDB.framework', 'LLDB')
2087 d = {'DYLIB_CXX_SOURCES' : sources,
2088 'DYLIB_NAME' : lib_name,
2089 'CFLAGS_EXTRAS' : "%s -stdlib=libc++" % stdflag,
2090 'FRAMEWORK_INCLUDES' : "-F%s" % self.lib_dir,
2091 'LD_EXTRAS' : "%s -Wl,-rpath,%s -dynamiclib" % (dsym, self.lib_dir),
2092 }
Robert Flack4629c4b2015-05-15 18:54:32 +00002093 elif self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux' or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Matt Kopec7663b3a2013-09-25 17:44:00 +00002094 d = {'DYLIB_CXX_SOURCES' : sources,
2095 'DYLIB_NAME' : lib_name,
2096 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
2097 'LD_EXTRAS' : "-shared -L%s -llldb" % self.lib_dir}
Robert Flack4629c4b2015-05-15 18:54:32 +00002098 elif self.getPlatform() == 'windows':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002099 d = {'DYLIB_CXX_SOURCES' : sources,
2100 'DYLIB_NAME' : lib_name,
2101 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
2102 'LD_EXTRAS' : "-shared -l%s\liblldb.lib" % self.implib_dir}
Matt Kopec7663b3a2013-09-25 17:44:00 +00002103 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002104 print("Building LLDB Library (%s) from sources %s" % (lib_name, sources))
Matt Kopec7663b3a2013-09-25 17:44:00 +00002105
2106 self.buildDefault(dictionary=d)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002107
Daniel Malea55faa402013-05-02 21:44:31 +00002108 def buildProgram(self, sources, exe_name):
2109 """ Platform specific way to build an executable from C/C++ sources. """
2110 d = {'CXX_SOURCES' : sources,
2111 'EXE' : exe_name}
2112 self.buildDefault(dictionary=d)
2113
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002114 def buildDefault(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002115 """Platform specific way to build the default binaries."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002116 if lldb.skip_build_and_cleanup:
2117 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002118 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002119 if target_is_android():
2120 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002121 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002122 raise Exception("Don't know how to build default binary")
2123
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002124 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002125 """Platform specific way to build binaries with dsym info."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002126 if lldb.skip_build_and_cleanup:
2127 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002128 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002129 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002130 raise Exception("Don't know how to build binary with dsym")
2131
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002132 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002133 """Platform specific way to build binaries with dwarf maps."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002134 if lldb.skip_build_and_cleanup:
2135 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002136 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002137 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002138 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002139 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002140 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002141
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002142 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2143 """Platform specific way to build binaries with dwarf maps."""
2144 if lldb.skip_build_and_cleanup:
2145 return
2146 module = builder_module()
2147 if target_is_android():
2148 dictionary = append_android_envs(dictionary)
2149 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2150 raise Exception("Don't know how to build binary with dwo")
2151
Ryan Brown57bee1e2015-09-14 22:45:11 +00002152 def buildGo(self):
2153 """Build the default go binary.
2154 """
2155 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2156
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002157 def signBinary(self, binary_path):
2158 if sys.platform.startswith("darwin"):
2159 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2160 call(codesign_cmd, shell=True)
2161
Kuba Breckabeed8212014-09-04 01:03:18 +00002162 def findBuiltClang(self):
2163 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2164 paths_to_try = [
2165 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2166 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2167 "llvm-build/Release/x86_64/Release/bin/clang",
2168 "llvm-build/Debug/x86_64/Debug/bin/clang",
2169 ]
2170 lldb_root_path = os.path.join(os.path.dirname(__file__), "..")
2171 for p in paths_to_try:
2172 path = os.path.join(lldb_root_path, p)
2173 if os.path.exists(path):
2174 return path
Ilia Kd9953052015-03-12 07:19:41 +00002175
2176 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002177 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002178 if os.path.exists(path):
2179 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002180
2181 return os.environ["CC"]
2182
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002183 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002184 """ Returns a dictionary (which can be provided to build* functions above) which
2185 contains OS-specific build flags.
2186 """
2187 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002188 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002189
2190 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002191 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002192 use_libcxx = True
2193
2194 if use_libcxx and self.libcxxPath:
2195 cflags += "-stdlib=libc++ "
2196 if self.libcxxPath:
2197 libcxxInclude = os.path.join(self.libcxxPath, "include")
2198 libcxxLib = os.path.join(self.libcxxPath, "lib")
2199 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2200 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2201
Andrew Kaylor93132f52013-05-28 23:04:25 +00002202 if use_cpp11:
2203 cflags += "-std="
2204 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2205 cflags += "c++0x"
2206 else:
2207 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002208 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002209 cflags += " -stdlib=libc++"
2210 elif "clang" in self.getCompiler():
2211 cflags += " -stdlib=libstdc++"
2212
Andrew Kaylor93132f52013-05-28 23:04:25 +00002213 return {'CFLAGS_EXTRAS' : cflags,
2214 'LD_EXTRAS' : ldflags,
2215 }
2216
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002217 def cleanup(self, dictionary=None):
2218 """Platform specific way to do cleanup after build."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002219 if lldb.skip_build_and_cleanup:
2220 return
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002221 module = builder_module()
2222 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002223 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002224
Daniel Malea55faa402013-05-02 21:44:31 +00002225 def getLLDBLibraryEnvVal(self):
2226 """ Returns the path that the OS-specific library search environment variable
2227 (self.dylibPath) should be set to in order for a program to find the LLDB
2228 library. If an environment variable named self.dylibPath is already set,
2229 the new path is appended to it and returned.
2230 """
2231 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
2232 if existing_library_path:
2233 return "%s:%s" % (existing_library_path, self.lib_dir)
2234 elif sys.platform.startswith("darwin"):
2235 return os.path.join(self.lib_dir, 'LLDB.framework')
2236 else:
2237 return self.lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002238
Ed Maste437f8f62013-09-09 14:04:04 +00002239 def getLibcPlusPlusLibs(self):
Robert Flackfa5ad652015-05-13 20:17:34 +00002240 if self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux':
Ed Maste437f8f62013-09-09 14:04:04 +00002241 return ['libc++.so.1']
2242 else:
2243 return ['libc++.1.dylib','libc++abi.dylib']
2244
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002245# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2246# We change the test methods to create a new test method for each test for each debug info we are
2247# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2248# the new test method we remove the old method at the same time.
2249class LLDBTestCaseFactory(type):
2250 def __new__(cls, name, bases, attrs):
2251 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002252 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002253 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
2254 @dsym_test
2255 def dsym_test_method(self, attrvalue=attrvalue):
2256 self.debug_info = "dsym"
2257 return attrvalue(self)
2258 dsym_method_name = attrname + "_dsym"
2259 dsym_test_method.__name__ = dsym_method_name
2260 newattrs[dsym_method_name] = dsym_test_method
2261
2262 @dwarf_test
2263 def dwarf_test_method(self, attrvalue=attrvalue):
2264 self.debug_info = "dwarf"
2265 return attrvalue(self)
2266 dwarf_method_name = attrname + "_dwarf"
2267 dwarf_test_method.__name__ = dwarf_method_name
2268 newattrs[dwarf_method_name] = dwarf_test_method
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002269
2270 @dwo_test
2271 def dwo_test_method(self, attrvalue=attrvalue):
2272 self.debug_info = "dwo"
2273 return attrvalue(self)
2274 dwo_method_name = attrname + "_dwo"
2275 dwo_test_method.__name__ = dwo_method_name
2276 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002277 else:
2278 newattrs[attrname] = attrvalue
2279 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2280
Zachary Turner43a01e42015-10-20 21:06:05 +00002281# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2282@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002283class TestBase(Base):
2284 """
2285 This abstract base class is meant to be subclassed. It provides default
2286 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2287 among other things.
2288
2289 Important things for test class writers:
2290
2291 - Overwrite the mydir class attribute, otherwise your test class won't
2292 run. It specifies the relative directory to the top level 'test' so
2293 the test harness can change to the correct working directory before
2294 running your test.
2295
2296 - The setUp method sets up things to facilitate subsequent interactions
2297 with the debugger as part of the test. These include:
2298 - populate the test method name
2299 - create/get a debugger set with synchronous mode (self.dbg)
2300 - get the command interpreter from with the debugger (self.ci)
2301 - create a result object for use with the command interpreter
2302 (self.res)
2303 - plus other stuffs
2304
2305 - The tearDown method tries to perform some necessary cleanup on behalf
2306 of the test to return the debugger to a good state for the next test.
2307 These include:
2308 - execute any tearDown hooks registered by the test method with
2309 TestBase.addTearDownHook(); examples can be found in
2310 settings/TestSettings.py
2311 - kill the inferior process associated with each target, if any,
2312 and, then delete the target from the debugger's target list
2313 - perform build cleanup before running the next test method in the
2314 same test class; examples of registering for this service can be
2315 found in types/TestIntegerTypes.py with the call:
2316 - self.setTearDownCleanup(dictionary=d)
2317
2318 - Similarly setUpClass and tearDownClass perform classwise setup and
2319 teardown fixtures. The tearDownClass method invokes a default build
2320 cleanup for the entire test class; also, subclasses can implement the
2321 classmethod classCleanup(cls) to perform special class cleanup action.
2322
2323 - The instance methods runCmd and expect are used heavily by existing
2324 test cases to send a command to the command interpreter and to perform
2325 string/pattern matching on the output of such command execution. The
2326 expect method also provides a mode to peform string/pattern matching
2327 without running a command.
2328
2329 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2330 build the binaries used during a particular test scenario. A plugin
2331 should be provided for the sys.platform running the test suite. The
2332 Mac OS X implementation is located in plugins/darwin.py.
2333 """
2334
2335 # Maximum allowed attempts when launching the inferior process.
2336 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2337 maxLaunchCount = 3;
2338
2339 # Time to wait before the next launching attempt in second(s).
2340 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2341 timeWaitNextLaunch = 1.0;
2342
2343 def doDelay(self):
2344 """See option -w of dotest.py."""
2345 if ("LLDB_WAIT_BETWEEN_TEST_CASES" in os.environ and
2346 os.environ["LLDB_WAIT_BETWEEN_TEST_CASES"] == 'YES'):
2347 waitTime = 1.0
2348 if "LLDB_TIME_WAIT_BETWEEN_TEST_CASES" in os.environ:
2349 waitTime = float(os.environ["LLDB_TIME_WAIT_BETWEEN_TEST_CASES"])
2350 time.sleep(waitTime)
2351
Enrico Granata165f8af2012-09-21 19:10:53 +00002352 # Returns the list of categories to which this test case belongs
2353 # by default, look for a ".categories" file, and read its contents
2354 # if no such file exists, traverse the hierarchy - we guarantee
2355 # a .categories to exist at the top level directory so we do not end up
2356 # looping endlessly - subclasses are free to define their own categories
2357 # in whatever way makes sense to them
2358 def getCategories(self):
2359 import inspect
2360 import os.path
2361 folder = inspect.getfile(self.__class__)
2362 folder = os.path.dirname(folder)
2363 while folder != '/':
2364 categories_file_name = os.path.join(folder,".categories")
2365 if os.path.exists(categories_file_name):
2366 categories_file = open(categories_file_name,'r')
2367 categories = categories_file.readline()
2368 categories_file.close()
2369 categories = str.replace(categories,'\n','')
2370 categories = str.replace(categories,'\r','')
2371 return categories.split(',')
2372 else:
2373 folder = os.path.dirname(folder)
2374 continue
2375
Johnny Chena74bb0a2011-08-01 18:46:13 +00002376 def setUp(self):
2377 #import traceback
2378 #traceback.print_stack()
2379
2380 # Works with the test driver to conditionally skip tests via decorators.
2381 Base.setUp(self)
2382
Johnny Chena74bb0a2011-08-01 18:46:13 +00002383 try:
2384 if lldb.blacklist:
2385 className = self.__class__.__name__
2386 classAndMethodName = "%s.%s" % (className, self._testMethodName)
2387 if className in lldb.blacklist:
2388 self.skipTest(lldb.blacklist.get(className))
2389 elif classAndMethodName in lldb.blacklist:
2390 self.skipTest(lldb.blacklist.get(classAndMethodName))
2391 except AttributeError:
2392 pass
2393
Johnny Chened492022011-06-21 00:53:00 +00002394 # Insert some delay between successive test cases if specified.
2395 self.doDelay()
Johnny Chen0ed37c92010-10-07 02:04:14 +00002396
Johnny Chenf2b70232010-08-25 18:49:48 +00002397 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2398 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2399
Johnny Chen430eb762010-10-19 16:00:42 +00002400 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002401 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002402
Daniel Maleae0f8f572013-08-26 23:57:52 +00002403 #
2404 # Warning: MAJOR HACK AHEAD!
2405 # If we are running testsuite remotely (by checking lldb.lldbtest_remote_sandbox),
2406 # redefine the self.dbg.CreateTarget(filename) method to execute a "file filename"
2407 # command, instead. See also runCmd() where it decorates the "file filename" call
2408 # with additional functionality when running testsuite remotely.
2409 #
2410 if lldb.lldbtest_remote_sandbox:
2411 def DecoratedCreateTarget(arg):
2412 self.runCmd("file %s" % arg)
2413 target = self.dbg.GetSelectedTarget()
2414 #
Greg Claytonc6947512013-12-13 19:18:59 +00002415 # SBtarget.LaunchSimple () currently not working for remote platform?
Daniel Maleae0f8f572013-08-26 23:57:52 +00002416 # johnny @ 04/23/2012
2417 #
2418 def DecoratedLaunchSimple(argv, envp, wd):
2419 self.runCmd("run")
2420 return target.GetProcess()
2421 target.LaunchSimple = DecoratedLaunchSimple
2422
2423 return target
2424 self.dbg.CreateTarget = DecoratedCreateTarget
2425 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002426 print("self.dbg.Create is redefined to:\n%s" % getsource_if_available(DecoratedCreateTarget))
Daniel Maleae0f8f572013-08-26 23:57:52 +00002427
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002428 # We want our debugger to be synchronous.
2429 self.dbg.SetAsync(False)
2430
2431 # Retrieve the associated command interpreter instance.
2432 self.ci = self.dbg.GetCommandInterpreter()
2433 if not self.ci:
2434 raise Exception('Could not get the command interpreter')
2435
2436 # And the result object.
2437 self.res = lldb.SBCommandReturnObject()
2438
Johnny Chen44d24972012-04-16 18:55:15 +00002439 # Run global pre-flight code, if defined via the config file.
2440 if lldb.pre_flight:
2441 lldb.pre_flight(self)
2442
Enrico Granatabd0998a2015-10-02 22:53:32 +00002443 if lldb.remote_platform and lldb.remote_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002444 remote_test_dir = lldbutil.join_remote_paths(
2445 lldb.remote_platform_working_dir,
2446 self.getArchitecture(),
2447 str(self.test_number),
2448 self.mydir)
Greg Claytonfb909312013-11-23 01:58:15 +00002449 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 0700)
2450 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002451 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002452
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002453 # This function removes all files from the current working directory while leaving
2454 # the directories in place. The cleaup is required to reduce the disk space required
2455 # by the test suit while leaving the directories untached is neccessary because
2456 # sub-directories might belong to an other test
2457 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002458 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002459 # TODO: Replace the heuristic to remove the files with a logic what collects the
2460 # list of files we have to remove during test runs.
2461 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002462 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002463 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002464 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002465 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002466
Greg Clayton35c91342014-11-17 18:40:27 +00002467 def registerSharedLibrariesWithTarget(self, target, shlibs):
2468 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2469
2470 Any modules in the target that have their remote install file specification set will
2471 get uploaded to the remote host. This function registers the local copies of the
2472 shared libraries with the target and sets their remote install locations so they will
2473 be uploaded when the target is run.
2474 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002475 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002476 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002477
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002478 shlib_environment_var = self.platformContext.shlib_environment_var
2479 shlib_prefix = self.platformContext.shlib_prefix
2480 shlib_extension = '.' + self.platformContext.shlib_extension
2481
2482 working_dir = self.get_process_working_directory()
2483 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2484 # Add any shared libraries to our target if remote so they get
2485 # uploaded into the working directory on the remote side
2486 for name in shlibs:
2487 # The path can be a full path to a shared library, or a make file name like "Foo" for
2488 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2489 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2490 # of the shared library accordingly
2491 if os.path.exists(name):
2492 local_shlib_path = name # name is the full path to the local shared library
2493 else:
2494 # Check relative names
2495 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2496 if not os.path.exists(local_shlib_path):
2497 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002498 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002499 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002500
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002501 # Make sure we found the local shared library in the above code
2502 self.assertTrue(os.path.exists(local_shlib_path))
2503
2504 # Add the shared library to our target
2505 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2506 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002507 # We must set the remote install location if we want the shared library
2508 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002509 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002510 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002511
2512 return environment
2513
Enrico Granata44818162012-10-24 01:23:57 +00002514 # utility methods that tests can use to access the current objects
2515 def target(self):
2516 if not self.dbg:
2517 raise Exception('Invalid debugger instance')
2518 return self.dbg.GetSelectedTarget()
2519
2520 def process(self):
2521 if not self.dbg:
2522 raise Exception('Invalid debugger instance')
2523 return self.dbg.GetSelectedTarget().GetProcess()
2524
2525 def thread(self):
2526 if not self.dbg:
2527 raise Exception('Invalid debugger instance')
2528 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2529
2530 def frame(self):
2531 if not self.dbg:
2532 raise Exception('Invalid debugger instance')
2533 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2534
Greg Claytonc6947512013-12-13 19:18:59 +00002535 def get_process_working_directory(self):
2536 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2537 if lldb.remote_platform:
2538 # Remote tests set the platform working directory up in TestBase.setUp()
2539 return lldb.remote_platform.GetWorkingDirectory()
2540 else:
2541 # local tests change directory into each test subdirectory
2542 return os.getcwd()
2543
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002544 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002545 #import traceback
2546 #traceback.print_stack()
2547
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002548 # Ensure all the references to SB objects have gone away so that we can
2549 # be sure that all test-specific resources have been freed before we
2550 # attempt to delete the targets.
2551 gc.collect()
2552
Johnny Chen3794ad92011-06-15 21:24:24 +00002553 # Delete the target(s) from the debugger as a general cleanup step.
2554 # This includes terminating the process for each target, if any.
2555 # We'd like to reuse the debugger for our next test without incurring
2556 # the initialization overhead.
2557 targets = []
2558 for target in self.dbg:
2559 if target:
2560 targets.append(target)
2561 process = target.GetProcess()
2562 if process:
2563 rc = self.invoke(process, "Kill")
2564 self.assertTrue(rc.Success(), PROCESS_KILLED)
2565 for target in targets:
2566 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002567
Johnny Chen44d24972012-04-16 18:55:15 +00002568 # Run global post-flight code, if defined via the config file.
2569 if lldb.post_flight:
2570 lldb.post_flight(self)
2571
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002572 # Do this last, to make sure it's in reverse order from how we setup.
2573 Base.tearDown(self)
2574
Zachary Turner95812042015-03-26 18:54:21 +00002575 # This must be the last statement, otherwise teardown hooks or other
2576 # lines might depend on this still being active.
2577 del self.dbg
2578
Johnny Chen86268e42011-09-30 21:48:35 +00002579 def switch_to_thread_with_stop_reason(self, stop_reason):
2580 """
2581 Run the 'thread list' command, and select the thread with stop reason as
2582 'stop_reason'. If no such thread exists, no select action is done.
2583 """
2584 from lldbutil import stop_reason_to_str
2585 self.runCmd('thread list')
2586 output = self.res.GetOutput()
2587 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2588 stop_reason_to_str(stop_reason))
2589 for line in output.splitlines():
2590 matched = thread_line_pattern.match(line)
2591 if matched:
2592 self.runCmd('thread select %s' % matched.group(1))
2593
Enrico Granata7594f142013-06-17 22:51:50 +00002594 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002595 """
2596 Ask the command interpreter to handle the command and then check its
2597 return status.
2598 """
2599 # Fail fast if 'cmd' is not meaningful.
2600 if not cmd or len(cmd) == 0:
2601 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002602
Johnny Chen8d55a342010-08-31 17:42:54 +00002603 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002604
Daniel Maleae0f8f572013-08-26 23:57:52 +00002605 # This is an opportunity to insert the 'platform target-install' command if we are told so
2606 # via the settig of lldb.lldbtest_remote_sandbox.
2607 if cmd.startswith("target create "):
2608 cmd = cmd.replace("target create ", "file ")
2609 if cmd.startswith("file ") and lldb.lldbtest_remote_sandbox:
2610 with recording(self, trace) as sbuf:
2611 the_rest = cmd.split("file ")[1]
2612 # Split the rest of the command line.
2613 atoms = the_rest.split()
2614 #
2615 # NOTE: This assumes that the options, if any, follow the file command,
2616 # instead of follow the specified target.
2617 #
2618 target = atoms[-1]
2619 # Now let's get the absolute pathname of our target.
2620 abs_target = os.path.abspath(target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002621 print("Found a file command, target (with absolute pathname)=%s" % abs_target, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002622 fpath, fname = os.path.split(abs_target)
2623 parent_dir = os.path.split(fpath)[0]
2624 platform_target_install_command = 'platform target-install %s %s' % (fpath, lldb.lldbtest_remote_sandbox)
Zachary Turnerff890da2015-10-19 23:45:41 +00002625 print("Insert this command to be run first: %s" % platform_target_install_command, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002626 self.ci.HandleCommand(platform_target_install_command, self.res)
2627 # And this is the file command we want to execute, instead.
2628 #
2629 # Warning: SIDE EFFECT AHEAD!!!
2630 # Populate the remote executable pathname into the lldb namespace,
2631 # so that test cases can grab this thing out of the namespace.
2632 #
2633 lldb.lldbtest_remote_sandboxed_executable = abs_target.replace(parent_dir, lldb.lldbtest_remote_sandbox)
2634 cmd = "file -P %s %s %s" % (lldb.lldbtest_remote_sandboxed_executable, the_rest.replace(target, ''), abs_target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002635 print("And this is the replaced file command: %s" % cmd, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002636
Johnny Chen63dfb272010-09-01 00:15:19 +00002637 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002638
Johnny Chen63dfb272010-09-01 00:15:19 +00002639 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002640 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002641
Johnny Chen150c3cc2010-10-15 01:18:29 +00002642 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002643 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002644 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002645 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002646 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002647 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002648 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002649 print("runCmd failed!", file=sbuf)
2650 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002651
Johnny Chenff3d01d2010-08-20 21:03:09 +00002652 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002653 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002654 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002655 # For process launch, wait some time before possible next try.
2656 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002657 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002658 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002659
Johnny Chen27f212d2010-08-19 23:26:59 +00002660 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002661 self.assertTrue(self.res.Succeeded(),
2662 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002663
Jim Ingham63dfc722012-09-22 00:05:11 +00002664 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2665 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2666
2667 Otherwise, all the arguments have the same meanings as for the expect function"""
2668
2669 trace = (True if traceAlways else trace)
2670
2671 if exe:
2672 # First run the command. If we are expecting error, set check=False.
2673 # Pass the assert message along since it provides more semantic info.
2674 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2675
2676 # Then compare the output against expected strings.
2677 output = self.res.GetError() if error else self.res.GetOutput()
2678
2679 # If error is True, the API client expects the command to fail!
2680 if error:
2681 self.assertFalse(self.res.Succeeded(),
2682 "Command '" + str + "' is expected to fail!")
2683 else:
2684 # No execution required, just compare str against the golden input.
2685 output = str
2686 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002687 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002688
2689 # The heading says either "Expecting" or "Not expecting".
2690 heading = "Expecting" if matching else "Not expecting"
2691
2692 for pattern in patterns:
2693 # Match Objects always have a boolean value of True.
2694 match_object = re.search(pattern, output)
2695 matched = bool(match_object)
2696 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002697 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2698 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002699 if matched:
2700 break
2701
2702 self.assertTrue(matched if matching else not matched,
2703 msg if msg else EXP_MSG(str, exe))
2704
2705 return match_object
2706
Enrico Granata7594f142013-06-17 22:51:50 +00002707 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 +00002708 """
2709 Similar to runCmd; with additional expect style output matching ability.
2710
2711 Ask the command interpreter to handle the command and then check its
2712 return status. The 'msg' parameter specifies an informational assert
2713 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002714 'startstr', matches the substrings contained in 'substrs', and regexp
2715 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002716
2717 If the keyword argument error is set to True, it signifies that the API
2718 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002719 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002720 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002721
2722 If the keyword argument matching is set to False, it signifies that the API
2723 client is expecting the output of the command not to match the golden
2724 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002725
2726 Finally, the required argument 'str' represents the lldb command to be
2727 sent to the command interpreter. In case the keyword argument 'exe' is
2728 set to False, the 'str' is treated as a string to be matched/not-matched
2729 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002730 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002731 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002732
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002733 if exe:
2734 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002735 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002736 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002737
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002738 # Then compare the output against expected strings.
2739 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002740
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002741 # If error is True, the API client expects the command to fail!
2742 if error:
2743 self.assertFalse(self.res.Succeeded(),
2744 "Command '" + str + "' is expected to fail!")
2745 else:
2746 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002747 if isinstance(str,lldb.SBCommandReturnObject):
2748 output = str.GetOutput()
2749 else:
2750 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002751 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002752 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002753
Johnny Chenea88e942010-09-21 21:08:53 +00002754 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002755 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002756
2757 # Start from the startstr, if specified.
2758 # If there's no startstr, set the initial state appropriately.
2759 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002760
Johnny Chen150c3cc2010-10-15 01:18:29 +00002761 if startstr:
2762 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002763 print("%s start string: %s" % (heading, startstr), file=sbuf)
2764 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002765
Johnny Chen86268e42011-09-30 21:48:35 +00002766 # Look for endstr, if specified.
2767 keepgoing = matched if matching else not matched
2768 if endstr:
2769 matched = output.endswith(endstr)
2770 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002771 print("%s end string: %s" % (heading, endstr), file=sbuf)
2772 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002773
Johnny Chenea88e942010-09-21 21:08:53 +00002774 # Look for sub strings, if specified.
2775 keepgoing = matched if matching else not matched
2776 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002777 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002778 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002779 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002780 print("%s sub string: %s" % (heading, str), file=sbuf)
2781 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002782 keepgoing = matched if matching else not matched
2783 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002784 break
2785
Johnny Chenea88e942010-09-21 21:08:53 +00002786 # Search for regular expression patterns, if specified.
2787 keepgoing = matched if matching else not matched
2788 if patterns and keepgoing:
2789 for pattern in patterns:
2790 # Match Objects always have a boolean value of True.
2791 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002792 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002793 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2794 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002795 keepgoing = matched if matching else not matched
2796 if not keepgoing:
2797 break
Johnny Chenea88e942010-09-21 21:08:53 +00002798
2799 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002800 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002801
Johnny Chenf3c59232010-08-25 22:52:45 +00002802 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002803 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002804 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002805
2806 method = getattr(obj, name)
2807 import inspect
2808 self.assertTrue(inspect.ismethod(method),
2809 name + "is a method name of object: " + str(obj))
2810 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002811 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002812 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002813 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002814
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002815 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2816 """Platform specific way to build the default binaries."""
2817 if lldb.skip_build_and_cleanup:
2818 return
2819 module = builder_module()
2820 if target_is_android():
2821 dictionary = append_android_envs(dictionary)
2822 if self.debug_info is None:
2823 return self.buildDefault(architecture, compiler, dictionary, clean)
2824 elif self.debug_info == "dsym":
2825 return self.buildDsym(architecture, compiler, dictionary, clean)
2826 elif self.debug_info == "dwarf":
2827 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002828 elif self.debug_info == "dwo":
2829 return self.buildDwo(architecture, compiler, dictionary, clean)
2830 else:
2831 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002832
Johnny Chenf359cf22011-05-27 23:36:52 +00002833 # =================================================
2834 # Misc. helper methods for debugging test execution
2835 # =================================================
2836
Johnny Chen56b92a72011-07-11 19:15:11 +00002837 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002838 """Debug print a SBValue object, if traceAlways is True."""
Johnny Chende90f1d2011-04-27 17:43:07 +00002839 from lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002840
Johnny Chen8d55a342010-08-31 17:42:54 +00002841 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002842 return
2843
2844 err = sys.stderr
2845 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002846 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2847 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2848 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2849 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2850 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2851 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2852 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2853 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2854 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002855
Johnny Chen36c5eb12011-08-05 20:17:27 +00002856 def DebugSBType(self, type):
2857 """Debug print a SBType object, if traceAlways is True."""
2858 if not traceAlways:
2859 return
2860
2861 err = sys.stderr
2862 err.write(type.GetName() + ":\n")
2863 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2864 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2865 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2866
Johnny Chenb877f1e2011-03-12 01:18:19 +00002867 def DebugPExpect(self, child):
2868 """Debug the spwaned pexpect object."""
2869 if not traceAlways:
2870 return
2871
Zachary Turnerff890da2015-10-19 23:45:41 +00002872 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002873
2874 @classmethod
2875 def RemoveTempFile(cls, file):
2876 if os.path.exists(file):
2877 os.remove(file)