blob: 1356c53bb16020055c95df8f62ac0b5216be4b19 [file] [log] [blame]
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001"""
2LLDB module which provides the abstract base class of lldb test case.
3
4The concrete subclass can override lldbtest.TesBase in order to inherit the
5common behavior for unitest.TestCase.setUp/tearDown implemented in this file.
6
7The subclass should override the attribute mydir in order for the python runtime
8to locate the individual test cases when running as part of a large test suite
9or when running each test case as a separate python invocation.
10
11./dotest.py provides a test driver which sets up the environment to run the
Johnny Chenc98892e2012-05-16 20:41:28 +000012entire of part of the test suite . Example:
Johnny Chenbf6ffa32010-07-03 03:41:59 +000013
Johnny Chenc98892e2012-05-16 20:41:28 +000014# Exercises the test suite in the types directory....
15/Volumes/data/lldb/svn/ToT/test $ ./dotest.py -A x86_64 types
Johnny Chen57b47382010-09-02 22:25:47 +000016...
Johnny Chend0190a62010-08-23 17:10:44 +000017
Johnny Chenc98892e2012-05-16 20:41:28 +000018Session logs for test failures/errors/unexpected successes will go into directory '2012-05-16-13_35_42'
19Command invoked: python ./dotest.py -A x86_64 types
20compilers=['clang']
Johnny Chend0190a62010-08-23 17:10:44 +000021
Johnny Chenc98892e2012-05-16 20:41:28 +000022Configuration: arch=x86_64 compiler=clang
Johnny Chend0190a62010-08-23 17:10:44 +000023----------------------------------------------------------------------
Johnny Chenc98892e2012-05-16 20:41:28 +000024Collected 72 tests
25
26........................................................................
27----------------------------------------------------------------------
28Ran 72 tests in 135.468s
Johnny Chend0190a62010-08-23 17:10:44 +000029
30OK
Johnny Chenbf6ffa32010-07-03 03:41:59 +000031$
32"""
33
Zachary Turnerff890da2015-10-19 23:45:41 +000034from __future__ import print_function
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000035from __future__ import absolute_import
Zachary Turnerff890da2015-10-19 23:45:41 +000036
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000037# System modules
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +000038import abc
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000039import collections
Zachary Turnerabdb8392015-11-16 22:40:30 +000040from distutils.version import LooseVersion
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +000041import gc
Vince Harron9753dd92015-05-10 15:22:09 +000042import glob
Zachary Turnerba105702015-11-16 23:58:20 +000043import inspect
Johnny Chen90312a82010-09-21 22:34:45 +000044import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000045import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000046import re
Daniel Malea69207462013-06-05 21:07:02 +000047import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000048from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000049import time
Johnny Chena33a93c2010-08-30 23:08:52 +000050import types
Zachary Turner43a01e42015-10-20 21:06:05 +000051
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000052# Third-party modules
53import unittest2
Zachary Turner43a01e42015-10-20 21:06:05 +000054from six import add_metaclass
Zachary Turner814236d2015-10-21 17:48:52 +000055from six import StringIO as SixStringIO
56from six.moves.urllib import parse as urlparse
Zachary Turnercd236b82015-10-26 18:48:24 +000057import six
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000058
59# LLDB modules
60import lldb
Zachary Turner606e3a52015-12-08 01:15:30 +000061from . import configuration
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000062from . import lldbtest_config
63from . import lldbutil
64from . import test_categories
Siva Chandra8af91662015-06-05 00:22:49 +000065
Todd Fiala9187f272015-12-11 18:06:47 +000066from .result_formatter import EventBuilder
67
Vince Harron85d19652015-05-21 19:09:29 +000068# dosep.py starts lots and lots of dotest instances
69# This option helps you find if two (or more) dotest instances are using the same
70# directory at the same time
71# Enable it to cause test failures and stderr messages if dotest instances try to run in
72# the same directory simultaneously
73# it is disabled by default because it litters the test directories with ".dirlock" files
74debug_confirm_directory_exclusivity = False
75
Johnny Chen707b3c92010-10-11 22:25:46 +000076# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000077# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000078
79# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000080if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
81 traceAlways = True
82else:
83 traceAlways = False
84
Johnny Chen707b3c92010-10-11 22:25:46 +000085# By default, doCleanup is True.
86if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
87 doCleanup = False
88else:
89 doCleanup = True
90
Johnny Chen8d55a342010-08-31 17:42:54 +000091
Johnny Chen00778092010-08-09 22:01:17 +000092#
93# Some commonly used assert messages.
94#
95
Johnny Chenaa902922010-09-17 22:45:27 +000096COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
97
Johnny Chen00778092010-08-09 22:01:17 +000098CURRENT_EXECUTABLE_SET = "Current executable set successfully"
99
Johnny Chen7d1d7532010-09-02 21:23:12 +0000100PROCESS_IS_VALID = "Process is valid"
101
102PROCESS_KILLED = "Process is killed successfully"
103
Johnny Chend5f66fc2010-12-23 01:12:19 +0000104PROCESS_EXITED = "Process exited successfully"
105
106PROCESS_STOPPED = "Process status should be stopped"
107
Sean Callanan05834cd2015-07-01 23:56:30 +0000108RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000109
Johnny Chen17941842010-08-09 23:44:24 +0000110RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000111
Johnny Chen67af43f2010-10-05 19:27:32 +0000112BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
113
Johnny Chen17941842010-08-09 23:44:24 +0000114BREAKPOINT_CREATED = "Breakpoint created successfully"
115
Johnny Chenf10af382010-12-04 00:07:24 +0000116BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
117
Johnny Chene76896c2010-08-17 21:33:31 +0000118BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
119
Johnny Chen17941842010-08-09 23:44:24 +0000120BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000121
Johnny Chen703dbd02010-09-30 17:06:24 +0000122BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
123
Johnny Chen164f1e12010-10-15 18:07:09 +0000124BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
125
Greg Clayton5db6b792012-10-24 18:24:14 +0000126MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
127
Johnny Chen89109ed12011-06-27 20:05:23 +0000128OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
129
Johnny Chen5b3a3572010-12-09 18:22:12 +0000130SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
131
Johnny Chenc70b02a2010-09-22 23:00:20 +0000132STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
133
Johnny Chen1691a162011-04-15 16:44:48 +0000134STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
135
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000136STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
137
Johnny Chen5d6c4642010-11-10 23:46:38 +0000138STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000139
Johnny Chen5d6c4642010-11-10 23:46:38 +0000140STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
141 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000142
Johnny Chen2e431ce2010-10-20 18:38:48 +0000143STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
144
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000145STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
146
Johnny Chenc066ab42010-10-14 01:22:03 +0000147STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
148
Johnny Chen00778092010-08-09 22:01:17 +0000149STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
150
Johnny Chenf68cc122011-09-15 21:09:59 +0000151STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
152
Johnny Chen3c884a02010-08-24 22:07:56 +0000153DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
154
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000155VALID_BREAKPOINT = "Got a valid breakpoint"
156
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000157VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
158
Johnny Chen7209d84f2011-05-06 23:26:12 +0000159VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
160
Johnny Chen5ee88192010-08-27 23:47:36 +0000161VALID_FILESPEC = "Got a valid filespec"
162
Johnny Chen025d1b82010-12-08 01:25:21 +0000163VALID_MODULE = "Got a valid module"
164
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000165VALID_PROCESS = "Got a valid process"
166
Johnny Chen025d1b82010-12-08 01:25:21 +0000167VALID_SYMBOL = "Got a valid symbol"
168
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000169VALID_TARGET = "Got a valid target"
170
Matthew Gardinerc928de32014-10-22 07:22:56 +0000171VALID_PLATFORM = "Got a valid platform"
172
Johnny Chen15f247a2012-02-03 20:43:00 +0000173VALID_TYPE = "Got a valid type"
174
Johnny Chen5819ab42011-07-15 22:28:10 +0000175VALID_VARIABLE = "Got a valid variable"
176
Johnny Chen981463d2010-08-25 19:00:04 +0000177VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000178
Johnny Chenf68cc122011-09-15 21:09:59 +0000179WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000180
Sean Callanan05834cd2015-07-01 23:56:30 +0000181def CMD_MSG(str):
182 '''A generic "Command '%s' returns successfully" message generator.'''
183 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000184
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000185def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000186 '''A generic message generator for the completion mechanism.'''
187 return "'%s' successfully completes to '%s'" % (str_before, str_after)
188
Johnny Chenc0c67f22010-11-09 18:42:22 +0000189def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000190 '''A generic "'%s' returns expected result" message generator if exe.
191 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000192 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000193
Johnny Chen3343f042010-10-19 19:11:38 +0000194def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000195 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000196 return "Value of setting '%s' is correct" % setting
197
Johnny Chen27c41232010-08-26 21:49:29 +0000198def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000199 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000200 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000201
Johnny Chen47ceb032010-10-11 23:52:19 +0000202def line_number(filename, string_to_match):
203 """Helper function to return the line number of the first matched string."""
204 with open(filename, 'r') as f:
205 for i, line in enumerate(f):
206 if line.find(string_to_match) != -1:
207 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000208 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000209 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000210
Johnny Chen67af43f2010-10-05 19:27:32 +0000211def pointer_size():
212 """Return the pointer size of the host system."""
213 import ctypes
214 a_pointer = ctypes.c_void_p(0xffff)
215 return 8 * ctypes.sizeof(a_pointer)
216
Johnny Chen57816732012-02-09 02:01:59 +0000217def is_exe(fpath):
218 """Returns true if fpath is an executable."""
219 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
220
221def which(program):
222 """Returns the full path to a program; None otherwise."""
223 fpath, fname = os.path.split(program)
224 if fpath:
225 if is_exe(program):
226 return program
227 else:
228 for path in os.environ["PATH"].split(os.pathsep):
229 exe_file = os.path.join(path, program)
230 if is_exe(exe_file):
231 return exe_file
232 return None
233
Zachary Turner814236d2015-10-21 17:48:52 +0000234class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000235 """
236 A nice little context manager for recording the debugger interactions into
237 our session object. If trace flag is ON, it also emits the interactions
238 into the stderr.
239 """
240 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000241 """Create a SixStringIO instance; record the session obj and trace flag."""
242 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000243 # The test might not have undergone the 'setUp(self)' phase yet, so that
244 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000245 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000246 self.trace = trace
247
248 def __enter__(self):
249 """
250 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000251 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000252 """
253 return self
254
255 def __exit__(self, type, value, tb):
256 """
257 Context management protocol on exit from the body of the with statement.
258 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000259 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000260 """
261 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000262 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000263 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000264 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000265 self.close()
266
Zachary Turner43a01e42015-10-20 21:06:05 +0000267@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000268class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000269
270 @abc.abstractproperty
271 def pid(self):
272 """Returns process PID if has been launched already."""
273
274 @abc.abstractmethod
275 def launch(self, executable, args):
276 """Launches new process with given executable and args."""
277
278 @abc.abstractmethod
279 def terminate(self):
280 """Terminates previously launched process.."""
281
282class _LocalProcess(_BaseProcess):
283
284 def __init__(self, trace_on):
285 self._proc = None
286 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000287 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000288
289 @property
290 def pid(self):
291 return self._proc.pid
292
293 def launch(self, executable, args):
294 self._proc = Popen([executable] + args,
295 stdout = open(os.devnull) if not self._trace_on else None,
296 stdin = PIPE)
297
298 def terminate(self):
299 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000300 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000301 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
302 for sig in signals_to_try:
303 try:
304 self._proc.send_signal(getattr(signal, sig))
305 time.sleep(self._delayafterterminate)
306 if self._proc.poll() != None:
307 return
308 except ValueError:
309 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000310 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000311 time.sleep(self._delayafterterminate)
312 if self._proc.poll() != None:
313 return
314 self._proc.kill()
315 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000316
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000317 def poll(self):
318 return self._proc.poll()
319
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000320class _RemoteProcess(_BaseProcess):
321
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000322 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000323 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000324 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000325
326 @property
327 def pid(self):
328 return self._pid
329
330 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000331 if self._install_remote:
332 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000333 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000334
335 dst_file_spec = lldb.SBFileSpec(dst_path, False)
336 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
337 if err.Fail():
338 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
339 else:
340 dst_path = executable
341 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000342
343 launch_info = lldb.SBLaunchInfo(args)
344 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000345 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000346
347 # Redirect stdout and stderr to /dev/null
348 launch_info.AddSuppressFileAction(1, False, True)
349 launch_info.AddSuppressFileAction(2, False, True)
350
351 err = lldb.remote_platform.Launch(launch_info)
352 if err.Fail():
353 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
354 self._pid = launch_info.GetProcessID()
355
356 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000357 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000358
Johnny Chen690fcef2010-10-15 23:55:05 +0000359# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000360# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000361def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000362 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000363
364 If the exit code was non-zero it raises a CalledProcessError. The
365 CalledProcessError object will have the return code in the returncode
366 attribute and output in the output attribute.
367
368 The arguments are the same as for the Popen constructor. Example:
369
370 >>> check_output(["ls", "-l", "/dev/null"])
371 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
372
373 The stdout argument is not allowed as it is used internally.
374 To capture standard error in the result, use stderr=STDOUT.
375
376 >>> check_output(["/bin/sh", "-c",
377 ... "ls -l non_existent_file ; exit 0"],
378 ... stderr=STDOUT)
379 'ls: non_existent_file: No such file or directory\n'
380 """
381
382 # Assign the sender object to variable 'test' and remove it from kwargs.
383 test = kwargs.pop('sender', None)
384
Zachary Turner9ef307b2014-07-22 16:19:29 +0000385 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
386 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000387 output = ""
388 error = ""
389 for shellCommand in commandList:
390 if 'stdout' in kwargs:
391 raise ValueError('stdout argument not allowed, it will be overridden.')
392 if 'shell' in kwargs and kwargs['shell']==False:
393 raise ValueError('shell=False not allowed')
Zachary Turner48ef8d4c2015-11-18 18:40:16 +0000394 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, universal_newlines=True, **kwargs)
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000395 pid = process.pid
396 this_output, this_error = process.communicate()
397 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000398
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000399 # Enable trace on failure return while tracking down FreeBSD buildbot issues
400 trace = traceAlways
401 if not trace and retcode and sys.platform.startswith("freebsd"):
402 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000403
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000404 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000405 print(file=sbuf)
406 print("os command:", shellCommand, file=sbuf)
407 print("with pid:", pid, file=sbuf)
408 print("stdout:", this_output, file=sbuf)
409 print("stderr:", this_error, file=sbuf)
410 print("retcode:", retcode, file=sbuf)
411 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000412
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000413 if retcode:
414 cmd = kwargs.get("args")
415 if cmd is None:
416 cmd = shellCommand
417 raise CalledProcessError(retcode, cmd)
418 output = output + this_output
419 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000420 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000421
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000422def getsource_if_available(obj):
423 """
424 Return the text of the source code for an object if available. Otherwise,
425 a print representation is returned.
426 """
427 import inspect
428 try:
429 return inspect.getsource(obj)
430 except:
431 return repr(obj)
432
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000433def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000434 if sys.platform.startswith("freebsd"):
435 return __import__("builder_freebsd")
Kamil Rytarowski0b655da2015-12-05 18:46:56 +0000436 if sys.platform.startswith("netbsd"):
437 return __import__("builder_netbsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000438 return __import__("builder_" + sys.platform)
439
Siva Chandra8af91662015-06-05 00:22:49 +0000440def run_adb_command(cmd, device_id):
441 device_id_args = []
442 if device_id:
443 device_id_args = ["-s", device_id]
444 full_cmd = ["adb"] + device_id_args + cmd
445 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
446 stdout, stderr = p.communicate()
447 return p.returncode, stdout, stderr
448
Chaoren Line9bbabc2015-07-18 00:37:55 +0000449def append_android_envs(dictionary):
450 if dictionary is None:
451 dictionary = {}
452 dictionary["OS"] = "Android"
453 if android_device_api() >= 16:
454 dictionary["PIE"] = 1
455 return dictionary
456
Chaoren Lin9070f532015-07-17 22:13:29 +0000457def target_is_android():
458 if not hasattr(target_is_android, 'result'):
459 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
460 match = re.match(".*-.*-.*-android", triple)
461 target_is_android.result = match is not None
462 return target_is_android.result
463
Siva Chandra8af91662015-06-05 00:22:49 +0000464def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000465 if not hasattr(android_device_api, 'result'):
Zachary Turner606e3a52015-12-08 01:15:30 +0000466 assert configuration.lldb_platform_url is not None
Chaoren Lin9070f532015-07-17 22:13:29 +0000467 device_id = None
Zachary Turner606e3a52015-12-08 01:15:30 +0000468 parsed_url = urlparse.urlparse(configuration.lldb_platform_url)
Ying Chenca922bb2015-11-18 19:03:20 +0000469 host_name = parsed_url.netloc.split(":")[0]
470 if host_name != 'localhost':
471 device_id = host_name
472 if device_id.startswith('[') and device_id.endswith(']'):
473 device_id = device_id[1:-1]
Chaoren Lin9070f532015-07-17 22:13:29 +0000474 retcode, stdout, stderr = run_adb_command(
475 ["shell", "getprop", "ro.build.version.sdk"], device_id)
476 if retcode == 0:
477 android_device_api.result = int(stdout)
478 else:
479 raise LookupError(
480 ">>> Unable to determine the API level of the Android device.\n"
481 ">>> stdout:\n%s\n"
482 ">>> stderr:\n%s\n" % (stdout, stderr))
483 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000484
Zachary Turnerabdb8392015-11-16 22:40:30 +0000485def check_expected_version(comparison, expected, actual):
486 def fn_leq(x,y): return x <= y
487 def fn_less(x,y): return x < y
488 def fn_geq(x,y): return x >= y
489 def fn_greater(x,y): return x > y
490 def fn_eq(x,y): return x == y
491 def fn_neq(x,y): return x != y
492
493 op_lookup = {
494 "==": fn_eq,
495 "=": fn_eq,
496 "!=": fn_neq,
497 "<>": fn_neq,
498 ">": fn_greater,
499 "<": fn_less,
500 ">=": fn_geq,
501 "<=": fn_leq
502 }
503 expected_str = '.'.join([str(x) for x in expected])
504 actual_str = '.'.join([str(x) for x in actual])
505
506 return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
507
Johnny Chena74bb0a2011-08-01 18:46:13 +0000508#
509# Decorators for categorizing test cases.
510#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000511from functools import wraps
Pavel Labathffbf9e82015-12-14 13:17:18 +0000512
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000513def add_test_categories(cat):
Pavel Labathffbf9e82015-12-14 13:17:18 +0000514 """Add test categories to a TestCase method"""
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000515 cat = test_categories.validate(cat, True)
516 def impl(func):
Pavel Labathffbf9e82015-12-14 13:17:18 +0000517 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
518 raise Exception("@add_test_categories can only be used to decorate a test method")
519 if hasattr(func, "categories"):
520 cat.extend(func.categories)
521 func.categories = cat
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000522 return func
Pavel Labathffbf9e82015-12-14 13:17:18 +0000523
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000524 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000525
Johnny Chena74bb0a2011-08-01 18:46:13 +0000526def benchmarks_test(func):
527 """Decorate the item as a benchmarks test."""
528 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
529 raise Exception("@benchmarks_test can only be used to decorate a test method")
530 @wraps(func)
531 def wrapper(self, *args, **kwargs):
Zachary Turneraad25fb2015-12-08 18:36:05 +0000532 self.skipTest("benchmarks test")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000533 return func(self, *args, **kwargs)
534
535 # Mark this function as such to separate them from the regular tests.
536 wrapper.__benchmarks_test__ = True
537 return wrapper
538
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000539def no_debug_info_test(func):
540 """Decorate the item as a test what don't use any debug info. If this annotation is specified
541 then the test runner won't generate a separate test for each debug info format. """
542 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
543 raise Exception("@no_debug_info_test can only be used to decorate a test method")
544 @wraps(func)
545 def wrapper(self, *args, **kwargs):
546 return func(self, *args, **kwargs)
547
548 # Mark this function as such to separate them from the regular tests.
549 wrapper.__no_debug_info_test__ = True
550 return wrapper
551
Todd Fialaa41d48c2014-04-28 04:49:40 +0000552def debugserver_test(func):
553 """Decorate the item as a debugserver test."""
554 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
555 raise Exception("@debugserver_test can only be used to decorate a test method")
556 @wraps(func)
557 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000558 if configuration.dont_do_debugserver_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000559 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000560 return func(self, *args, **kwargs)
561
562 # Mark this function as such to separate them from the regular tests.
563 wrapper.__debugserver_test__ = True
564 return wrapper
565
566def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000567 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000568 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
569 raise Exception("@llgs_test can only be used to decorate a test method")
570 @wraps(func)
571 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000572 if configuration.dont_do_llgs_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000573 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000574 return func(self, *args, **kwargs)
575
576 # Mark this function as such to separate them from the regular tests.
577 wrapper.__llgs_test__ = True
578 return wrapper
579
Daniel Maleae0f8f572013-08-26 23:57:52 +0000580def not_remote_testsuite_ready(func):
581 """Decorate the item as a test which is not ready yet for remote testsuite."""
582 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
583 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
584 @wraps(func)
585 def wrapper(self, *args, **kwargs):
Zachary Turnerd865c6b2015-12-08 22:15:48 +0000586 if lldb.remote_platform:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000587 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000588 return func(self, *args, **kwargs)
589
590 # Mark this function as such to separate them from the regular tests.
591 wrapper.__not_ready_for_remote_testsuite_test__ = True
592 return wrapper
593
Ed Maste433790a2014-04-23 12:55:41 +0000594def expectedFailure(expected_fn, bugnumber=None):
595 def expectedFailure_impl(func):
596 @wraps(func)
597 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000598 from unittest2 import case
599 self = args[0]
Ed Maste433790a2014-04-23 12:55:41 +0000600 if expected_fn(self):
Zachary Turner5cb8e672015-11-06 18:14:42 +0000601 xfail_func = unittest2.expectedFailure(func)
602 xfail_func(*args, **kwargs)
603 else:
604 func(*args, **kwargs)
Ed Maste433790a2014-04-23 12:55:41 +0000605 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000606 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
607 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000608 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000609 return expectedFailure_impl(bugnumber)
610 else:
611 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000612
Ying Chen0c352822015-11-16 23:41:02 +0000613# You can also pass not_in(list) to reverse the sense of the test for the arguments that
614# are simple lists, namely oslist, compiler, and debug_info.
615
616def not_in (iterable):
617 return lambda x : x not in iterable
618
Siva Chandra7dcad312015-11-20 20:30:36 +0000619def check_list_or_lambda (list_or_lambda, value):
620 if six.callable(list_or_lambda):
621 return list_or_lambda(value)
622 else:
623 return list_or_lambda is None or value is None or value in list_or_lambda
Ying Chen0c352822015-11-16 23:41:02 +0000624
Ying Chen7091c2c2015-04-21 01:15:47 +0000625# provide a function to xfail on defined oslist, compiler version, and archs
626# if none is specified for any argument, that argument won't be checked and thus means for all
627# for example,
628# @expectedFailureAll, xfail for all platform/compiler/arch,
629# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
630# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Pavel Labath7ead0b92015-12-09 10:54:18 +0000631def expectedFailureAll(bugnumber=None, oslist=None, hostoslist=None, compiler=None, compiler_version=None, archs=None, triple=None, debug_info=None, swig_version=None, py_version=None):
Ying Chen7091c2c2015-04-21 01:15:47 +0000632 def fn(self):
Siva Chandra7dcad312015-11-20 20:30:36 +0000633 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
Pavel Labath7ead0b92015-12-09 10:54:18 +0000634 hostoslist_passes = check_list_or_lambda(hostoslist, getHostPlatform())
Siva Chandra7dcad312015-11-20 20:30:36 +0000635 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000636 arch_passes = self.expectedArch(archs)
637 triple_passes = triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())
Siva Chandra7dcad312015-11-20 20:30:36 +0000638 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000639 swig_version_passes = (swig_version is None) or (not hasattr(lldb, 'swig_version')) or (check_expected_version(swig_version[0], swig_version[1], lldb.swig_version))
640 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
641
642 return (oslist_passes and
Pavel Labath7ead0b92015-12-09 10:54:18 +0000643 hostoslist_passes and
Zachary Turnerabdb8392015-11-16 22:40:30 +0000644 compiler_passes and
645 arch_passes and
646 triple_passes and
647 debug_info_passes and
648 swig_version_passes and
649 py_version_passes)
Ying Chen7091c2c2015-04-21 01:15:47 +0000650 return expectedFailure(fn, bugnumber)
651
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000652def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000653 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
654
655def expectedFailureDwo(bugnumber=None):
656 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000657
658def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000659 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000660
661def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
662 if compiler_version is None:
663 compiler_version=['=', None]
664 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
665
Vince Harron8974ce22015-03-13 19:54:54 +0000666# to XFAIL a specific clang versions, try this
667# @expectedFailureClang('bugnumber', ['<=', '3.4'])
668def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000669 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000670
671def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000672 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000673
Matt Kopec0de53f02013-03-15 19:10:12 +0000674def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000675 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000676
Ed Maste433790a2014-04-23 12:55:41 +0000677def expectedFailureArch(arch, bugnumber=None):
678 def fn(self):
679 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000680 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000681
Enrico Granatae6cedc12013-02-23 01:05:23 +0000682def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000683 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000684
Matt Kopecee969f92013-09-26 23:30:59 +0000685def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000686 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000687
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000688def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None):
Ed Maste433790a2014-04-23 12:55:41 +0000689 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000690 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000691 self.expectedCompiler(compilers) and
692 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000693 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000694
Chaoren Linf7160f32015-06-09 17:39:27 +0000695def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
696 def fn(self):
697 return (getHostPlatform() in oslist and
698 self.expectedCompiler(compilers))
699 return expectedFailure(fn, bugnumber)
700
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000701def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000702 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000703 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000704
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000705def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
706 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000707
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000708def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None):
709 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000710
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000711def expectedFailureNetBSD(bugnumber=None, compilers=None, debug_info=None):
712 return expectedFailureOS(['netbsd'], bugnumber, compilers, debug_info=debug_info)
713
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000714def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
715 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000716
Chaoren Linf7160f32015-06-09 17:39:27 +0000717def expectedFailureHostWindows(bugnumber=None, compilers=None):
718 return expectedFailureHostOS(['windows'], bugnumber, compilers)
719
Pavel Labath090152b2015-08-20 11:37:19 +0000720def matchAndroid(api_levels=None, archs=None):
721 def match(self):
722 if not target_is_android():
723 return False
724 if archs is not None and self.getArchitecture() not in archs:
725 return False
726 if api_levels is not None and android_device_api() not in api_levels:
727 return False
728 return True
729 return match
730
731
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000732def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000733 """ Mark a test as xfail for Android.
734
735 Arguments:
736 bugnumber - The LLVM pr associated with the problem.
737 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000738 for which a test is expected to fail. None means all API level.
739 arch - A sequence of architecture names specifying the architectures
740 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000741 """
Pavel Labath090152b2015-08-20 11:37:19 +0000742 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000743
Vince Harron7ac3ea42015-06-26 15:13:21 +0000744# if the test passes on the first try, we're done (success)
745# if the test fails once, then passes on the second try, raise an ExpectedFailure
746# if the test fails twice in a row, re-throw the exception from the second test run
747def expectedFlakey(expected_fn, bugnumber=None):
748 def expectedFailure_impl(func):
749 @wraps(func)
750 def wrapper(*args, **kwargs):
751 from unittest2 import case
752 self = args[0]
Todd Fiala9187f272015-12-11 18:06:47 +0000753 if expected_fn(self):
754 # Send event marking test as explicitly eligible for rerunning.
755 if configuration.results_formatter_object is not None:
756 # Mark this test as rerunnable.
757 configuration.results_formatter_object.handle_event(
758 EventBuilder.event_for_mark_test_rerun_eligible(self))
Vince Harron7ac3ea42015-06-26 15:13:21 +0000759 try:
760 func(*args, **kwargs)
Ying Chen0a7202b2015-07-01 22:44:27 +0000761 # don't retry if the test case is already decorated with xfail or skip
762 except (case._ExpectedFailure, case.SkipTest, case._UnexpectedSuccess):
763 raise
Vince Harron7ac3ea42015-06-26 15:13:21 +0000764 except Exception:
765 if expected_fn(self):
Ying Chen0a7202b2015-07-01 22:44:27 +0000766 # before retry, run tearDown for previous run and setup for next
Vince Harron7ac3ea42015-06-26 15:13:21 +0000767 try:
Ying Chen0a7202b2015-07-01 22:44:27 +0000768 self.tearDown()
769 self.setUp()
Vince Harron7ac3ea42015-06-26 15:13:21 +0000770 func(*args, **kwargs)
771 except Exception:
772 # oh snap! two failures in a row, record a failure/error
773 raise
774 # record the expected failure
775 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
776 else:
777 raise
778 return wrapper
779 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
780 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000781 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000782 return expectedFailure_impl(bugnumber)
783 else:
784 return expectedFailure_impl
785
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000786def expectedFlakeyDwarf(bugnumber=None):
787 def fn(self):
788 return self.debug_info == "dwarf"
789 return expectedFlakey(fn, bugnumber)
790
791def expectedFlakeyDsym(bugnumber=None):
792 def fn(self):
793 return self.debug_info == "dwarf"
794 return expectedFlakey(fn, bugnumber)
795
Vince Harron7ac3ea42015-06-26 15:13:21 +0000796def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
797 def fn(self):
798 return (self.getPlatform() in oslist and
799 self.expectedCompiler(compilers))
800 return expectedFlakey(fn, bugnumber)
801
802def expectedFlakeyDarwin(bugnumber=None, compilers=None):
803 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
804 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
805
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000806def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
807 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
808
Vince Harron7ac3ea42015-06-26 15:13:21 +0000809def expectedFlakeyLinux(bugnumber=None, compilers=None):
810 return expectedFlakeyOS(['linux'], bugnumber, compilers)
811
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000812def expectedFlakeyNetBSD(bugnumber=None, compilers=None):
813 return expectedFlakeyOS(['netbsd'], bugnumber, compilers)
Vince Harron7ac3ea42015-06-26 15:13:21 +0000814
815def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
816 if compiler_version is None:
817 compiler_version=['=', None]
818 def fn(self):
819 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
820 return expectedFlakey(fn, bugnumber)
821
822# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
823def expectedFlakeyClang(bugnumber=None, compiler_version=None):
824 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
825
826# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
827def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
828 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
829
Pavel Labath63a579c2015-09-07 12:15:27 +0000830def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
831 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
832
Greg Clayton12514562013-12-05 22:22:32 +0000833def skipIfRemote(func):
834 """Decorate the item to skip tests if testing remotely."""
835 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
836 raise Exception("@skipIfRemote can only be used to decorate a test method")
837 @wraps(func)
838 def wrapper(*args, **kwargs):
839 from unittest2 import case
840 if lldb.remote_platform:
841 self = args[0]
842 self.skipTest("skip on remote platform")
843 else:
844 func(*args, **kwargs)
845 return wrapper
846
Siva Chandra4470f382015-06-17 22:32:27 +0000847def skipUnlessListedRemote(remote_list=None):
848 def myImpl(func):
849 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
850 raise Exception("@skipIfRemote can only be used to decorate a "
851 "test method")
852
853 @wraps(func)
854 def wrapper(*args, **kwargs):
855 if remote_list and lldb.remote_platform:
856 self = args[0]
857 triple = self.dbg.GetSelectedPlatform().GetTriple()
858 for r in remote_list:
859 if r in triple:
860 func(*args, **kwargs)
861 return
862 self.skipTest("skip on remote platform %s" % str(triple))
863 else:
864 func(*args, **kwargs)
865 return wrapper
866
867 return myImpl
868
Greg Clayton12514562013-12-05 22:22:32 +0000869def skipIfRemoteDueToDeadlock(func):
870 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
871 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
872 raise Exception("@skipIfRemote can only be used to decorate a test method")
873 @wraps(func)
874 def wrapper(*args, **kwargs):
875 from unittest2 import case
876 if lldb.remote_platform:
877 self = args[0]
878 self.skipTest("skip on remote platform (deadlocks)")
879 else:
880 func(*args, **kwargs)
881 return wrapper
882
Enrico Granatab633e432014-10-06 21:37:06 +0000883def skipIfNoSBHeaders(func):
884 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
885 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000886 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000887 @wraps(func)
888 def wrapper(*args, **kwargs):
889 from unittest2 import case
890 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000891 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000892 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000893 else:
894 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000895 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000896 if not os.path.exists(header):
897 self.skipTest("skip because LLDB.h header not found")
898 else:
899 func(*args, **kwargs)
900 return wrapper
901
Enrico Granata5f92a132015-11-05 00:46:25 +0000902def skipIfiOSSimulator(func):
903 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
Zachary Turner606e3a52015-12-08 01:15:30 +0000904 return unittest2.skipIf(configuration.lldb_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
Enrico Granata5f92a132015-11-05 00:46:25 +0000905
Robert Flack13c7ad92015-03-30 14:12:17 +0000906def skipIfFreeBSD(func):
907 """Decorate the item to skip tests that should be skipped on FreeBSD."""
908 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000909
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000910def skipIfNetBSD(func):
911 """Decorate the item to skip tests that should be skipped on NetBSD."""
912 return skipIfPlatform(["netbsd"])(func)
913
Greg Claytone0d0a762015-04-02 18:24:03 +0000914def getDarwinOSTriples():
915 return ['darwin', 'macosx', 'ios']
916
Daniel Maleab3d41a22013-07-09 00:08:01 +0000917def skipIfDarwin(func):
918 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000919 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000920
Robert Flack13c7ad92015-03-30 14:12:17 +0000921def skipIfLinux(func):
922 """Decorate the item to skip tests that should be skipped on Linux."""
923 return skipIfPlatform(["linux"])(func)
924
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000925def skipUnlessHostLinux(func):
926 """Decorate the item to skip tests that should be skipped on any non Linux host."""
927 return skipUnlessHostPlatform(["linux"])(func)
928
Robert Flack13c7ad92015-03-30 14:12:17 +0000929def skipIfWindows(func):
930 """Decorate the item to skip tests that should be skipped on Windows."""
931 return skipIfPlatform(["windows"])(func)
932
Chaoren Line6eea5d2015-06-08 22:13:28 +0000933def skipIfHostWindows(func):
934 """Decorate the item to skip tests that should be skipped on Windows."""
935 return skipIfHostPlatform(["windows"])(func)
936
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000937def skipUnlessWindows(func):
938 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
939 return skipUnlessPlatform(["windows"])(func)
940
Robert Flack13c7ad92015-03-30 14:12:17 +0000941def skipUnlessDarwin(func):
942 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000943 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000944
Ryan Brown57bee1e2015-09-14 22:45:11 +0000945def skipUnlessGoInstalled(func):
946 """Decorate the item to skip tests when no Go compiler is available."""
947 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
948 raise Exception("@skipIfGcc can only be used to decorate a test method")
949 @wraps(func)
950 def wrapper(*args, **kwargs):
951 from unittest2 import case
952 self = args[0]
953 compiler = self.getGoCompilerVersion()
954 if not compiler:
955 self.skipTest("skipping because go compiler not found")
956 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000957 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000958 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000959 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
960 if not match_version:
961 # Couldn't determine version.
962 self.skipTest(
963 "skipping because go version could not be parsed "
964 "out of {}".format(compiler))
965 else:
966 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000967 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000968 compiler_strict_version = StrictVersion(match_version.group(1))
969 if compiler_strict_version < min_strict_version:
970 self.skipTest(
971 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +0000972 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +0000973 compiler_strict_version,
974 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +0000975 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +0000976 return wrapper
977
Robert Flack068898c2015-04-09 18:07:58 +0000978def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +0000979 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +0000980 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
981 if platform.startswith('freebsd'):
982 platform = 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000983 elif platform.startswith('netbsd'):
984 platform = 'netbsd'
Robert Flack068898c2015-04-09 18:07:58 +0000985 return platform
986
Robert Flack6e1fd352015-05-15 12:39:33 +0000987def getHostPlatform():
988 """Returns the host platform running the test suite."""
989 # Attempts to return a platform name matching a target Triple platform.
990 if sys.platform.startswith('linux'):
991 return 'linux'
992 elif sys.platform.startswith('win32'):
993 return 'windows'
994 elif sys.platform.startswith('darwin'):
995 return 'darwin'
996 elif sys.platform.startswith('freebsd'):
997 return 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000998 elif sys.platform.startswith('netbsd'):
999 return 'netbsd'
Robert Flack6e1fd352015-05-15 12:39:33 +00001000 else:
1001 return sys.platform
1002
Robert Flackfb2f6c62015-04-17 08:02:18 +00001003def platformIsDarwin():
1004 """Returns true if the OS triple for the selected platform is any valid apple OS"""
1005 return getPlatform() in getDarwinOSTriples()
1006
Robert Flack6e1fd352015-05-15 12:39:33 +00001007def skipIfHostIncompatibleWithRemote(func):
1008 """Decorate the item to skip tests if binaries built on this host are incompatible."""
1009 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1010 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
1011 @wraps(func)
1012 def wrapper(*args, **kwargs):
1013 from unittest2 import case
1014 self = args[0]
1015 host_arch = self.getLldbArchitecture()
1016 host_platform = getHostPlatform()
1017 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +00001018 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +00001019 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
1020 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
1021 elif target_platform != host_platform:
1022 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
1023 else:
1024 func(*args, **kwargs)
1025 return wrapper
1026
Chaoren Line6eea5d2015-06-08 22:13:28 +00001027def skipIfHostPlatform(oslist):
1028 """Decorate the item to skip tests if running on one of the listed host platforms."""
1029 return unittest2.skipIf(getHostPlatform() in oslist,
1030 "skip on %s" % (", ".join(oslist)))
1031
1032def skipUnlessHostPlatform(oslist):
1033 """Decorate the item to skip tests unless running on one of the listed host platforms."""
1034 return unittest2.skipUnless(getHostPlatform() in oslist,
1035 "requires on of %s" % (", ".join(oslist)))
1036
Zachary Turner793d9972015-08-14 23:29:24 +00001037def skipUnlessArch(archlist):
1038 """Decorate the item to skip tests unless running on one of the listed architectures."""
1039 def myImpl(func):
1040 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1041 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1042
1043 @wraps(func)
1044 def wrapper(*args, **kwargs):
1045 self = args[0]
1046 if self.getArchitecture() not in archlist:
1047 self.skipTest("skipping for architecture %s (requires one of %s)" %
1048 (self.getArchitecture(), ", ".join(archlist)))
1049 else:
1050 func(*args, **kwargs)
1051 return wrapper
1052
1053 return myImpl
1054
Robert Flack13c7ad92015-03-30 14:12:17 +00001055def skipIfPlatform(oslist):
1056 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001057 return unittest2.skipIf(getPlatform() in oslist,
1058 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001059
1060def skipUnlessPlatform(oslist):
1061 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001062 return unittest2.skipUnless(getPlatform() in oslist,
1063 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001064
Daniel Malea48359902013-05-14 20:48:54 +00001065def skipIfLinuxClang(func):
1066 """Decorate the item to skip tests that should be skipped if building on
1067 Linux with clang.
1068 """
1069 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1070 raise Exception("@skipIfLinuxClang can only be used to decorate a test method")
1071 @wraps(func)
1072 def wrapper(*args, **kwargs):
1073 from unittest2 import case
1074 self = args[0]
1075 compiler = self.getCompiler()
Vince Harronc8492672015-05-04 02:59:19 +00001076 platform = self.getPlatform()
1077 if "clang" in compiler and platform == "linux":
Daniel Malea48359902013-05-14 20:48:54 +00001078 self.skipTest("skipping because Clang is used on Linux")
1079 else:
1080 func(*args, **kwargs)
1081 return wrapper
1082
Ying Chen7091c2c2015-04-21 01:15:47 +00001083# provide a function to skip on defined oslist, compiler version, and archs
1084# if none is specified for any argument, that argument won't be checked and thus means for all
1085# for example,
1086# @skipIf, skip for all platform/compiler/arch,
1087# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1088# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1089
1090# TODO: refactor current code, to make skipIfxxx functions to call this function
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001091def skipIf(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, debug_info=None, swig_version=None, py_version=None, remote=None):
Ying Chen7091c2c2015-04-21 01:15:47 +00001092 def fn(self):
Siva Chandra7dcad312015-11-20 20:30:36 +00001093 oslist_passes = oslist is None or self.getPlatform() in oslist
1094 compiler_passes = compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))
Zachary Turnerabdb8392015-11-16 22:40:30 +00001095 arch_passes = self.expectedArch(archs)
Siva Chandra7dcad312015-11-20 20:30:36 +00001096 debug_info_passes = debug_info is None or self.debug_info in debug_info
Zachary Turnerabdb8392015-11-16 22:40:30 +00001097 swig_version_passes = (swig_version is None) or (not hasattr(lldb, 'swig_version')) or (check_expected_version(swig_version[0], swig_version[1], lldb.swig_version))
1098 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001099 remote_passes = (remote is None) or (remote == (lldb.remote_platform is not None))
Zachary Turnerabdb8392015-11-16 22:40:30 +00001100
1101 return (oslist_passes and
1102 compiler_passes and
1103 arch_passes and
1104 debug_info_passes and
1105 swig_version_passes and
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001106 py_version_passes and
1107 remote_passes)
Zachary Turnerba105702015-11-16 23:58:20 +00001108
1109 local_vars = locals()
1110 args = [x for x in inspect.getargspec(skipIf).args]
1111 arg_vals = [eval(x, globals(), local_vars) for x in args]
1112 args = [x for x in zip(args, arg_vals) if x[1] is not None]
1113 reasons = ['%s=%s' % (x, str(y)) for (x,y) in args]
1114 return skipTestIfFn(fn, bugnumber, skipReason='skipping because ' + ' && '.join(reasons))
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001115
1116def skipIfDebugInfo(bugnumber=None, debug_info=None):
1117 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1118
Greg Claytonedea2372015-10-07 20:01:13 +00001119def skipIfDWO(bugnumber=None):
1120 return skipIfDebugInfo(bugnumber, ["dwo"])
1121
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001122def skipIfDwarf(bugnumber=None):
1123 return skipIfDebugInfo(bugnumber, ["dwarf"])
1124
1125def skipIfDsym(bugnumber=None):
1126 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001127
1128def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1129 def skipTestIfFn_impl(func):
1130 @wraps(func)
1131 def wrapper(*args, **kwargs):
1132 from unittest2 import case
1133 self = args[0]
1134 if expected_fn(self):
1135 self.skipTest(skipReason)
1136 else:
1137 func(*args, **kwargs)
1138 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001139 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001140 return skipTestIfFn_impl(bugnumber)
1141 else:
1142 return skipTestIfFn_impl
1143
Daniel Maleabe230792013-01-24 23:52:09 +00001144def skipIfGcc(func):
1145 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1146 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001147 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001148 @wraps(func)
1149 def wrapper(*args, **kwargs):
1150 from unittest2 import case
1151 self = args[0]
1152 compiler = self.getCompiler()
1153 if "gcc" in compiler:
1154 self.skipTest("skipping because gcc is the test compiler")
1155 else:
1156 func(*args, **kwargs)
1157 return wrapper
1158
Matt Kopec0de53f02013-03-15 19:10:12 +00001159def skipIfIcc(func):
1160 """Decorate the item to skip tests that should be skipped if building with icc ."""
1161 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1162 raise Exception("@skipIfIcc can only be used to decorate a test method")
1163 @wraps(func)
1164 def wrapper(*args, **kwargs):
1165 from unittest2 import case
1166 self = args[0]
1167 compiler = self.getCompiler()
1168 if "icc" in compiler:
1169 self.skipTest("skipping because icc is the test compiler")
1170 else:
1171 func(*args, **kwargs)
1172 return wrapper
1173
Daniel Malea55faa402013-05-02 21:44:31 +00001174def skipIfi386(func):
1175 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1176 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1177 raise Exception("@skipIfi386 can only be used to decorate a test method")
1178 @wraps(func)
1179 def wrapper(*args, **kwargs):
1180 from unittest2 import case
1181 self = args[0]
1182 if "i386" == self.getArchitecture():
1183 self.skipTest("skipping because i386 is not a supported architecture")
1184 else:
1185 func(*args, **kwargs)
1186 return wrapper
1187
Pavel Labath090152b2015-08-20 11:37:19 +00001188def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001189 """Decorator to skip tests when the target is Android.
1190
1191 Arguments:
1192 api_levels - The API levels for which the test should be skipped. If
1193 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001194 arch - A sequence of architecture names specifying the architectures
1195 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001196 """
1197 def myImpl(func):
1198 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1199 raise Exception("@skipIfTargetAndroid can only be used to "
1200 "decorate a test method")
1201 @wraps(func)
1202 def wrapper(*args, **kwargs):
1203 from unittest2 import case
1204 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001205 if matchAndroid(api_levels, archs)(self):
1206 self.skipTest("skiped on Android target with API %d and architecture %s" %
1207 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001208 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001209 return wrapper
1210 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001211
Ilia Kd9953052015-03-12 07:19:41 +00001212def skipUnlessCompilerRt(func):
1213 """Decorate the item to skip tests if testing remotely."""
1214 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1215 raise Exception("@skipUnless can only be used to decorate a test method")
1216 @wraps(func)
1217 def wrapper(*args, **kwargs):
1218 from unittest2 import case
1219 import os.path
Enrico Granata55d99f02015-11-19 21:45:07 +00001220 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "llvm","projects","compiler-rt")
1221 print(compilerRtPath)
Ilia Kd9953052015-03-12 07:19:41 +00001222 if not os.path.exists(compilerRtPath):
1223 self = args[0]
1224 self.skipTest("skip if compiler-rt not found")
1225 else:
1226 func(*args, **kwargs)
1227 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001228
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001229class _PlatformContext(object):
1230 """Value object class which contains platform-specific options."""
1231
1232 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1233 self.shlib_environment_var = shlib_environment_var
1234 self.shlib_prefix = shlib_prefix
1235 self.shlib_extension = shlib_extension
1236
1237
Johnny Chena74bb0a2011-08-01 18:46:13 +00001238class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001239 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001240 Abstract base for performing lldb (see TestBase) or other generic tests (see
1241 BenchBase for one example). lldbtest.Base works with the test driver to
1242 accomplish things.
1243
Johnny Chen8334dad2010-10-22 23:15:46 +00001244 """
Enrico Granata5020f952012-10-24 21:42:49 +00001245
Enrico Granata19186272012-10-24 21:44:48 +00001246 # The concrete subclass should override this attribute.
1247 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001248
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001249 # Keep track of the old current working directory.
1250 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001251
Greg Clayton4570d3e2013-12-10 23:19:29 +00001252 @staticmethod
1253 def compute_mydir(test_file):
1254 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1255
1256 mydir = TestBase.compute_mydir(__file__)'''
1257 test_dir = os.path.dirname(test_file)
1258 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1259
Johnny Chenfb4264c2011-08-01 19:50:58 +00001260 def TraceOn(self):
1261 """Returns True if we are in trace mode (tracing detailed test execution)."""
1262 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001263
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001264 @classmethod
1265 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001266 """
1267 Python unittest framework class setup fixture.
1268 Do current directory manipulation.
1269 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001270 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001271 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001272 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001273
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001274 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001275 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001276
1277 # Change current working directory if ${LLDB_TEST} is defined.
1278 # See also dotest.py which sets up ${LLDB_TEST}.
1279 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001280 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001281 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001282 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001283 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1284
Vince Harron85d19652015-05-21 19:09:29 +00001285 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001286 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001287 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1288 try:
1289 cls.dir_lock.try_acquire()
1290 # write the class that owns the lock into the lock file
1291 cls.dir_lock.handle.write(cls.__name__)
1292 except IOError as ioerror:
1293 # nothing else should have this directory lock
1294 # wait here until we get a lock
1295 cls.dir_lock.acquire()
1296 # read the previous owner from the lock file
1297 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001298 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 +00001299 raise ioerror
1300
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001301 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001302 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001303 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001304 elif getPlatform() in ("freebsd", "linux", "netbsd"):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001305 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001306 else:
1307 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001308
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001309 @classmethod
1310 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001311 """
1312 Python unittest framework class teardown fixture.
1313 Do class-wide cleanup.
1314 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001315
Zachary Turner742afdb2015-12-11 19:21:49 +00001316 if doCleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001317 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001318 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001319 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001320
Johnny Chen707b3c92010-10-11 22:25:46 +00001321 # Subclass might have specific cleanup function defined.
1322 if getattr(cls, "classCleanup", None):
1323 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001324 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001325 try:
1326 cls.classCleanup()
1327 except:
1328 exc_type, exc_value, exc_tb = sys.exc_info()
1329 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001330
Vince Harron85d19652015-05-21 19:09:29 +00001331 if debug_confirm_directory_exclusivity:
1332 cls.dir_lock.release()
1333 del cls.dir_lock
1334
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001335 # Restore old working directory.
1336 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001337 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001338 os.chdir(cls.oldcwd)
1339
Johnny Chena74bb0a2011-08-01 18:46:13 +00001340 @classmethod
1341 def skipLongRunningTest(cls):
1342 """
1343 By default, we skip long running test case.
1344 This can be overridden by passing '-l' to the test driver (dotest.py).
1345 """
1346 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1347 return False
1348 else:
1349 return True
Johnny Chened492022011-06-21 00:53:00 +00001350
Vince Harron6d3d0f12015-05-10 22:01:59 +00001351 def enableLogChannelsForCurrentTest(self):
1352 if len(lldbtest_config.channels) == 0:
1353 return
1354
1355 # if debug channels are specified in lldbtest_config.channels,
1356 # create a new set of log files for every test
1357 log_basename = self.getLogBasenameForCurrentTest()
1358
1359 # confirm that the file is writeable
1360 host_log_path = "{}-host.log".format(log_basename)
1361 open(host_log_path, 'w').close()
1362
1363 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1364 for channel_with_categories in lldbtest_config.channels:
1365 channel_then_categories = channel_with_categories.split(' ', 1)
1366 channel = channel_then_categories[0]
1367 if len(channel_then_categories) > 1:
1368 categories = channel_then_categories[1]
1369 else:
1370 categories = "default"
1371
1372 if channel == "gdb-remote":
1373 # communicate gdb-remote categories to debugserver
1374 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1375
1376 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1377 if not self.res.Succeeded():
1378 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1379
1380 # Communicate log path name to debugserver & lldb-server
1381 server_log_path = "{}-server.log".format(log_basename)
1382 open(server_log_path, 'w').close()
1383 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
1384
1385 # Communicate channels to lldb-server
1386 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
1387
1388 if len(lldbtest_config.channels) == 0:
1389 return
1390
1391 def disableLogChannelsForCurrentTest(self):
1392 # close all log files that we opened
1393 for channel_and_categories in lldbtest_config.channels:
1394 # channel format - <channel-name> [<category0> [<category1> ...]]
1395 channel = channel_and_categories.split(' ', 1)[0]
1396 self.ci.HandleCommand("log disable " + channel, self.res)
1397 if not self.res.Succeeded():
1398 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1399
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001400 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001401 """Fixture for unittest test case setup.
1402
1403 It works with the test driver to conditionally skip tests and does other
1404 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001405 #import traceback
1406 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001407
Daniel Malea9115f072013-08-06 15:02:32 +00001408 if "LIBCXX_PATH" in os.environ:
1409 self.libcxxPath = os.environ["LIBCXX_PATH"]
1410 else:
1411 self.libcxxPath = None
1412
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001413 if "LLDBMI_EXEC" in os.environ:
1414 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1415 else:
1416 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001417
Johnny Chenebe51722011-10-07 19:21:09 +00001418 # If we spawn an lldb process for test (via pexpect), do not load the
1419 # init file unless told otherwise.
1420 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1421 self.lldbOption = ""
1422 else:
1423 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001424
Johnny Chen985e7402011-08-01 21:13:26 +00001425 # Assign the test method name to self.testMethodName.
1426 #
1427 # For an example of the use of this attribute, look at test/types dir.
1428 # There are a bunch of test cases under test/types and we don't want the
1429 # module cacheing subsystem to be confused with executable name "a.out"
1430 # used for all the test cases.
1431 self.testMethodName = self._testMethodName
1432
Johnny Chen985e7402011-08-01 21:13:26 +00001433 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1434 # with it using pexpect.
1435 self.child = None
1436 self.child_prompt = "(lldb) "
1437 # If the child is interacting with the embedded script interpreter,
1438 # there are two exits required during tear down, first to quit the
1439 # embedded script interpreter and second to quit the lldb command
1440 # interpreter.
1441 self.child_in_script_interpreter = False
1442
Johnny Chenfb4264c2011-08-01 19:50:58 +00001443 # These are for customized teardown cleanup.
1444 self.dict = None
1445 self.doTearDownCleanup = False
1446 # And in rare cases where there are multiple teardown cleanups.
1447 self.dicts = []
1448 self.doTearDownCleanups = False
1449
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001450 # List of spawned subproces.Popen objects
1451 self.subprocesses = []
1452
Daniel Malea69207462013-06-05 21:07:02 +00001453 # List of forked process PIDs
1454 self.forkedProcessPids = []
1455
Johnny Chenfb4264c2011-08-01 19:50:58 +00001456 # Create a string buffer to record the session info, to be dumped into a
1457 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001458 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001459
Vince Harron1f160372015-05-21 18:51:20 +00001460 session_file = "{}.log".format(self.log_basename)
Zachary Turner8d13fab2015-11-07 01:08:15 +00001461 # Python 3 doesn't support unbuffered I/O in text mode. Open buffered.
1462 self.session = open(session_file, "w")
Johnny Chenfb4264c2011-08-01 19:50:58 +00001463
1464 # Optimistically set __errored__, __failed__, __expected__ to False
1465 # initially. If the test errored/failed, the session info
1466 # (self.session) is then dumped into a session specific file for
1467 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001468 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001469 self.__errored__ = False
1470 self.__failed__ = False
1471 self.__expected__ = False
1472 # We are also interested in unexpected success.
1473 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001474 # And skipped tests.
1475 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001476
1477 # See addTearDownHook(self, hook) which allows the client to add a hook
1478 # function to be run during tearDown() time.
1479 self.hooks = []
1480
1481 # See HideStdout(self).
1482 self.sys_stdout_hidden = False
1483
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001484 if self.platformContext:
1485 # set environment variable names for finding shared libraries
1486 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001487
Vince Harron6d3d0f12015-05-10 22:01:59 +00001488 # Create the debugger instance if necessary.
1489 try:
1490 self.dbg = lldb.DBG
1491 except AttributeError:
1492 self.dbg = lldb.SBDebugger.Create()
1493
1494 if not self.dbg:
1495 raise Exception('Invalid debugger instance')
1496
1497 # Retrieve the associated command interpreter instance.
1498 self.ci = self.dbg.GetCommandInterpreter()
1499 if not self.ci:
1500 raise Exception('Could not get the command interpreter')
1501
1502 # And the result object.
1503 self.res = lldb.SBCommandReturnObject()
1504
1505 self.enableLogChannelsForCurrentTest()
1506
Ying Chen0c352822015-11-16 23:41:02 +00001507 #Initialize debug_info
1508 self.debug_info = None
1509
Daniel Malea249287a2013-02-19 16:08:57 +00001510 def setAsync(self, value):
1511 """ Sets async mode to True/False and ensures it is reset after the testcase completes."""
1512 old_async = self.dbg.GetAsync()
1513 self.dbg.SetAsync(value)
1514 self.addTearDownHook(lambda: self.dbg.SetAsync(old_async))
1515
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001516 def cleanupSubprocesses(self):
1517 # Ensure any subprocesses are cleaned up
1518 for p in self.subprocesses:
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001519 p.terminate()
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001520 del p
1521 del self.subprocesses[:]
Daniel Malea69207462013-06-05 21:07:02 +00001522 # Ensure any forked processes are cleaned up
1523 for pid in self.forkedProcessPids:
1524 if os.path.exists("/proc/" + str(pid)):
1525 os.kill(pid, signal.SIGTERM)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001526
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001527 def spawnSubprocess(self, executable, args=[], install_remote=True):
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001528 """ Creates a subprocess.Popen object with the specified executable and arguments,
1529 saves it in self.subprocesses, and returns the object.
1530 NOTE: if using this function, ensure you also call:
1531
1532 self.addTearDownHook(self.cleanupSubprocesses)
1533
1534 otherwise the test suite will leak processes.
1535 """
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001536 proc = _RemoteProcess(install_remote) if lldb.remote_platform else _LocalProcess(self.TraceOn())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001537 proc.launch(executable, args)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001538 self.subprocesses.append(proc)
1539 return proc
1540
Daniel Malea69207462013-06-05 21:07:02 +00001541 def forkSubprocess(self, executable, args=[]):
1542 """ Fork a subprocess with its own group ID.
1543 NOTE: if using this function, ensure you also call:
1544
1545 self.addTearDownHook(self.cleanupSubprocesses)
1546
1547 otherwise the test suite will leak processes.
1548 """
1549 child_pid = os.fork()
1550 if child_pid == 0:
1551 # If more I/O support is required, this can be beefed up.
1552 fd = os.open(os.devnull, os.O_RDWR)
Daniel Malea69207462013-06-05 21:07:02 +00001553 os.dup2(fd, 1)
1554 os.dup2(fd, 2)
1555 # This call causes the child to have its of group ID
1556 os.setpgid(0,0)
1557 os.execvp(executable, [executable] + args)
1558 # Give the child time to get through the execvp() call
1559 time.sleep(0.1)
1560 self.forkedProcessPids.append(child_pid)
1561 return child_pid
1562
Johnny Chenfb4264c2011-08-01 19:50:58 +00001563 def HideStdout(self):
1564 """Hide output to stdout from the user.
1565
1566 During test execution, there might be cases where we don't want to show the
1567 standard output to the user. For example,
1568
Zachary Turner35d017f2015-10-23 17:04:29 +00001569 self.runCmd(r'''sc print("\n\n\tHello!\n")''')
Johnny Chenfb4264c2011-08-01 19:50:58 +00001570
1571 tests whether command abbreviation for 'script' works or not. There is no
1572 need to show the 'Hello' output to the user as long as the 'script' command
1573 succeeds and we are not in TraceOn() mode (see the '-t' option).
1574
1575 In this case, the test method calls self.HideStdout(self) to redirect the
1576 sys.stdout to a null device, and restores the sys.stdout upon teardown.
1577
1578 Note that you should only call this method at most once during a test case
1579 execution. Any subsequent call has no effect at all."""
1580 if self.sys_stdout_hidden:
1581 return
1582
1583 self.sys_stdout_hidden = True
1584 old_stdout = sys.stdout
1585 sys.stdout = open(os.devnull, 'w')
1586 def restore_stdout():
1587 sys.stdout = old_stdout
1588 self.addTearDownHook(restore_stdout)
1589
1590 # =======================================================================
1591 # Methods for customized teardown cleanups as well as execution of hooks.
1592 # =======================================================================
1593
1594 def setTearDownCleanup(self, dictionary=None):
1595 """Register a cleanup action at tearDown() time with a dictinary"""
1596 self.dict = dictionary
1597 self.doTearDownCleanup = True
1598
1599 def addTearDownCleanup(self, dictionary):
1600 """Add a cleanup action at tearDown() time with a dictinary"""
1601 self.dicts.append(dictionary)
1602 self.doTearDownCleanups = True
1603
1604 def addTearDownHook(self, hook):
1605 """
1606 Add a function to be run during tearDown() time.
1607
1608 Hooks are executed in a first come first serve manner.
1609 """
Zachary Turnercd236b82015-10-26 18:48:24 +00001610 if six.callable(hook):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001611 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001612 print("Adding tearDown hook:", getsource_if_available(hook), file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001613 self.hooks.append(hook)
Enrico Granataab0e8312014-11-05 21:31:57 +00001614
1615 return self
Johnny Chenfb4264c2011-08-01 19:50:58 +00001616
Jim Inghamda3a3862014-10-16 23:02:14 +00001617 def deletePexpectChild(self):
Johnny Chen985e7402011-08-01 21:13:26 +00001618 # This is for the case of directly spawning 'lldb' and interacting with it
1619 # using pexpect.
Johnny Chen985e7402011-08-01 21:13:26 +00001620 if self.child and self.child.isalive():
Zachary Turner9ef307b2014-07-22 16:19:29 +00001621 import pexpect
Johnny Chen985e7402011-08-01 21:13:26 +00001622 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001623 print("tearing down the child process....", file=sbuf)
Johnny Chen985e7402011-08-01 21:13:26 +00001624 try:
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001625 if self.child_in_script_interpreter:
1626 self.child.sendline('quit()')
1627 self.child.expect_exact(self.child_prompt)
1628 self.child.sendline('settings set interpreter.prompt-on-quit false')
1629 self.child.sendline('quit')
Johnny Chen985e7402011-08-01 21:13:26 +00001630 self.child.expect(pexpect.EOF)
Ilia K47448c22015-02-11 21:41:58 +00001631 except (ValueError, pexpect.ExceptionPexpect):
1632 # child is already terminated
1633 pass
1634 except OSError as exception:
1635 import errno
1636 if exception.errno != errno.EIO:
1637 # unexpected error
1638 raise
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001639 # child is already terminated
Johnny Chen985e7402011-08-01 21:13:26 +00001640 pass
Shawn Besteb3e9052014-11-06 17:52:15 +00001641 finally:
1642 # Give it one final blow to make sure the child is terminated.
1643 self.child.close()
Jim Inghamda3a3862014-10-16 23:02:14 +00001644
1645 def tearDown(self):
1646 """Fixture for unittest test case teardown."""
1647 #import traceback
1648 #traceback.print_stack()
1649
1650 self.deletePexpectChild()
1651
Johnny Chenfb4264c2011-08-01 19:50:58 +00001652 # Check and run any hook functions.
1653 for hook in reversed(self.hooks):
1654 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001655 print("Executing tearDown hook:", getsource_if_available(hook), file=sbuf)
Enrico Granataab0e8312014-11-05 21:31:57 +00001656 import inspect
1657 hook_argc = len(inspect.getargspec(hook).args)
Enrico Granata6e0566c2014-11-17 19:00:20 +00001658 if hook_argc == 0 or getattr(hook,'im_self',None):
Enrico Granataab0e8312014-11-05 21:31:57 +00001659 hook()
1660 elif hook_argc == 1:
1661 hook(self)
1662 else:
1663 hook() # try the plain call and hope it works
Johnny Chenfb4264c2011-08-01 19:50:58 +00001664
1665 del self.hooks
1666
1667 # Perform registered teardown cleanup.
1668 if doCleanup and self.doTearDownCleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00001669 self.cleanup(dictionary=self.dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001670
1671 # In rare cases where there are multiple teardown cleanups added.
1672 if doCleanup and self.doTearDownCleanups:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001673 if self.dicts:
1674 for dict in reversed(self.dicts):
Johnny Chen0fddfb22011-11-17 19:57:27 +00001675 self.cleanup(dictionary=dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001676
Vince Harron9753dd92015-05-10 15:22:09 +00001677 self.disableLogChannelsForCurrentTest()
1678
Johnny Chenfb4264c2011-08-01 19:50:58 +00001679 # =========================================================
1680 # Various callbacks to allow introspection of test progress
1681 # =========================================================
1682
1683 def markError(self):
1684 """Callback invoked when an error (unexpected exception) errored."""
1685 self.__errored__ = True
1686 with recording(self, False) as sbuf:
1687 # False because there's no need to write "ERROR" to the stderr twice.
1688 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001689 print("ERROR", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001690
Zachary Turnerb1490b62015-08-26 19:44:56 +00001691 def markCleanupError(self):
1692 """Callback invoked when an error occurs while a test is cleaning up."""
1693 self.__cleanup_errored__ = True
1694 with recording(self, False) as sbuf:
1695 # False because there's no need to write "CLEANUP_ERROR" to the stderr twice.
1696 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001697 print("CLEANUP_ERROR", file=sbuf)
Zachary Turnerb1490b62015-08-26 19:44:56 +00001698
Johnny Chenfb4264c2011-08-01 19:50:58 +00001699 def markFailure(self):
1700 """Callback invoked when a failure (test assertion failure) occurred."""
1701 self.__failed__ = True
1702 with recording(self, False) as sbuf:
1703 # False because there's no need to write "FAIL" to the stderr twice.
1704 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001705 print("FAIL", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001706
Enrico Granatae6cedc12013-02-23 01:05:23 +00001707 def markExpectedFailure(self,err,bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001708 """Callback invoked when an expected failure/error occurred."""
1709 self.__expected__ = True
1710 with recording(self, False) as sbuf:
1711 # False because there's no need to write "expected failure" to the
1712 # stderr twice.
1713 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001714 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001715 print("expected failure", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001716 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001717 print("expected failure (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001718
Johnny Chenc5cc6252011-08-15 23:09:08 +00001719 def markSkippedTest(self):
1720 """Callback invoked when a test is skipped."""
1721 self.__skipped__ = True
1722 with recording(self, False) as sbuf:
1723 # False because there's no need to write "skipped test" to the
1724 # stderr twice.
1725 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001726 print("skipped test", file=sbuf)
Johnny Chenc5cc6252011-08-15 23:09:08 +00001727
Enrico Granatae6cedc12013-02-23 01:05:23 +00001728 def markUnexpectedSuccess(self, bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001729 """Callback invoked when an unexpected success occurred."""
1730 self.__unexpected__ = True
1731 with recording(self, False) as sbuf:
1732 # False because there's no need to write "unexpected success" to the
1733 # stderr twice.
1734 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001735 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001736 print("unexpected success", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001737 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001738 print("unexpected success (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001739
Greg Clayton70995582015-01-07 22:25:50 +00001740 def getRerunArgs(self):
1741 return " -f %s.%s" % (self.__class__.__name__, self._testMethodName)
Vince Harron9753dd92015-05-10 15:22:09 +00001742
1743 def getLogBasenameForCurrentTest(self, prefix=None):
1744 """
1745 returns a partial path that can be used as the beginning of the name of multiple
1746 log files pertaining to this test
1747
1748 <session-dir>/<arch>-<compiler>-<test-file>.<test-class>.<test-method>
1749 """
1750 dname = os.path.join(os.environ["LLDB_TEST"],
1751 os.environ["LLDB_SESSION_DIRNAME"])
1752 if not os.path.isdir(dname):
1753 os.mkdir(dname)
1754
1755 compiler = self.getCompiler()
1756
1757 if compiler[1] == ':':
1758 compiler = compiler[2:]
Chaoren Lin636a0e32015-07-17 21:40:11 +00001759 if os.path.altsep is not None:
1760 compiler = compiler.replace(os.path.altsep, os.path.sep)
Vince Harron9753dd92015-05-10 15:22:09 +00001761
Vince Harron19e300f2015-05-12 00:50:54 +00001762 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), "_".join(compiler.split(os.path.sep)))
Vince Harron9753dd92015-05-10 15:22:09 +00001763 if len(fname) > 200:
Vince Harron19e300f2015-05-12 00:50:54 +00001764 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), compiler.split(os.path.sep)[-1])
Vince Harron9753dd92015-05-10 15:22:09 +00001765
1766 if prefix is not None:
1767 fname = "{}-{}".format(prefix, fname)
1768
1769 return os.path.join(dname, fname)
1770
Johnny Chenfb4264c2011-08-01 19:50:58 +00001771 def dumpSessionInfo(self):
1772 """
1773 Dump the debugger interactions leading to a test error/failure. This
1774 allows for more convenient postmortem analysis.
1775
1776 See also LLDBTestResult (dotest.py) which is a singlton class derived
1777 from TextTestResult and overwrites addError, addFailure, and
1778 addExpectedFailure methods to allow us to to mark the test instance as
1779 such.
1780 """
1781
1782 # We are here because self.tearDown() detected that this test instance
1783 # either errored or failed. The lldb.test_result singleton contains
1784 # two lists (erros and failures) which get populated by the unittest
1785 # framework. Look over there for stack trace information.
1786 #
1787 # The lists contain 2-tuples of TestCase instances and strings holding
1788 # formatted tracebacks.
1789 #
1790 # See http://docs.python.org/library/unittest.html#unittest.TestResult.
Vince Harron9753dd92015-05-10 15:22:09 +00001791
Vince Harron35b17dc2015-05-21 18:20:21 +00001792 # output tracebacks into session
Vince Harron9753dd92015-05-10 15:22:09 +00001793 pairs = []
Johnny Chenfb4264c2011-08-01 19:50:58 +00001794 if self.__errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001795 pairs = configuration.test_result.errors
Johnny Chenfb4264c2011-08-01 19:50:58 +00001796 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001797 elif self.__cleanup_errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001798 pairs = configuration.test_result.cleanup_errors
Zachary Turnerb1490b62015-08-26 19:44:56 +00001799 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001800 elif self.__failed__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001801 pairs = configuration.test_result.failures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001802 prefix = 'Failure'
1803 elif self.__expected__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001804 pairs = configuration.test_result.expectedFailures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001805 prefix = 'ExpectedFailure'
Johnny Chenc5cc6252011-08-15 23:09:08 +00001806 elif self.__skipped__:
1807 prefix = 'SkippedTest'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001808 elif self.__unexpected__:
Vince Harron35b17dc2015-05-21 18:20:21 +00001809 prefix = 'UnexpectedSuccess'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001810 else:
Vince Harron35b17dc2015-05-21 18:20:21 +00001811 prefix = 'Success'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001812
Johnny Chenc5cc6252011-08-15 23:09:08 +00001813 if not self.__unexpected__ and not self.__skipped__:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001814 for test, traceback in pairs:
1815 if test is self:
Zachary Turnerff890da2015-10-19 23:45:41 +00001816 print(traceback, file=self.session)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001817
Vince Harron35b17dc2015-05-21 18:20:21 +00001818 # put footer (timestamp/rerun instructions) into session
Johnny Chen8082a002011-08-11 00:16:28 +00001819 testMethod = getattr(self, self._testMethodName)
1820 if getattr(testMethod, "__benchmarks_test__", False):
1821 benchmarks = True
1822 else:
1823 benchmarks = False
1824
Vince Harron35b17dc2015-05-21 18:20:21 +00001825 import datetime
Zachary Turnerff890da2015-10-19 23:45:41 +00001826 print("Session info generated @", datetime.datetime.now().ctime(), file=self.session)
1827 print("To rerun this test, issue the following command from the 'test' directory:\n", file=self.session)
1828 print("./dotest.py %s -v %s %s" % (self.getRunOptions(),
Vince Harron35b17dc2015-05-21 18:20:21 +00001829 ('+b' if benchmarks else '-t'),
Zachary Turnerff890da2015-10-19 23:45:41 +00001830 self.getRerunArgs()), file=self.session)
Vince Harron35b17dc2015-05-21 18:20:21 +00001831 self.session.close()
1832 del self.session
1833
1834 # process the log files
Vince Harron1f160372015-05-21 18:51:20 +00001835 log_files_for_this_test = glob.glob(self.log_basename + "*")
Vince Harron35b17dc2015-05-21 18:20:21 +00001836
1837 if prefix != 'Success' or lldbtest_config.log_success:
1838 # keep all log files, rename them to include prefix
1839 dst_log_basename = self.getLogBasenameForCurrentTest(prefix)
1840 for src in log_files_for_this_test:
Zachary Turner306278f2015-05-26 20:26:29 +00001841 if os.path.isfile(src):
1842 dst = src.replace(self.log_basename, dst_log_basename)
1843 if os.name == "nt" and os.path.isfile(dst):
1844 # On Windows, renaming a -> b will throw an exception if b exists. On non-Windows platforms
1845 # it silently replaces the destination. Ultimately this means that atomic renames are not
1846 # guaranteed to be possible on Windows, but we need this to work anyway, so just remove the
1847 # destination first if it already exists.
1848 os.remove(dst)
Zachary Turner5de068b2015-05-26 19:52:24 +00001849
Zachary Turner306278f2015-05-26 20:26:29 +00001850 os.rename(src, dst)
Vince Harron35b17dc2015-05-21 18:20:21 +00001851 else:
1852 # success! (and we don't want log files) delete log files
1853 for log_file in log_files_for_this_test:
Adrian McCarthya7292042015-09-04 20:48:48 +00001854 try:
1855 os.unlink(log_file)
1856 except:
1857 # We've seen consistent unlink failures on Windows, perhaps because the
1858 # just-created log file is being scanned by anti-virus. Empirically, this
1859 # sleep-and-retry approach allows tests to succeed much more reliably.
1860 # Attempts to figure out exactly what process was still holding a file handle
1861 # have failed because running instrumentation like Process Monitor seems to
1862 # slow things down enough that the problem becomes much less consistent.
1863 time.sleep(0.5)
1864 os.unlink(log_file)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001865
1866 # ====================================================
1867 # Config. methods supported through a plugin interface
1868 # (enables reading of the current test configuration)
1869 # ====================================================
1870
1871 def getArchitecture(self):
1872 """Returns the architecture in effect the test suite is running with."""
1873 module = builder_module()
Ed Maste0f434e62015-04-06 15:50:48 +00001874 arch = module.getArchitecture()
1875 if arch == 'amd64':
1876 arch = 'x86_64'
1877 return arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001878
Vince Harron02613762015-05-04 00:17:53 +00001879 def getLldbArchitecture(self):
1880 """Returns the architecture of the lldb binary."""
1881 if not hasattr(self, 'lldbArchitecture'):
1882
1883 # spawn local process
1884 command = [
Vince Harron790d95c2015-05-18 19:39:03 +00001885 lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001886 "-o",
Vince Harron790d95c2015-05-18 19:39:03 +00001887 "file " + lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001888 "-o",
1889 "quit"
1890 ]
1891
1892 output = check_output(command)
1893 str = output.decode("utf-8");
1894
1895 for line in str.splitlines():
1896 m = re.search("Current executable set to '.*' \\((.*)\\)\\.", line)
1897 if m:
1898 self.lldbArchitecture = m.group(1)
1899 break
1900
1901 return self.lldbArchitecture
1902
Johnny Chenfb4264c2011-08-01 19:50:58 +00001903 def getCompiler(self):
1904 """Returns the compiler in effect the test suite is running with."""
1905 module = builder_module()
1906 return module.getCompiler()
1907
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001908 def getCompilerBinary(self):
1909 """Returns the compiler binary the test suite is running with."""
1910 return self.getCompiler().split()[0]
1911
Daniel Malea0aea0162013-02-27 17:29:46 +00001912 def getCompilerVersion(self):
1913 """ Returns a string that represents the compiler version.
1914 Supports: llvm, clang.
1915 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00001916 from .lldbutil import which
Daniel Malea0aea0162013-02-27 17:29:46 +00001917 version = 'unknown'
1918
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001919 compiler = self.getCompilerBinary()
Zachary Turner9ef307b2014-07-22 16:19:29 +00001920 version_output = system([[which(compiler), "-v"]])[1]
Daniel Malea0aea0162013-02-27 17:29:46 +00001921 for line in version_output.split(os.linesep):
Greg Clayton2a844b72013-03-06 02:34:51 +00001922 m = re.search('version ([0-9\.]+)', line)
Daniel Malea0aea0162013-02-27 17:29:46 +00001923 if m:
1924 version = m.group(1)
1925 return version
1926
Ryan Brown57bee1e2015-09-14 22:45:11 +00001927 def getGoCompilerVersion(self):
1928 """ Returns a string that represents the go compiler version, or None if go is not found.
1929 """
1930 compiler = which("go")
1931 if compiler:
1932 version_output = system([[compiler, "version"]])[0]
1933 for line in version_output.split(os.linesep):
1934 m = re.search('go version (devel|go\\S+)', line)
1935 if m:
1936 return m.group(1)
1937 return None
1938
Greg Claytone0d0a762015-04-02 18:24:03 +00001939 def platformIsDarwin(self):
1940 """Returns true if the OS triple for the selected platform is any valid apple OS"""
Robert Flackfb2f6c62015-04-17 08:02:18 +00001941 return platformIsDarwin()
Vince Harron20952cc2015-04-03 01:00:06 +00001942
Robert Flack13c7ad92015-03-30 14:12:17 +00001943 def getPlatform(self):
Robert Flackfb2f6c62015-04-17 08:02:18 +00001944 """Returns the target platform the test suite is running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001945 return getPlatform()
Robert Flack13c7ad92015-03-30 14:12:17 +00001946
Daniel Maleaadaaec92013-08-06 20:51:41 +00001947 def isIntelCompiler(self):
1948 """ Returns true if using an Intel (ICC) compiler, false otherwise. """
1949 return any([x in self.getCompiler() for x in ["icc", "icpc", "icl"]])
1950
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001951 def expectedCompilerVersion(self, compiler_version):
1952 """Returns True iff compiler_version[1] matches the current compiler version.
1953 Use compiler_version[0] to specify the operator used to determine if a match has occurred.
1954 Any operator other than the following defaults to an equality test:
1955 '>', '>=', "=>", '<', '<=', '=<', '!=', "!" or 'not'
1956 """
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001957 if (compiler_version == None):
1958 return True
1959 operator = str(compiler_version[0])
1960 version = compiler_version[1]
1961
1962 if (version == None):
1963 return True
1964 if (operator == '>'):
1965 return self.getCompilerVersion() > version
1966 if (operator == '>=' or operator == '=>'):
1967 return self.getCompilerVersion() >= version
1968 if (operator == '<'):
1969 return self.getCompilerVersion() < version
1970 if (operator == '<=' or operator == '=<'):
1971 return self.getCompilerVersion() <= version
1972 if (operator == '!=' or operator == '!' or operator == 'not'):
1973 return str(version) not in str(self.getCompilerVersion())
1974 return str(version) in str(self.getCompilerVersion())
1975
1976 def expectedCompiler(self, compilers):
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001977 """Returns True iff any element of compilers is a sub-string of the current compiler."""
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001978 if (compilers == None):
1979 return True
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001980
1981 for compiler in compilers:
1982 if compiler in self.getCompiler():
1983 return True
1984
1985 return False
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001986
Ying Chen7091c2c2015-04-21 01:15:47 +00001987 def expectedArch(self, archs):
1988 """Returns True iff any element of archs is a sub-string of the current architecture."""
1989 if (archs == None):
1990 return True
1991
1992 for arch in archs:
1993 if arch in self.getArchitecture():
1994 return True
1995
1996 return False
1997
Johnny Chenfb4264c2011-08-01 19:50:58 +00001998 def getRunOptions(self):
1999 """Command line option for -A and -C to run this test again, called from
2000 self.dumpSessionInfo()."""
2001 arch = self.getArchitecture()
2002 comp = self.getCompiler()
Johnny Chenb7bdd102011-08-24 19:48:51 +00002003 if arch:
2004 option_str = "-A " + arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00002005 else:
Johnny Chenb7bdd102011-08-24 19:48:51 +00002006 option_str = ""
2007 if comp:
Johnny Chen531c0852012-03-16 20:44:00 +00002008 option_str += " -C " + comp
Johnny Chenb7bdd102011-08-24 19:48:51 +00002009 return option_str
Johnny Chenfb4264c2011-08-01 19:50:58 +00002010
2011 # ==================================================
2012 # Build methods supported through a plugin interface
2013 # ==================================================
2014
Ed Mastec97323e2014-04-01 18:47:58 +00002015 def getstdlibFlag(self):
2016 """ Returns the proper -stdlib flag, or empty if not required."""
Robert Flack4629c4b2015-05-15 18:54:32 +00002017 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Ed Mastec97323e2014-04-01 18:47:58 +00002018 stdlibflag = "-stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002019 else: # this includes NetBSD
Ed Mastec97323e2014-04-01 18:47:58 +00002020 stdlibflag = ""
2021 return stdlibflag
2022
Matt Kopec7663b3a2013-09-25 17:44:00 +00002023 def getstdFlag(self):
2024 """ Returns the proper stdflag. """
Daniel Malea55faa402013-05-02 21:44:31 +00002025 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
Daniel Malea0b7c6112013-05-06 19:31:31 +00002026 stdflag = "-std=c++0x"
Daniel Malea55faa402013-05-02 21:44:31 +00002027 else:
2028 stdflag = "-std=c++11"
Matt Kopec7663b3a2013-09-25 17:44:00 +00002029 return stdflag
2030
2031 def buildDriver(self, sources, exe_name):
2032 """ Platform-specific way to build a program that links with LLDB (via the liblldb.so
2033 or LLDB.framework).
2034 """
2035
2036 stdflag = self.getstdFlag()
Ed Mastec97323e2014-04-01 18:47:58 +00002037 stdlibflag = self.getstdlibFlag()
Greg Clayton22fd3b12015-10-26 17:52:16 +00002038
2039 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002040 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002041 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Daniel Malea55faa402013-05-02 21:44:31 +00002042 d = {'CXX_SOURCES' : sources,
2043 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002044 'CFLAGS_EXTRAS' : "%s %s" % (stdflag, stdlibflag),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002045 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2046 'LD_EXTRAS' : "%s -Wl,-rpath,%s" % (dsym, lib_dir),
Daniel Malea55faa402013-05-02 21:44:31 +00002047 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002048 elif sys.platform.rstrip('0123456789') in ('freebsd', 'linux', 'netbsd') or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002049 d = {'CXX_SOURCES' : sources,
Daniel Malea55faa402013-05-02 21:44:31 +00002050 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002051 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002052 'LD_EXTRAS' : "-L%s -llldb" % lib_dir}
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002053 elif sys.platform.startswith('win'):
2054 d = {'CXX_SOURCES' : sources,
2055 'EXE' : exe_name,
2056 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002057 'LD_EXTRAS' : "-L%s -lliblldb" % os.environ["LLDB_IMPLIB_DIR"]}
Daniel Malea55faa402013-05-02 21:44:31 +00002058 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002059 print("Building LLDB Driver (%s) from sources %s" % (exe_name, sources))
Daniel Malea55faa402013-05-02 21:44:31 +00002060
2061 self.buildDefault(dictionary=d)
2062
Matt Kopec7663b3a2013-09-25 17:44:00 +00002063 def buildLibrary(self, sources, lib_name):
2064 """Platform specific way to build a default library. """
2065
2066 stdflag = self.getstdFlag()
2067
Greg Clayton22fd3b12015-10-26 17:52:16 +00002068 lib_dir = os.environ["LLDB_LIB_DIR"]
Robert Flack4629c4b2015-05-15 18:54:32 +00002069 if self.platformIsDarwin():
Greg Clayton22fd3b12015-10-26 17:52:16 +00002070 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Matt Kopec7663b3a2013-09-25 17:44:00 +00002071 d = {'DYLIB_CXX_SOURCES' : sources,
2072 'DYLIB_NAME' : lib_name,
2073 'CFLAGS_EXTRAS' : "%s -stdlib=libc++" % stdflag,
Greg Clayton22fd3b12015-10-26 17:52:16 +00002074 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2075 'LD_EXTRAS' : "%s -Wl,-rpath,%s -dynamiclib" % (dsym, lib_dir),
Matt Kopec7663b3a2013-09-25 17:44:00 +00002076 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002077 elif self.getPlatform() in ('freebsd', 'linux', 'netbsd') or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Matt Kopec7663b3a2013-09-25 17:44:00 +00002078 d = {'DYLIB_CXX_SOURCES' : sources,
2079 'DYLIB_NAME' : lib_name,
2080 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002081 'LD_EXTRAS' : "-shared -L%s -llldb" % lib_dir}
Robert Flack4629c4b2015-05-15 18:54:32 +00002082 elif self.getPlatform() == 'windows':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002083 d = {'DYLIB_CXX_SOURCES' : sources,
2084 'DYLIB_NAME' : lib_name,
2085 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002086 'LD_EXTRAS' : "-shared -l%s\liblldb.lib" % self.os.environ["LLDB_IMPLIB_DIR"]}
Matt Kopec7663b3a2013-09-25 17:44:00 +00002087 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002088 print("Building LLDB Library (%s) from sources %s" % (lib_name, sources))
Matt Kopec7663b3a2013-09-25 17:44:00 +00002089
2090 self.buildDefault(dictionary=d)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002091
Daniel Malea55faa402013-05-02 21:44:31 +00002092 def buildProgram(self, sources, exe_name):
2093 """ Platform specific way to build an executable from C/C++ sources. """
2094 d = {'CXX_SOURCES' : sources,
2095 'EXE' : exe_name}
2096 self.buildDefault(dictionary=d)
2097
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002098 def buildDefault(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002099 """Platform specific way to build the default binaries."""
2100 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002101 if target_is_android():
2102 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002103 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002104 raise Exception("Don't know how to build default binary")
2105
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002106 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002107 """Platform specific way to build binaries with dsym info."""
2108 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002109 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002110 raise Exception("Don't know how to build binary with dsym")
2111
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002112 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002113 """Platform specific way to build binaries with dwarf maps."""
2114 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002115 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002116 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002117 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002118 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002119
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002120 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2121 """Platform specific way to build binaries with dwarf maps."""
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002122 module = builder_module()
2123 if target_is_android():
2124 dictionary = append_android_envs(dictionary)
2125 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2126 raise Exception("Don't know how to build binary with dwo")
2127
Ryan Brown57bee1e2015-09-14 22:45:11 +00002128 def buildGo(self):
2129 """Build the default go binary.
2130 """
2131 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2132
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002133 def signBinary(self, binary_path):
2134 if sys.platform.startswith("darwin"):
2135 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2136 call(codesign_cmd, shell=True)
2137
Kuba Breckabeed8212014-09-04 01:03:18 +00002138 def findBuiltClang(self):
2139 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2140 paths_to_try = [
2141 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2142 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2143 "llvm-build/Release/x86_64/Release/bin/clang",
2144 "llvm-build/Debug/x86_64/Debug/bin/clang",
2145 ]
Enrico Granata55d99f02015-11-19 21:45:07 +00002146 lldb_root_path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")
Kuba Breckabeed8212014-09-04 01:03:18 +00002147 for p in paths_to_try:
2148 path = os.path.join(lldb_root_path, p)
2149 if os.path.exists(path):
2150 return path
Ilia Kd9953052015-03-12 07:19:41 +00002151
2152 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002153 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002154 if os.path.exists(path):
2155 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002156
2157 return os.environ["CC"]
2158
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002159 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002160 """ Returns a dictionary (which can be provided to build* functions above) which
2161 contains OS-specific build flags.
2162 """
2163 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002164 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002165
2166 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002167 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002168 use_libcxx = True
2169
2170 if use_libcxx and self.libcxxPath:
2171 cflags += "-stdlib=libc++ "
2172 if self.libcxxPath:
2173 libcxxInclude = os.path.join(self.libcxxPath, "include")
2174 libcxxLib = os.path.join(self.libcxxPath, "lib")
2175 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2176 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2177
Andrew Kaylor93132f52013-05-28 23:04:25 +00002178 if use_cpp11:
2179 cflags += "-std="
2180 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2181 cflags += "c++0x"
2182 else:
2183 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002184 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002185 cflags += " -stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002186 elif self.getPlatform() == "netbsd":
2187 cflags += " -stdlib=libstdc++"
Andrew Kaylor93132f52013-05-28 23:04:25 +00002188 elif "clang" in self.getCompiler():
2189 cflags += " -stdlib=libstdc++"
2190
Andrew Kaylor93132f52013-05-28 23:04:25 +00002191 return {'CFLAGS_EXTRAS' : cflags,
2192 'LD_EXTRAS' : ldflags,
2193 }
2194
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002195 def cleanup(self, dictionary=None):
2196 """Platform specific way to do cleanup after build."""
2197 module = builder_module()
2198 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002199 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002200
Daniel Malea55faa402013-05-02 21:44:31 +00002201 def getLLDBLibraryEnvVal(self):
2202 """ Returns the path that the OS-specific library search environment variable
2203 (self.dylibPath) should be set to in order for a program to find the LLDB
2204 library. If an environment variable named self.dylibPath is already set,
2205 the new path is appended to it and returned.
2206 """
2207 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002208 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002209 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002210 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002211 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002212 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002213 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002214 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002215
Ed Maste437f8f62013-09-09 14:04:04 +00002216 def getLibcPlusPlusLibs(self):
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002217 if self.getPlatform() in ('freebsd', 'linux', 'netbsd'):
Ed Maste437f8f62013-09-09 14:04:04 +00002218 return ['libc++.so.1']
2219 else:
2220 return ['libc++.1.dylib','libc++abi.dylib']
2221
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002222# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2223# We change the test methods to create a new test method for each test for each debug info we are
2224# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2225# the new test method we remove the old method at the same time.
2226class LLDBTestCaseFactory(type):
2227 def __new__(cls, name, bases, attrs):
2228 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002229 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002230 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002231 target_platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002232
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002233 # If any debug info categories were explicitly tagged, assume that list to be
2234 # authoritative. If none were specified, try with all debug info formats.
2235 all_dbginfo_categories = set(test_categories.debug_info_categories)
2236 categories = set(getattr(attrvalue, "categories", [])) & all_dbginfo_categories
2237 if not categories:
2238 categories = all_dbginfo_categories
2239
2240 supported_categories = [x for x in categories
2241 if test_categories.is_supported_on_platform(x, target_platform)]
2242 for category in supported_categories:
2243 @add_test_categories([category])
2244 @wraps(attrvalue)
2245 def test_method(self, attrvalue=attrvalue):
2246 self.debug_info = category
2247 return attrvalue(self)
2248 method_name = attrname + "_" + category
2249 test_method.__name__ = method_name
2250 newattrs[method_name] = test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002251 else:
2252 newattrs[attrname] = attrvalue
2253 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2254
Zachary Turner43a01e42015-10-20 21:06:05 +00002255# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2256@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002257class TestBase(Base):
2258 """
2259 This abstract base class is meant to be subclassed. It provides default
2260 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2261 among other things.
2262
2263 Important things for test class writers:
2264
2265 - Overwrite the mydir class attribute, otherwise your test class won't
2266 run. It specifies the relative directory to the top level 'test' so
2267 the test harness can change to the correct working directory before
2268 running your test.
2269
2270 - The setUp method sets up things to facilitate subsequent interactions
2271 with the debugger as part of the test. These include:
2272 - populate the test method name
2273 - create/get a debugger set with synchronous mode (self.dbg)
2274 - get the command interpreter from with the debugger (self.ci)
2275 - create a result object for use with the command interpreter
2276 (self.res)
2277 - plus other stuffs
2278
2279 - The tearDown method tries to perform some necessary cleanup on behalf
2280 of the test to return the debugger to a good state for the next test.
2281 These include:
2282 - execute any tearDown hooks registered by the test method with
2283 TestBase.addTearDownHook(); examples can be found in
2284 settings/TestSettings.py
2285 - kill the inferior process associated with each target, if any,
2286 and, then delete the target from the debugger's target list
2287 - perform build cleanup before running the next test method in the
2288 same test class; examples of registering for this service can be
2289 found in types/TestIntegerTypes.py with the call:
2290 - self.setTearDownCleanup(dictionary=d)
2291
2292 - Similarly setUpClass and tearDownClass perform classwise setup and
2293 teardown fixtures. The tearDownClass method invokes a default build
2294 cleanup for the entire test class; also, subclasses can implement the
2295 classmethod classCleanup(cls) to perform special class cleanup action.
2296
2297 - The instance methods runCmd and expect are used heavily by existing
2298 test cases to send a command to the command interpreter and to perform
2299 string/pattern matching on the output of such command execution. The
2300 expect method also provides a mode to peform string/pattern matching
2301 without running a command.
2302
2303 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2304 build the binaries used during a particular test scenario. A plugin
2305 should be provided for the sys.platform running the test suite. The
2306 Mac OS X implementation is located in plugins/darwin.py.
2307 """
2308
2309 # Maximum allowed attempts when launching the inferior process.
2310 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2311 maxLaunchCount = 3;
2312
2313 # Time to wait before the next launching attempt in second(s).
2314 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2315 timeWaitNextLaunch = 1.0;
2316
Enrico Granata165f8af2012-09-21 19:10:53 +00002317 # Returns the list of categories to which this test case belongs
2318 # by default, look for a ".categories" file, and read its contents
2319 # if no such file exists, traverse the hierarchy - we guarantee
2320 # a .categories to exist at the top level directory so we do not end up
2321 # looping endlessly - subclasses are free to define their own categories
2322 # in whatever way makes sense to them
2323 def getCategories(self):
2324 import inspect
2325 import os.path
2326 folder = inspect.getfile(self.__class__)
2327 folder = os.path.dirname(folder)
2328 while folder != '/':
2329 categories_file_name = os.path.join(folder,".categories")
2330 if os.path.exists(categories_file_name):
2331 categories_file = open(categories_file_name,'r')
2332 categories = categories_file.readline()
2333 categories_file.close()
2334 categories = str.replace(categories,'\n','')
2335 categories = str.replace(categories,'\r','')
2336 return categories.split(',')
2337 else:
2338 folder = os.path.dirname(folder)
2339 continue
2340
Johnny Chena74bb0a2011-08-01 18:46:13 +00002341 def setUp(self):
2342 #import traceback
2343 #traceback.print_stack()
2344
2345 # Works with the test driver to conditionally skip tests via decorators.
2346 Base.setUp(self)
2347
Johnny Chenf2b70232010-08-25 18:49:48 +00002348 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2349 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2350
Johnny Chen430eb762010-10-19 16:00:42 +00002351 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002352 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002353
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002354 # We want our debugger to be synchronous.
2355 self.dbg.SetAsync(False)
2356
2357 # Retrieve the associated command interpreter instance.
2358 self.ci = self.dbg.GetCommandInterpreter()
2359 if not self.ci:
2360 raise Exception('Could not get the command interpreter')
2361
2362 # And the result object.
2363 self.res = lldb.SBCommandReturnObject()
2364
Zachary Turner606e3a52015-12-08 01:15:30 +00002365 if lldb.remote_platform and configuration.lldb_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002366 remote_test_dir = lldbutil.join_remote_paths(
Zachary Turner606e3a52015-12-08 01:15:30 +00002367 configuration.lldb_platform_working_dir,
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002368 self.getArchitecture(),
2369 str(self.test_number),
2370 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002371 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002372 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002373 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002374
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002375 # This function removes all files from the current working directory while leaving
2376 # the directories in place. The cleaup is required to reduce the disk space required
2377 # by the test suit while leaving the directories untached is neccessary because
2378 # sub-directories might belong to an other test
2379 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002380 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002381 # TODO: Replace the heuristic to remove the files with a logic what collects the
2382 # list of files we have to remove during test runs.
2383 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002384 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002385 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002386 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002387 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002388
Greg Clayton35c91342014-11-17 18:40:27 +00002389 def registerSharedLibrariesWithTarget(self, target, shlibs):
2390 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2391
2392 Any modules in the target that have their remote install file specification set will
2393 get uploaded to the remote host. This function registers the local copies of the
2394 shared libraries with the target and sets their remote install locations so they will
2395 be uploaded when the target is run.
2396 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002397 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002398 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002399
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002400 shlib_environment_var = self.platformContext.shlib_environment_var
2401 shlib_prefix = self.platformContext.shlib_prefix
2402 shlib_extension = '.' + self.platformContext.shlib_extension
2403
2404 working_dir = self.get_process_working_directory()
2405 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2406 # Add any shared libraries to our target if remote so they get
2407 # uploaded into the working directory on the remote side
2408 for name in shlibs:
2409 # The path can be a full path to a shared library, or a make file name like "Foo" for
2410 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2411 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2412 # of the shared library accordingly
2413 if os.path.exists(name):
2414 local_shlib_path = name # name is the full path to the local shared library
2415 else:
2416 # Check relative names
2417 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2418 if not os.path.exists(local_shlib_path):
2419 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002420 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002421 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002422
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002423 # Make sure we found the local shared library in the above code
2424 self.assertTrue(os.path.exists(local_shlib_path))
2425
2426 # Add the shared library to our target
2427 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2428 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002429 # We must set the remote install location if we want the shared library
2430 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002431 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002432 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002433
2434 return environment
2435
Enrico Granata44818162012-10-24 01:23:57 +00002436 # utility methods that tests can use to access the current objects
2437 def target(self):
2438 if not self.dbg:
2439 raise Exception('Invalid debugger instance')
2440 return self.dbg.GetSelectedTarget()
2441
2442 def process(self):
2443 if not self.dbg:
2444 raise Exception('Invalid debugger instance')
2445 return self.dbg.GetSelectedTarget().GetProcess()
2446
2447 def thread(self):
2448 if not self.dbg:
2449 raise Exception('Invalid debugger instance')
2450 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2451
2452 def frame(self):
2453 if not self.dbg:
2454 raise Exception('Invalid debugger instance')
2455 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2456
Greg Claytonc6947512013-12-13 19:18:59 +00002457 def get_process_working_directory(self):
2458 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2459 if lldb.remote_platform:
2460 # Remote tests set the platform working directory up in TestBase.setUp()
2461 return lldb.remote_platform.GetWorkingDirectory()
2462 else:
2463 # local tests change directory into each test subdirectory
2464 return os.getcwd()
2465
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002466 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002467 #import traceback
2468 #traceback.print_stack()
2469
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002470 # Ensure all the references to SB objects have gone away so that we can
2471 # be sure that all test-specific resources have been freed before we
2472 # attempt to delete the targets.
2473 gc.collect()
2474
Johnny Chen3794ad92011-06-15 21:24:24 +00002475 # Delete the target(s) from the debugger as a general cleanup step.
2476 # This includes terminating the process for each target, if any.
2477 # We'd like to reuse the debugger for our next test without incurring
2478 # the initialization overhead.
2479 targets = []
2480 for target in self.dbg:
2481 if target:
2482 targets.append(target)
2483 process = target.GetProcess()
2484 if process:
2485 rc = self.invoke(process, "Kill")
2486 self.assertTrue(rc.Success(), PROCESS_KILLED)
2487 for target in targets:
2488 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002489
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002490 # Do this last, to make sure it's in reverse order from how we setup.
2491 Base.tearDown(self)
2492
Zachary Turner95812042015-03-26 18:54:21 +00002493 # This must be the last statement, otherwise teardown hooks or other
2494 # lines might depend on this still being active.
2495 del self.dbg
2496
Johnny Chen86268e42011-09-30 21:48:35 +00002497 def switch_to_thread_with_stop_reason(self, stop_reason):
2498 """
2499 Run the 'thread list' command, and select the thread with stop reason as
2500 'stop_reason'. If no such thread exists, no select action is done.
2501 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002502 from .lldbutil import stop_reason_to_str
Johnny Chen86268e42011-09-30 21:48:35 +00002503 self.runCmd('thread list')
2504 output = self.res.GetOutput()
2505 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2506 stop_reason_to_str(stop_reason))
2507 for line in output.splitlines():
2508 matched = thread_line_pattern.match(line)
2509 if matched:
2510 self.runCmd('thread select %s' % matched.group(1))
2511
Enrico Granata7594f142013-06-17 22:51:50 +00002512 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002513 """
2514 Ask the command interpreter to handle the command and then check its
2515 return status.
2516 """
2517 # Fail fast if 'cmd' is not meaningful.
2518 if not cmd or len(cmd) == 0:
2519 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002520
Johnny Chen8d55a342010-08-31 17:42:54 +00002521 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002522
Daniel Maleae0f8f572013-08-26 23:57:52 +00002523 if cmd.startswith("target create "):
2524 cmd = cmd.replace("target create ", "file ")
Daniel Maleae0f8f572013-08-26 23:57:52 +00002525
Johnny Chen63dfb272010-09-01 00:15:19 +00002526 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002527
Johnny Chen63dfb272010-09-01 00:15:19 +00002528 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002529 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002530
Johnny Chen150c3cc2010-10-15 01:18:29 +00002531 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002532 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002533 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002534 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002535 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002536 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002537 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002538 print("runCmd failed!", file=sbuf)
2539 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002540
Johnny Chenff3d01d2010-08-20 21:03:09 +00002541 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002542 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002543 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002544 # For process launch, wait some time before possible next try.
2545 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002546 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002547 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002548
Johnny Chen27f212d2010-08-19 23:26:59 +00002549 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002550 self.assertTrue(self.res.Succeeded(),
2551 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002552
Jim Ingham63dfc722012-09-22 00:05:11 +00002553 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2554 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2555
2556 Otherwise, all the arguments have the same meanings as for the expect function"""
2557
2558 trace = (True if traceAlways else trace)
2559
2560 if exe:
2561 # First run the command. If we are expecting error, set check=False.
2562 # Pass the assert message along since it provides more semantic info.
2563 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2564
2565 # Then compare the output against expected strings.
2566 output = self.res.GetError() if error else self.res.GetOutput()
2567
2568 # If error is True, the API client expects the command to fail!
2569 if error:
2570 self.assertFalse(self.res.Succeeded(),
2571 "Command '" + str + "' is expected to fail!")
2572 else:
2573 # No execution required, just compare str against the golden input.
2574 output = str
2575 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002576 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002577
2578 # The heading says either "Expecting" or "Not expecting".
2579 heading = "Expecting" if matching else "Not expecting"
2580
2581 for pattern in patterns:
2582 # Match Objects always have a boolean value of True.
2583 match_object = re.search(pattern, output)
2584 matched = bool(match_object)
2585 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002586 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2587 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002588 if matched:
2589 break
2590
2591 self.assertTrue(matched if matching else not matched,
2592 msg if msg else EXP_MSG(str, exe))
2593
2594 return match_object
2595
Enrico Granata7594f142013-06-17 22:51:50 +00002596 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 +00002597 """
2598 Similar to runCmd; with additional expect style output matching ability.
2599
2600 Ask the command interpreter to handle the command and then check its
2601 return status. The 'msg' parameter specifies an informational assert
2602 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002603 'startstr', matches the substrings contained in 'substrs', and regexp
2604 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002605
2606 If the keyword argument error is set to True, it signifies that the API
2607 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002608 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002609 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002610
2611 If the keyword argument matching is set to False, it signifies that the API
2612 client is expecting the output of the command not to match the golden
2613 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002614
2615 Finally, the required argument 'str' represents the lldb command to be
2616 sent to the command interpreter. In case the keyword argument 'exe' is
2617 set to False, the 'str' is treated as a string to be matched/not-matched
2618 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002619 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002620 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002621
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002622 if exe:
2623 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002624 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002625 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002626
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002627 # Then compare the output against expected strings.
2628 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002629
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002630 # If error is True, the API client expects the command to fail!
2631 if error:
2632 self.assertFalse(self.res.Succeeded(),
2633 "Command '" + str + "' is expected to fail!")
2634 else:
2635 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002636 if isinstance(str,lldb.SBCommandReturnObject):
2637 output = str.GetOutput()
2638 else:
2639 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002640 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002641 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002642
Johnny Chenea88e942010-09-21 21:08:53 +00002643 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002644 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002645
2646 # Start from the startstr, if specified.
2647 # If there's no startstr, set the initial state appropriately.
2648 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002649
Johnny Chen150c3cc2010-10-15 01:18:29 +00002650 if startstr:
2651 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002652 print("%s start string: %s" % (heading, startstr), file=sbuf)
2653 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002654
Johnny Chen86268e42011-09-30 21:48:35 +00002655 # Look for endstr, if specified.
2656 keepgoing = matched if matching else not matched
2657 if endstr:
2658 matched = output.endswith(endstr)
2659 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002660 print("%s end string: %s" % (heading, endstr), file=sbuf)
2661 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002662
Johnny Chenea88e942010-09-21 21:08:53 +00002663 # Look for sub strings, if specified.
2664 keepgoing = matched if matching else not matched
2665 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002666 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002667 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002668 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002669 print("%s sub string: %s" % (heading, str), file=sbuf)
2670 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002671 keepgoing = matched if matching else not matched
2672 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002673 break
2674
Johnny Chenea88e942010-09-21 21:08:53 +00002675 # Search for regular expression patterns, if specified.
2676 keepgoing = matched if matching else not matched
2677 if patterns and keepgoing:
2678 for pattern in patterns:
2679 # Match Objects always have a boolean value of True.
2680 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002681 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002682 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2683 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002684 keepgoing = matched if matching else not matched
2685 if not keepgoing:
2686 break
Johnny Chenea88e942010-09-21 21:08:53 +00002687
2688 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002689 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002690
Johnny Chenf3c59232010-08-25 22:52:45 +00002691 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002692 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002693 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002694
2695 method = getattr(obj, name)
2696 import inspect
2697 self.assertTrue(inspect.ismethod(method),
2698 name + "is a method name of object: " + str(obj))
2699 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002700 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002701 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002702 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002703
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002704 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2705 """Platform specific way to build the default binaries."""
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002706 module = builder_module()
2707 if target_is_android():
2708 dictionary = append_android_envs(dictionary)
2709 if self.debug_info is None:
2710 return self.buildDefault(architecture, compiler, dictionary, clean)
2711 elif self.debug_info == "dsym":
2712 return self.buildDsym(architecture, compiler, dictionary, clean)
2713 elif self.debug_info == "dwarf":
2714 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002715 elif self.debug_info == "dwo":
2716 return self.buildDwo(architecture, compiler, dictionary, clean)
2717 else:
2718 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002719
Johnny Chenf359cf22011-05-27 23:36:52 +00002720 # =================================================
2721 # Misc. helper methods for debugging test execution
2722 # =================================================
2723
Johnny Chen56b92a72011-07-11 19:15:11 +00002724 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002725 """Debug print a SBValue object, if traceAlways is True."""
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002726 from .lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002727
Johnny Chen8d55a342010-08-31 17:42:54 +00002728 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002729 return
2730
2731 err = sys.stderr
2732 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002733 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2734 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2735 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2736 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2737 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2738 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2739 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2740 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2741 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002742
Johnny Chen36c5eb12011-08-05 20:17:27 +00002743 def DebugSBType(self, type):
2744 """Debug print a SBType object, if traceAlways is True."""
2745 if not traceAlways:
2746 return
2747
2748 err = sys.stderr
2749 err.write(type.GetName() + ":\n")
2750 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2751 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2752 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2753
Johnny Chenb877f1e2011-03-12 01:18:19 +00002754 def DebugPExpect(self, child):
2755 """Debug the spwaned pexpect object."""
2756 if not traceAlways:
2757 return
2758
Zachary Turnerff890da2015-10-19 23:45:41 +00002759 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002760
2761 @classmethod
2762 def RemoveTempFile(cls, file):
2763 if os.path.exists(file):
2764 os.remove(file)