blob: 5a43cffabc349cda5c0add5fb60362f6d4df38ae [file] [log] [blame]
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001"""
2LLDB module which provides the abstract base class of lldb test case.
3
4The concrete subclass can override lldbtest.TesBase in order to inherit the
5common behavior for unitest.TestCase.setUp/tearDown implemented in this file.
6
7The subclass should override the attribute mydir in order for the python runtime
8to locate the individual test cases when running as part of a large test suite
9or when running each test case as a separate python invocation.
10
11./dotest.py provides a test driver which sets up the environment to run the
Johnny Chenc98892e2012-05-16 20:41:28 +000012entire of part of the test suite . Example:
Johnny Chenbf6ffa32010-07-03 03:41:59 +000013
Johnny Chenc98892e2012-05-16 20:41:28 +000014# Exercises the test suite in the types directory....
15/Volumes/data/lldb/svn/ToT/test $ ./dotest.py -A x86_64 types
Johnny Chen57b47382010-09-02 22:25:47 +000016...
Johnny Chend0190a62010-08-23 17:10:44 +000017
Johnny Chenc98892e2012-05-16 20:41:28 +000018Session logs for test failures/errors/unexpected successes will go into directory '2012-05-16-13_35_42'
19Command invoked: python ./dotest.py -A x86_64 types
20compilers=['clang']
Johnny Chend0190a62010-08-23 17:10:44 +000021
Johnny Chenc98892e2012-05-16 20:41:28 +000022Configuration: arch=x86_64 compiler=clang
Johnny Chend0190a62010-08-23 17:10:44 +000023----------------------------------------------------------------------
Johnny Chenc98892e2012-05-16 20:41:28 +000024Collected 72 tests
25
26........................................................................
27----------------------------------------------------------------------
28Ran 72 tests in 135.468s
Johnny Chend0190a62010-08-23 17:10:44 +000029
30OK
Johnny Chenbf6ffa32010-07-03 03:41:59 +000031$
32"""
33
Zachary Turnerff890da2015-10-19 23:45:41 +000034from __future__ import print_function
35
Zachary Turner19474e12015-11-03 19:20:39 +000036
Zachary Turner43a01e42015-10-20 21:06:05 +000037
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +000038import abc
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +000039import gc
Vince Harron9753dd92015-05-10 15:22:09 +000040import glob
Johnny Chen90312a82010-09-21 22:34:45 +000041import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000042import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000043import re
Daniel Malea69207462013-06-05 21:07:02 +000044import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000045from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000046import time
Johnny Chena33a93c2010-08-30 23:08:52 +000047import types
Johnny Chen73258832010-08-05 23:42:46 +000048import unittest2
Johnny Chenbf6ffa32010-07-03 03:41:59 +000049import lldb
Vince Harron9753dd92015-05-10 15:22:09 +000050import lldbtest_config
Zachary Turner95c453a2015-11-03 02:06:18 +000051import lldbutil
Pavel Labathdc8b2d32015-10-26 09:28:32 +000052import test_categories
Zachary Turner43a01e42015-10-20 21:06:05 +000053
54from 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
58import collections
Siva Chandra8af91662015-06-05 00:22:49 +000059
Vince Harron85d19652015-05-21 19:09:29 +000060# dosep.py starts lots and lots of dotest instances
61# This option helps you find if two (or more) dotest instances are using the same
62# directory at the same time
63# Enable it to cause test failures and stderr messages if dotest instances try to run in
64# the same directory simultaneously
65# it is disabled by default because it litters the test directories with ".dirlock" files
66debug_confirm_directory_exclusivity = False
67
Johnny Chen707b3c92010-10-11 22:25:46 +000068# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000069# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000070
71# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000072if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
73 traceAlways = True
74else:
75 traceAlways = False
76
Johnny Chen707b3c92010-10-11 22:25:46 +000077# By default, doCleanup is True.
78if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
79 doCleanup = False
80else:
81 doCleanup = True
82
Johnny Chen8d55a342010-08-31 17:42:54 +000083
Johnny Chen00778092010-08-09 22:01:17 +000084#
85# Some commonly used assert messages.
86#
87
Johnny Chenaa902922010-09-17 22:45:27 +000088COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
89
Johnny Chen00778092010-08-09 22:01:17 +000090CURRENT_EXECUTABLE_SET = "Current executable set successfully"
91
Johnny Chen7d1d7532010-09-02 21:23:12 +000092PROCESS_IS_VALID = "Process is valid"
93
94PROCESS_KILLED = "Process is killed successfully"
95
Johnny Chend5f66fc2010-12-23 01:12:19 +000096PROCESS_EXITED = "Process exited successfully"
97
98PROCESS_STOPPED = "Process status should be stopped"
99
Sean Callanan05834cd2015-07-01 23:56:30 +0000100RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000101
Johnny Chen17941842010-08-09 23:44:24 +0000102RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000103
Johnny Chen67af43f2010-10-05 19:27:32 +0000104BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
105
Johnny Chen17941842010-08-09 23:44:24 +0000106BREAKPOINT_CREATED = "Breakpoint created successfully"
107
Johnny Chenf10af382010-12-04 00:07:24 +0000108BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
109
Johnny Chene76896c2010-08-17 21:33:31 +0000110BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
111
Johnny Chen17941842010-08-09 23:44:24 +0000112BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000113
Johnny Chen703dbd02010-09-30 17:06:24 +0000114BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
115
Johnny Chen164f1e12010-10-15 18:07:09 +0000116BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
117
Greg Clayton5db6b792012-10-24 18:24:14 +0000118MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
119
Johnny Chen89109ed12011-06-27 20:05:23 +0000120OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
121
Johnny Chen5b3a3572010-12-09 18:22:12 +0000122SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
123
Johnny Chenc70b02a2010-09-22 23:00:20 +0000124STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
125
Johnny Chen1691a162011-04-15 16:44:48 +0000126STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
127
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000128STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
129
Johnny Chen5d6c4642010-11-10 23:46:38 +0000130STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000131
Johnny Chen5d6c4642010-11-10 23:46:38 +0000132STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
133 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000134
Johnny Chen2e431ce2010-10-20 18:38:48 +0000135STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
136
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000137STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
138
Johnny Chenc066ab42010-10-14 01:22:03 +0000139STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
140
Johnny Chen00778092010-08-09 22:01:17 +0000141STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
142
Johnny Chenf68cc122011-09-15 21:09:59 +0000143STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
144
Johnny Chen3c884a02010-08-24 22:07:56 +0000145DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
146
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000147VALID_BREAKPOINT = "Got a valid breakpoint"
148
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000149VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
150
Johnny Chen7209d84f2011-05-06 23:26:12 +0000151VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
152
Johnny Chen5ee88192010-08-27 23:47:36 +0000153VALID_FILESPEC = "Got a valid filespec"
154
Johnny Chen025d1b82010-12-08 01:25:21 +0000155VALID_MODULE = "Got a valid module"
156
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000157VALID_PROCESS = "Got a valid process"
158
Johnny Chen025d1b82010-12-08 01:25:21 +0000159VALID_SYMBOL = "Got a valid symbol"
160
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000161VALID_TARGET = "Got a valid target"
162
Matthew Gardinerc928de32014-10-22 07:22:56 +0000163VALID_PLATFORM = "Got a valid platform"
164
Johnny Chen15f247a2012-02-03 20:43:00 +0000165VALID_TYPE = "Got a valid type"
166
Johnny Chen5819ab42011-07-15 22:28:10 +0000167VALID_VARIABLE = "Got a valid variable"
168
Johnny Chen981463d2010-08-25 19:00:04 +0000169VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000170
Johnny Chenf68cc122011-09-15 21:09:59 +0000171WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000172
Sean Callanan05834cd2015-07-01 23:56:30 +0000173def CMD_MSG(str):
174 '''A generic "Command '%s' returns successfully" message generator.'''
175 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000176
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000177def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000178 '''A generic message generator for the completion mechanism.'''
179 return "'%s' successfully completes to '%s'" % (str_before, str_after)
180
Johnny Chenc0c67f22010-11-09 18:42:22 +0000181def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000182 '''A generic "'%s' returns expected result" message generator if exe.
183 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000184 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000185
Johnny Chen3343f042010-10-19 19:11:38 +0000186def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000187 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000188 return "Value of setting '%s' is correct" % setting
189
Johnny Chen27c41232010-08-26 21:49:29 +0000190def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000191 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000192 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000193
Johnny Chen47ceb032010-10-11 23:52:19 +0000194def line_number(filename, string_to_match):
195 """Helper function to return the line number of the first matched string."""
196 with open(filename, 'r') as f:
197 for i, line in enumerate(f):
198 if line.find(string_to_match) != -1:
199 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000200 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000201 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000202
Johnny Chen67af43f2010-10-05 19:27:32 +0000203def pointer_size():
204 """Return the pointer size of the host system."""
205 import ctypes
206 a_pointer = ctypes.c_void_p(0xffff)
207 return 8 * ctypes.sizeof(a_pointer)
208
Johnny Chen57816732012-02-09 02:01:59 +0000209def is_exe(fpath):
210 """Returns true if fpath is an executable."""
211 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
212
213def which(program):
214 """Returns the full path to a program; None otherwise."""
215 fpath, fname = os.path.split(program)
216 if fpath:
217 if is_exe(program):
218 return program
219 else:
220 for path in os.environ["PATH"].split(os.pathsep):
221 exe_file = os.path.join(path, program)
222 if is_exe(exe_file):
223 return exe_file
224 return None
225
Zachary Turner814236d2015-10-21 17:48:52 +0000226class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000227 """
228 A nice little context manager for recording the debugger interactions into
229 our session object. If trace flag is ON, it also emits the interactions
230 into the stderr.
231 """
232 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000233 """Create a SixStringIO instance; record the session obj and trace flag."""
234 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000235 # The test might not have undergone the 'setUp(self)' phase yet, so that
236 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000237 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000238 self.trace = trace
239
240 def __enter__(self):
241 """
242 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000243 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000244 """
245 return self
246
247 def __exit__(self, type, value, tb):
248 """
249 Context management protocol on exit from the body of the with statement.
250 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000251 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000252 """
253 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000254 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000255 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000256 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000257 self.close()
258
Zachary Turner43a01e42015-10-20 21:06:05 +0000259@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000260class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000261
262 @abc.abstractproperty
263 def pid(self):
264 """Returns process PID if has been launched already."""
265
266 @abc.abstractmethod
267 def launch(self, executable, args):
268 """Launches new process with given executable and args."""
269
270 @abc.abstractmethod
271 def terminate(self):
272 """Terminates previously launched process.."""
273
274class _LocalProcess(_BaseProcess):
275
276 def __init__(self, trace_on):
277 self._proc = None
278 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000279 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000280
281 @property
282 def pid(self):
283 return self._proc.pid
284
285 def launch(self, executable, args):
286 self._proc = Popen([executable] + args,
287 stdout = open(os.devnull) if not self._trace_on else None,
288 stdin = PIPE)
289
290 def terminate(self):
291 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000292 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000293 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
294 for sig in signals_to_try:
295 try:
296 self._proc.send_signal(getattr(signal, sig))
297 time.sleep(self._delayafterterminate)
298 if self._proc.poll() != None:
299 return
300 except ValueError:
301 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000302 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000303 time.sleep(self._delayafterterminate)
304 if self._proc.poll() != None:
305 return
306 self._proc.kill()
307 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000308
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000309 def poll(self):
310 return self._proc.poll()
311
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000312class _RemoteProcess(_BaseProcess):
313
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000314 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000315 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000316 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000317
318 @property
319 def pid(self):
320 return self._pid
321
322 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000323 if self._install_remote:
324 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000325 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000326
327 dst_file_spec = lldb.SBFileSpec(dst_path, False)
328 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
329 if err.Fail():
330 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
331 else:
332 dst_path = executable
333 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000334
335 launch_info = lldb.SBLaunchInfo(args)
336 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000337 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000338
339 # Redirect stdout and stderr to /dev/null
340 launch_info.AddSuppressFileAction(1, False, True)
341 launch_info.AddSuppressFileAction(2, False, True)
342
343 err = lldb.remote_platform.Launch(launch_info)
344 if err.Fail():
345 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
346 self._pid = launch_info.GetProcessID()
347
348 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000349 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000350
Johnny Chen690fcef2010-10-15 23:55:05 +0000351# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000352# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000353def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000354 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000355
356 If the exit code was non-zero it raises a CalledProcessError. The
357 CalledProcessError object will have the return code in the returncode
358 attribute and output in the output attribute.
359
360 The arguments are the same as for the Popen constructor. Example:
361
362 >>> check_output(["ls", "-l", "/dev/null"])
363 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
364
365 The stdout argument is not allowed as it is used internally.
366 To capture standard error in the result, use stderr=STDOUT.
367
368 >>> check_output(["/bin/sh", "-c",
369 ... "ls -l non_existent_file ; exit 0"],
370 ... stderr=STDOUT)
371 'ls: non_existent_file: No such file or directory\n'
372 """
373
374 # Assign the sender object to variable 'test' and remove it from kwargs.
375 test = kwargs.pop('sender', None)
376
Zachary Turner9ef307b2014-07-22 16:19:29 +0000377 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
378 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000379 output = ""
380 error = ""
381 for shellCommand in commandList:
382 if 'stdout' in kwargs:
383 raise ValueError('stdout argument not allowed, it will be overridden.')
384 if 'shell' in kwargs and kwargs['shell']==False:
385 raise ValueError('shell=False not allowed')
386 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, **kwargs)
387 pid = process.pid
388 this_output, this_error = process.communicate()
389 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000390
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000391 # Enable trace on failure return while tracking down FreeBSD buildbot issues
392 trace = traceAlways
393 if not trace and retcode and sys.platform.startswith("freebsd"):
394 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000395
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000396 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000397 print(file=sbuf)
398 print("os command:", shellCommand, file=sbuf)
399 print("with pid:", pid, file=sbuf)
400 print("stdout:", this_output, file=sbuf)
401 print("stderr:", this_error, file=sbuf)
402 print("retcode:", retcode, file=sbuf)
403 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000404
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000405 if retcode:
406 cmd = kwargs.get("args")
407 if cmd is None:
408 cmd = shellCommand
409 raise CalledProcessError(retcode, cmd)
410 output = output + this_output
411 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000412 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000413
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000414def getsource_if_available(obj):
415 """
416 Return the text of the source code for an object if available. Otherwise,
417 a print representation is returned.
418 """
419 import inspect
420 try:
421 return inspect.getsource(obj)
422 except:
423 return repr(obj)
424
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000425def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000426 if sys.platform.startswith("freebsd"):
427 return __import__("builder_freebsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000428 return __import__("builder_" + sys.platform)
429
Siva Chandra8af91662015-06-05 00:22:49 +0000430def run_adb_command(cmd, device_id):
431 device_id_args = []
432 if device_id:
433 device_id_args = ["-s", device_id]
434 full_cmd = ["adb"] + device_id_args + cmd
435 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
436 stdout, stderr = p.communicate()
437 return p.returncode, stdout, stderr
438
Chaoren Line9bbabc2015-07-18 00:37:55 +0000439def append_android_envs(dictionary):
440 if dictionary is None:
441 dictionary = {}
442 dictionary["OS"] = "Android"
443 if android_device_api() >= 16:
444 dictionary["PIE"] = 1
445 return dictionary
446
Chaoren Lin9070f532015-07-17 22:13:29 +0000447def target_is_android():
448 if not hasattr(target_is_android, 'result'):
449 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
450 match = re.match(".*-.*-.*-android", triple)
451 target_is_android.result = match is not None
452 return target_is_android.result
453
Siva Chandra8af91662015-06-05 00:22:49 +0000454def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000455 if not hasattr(android_device_api, 'result'):
456 assert lldb.platform_url is not None
457 device_id = None
458 parsed_url = urlparse.urlparse(lldb.platform_url)
459 if parsed_url.scheme == "adb":
460 device_id = parsed_url.netloc.split(":")[0]
461 retcode, stdout, stderr = run_adb_command(
462 ["shell", "getprop", "ro.build.version.sdk"], device_id)
463 if retcode == 0:
464 android_device_api.result = int(stdout)
465 else:
466 raise LookupError(
467 ">>> Unable to determine the API level of the Android device.\n"
468 ">>> stdout:\n%s\n"
469 ">>> stderr:\n%s\n" % (stdout, stderr))
470 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000471
Johnny Chena74bb0a2011-08-01 18:46:13 +0000472#
473# Decorators for categorizing test cases.
474#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000475from functools import wraps
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000476def add_test_categories(cat):
477 """Decorate an item with test categories"""
478 cat = test_categories.validate(cat, True)
479 def impl(func):
480 func.getCategories = lambda test: cat
481 return func
482 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000483
Johnny Chena74bb0a2011-08-01 18:46:13 +0000484def benchmarks_test(func):
485 """Decorate the item as a benchmarks test."""
486 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
487 raise Exception("@benchmarks_test can only be used to decorate a test method")
488 @wraps(func)
489 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000490 if not lldb.just_do_benchmarks_test:
491 self.skipTest("benchmarks tests")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000492 return func(self, *args, **kwargs)
493
494 # Mark this function as such to separate them from the regular tests.
495 wrapper.__benchmarks_test__ = True
496 return wrapper
497
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000498def no_debug_info_test(func):
499 """Decorate the item as a test what don't use any debug info. If this annotation is specified
500 then the test runner won't generate a separate test for each debug info format. """
501 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
502 raise Exception("@no_debug_info_test can only be used to decorate a test method")
503 @wraps(func)
504 def wrapper(self, *args, **kwargs):
505 return func(self, *args, **kwargs)
506
507 # Mark this function as such to separate them from the regular tests.
508 wrapper.__no_debug_info_test__ = True
509 return wrapper
510
Johnny Chenf1548d42012-04-06 00:56:05 +0000511def dsym_test(func):
512 """Decorate the item as a dsym test."""
513 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
514 raise Exception("@dsym_test can only be used to decorate a test method")
515 @wraps(func)
516 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000517 if lldb.dont_do_dsym_test:
518 self.skipTest("dsym tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000519 return func(self, *args, **kwargs)
520
521 # Mark this function as such to separate them from the regular tests.
522 wrapper.__dsym_test__ = True
523 return wrapper
524
525def dwarf_test(func):
526 """Decorate the item as a dwarf test."""
527 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
528 raise Exception("@dwarf_test can only be used to decorate a test method")
529 @wraps(func)
530 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000531 if lldb.dont_do_dwarf_test:
532 self.skipTest("dwarf tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000533 return func(self, *args, **kwargs)
534
535 # Mark this function as such to separate them from the regular tests.
536 wrapper.__dwarf_test__ = True
537 return wrapper
538
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000539def dwo_test(func):
540 """Decorate the item as a dwo test."""
541 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
542 raise Exception("@dwo_test can only be used to decorate a test method")
543 @wraps(func)
544 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000545 if lldb.dont_do_dwo_test:
546 self.skipTest("dwo tests")
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000547 return func(self, *args, **kwargs)
548
549 # Mark this function as such to separate them from the regular tests.
550 wrapper.__dwo_test__ = True
551 return wrapper
552
Todd Fialaa41d48c2014-04-28 04:49:40 +0000553def debugserver_test(func):
554 """Decorate the item as a debugserver test."""
555 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
556 raise Exception("@debugserver_test can only be used to decorate a test method")
557 @wraps(func)
558 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000559 if lldb.dont_do_debugserver_test:
560 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000561 return func(self, *args, **kwargs)
562
563 # Mark this function as such to separate them from the regular tests.
564 wrapper.__debugserver_test__ = True
565 return wrapper
566
567def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000568 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000569 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
570 raise Exception("@llgs_test can only be used to decorate a test method")
571 @wraps(func)
572 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000573 if lldb.dont_do_llgs_test:
574 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000575 return func(self, *args, **kwargs)
576
577 # Mark this function as such to separate them from the regular tests.
578 wrapper.__llgs_test__ = True
579 return wrapper
580
Daniel Maleae0f8f572013-08-26 23:57:52 +0000581def not_remote_testsuite_ready(func):
582 """Decorate the item as a test which is not ready yet for remote testsuite."""
583 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
584 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
585 @wraps(func)
586 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000587 if lldb.lldbtest_remote_sandbox or lldb.remote_platform:
588 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000589 return func(self, *args, **kwargs)
590
591 # Mark this function as such to separate them from the regular tests.
592 wrapper.__not_ready_for_remote_testsuite_test__ = True
593 return wrapper
594
Ed Maste433790a2014-04-23 12:55:41 +0000595def expectedFailure(expected_fn, bugnumber=None):
596 def expectedFailure_impl(func):
597 @wraps(func)
598 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000599 from unittest2 import case
600 self = args[0]
Enrico Granata43f62132013-02-23 01:28:30 +0000601 try:
Ed Maste433790a2014-04-23 12:55:41 +0000602 func(*args, **kwargs)
Enrico Granata43f62132013-02-23 01:28:30 +0000603 except Exception:
Ed Maste433790a2014-04-23 12:55:41 +0000604 if expected_fn(self):
605 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
Enrico Granata43f62132013-02-23 01:28:30 +0000606 else:
607 raise
Ed Maste433790a2014-04-23 12:55:41 +0000608 if expected_fn(self):
609 raise case._UnexpectedSuccess(sys.exc_info(), bugnumber)
610 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000611 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
612 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000613 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000614 return expectedFailure_impl(bugnumber)
615 else:
616 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000617
Ying Chen7091c2c2015-04-21 01:15:47 +0000618# provide a function to xfail on defined oslist, compiler version, and archs
619# if none is specified for any argument, that argument won't be checked and thus means for all
620# for example,
621# @expectedFailureAll, xfail for all platform/compiler/arch,
622# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
623# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000624def expectedFailureAll(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, triple=None, debug_info=None):
Ying Chen7091c2c2015-04-21 01:15:47 +0000625 def fn(self):
626 return ((oslist is None or self.getPlatform() in oslist) and
627 (compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))) and
Tamas Berghammercf6f92a2015-09-07 15:50:19 +0000628 self.expectedArch(archs) and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000629 (triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())) and
630 (debug_info is None or self.debug_info in debug_info))
Ying Chen7091c2c2015-04-21 01:15:47 +0000631 return expectedFailure(fn, bugnumber)
632
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000633def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000634 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
635
636def expectedFailureDwo(bugnumber=None):
637 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000638
639def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000640 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000641
642def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
643 if compiler_version is None:
644 compiler_version=['=', None]
645 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
646
Vince Harron8974ce22015-03-13 19:54:54 +0000647# to XFAIL a specific clang versions, try this
648# @expectedFailureClang('bugnumber', ['<=', '3.4'])
649def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000650 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000651
652def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000653 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000654
Matt Kopec0de53f02013-03-15 19:10:12 +0000655def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000656 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000657
Ed Maste433790a2014-04-23 12:55:41 +0000658def expectedFailureArch(arch, bugnumber=None):
659 def fn(self):
660 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000661 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000662
Enrico Granatae6cedc12013-02-23 01:05:23 +0000663def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000664 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000665
Matt Kopecee969f92013-09-26 23:30:59 +0000666def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000667 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000668
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000669def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None):
Ed Maste433790a2014-04-23 12:55:41 +0000670 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000671 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000672 self.expectedCompiler(compilers) and
673 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000674 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000675
Chaoren Linf7160f32015-06-09 17:39:27 +0000676def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
677 def fn(self):
678 return (getHostPlatform() in oslist and
679 self.expectedCompiler(compilers))
680 return expectedFailure(fn, bugnumber)
681
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000682def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000683 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000684 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000685
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000686def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
687 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000688
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000689def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None):
690 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000691
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000692def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
693 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000694
Chaoren Linf7160f32015-06-09 17:39:27 +0000695def expectedFailureHostWindows(bugnumber=None, compilers=None):
696 return expectedFailureHostOS(['windows'], bugnumber, compilers)
697
Pavel Labath090152b2015-08-20 11:37:19 +0000698def matchAndroid(api_levels=None, archs=None):
699 def match(self):
700 if not target_is_android():
701 return False
702 if archs is not None and self.getArchitecture() not in archs:
703 return False
704 if api_levels is not None and android_device_api() not in api_levels:
705 return False
706 return True
707 return match
708
709
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000710def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000711 """ Mark a test as xfail for Android.
712
713 Arguments:
714 bugnumber - The LLVM pr associated with the problem.
715 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000716 for which a test is expected to fail. None means all API level.
717 arch - A sequence of architecture names specifying the architectures
718 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000719 """
Pavel Labath090152b2015-08-20 11:37:19 +0000720 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000721
Vince Harron7ac3ea42015-06-26 15:13:21 +0000722# if the test passes on the first try, we're done (success)
723# if the test fails once, then passes on the second try, raise an ExpectedFailure
724# if the test fails twice in a row, re-throw the exception from the second test run
725def expectedFlakey(expected_fn, bugnumber=None):
726 def expectedFailure_impl(func):
727 @wraps(func)
728 def wrapper(*args, **kwargs):
729 from unittest2 import case
730 self = args[0]
731 try:
732 func(*args, **kwargs)
Ying Chen0a7202b2015-07-01 22:44:27 +0000733 # don't retry if the test case is already decorated with xfail or skip
734 except (case._ExpectedFailure, case.SkipTest, case._UnexpectedSuccess):
735 raise
Vince Harron7ac3ea42015-06-26 15:13:21 +0000736 except Exception:
737 if expected_fn(self):
Ying Chen0a7202b2015-07-01 22:44:27 +0000738 # before retry, run tearDown for previous run and setup for next
Vince Harron7ac3ea42015-06-26 15:13:21 +0000739 try:
Ying Chen0a7202b2015-07-01 22:44:27 +0000740 self.tearDown()
741 self.setUp()
Vince Harron7ac3ea42015-06-26 15:13:21 +0000742 func(*args, **kwargs)
743 except Exception:
744 # oh snap! two failures in a row, record a failure/error
745 raise
746 # record the expected failure
747 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
748 else:
749 raise
750 return wrapper
751 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
752 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000753 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000754 return expectedFailure_impl(bugnumber)
755 else:
756 return expectedFailure_impl
757
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000758def expectedFlakeyDwarf(bugnumber=None):
759 def fn(self):
760 return self.debug_info == "dwarf"
761 return expectedFlakey(fn, bugnumber)
762
763def expectedFlakeyDsym(bugnumber=None):
764 def fn(self):
765 return self.debug_info == "dwarf"
766 return expectedFlakey(fn, bugnumber)
767
Vince Harron7ac3ea42015-06-26 15:13:21 +0000768def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
769 def fn(self):
770 return (self.getPlatform() in oslist and
771 self.expectedCompiler(compilers))
772 return expectedFlakey(fn, bugnumber)
773
774def expectedFlakeyDarwin(bugnumber=None, compilers=None):
775 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
776 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
777
778def expectedFlakeyLinux(bugnumber=None, compilers=None):
779 return expectedFlakeyOS(['linux'], bugnumber, compilers)
780
781def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
782 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
783
784def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
785 if compiler_version is None:
786 compiler_version=['=', None]
787 def fn(self):
788 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
789 return expectedFlakey(fn, bugnumber)
790
791# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
792def expectedFlakeyClang(bugnumber=None, compiler_version=None):
793 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
794
795# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
796def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
797 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
798
Pavel Labath63a579c2015-09-07 12:15:27 +0000799def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
800 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
801
Greg Clayton12514562013-12-05 22:22:32 +0000802def skipIfRemote(func):
803 """Decorate the item to skip tests if testing remotely."""
804 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
805 raise Exception("@skipIfRemote can only be used to decorate a test method")
806 @wraps(func)
807 def wrapper(*args, **kwargs):
808 from unittest2 import case
809 if lldb.remote_platform:
810 self = args[0]
811 self.skipTest("skip on remote platform")
812 else:
813 func(*args, **kwargs)
814 return wrapper
815
Siva Chandra4470f382015-06-17 22:32:27 +0000816def skipUnlessListedRemote(remote_list=None):
817 def myImpl(func):
818 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
819 raise Exception("@skipIfRemote can only be used to decorate a "
820 "test method")
821
822 @wraps(func)
823 def wrapper(*args, **kwargs):
824 if remote_list and lldb.remote_platform:
825 self = args[0]
826 triple = self.dbg.GetSelectedPlatform().GetTriple()
827 for r in remote_list:
828 if r in triple:
829 func(*args, **kwargs)
830 return
831 self.skipTest("skip on remote platform %s" % str(triple))
832 else:
833 func(*args, **kwargs)
834 return wrapper
835
836 return myImpl
837
Greg Clayton12514562013-12-05 22:22:32 +0000838def skipIfRemoteDueToDeadlock(func):
839 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
840 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
841 raise Exception("@skipIfRemote can only be used to decorate a test method")
842 @wraps(func)
843 def wrapper(*args, **kwargs):
844 from unittest2 import case
845 if lldb.remote_platform:
846 self = args[0]
847 self.skipTest("skip on remote platform (deadlocks)")
848 else:
849 func(*args, **kwargs)
850 return wrapper
851
Enrico Granatab633e432014-10-06 21:37:06 +0000852def skipIfNoSBHeaders(func):
853 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
854 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000855 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000856 @wraps(func)
857 def wrapper(*args, **kwargs):
858 from unittest2 import case
859 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000860 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000861 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000862 else:
863 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000864 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000865 if not os.path.exists(header):
866 self.skipTest("skip because LLDB.h header not found")
867 else:
868 func(*args, **kwargs)
869 return wrapper
870
Enrico Granata5f92a132015-11-05 00:46:25 +0000871def skipIfiOSSimulator(func):
872 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
873 return unittest2.skipIf(hasattr(lldb, 'remote_platform_name') and lldb.remote_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
874
Robert Flack13c7ad92015-03-30 14:12:17 +0000875def skipIfFreeBSD(func):
876 """Decorate the item to skip tests that should be skipped on FreeBSD."""
877 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000878
Greg Claytone0d0a762015-04-02 18:24:03 +0000879def getDarwinOSTriples():
880 return ['darwin', 'macosx', 'ios']
881
Daniel Maleab3d41a22013-07-09 00:08:01 +0000882def skipIfDarwin(func):
883 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000884 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000885
Robert Flack13c7ad92015-03-30 14:12:17 +0000886def skipIfLinux(func):
887 """Decorate the item to skip tests that should be skipped on Linux."""
888 return skipIfPlatform(["linux"])(func)
889
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000890def skipUnlessHostLinux(func):
891 """Decorate the item to skip tests that should be skipped on any non Linux host."""
892 return skipUnlessHostPlatform(["linux"])(func)
893
Robert Flack13c7ad92015-03-30 14:12:17 +0000894def skipIfWindows(func):
895 """Decorate the item to skip tests that should be skipped on Windows."""
896 return skipIfPlatform(["windows"])(func)
897
Chaoren Line6eea5d2015-06-08 22:13:28 +0000898def skipIfHostWindows(func):
899 """Decorate the item to skip tests that should be skipped on Windows."""
900 return skipIfHostPlatform(["windows"])(func)
901
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000902def skipUnlessWindows(func):
903 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
904 return skipUnlessPlatform(["windows"])(func)
905
Robert Flack13c7ad92015-03-30 14:12:17 +0000906def skipUnlessDarwin(func):
907 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000908 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000909
Ryan Brown57bee1e2015-09-14 22:45:11 +0000910def skipUnlessGoInstalled(func):
911 """Decorate the item to skip tests when no Go compiler is available."""
912 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
913 raise Exception("@skipIfGcc can only be used to decorate a test method")
914 @wraps(func)
915 def wrapper(*args, **kwargs):
916 from unittest2 import case
917 self = args[0]
918 compiler = self.getGoCompilerVersion()
919 if not compiler:
920 self.skipTest("skipping because go compiler not found")
921 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000922 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000923 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000924 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
925 if not match_version:
926 # Couldn't determine version.
927 self.skipTest(
928 "skipping because go version could not be parsed "
929 "out of {}".format(compiler))
930 else:
931 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000932 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000933 compiler_strict_version = StrictVersion(match_version.group(1))
934 if compiler_strict_version < min_strict_version:
935 self.skipTest(
936 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +0000937 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +0000938 compiler_strict_version,
939 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +0000940 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +0000941 return wrapper
942
Robert Flack068898c2015-04-09 18:07:58 +0000943def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +0000944 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +0000945 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
946 if platform.startswith('freebsd'):
947 platform = 'freebsd'
948 return platform
949
Robert Flack6e1fd352015-05-15 12:39:33 +0000950def getHostPlatform():
951 """Returns the host platform running the test suite."""
952 # Attempts to return a platform name matching a target Triple platform.
953 if sys.platform.startswith('linux'):
954 return 'linux'
955 elif sys.platform.startswith('win32'):
956 return 'windows'
957 elif sys.platform.startswith('darwin'):
958 return 'darwin'
959 elif sys.platform.startswith('freebsd'):
960 return 'freebsd'
961 else:
962 return sys.platform
963
Robert Flackfb2f6c62015-04-17 08:02:18 +0000964def platformIsDarwin():
965 """Returns true if the OS triple for the selected platform is any valid apple OS"""
966 return getPlatform() in getDarwinOSTriples()
967
Robert Flack6e1fd352015-05-15 12:39:33 +0000968def skipIfHostIncompatibleWithRemote(func):
969 """Decorate the item to skip tests if binaries built on this host are incompatible."""
970 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
971 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
972 @wraps(func)
973 def wrapper(*args, **kwargs):
974 from unittest2 import case
975 self = args[0]
976 host_arch = self.getLldbArchitecture()
977 host_platform = getHostPlatform()
978 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +0000979 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +0000980 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
981 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
982 elif target_platform != host_platform:
983 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
984 else:
985 func(*args, **kwargs)
986 return wrapper
987
Chaoren Line6eea5d2015-06-08 22:13:28 +0000988def skipIfHostPlatform(oslist):
989 """Decorate the item to skip tests if running on one of the listed host platforms."""
990 return unittest2.skipIf(getHostPlatform() in oslist,
991 "skip on %s" % (", ".join(oslist)))
992
993def skipUnlessHostPlatform(oslist):
994 """Decorate the item to skip tests unless running on one of the listed host platforms."""
995 return unittest2.skipUnless(getHostPlatform() in oslist,
996 "requires on of %s" % (", ".join(oslist)))
997
Zachary Turner793d9972015-08-14 23:29:24 +0000998def skipUnlessArch(archlist):
999 """Decorate the item to skip tests unless running on one of the listed architectures."""
1000 def myImpl(func):
1001 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1002 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1003
1004 @wraps(func)
1005 def wrapper(*args, **kwargs):
1006 self = args[0]
1007 if self.getArchitecture() not in archlist:
1008 self.skipTest("skipping for architecture %s (requires one of %s)" %
1009 (self.getArchitecture(), ", ".join(archlist)))
1010 else:
1011 func(*args, **kwargs)
1012 return wrapper
1013
1014 return myImpl
1015
Robert Flack13c7ad92015-03-30 14:12:17 +00001016def skipIfPlatform(oslist):
1017 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001018 return unittest2.skipIf(getPlatform() in oslist,
1019 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001020
1021def skipUnlessPlatform(oslist):
1022 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001023 return unittest2.skipUnless(getPlatform() in oslist,
1024 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001025
Daniel Malea48359902013-05-14 20:48:54 +00001026def skipIfLinuxClang(func):
1027 """Decorate the item to skip tests that should be skipped if building on
1028 Linux with clang.
1029 """
1030 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1031 raise Exception("@skipIfLinuxClang can only be used to decorate a test method")
1032 @wraps(func)
1033 def wrapper(*args, **kwargs):
1034 from unittest2 import case
1035 self = args[0]
1036 compiler = self.getCompiler()
Vince Harronc8492672015-05-04 02:59:19 +00001037 platform = self.getPlatform()
1038 if "clang" in compiler and platform == "linux":
Daniel Malea48359902013-05-14 20:48:54 +00001039 self.skipTest("skipping because Clang is used on Linux")
1040 else:
1041 func(*args, **kwargs)
1042 return wrapper
1043
Ying Chen7091c2c2015-04-21 01:15:47 +00001044# provide a function to skip on defined oslist, compiler version, and archs
1045# if none is specified for any argument, that argument won't be checked and thus means for all
1046# for example,
1047# @skipIf, skip for all platform/compiler/arch,
1048# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1049# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1050
1051# TODO: refactor current code, to make skipIfxxx functions to call this function
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001052def skipIf(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, debug_info=None):
Ying Chen7091c2c2015-04-21 01:15:47 +00001053 def fn(self):
1054 return ((oslist is None or self.getPlatform() in oslist) and
1055 (compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))) and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001056 self.expectedArch(archs) and
1057 (debug_info is None or self.debug_info in debug_info))
1058 return skipTestIfFn(fn, bugnumber, skipReason="skipping because os:%s compiler: %s %s arch: %s debug info: %s"%(oslist, compiler, compiler_version, archs, debug_info))
1059
1060def skipIfDebugInfo(bugnumber=None, debug_info=None):
1061 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1062
Greg Claytonedea2372015-10-07 20:01:13 +00001063def skipIfDWO(bugnumber=None):
1064 return skipIfDebugInfo(bugnumber, ["dwo"])
1065
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001066def skipIfDwarf(bugnumber=None):
1067 return skipIfDebugInfo(bugnumber, ["dwarf"])
1068
1069def skipIfDsym(bugnumber=None):
1070 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001071
1072def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1073 def skipTestIfFn_impl(func):
1074 @wraps(func)
1075 def wrapper(*args, **kwargs):
1076 from unittest2 import case
1077 self = args[0]
1078 if expected_fn(self):
1079 self.skipTest(skipReason)
1080 else:
1081 func(*args, **kwargs)
1082 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001083 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001084 return skipTestIfFn_impl(bugnumber)
1085 else:
1086 return skipTestIfFn_impl
1087
Daniel Maleabe230792013-01-24 23:52:09 +00001088def skipIfGcc(func):
1089 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1090 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001091 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001092 @wraps(func)
1093 def wrapper(*args, **kwargs):
1094 from unittest2 import case
1095 self = args[0]
1096 compiler = self.getCompiler()
1097 if "gcc" in compiler:
1098 self.skipTest("skipping because gcc is the test compiler")
1099 else:
1100 func(*args, **kwargs)
1101 return wrapper
1102
Matt Kopec0de53f02013-03-15 19:10:12 +00001103def skipIfIcc(func):
1104 """Decorate the item to skip tests that should be skipped if building with icc ."""
1105 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1106 raise Exception("@skipIfIcc can only be used to decorate a test method")
1107 @wraps(func)
1108 def wrapper(*args, **kwargs):
1109 from unittest2 import case
1110 self = args[0]
1111 compiler = self.getCompiler()
1112 if "icc" in compiler:
1113 self.skipTest("skipping because icc is the test compiler")
1114 else:
1115 func(*args, **kwargs)
1116 return wrapper
1117
Daniel Malea55faa402013-05-02 21:44:31 +00001118def skipIfi386(func):
1119 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1120 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1121 raise Exception("@skipIfi386 can only be used to decorate a test method")
1122 @wraps(func)
1123 def wrapper(*args, **kwargs):
1124 from unittest2 import case
1125 self = args[0]
1126 if "i386" == self.getArchitecture():
1127 self.skipTest("skipping because i386 is not a supported architecture")
1128 else:
1129 func(*args, **kwargs)
1130 return wrapper
1131
Pavel Labath090152b2015-08-20 11:37:19 +00001132def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001133 """Decorator to skip tests when the target is Android.
1134
1135 Arguments:
1136 api_levels - The API levels for which the test should be skipped. If
1137 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001138 arch - A sequence of architecture names specifying the architectures
1139 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001140 """
1141 def myImpl(func):
1142 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1143 raise Exception("@skipIfTargetAndroid can only be used to "
1144 "decorate a test method")
1145 @wraps(func)
1146 def wrapper(*args, **kwargs):
1147 from unittest2 import case
1148 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001149 if matchAndroid(api_levels, archs)(self):
1150 self.skipTest("skiped on Android target with API %d and architecture %s" %
1151 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001152 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001153 return wrapper
1154 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001155
Ilia Kd9953052015-03-12 07:19:41 +00001156def skipUnlessCompilerRt(func):
1157 """Decorate the item to skip tests if testing remotely."""
1158 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1159 raise Exception("@skipUnless can only be used to decorate a test method")
1160 @wraps(func)
1161 def wrapper(*args, **kwargs):
1162 from unittest2 import case
1163 import os.path
1164 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "projects", "compiler-rt")
1165 if not os.path.exists(compilerRtPath):
1166 self = args[0]
1167 self.skipTest("skip if compiler-rt not found")
1168 else:
1169 func(*args, **kwargs)
1170 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001171
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001172class _PlatformContext(object):
1173 """Value object class which contains platform-specific options."""
1174
1175 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1176 self.shlib_environment_var = shlib_environment_var
1177 self.shlib_prefix = shlib_prefix
1178 self.shlib_extension = shlib_extension
1179
1180
Johnny Chena74bb0a2011-08-01 18:46:13 +00001181class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001182 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001183 Abstract base for performing lldb (see TestBase) or other generic tests (see
1184 BenchBase for one example). lldbtest.Base works with the test driver to
1185 accomplish things.
1186
Johnny Chen8334dad2010-10-22 23:15:46 +00001187 """
Enrico Granata5020f952012-10-24 21:42:49 +00001188
Enrico Granata19186272012-10-24 21:44:48 +00001189 # The concrete subclass should override this attribute.
1190 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001191
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001192 # Keep track of the old current working directory.
1193 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001194
Greg Clayton4570d3e2013-12-10 23:19:29 +00001195 @staticmethod
1196 def compute_mydir(test_file):
1197 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1198
1199 mydir = TestBase.compute_mydir(__file__)'''
1200 test_dir = os.path.dirname(test_file)
1201 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1202
Johnny Chenfb4264c2011-08-01 19:50:58 +00001203 def TraceOn(self):
1204 """Returns True if we are in trace mode (tracing detailed test execution)."""
1205 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001206
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001207 @classmethod
1208 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001209 """
1210 Python unittest framework class setup fixture.
1211 Do current directory manipulation.
1212 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001213 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001214 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001215 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001216
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001217 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001218 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001219
1220 # Change current working directory if ${LLDB_TEST} is defined.
1221 # See also dotest.py which sets up ${LLDB_TEST}.
1222 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001223 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001224 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001225 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001226 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1227
Vince Harron85d19652015-05-21 19:09:29 +00001228 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001229 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001230 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1231 try:
1232 cls.dir_lock.try_acquire()
1233 # write the class that owns the lock into the lock file
1234 cls.dir_lock.handle.write(cls.__name__)
1235 except IOError as ioerror:
1236 # nothing else should have this directory lock
1237 # wait here until we get a lock
1238 cls.dir_lock.acquire()
1239 # read the previous owner from the lock file
1240 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001241 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 +00001242 raise ioerror
1243
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001244 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001245 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001246 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Robert Flackfb2f6c62015-04-17 08:02:18 +00001247 elif getPlatform() == "linux" or getPlatform() == "freebsd":
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001248 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001249 else:
1250 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001251
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001252 @classmethod
1253 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001254 """
1255 Python unittest framework class teardown fixture.
1256 Do class-wide cleanup.
1257 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001258
Johnny Chen0fddfb22011-11-17 19:57:27 +00001259 if doCleanup and not lldb.skip_build_and_cleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001260 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001261 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001262 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001263
Johnny Chen707b3c92010-10-11 22:25:46 +00001264 # Subclass might have specific cleanup function defined.
1265 if getattr(cls, "classCleanup", None):
1266 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001267 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001268 try:
1269 cls.classCleanup()
1270 except:
1271 exc_type, exc_value, exc_tb = sys.exc_info()
1272 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001273
Vince Harron85d19652015-05-21 19:09:29 +00001274 if debug_confirm_directory_exclusivity:
1275 cls.dir_lock.release()
1276 del cls.dir_lock
1277
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001278 # Restore old working directory.
1279 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001280 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001281 os.chdir(cls.oldcwd)
1282
Johnny Chena74bb0a2011-08-01 18:46:13 +00001283 @classmethod
1284 def skipLongRunningTest(cls):
1285 """
1286 By default, we skip long running test case.
1287 This can be overridden by passing '-l' to the test driver (dotest.py).
1288 """
1289 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1290 return False
1291 else:
1292 return True
Johnny Chened492022011-06-21 00:53:00 +00001293
Vince Harron6d3d0f12015-05-10 22:01:59 +00001294 def enableLogChannelsForCurrentTest(self):
1295 if len(lldbtest_config.channels) == 0:
1296 return
1297
1298 # if debug channels are specified in lldbtest_config.channels,
1299 # create a new set of log files for every test
1300 log_basename = self.getLogBasenameForCurrentTest()
1301
1302 # confirm that the file is writeable
1303 host_log_path = "{}-host.log".format(log_basename)
1304 open(host_log_path, 'w').close()
1305
1306 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1307 for channel_with_categories in lldbtest_config.channels:
1308 channel_then_categories = channel_with_categories.split(' ', 1)
1309 channel = channel_then_categories[0]
1310 if len(channel_then_categories) > 1:
1311 categories = channel_then_categories[1]
1312 else:
1313 categories = "default"
1314
1315 if channel == "gdb-remote":
1316 # communicate gdb-remote categories to debugserver
1317 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1318
1319 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1320 if not self.res.Succeeded():
1321 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1322
1323 # Communicate log path name to debugserver & lldb-server
1324 server_log_path = "{}-server.log".format(log_basename)
1325 open(server_log_path, 'w').close()
1326 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
1327
1328 # Communicate channels to lldb-server
1329 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
1330
1331 if len(lldbtest_config.channels) == 0:
1332 return
1333
1334 def disableLogChannelsForCurrentTest(self):
1335 # close all log files that we opened
1336 for channel_and_categories in lldbtest_config.channels:
1337 # channel format - <channel-name> [<category0> [<category1> ...]]
1338 channel = channel_and_categories.split(' ', 1)[0]
1339 self.ci.HandleCommand("log disable " + channel, self.res)
1340 if not self.res.Succeeded():
1341 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1342
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001343 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001344 """Fixture for unittest test case setup.
1345
1346 It works with the test driver to conditionally skip tests and does other
1347 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001348 #import traceback
1349 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001350
Daniel Malea9115f072013-08-06 15:02:32 +00001351 if "LIBCXX_PATH" in os.environ:
1352 self.libcxxPath = os.environ["LIBCXX_PATH"]
1353 else:
1354 self.libcxxPath = None
1355
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001356 if "LLDBMI_EXEC" in os.environ:
1357 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1358 else:
1359 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001360
Johnny Chenebe51722011-10-07 19:21:09 +00001361 # If we spawn an lldb process for test (via pexpect), do not load the
1362 # init file unless told otherwise.
1363 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1364 self.lldbOption = ""
1365 else:
1366 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001367
Johnny Chen985e7402011-08-01 21:13:26 +00001368 # Assign the test method name to self.testMethodName.
1369 #
1370 # For an example of the use of this attribute, look at test/types dir.
1371 # There are a bunch of test cases under test/types and we don't want the
1372 # module cacheing subsystem to be confused with executable name "a.out"
1373 # used for all the test cases.
1374 self.testMethodName = self._testMethodName
1375
Johnny Chen5ccbccf2011-07-30 01:39:58 +00001376 # Benchmarks test is decorated with @benchmarks_test,
1377 # which also sets the "__benchmarks_test__" attribute of the
1378 # function object to True.
1379 try:
1380 if lldb.just_do_benchmarks_test:
1381 testMethod = getattr(self, self._testMethodName)
1382 if getattr(testMethod, "__benchmarks_test__", False):
1383 pass
1384 else:
1385 self.skipTest("non benchmarks test")
Johnny Chen4533dad2011-05-31 23:21:42 +00001386 except AttributeError:
1387 pass
Johnny Chenf3e22ac2010-12-10 18:52:10 +00001388
Johnny Chen985e7402011-08-01 21:13:26 +00001389 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1390 # with it using pexpect.
1391 self.child = None
1392 self.child_prompt = "(lldb) "
1393 # If the child is interacting with the embedded script interpreter,
1394 # there are two exits required during tear down, first to quit the
1395 # embedded script interpreter and second to quit the lldb command
1396 # interpreter.
1397 self.child_in_script_interpreter = False
1398
Johnny Chenfb4264c2011-08-01 19:50:58 +00001399 # These are for customized teardown cleanup.
1400 self.dict = None
1401 self.doTearDownCleanup = False
1402 # And in rare cases where there are multiple teardown cleanups.
1403 self.dicts = []
1404 self.doTearDownCleanups = False
1405
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001406 # List of spawned subproces.Popen objects
1407 self.subprocesses = []
1408
Daniel Malea69207462013-06-05 21:07:02 +00001409 # List of forked process PIDs
1410 self.forkedProcessPids = []
1411
Johnny Chenfb4264c2011-08-01 19:50:58 +00001412 # Create a string buffer to record the session info, to be dumped into a
1413 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001414 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001415
Vince Harron1f160372015-05-21 18:51:20 +00001416 session_file = "{}.log".format(self.log_basename)
Vince Harron35b17dc2015-05-21 18:20:21 +00001417 unbuffered = 0 # 0 is the constant for unbuffered
Vince Harron1f160372015-05-21 18:51:20 +00001418 self.session = open(session_file, "w", unbuffered)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001419
1420 # Optimistically set __errored__, __failed__, __expected__ to False
1421 # initially. If the test errored/failed, the session info
1422 # (self.session) is then dumped into a session specific file for
1423 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001424 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001425 self.__errored__ = False
1426 self.__failed__ = False
1427 self.__expected__ = False
1428 # We are also interested in unexpected success.
1429 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001430 # And skipped tests.
1431 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001432
1433 # See addTearDownHook(self, hook) which allows the client to add a hook
1434 # function to be run during tearDown() time.
1435 self.hooks = []
1436
1437 # See HideStdout(self).
1438 self.sys_stdout_hidden = False
1439
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001440 if self.platformContext:
1441 # set environment variable names for finding shared libraries
1442 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001443
Vince Harron6d3d0f12015-05-10 22:01:59 +00001444 # Create the debugger instance if necessary.
1445 try:
1446 self.dbg = lldb.DBG
1447 except AttributeError:
1448 self.dbg = lldb.SBDebugger.Create()
1449
1450 if not self.dbg:
1451 raise Exception('Invalid debugger instance')
1452
1453 # Retrieve the associated command interpreter instance.
1454 self.ci = self.dbg.GetCommandInterpreter()
1455 if not self.ci:
1456 raise Exception('Could not get the command interpreter')
1457
1458 # And the result object.
1459 self.res = lldb.SBCommandReturnObject()
1460
1461 self.enableLogChannelsForCurrentTest()
1462
Johnny Chen2a808582011-10-19 16:48:07 +00001463 def runHooks(self, child=None, child_prompt=None, use_cmd_api=False):
Johnny Chena737ba52011-10-19 01:06:21 +00001464 """Perform the run hooks to bring lldb debugger to the desired state.
1465
Johnny Chen2a808582011-10-19 16:48:07 +00001466 By default, expect a pexpect spawned child and child prompt to be
1467 supplied (use_cmd_api=False). If use_cmd_api is true, ignore the child
1468 and child prompt and use self.runCmd() to run the hooks one by one.
1469
Johnny Chena737ba52011-10-19 01:06:21 +00001470 Note that child is a process spawned by pexpect.spawn(). If not, your
1471 test case is mostly likely going to fail.
1472
1473 See also dotest.py where lldb.runHooks are processed/populated.
1474 """
1475 if not lldb.runHooks:
1476 self.skipTest("No runhooks specified for lldb, skip the test")
Johnny Chen2a808582011-10-19 16:48:07 +00001477 if use_cmd_api:
1478 for hook in lldb.runhooks:
1479 self.runCmd(hook)
1480 else:
1481 if not child or not child_prompt:
1482 self.fail("Both child and child_prompt need to be defined.")
1483 for hook in lldb.runHooks:
1484 child.sendline(hook)
1485 child.expect_exact(child_prompt)
Johnny Chena737ba52011-10-19 01:06:21 +00001486
Daniel Malea249287a2013-02-19 16:08:57 +00001487 def setAsync(self, value):
1488 """ Sets async mode to True/False and ensures it is reset after the testcase completes."""
1489 old_async = self.dbg.GetAsync()
1490 self.dbg.SetAsync(value)
1491 self.addTearDownHook(lambda: self.dbg.SetAsync(old_async))
1492
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001493 def cleanupSubprocesses(self):
1494 # Ensure any subprocesses are cleaned up
1495 for p in self.subprocesses:
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001496 p.terminate()
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001497 del p
1498 del self.subprocesses[:]
Daniel Malea69207462013-06-05 21:07:02 +00001499 # Ensure any forked processes are cleaned up
1500 for pid in self.forkedProcessPids:
1501 if os.path.exists("/proc/" + str(pid)):
1502 os.kill(pid, signal.SIGTERM)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001503
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001504 def spawnSubprocess(self, executable, args=[], install_remote=True):
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001505 """ Creates a subprocess.Popen object with the specified executable and arguments,
1506 saves it in self.subprocesses, and returns the object.
1507 NOTE: if using this function, ensure you also call:
1508
1509 self.addTearDownHook(self.cleanupSubprocesses)
1510
1511 otherwise the test suite will leak processes.
1512 """
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001513 proc = _RemoteProcess(install_remote) if lldb.remote_platform else _LocalProcess(self.TraceOn())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001514 proc.launch(executable, args)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001515 self.subprocesses.append(proc)
1516 return proc
1517
Daniel Malea69207462013-06-05 21:07:02 +00001518 def forkSubprocess(self, executable, args=[]):
1519 """ Fork a subprocess with its own group ID.
1520 NOTE: if using this function, ensure you also call:
1521
1522 self.addTearDownHook(self.cleanupSubprocesses)
1523
1524 otherwise the test suite will leak processes.
1525 """
1526 child_pid = os.fork()
1527 if child_pid == 0:
1528 # If more I/O support is required, this can be beefed up.
1529 fd = os.open(os.devnull, os.O_RDWR)
Daniel Malea69207462013-06-05 21:07:02 +00001530 os.dup2(fd, 1)
1531 os.dup2(fd, 2)
1532 # This call causes the child to have its of group ID
1533 os.setpgid(0,0)
1534 os.execvp(executable, [executable] + args)
1535 # Give the child time to get through the execvp() call
1536 time.sleep(0.1)
1537 self.forkedProcessPids.append(child_pid)
1538 return child_pid
1539
Johnny Chenfb4264c2011-08-01 19:50:58 +00001540 def HideStdout(self):
1541 """Hide output to stdout from the user.
1542
1543 During test execution, there might be cases where we don't want to show the
1544 standard output to the user. For example,
1545
Zachary Turner35d017f2015-10-23 17:04:29 +00001546 self.runCmd(r'''sc print("\n\n\tHello!\n")''')
Johnny Chenfb4264c2011-08-01 19:50:58 +00001547
1548 tests whether command abbreviation for 'script' works or not. There is no
1549 need to show the 'Hello' output to the user as long as the 'script' command
1550 succeeds and we are not in TraceOn() mode (see the '-t' option).
1551
1552 In this case, the test method calls self.HideStdout(self) to redirect the
1553 sys.stdout to a null device, and restores the sys.stdout upon teardown.
1554
1555 Note that you should only call this method at most once during a test case
1556 execution. Any subsequent call has no effect at all."""
1557 if self.sys_stdout_hidden:
1558 return
1559
1560 self.sys_stdout_hidden = True
1561 old_stdout = sys.stdout
1562 sys.stdout = open(os.devnull, 'w')
1563 def restore_stdout():
1564 sys.stdout = old_stdout
1565 self.addTearDownHook(restore_stdout)
1566
1567 # =======================================================================
1568 # Methods for customized teardown cleanups as well as execution of hooks.
1569 # =======================================================================
1570
1571 def setTearDownCleanup(self, dictionary=None):
1572 """Register a cleanup action at tearDown() time with a dictinary"""
1573 self.dict = dictionary
1574 self.doTearDownCleanup = True
1575
1576 def addTearDownCleanup(self, dictionary):
1577 """Add a cleanup action at tearDown() time with a dictinary"""
1578 self.dicts.append(dictionary)
1579 self.doTearDownCleanups = True
1580
1581 def addTearDownHook(self, hook):
1582 """
1583 Add a function to be run during tearDown() time.
1584
1585 Hooks are executed in a first come first serve manner.
1586 """
Zachary Turnercd236b82015-10-26 18:48:24 +00001587 if six.callable(hook):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001588 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001589 print("Adding tearDown hook:", getsource_if_available(hook), file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001590 self.hooks.append(hook)
Enrico Granataab0e8312014-11-05 21:31:57 +00001591
1592 return self
Johnny Chenfb4264c2011-08-01 19:50:58 +00001593
Jim Inghamda3a3862014-10-16 23:02:14 +00001594 def deletePexpectChild(self):
Johnny Chen985e7402011-08-01 21:13:26 +00001595 # This is for the case of directly spawning 'lldb' and interacting with it
1596 # using pexpect.
Johnny Chen985e7402011-08-01 21:13:26 +00001597 if self.child and self.child.isalive():
Zachary Turner9ef307b2014-07-22 16:19:29 +00001598 import pexpect
Johnny Chen985e7402011-08-01 21:13:26 +00001599 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001600 print("tearing down the child process....", file=sbuf)
Johnny Chen985e7402011-08-01 21:13:26 +00001601 try:
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001602 if self.child_in_script_interpreter:
1603 self.child.sendline('quit()')
1604 self.child.expect_exact(self.child_prompt)
1605 self.child.sendline('settings set interpreter.prompt-on-quit false')
1606 self.child.sendline('quit')
Johnny Chen985e7402011-08-01 21:13:26 +00001607 self.child.expect(pexpect.EOF)
Ilia K47448c22015-02-11 21:41:58 +00001608 except (ValueError, pexpect.ExceptionPexpect):
1609 # child is already terminated
1610 pass
1611 except OSError as exception:
1612 import errno
1613 if exception.errno != errno.EIO:
1614 # unexpected error
1615 raise
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001616 # child is already terminated
Johnny Chen985e7402011-08-01 21:13:26 +00001617 pass
Shawn Besteb3e9052014-11-06 17:52:15 +00001618 finally:
1619 # Give it one final blow to make sure the child is terminated.
1620 self.child.close()
Jim Inghamda3a3862014-10-16 23:02:14 +00001621
1622 def tearDown(self):
1623 """Fixture for unittest test case teardown."""
1624 #import traceback
1625 #traceback.print_stack()
1626
1627 self.deletePexpectChild()
1628
Johnny Chenfb4264c2011-08-01 19:50:58 +00001629 # Check and run any hook functions.
1630 for hook in reversed(self.hooks):
1631 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001632 print("Executing tearDown hook:", getsource_if_available(hook), file=sbuf)
Enrico Granataab0e8312014-11-05 21:31:57 +00001633 import inspect
1634 hook_argc = len(inspect.getargspec(hook).args)
Enrico Granata6e0566c2014-11-17 19:00:20 +00001635 if hook_argc == 0 or getattr(hook,'im_self',None):
Enrico Granataab0e8312014-11-05 21:31:57 +00001636 hook()
1637 elif hook_argc == 1:
1638 hook(self)
1639 else:
1640 hook() # try the plain call and hope it works
Johnny Chenfb4264c2011-08-01 19:50:58 +00001641
1642 del self.hooks
1643
1644 # Perform registered teardown cleanup.
1645 if doCleanup and self.doTearDownCleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00001646 self.cleanup(dictionary=self.dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001647
1648 # In rare cases where there are multiple teardown cleanups added.
1649 if doCleanup and self.doTearDownCleanups:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001650 if self.dicts:
1651 for dict in reversed(self.dicts):
Johnny Chen0fddfb22011-11-17 19:57:27 +00001652 self.cleanup(dictionary=dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001653
Vince Harron9753dd92015-05-10 15:22:09 +00001654 self.disableLogChannelsForCurrentTest()
1655
Johnny Chenfb4264c2011-08-01 19:50:58 +00001656 # =========================================================
1657 # Various callbacks to allow introspection of test progress
1658 # =========================================================
1659
1660 def markError(self):
1661 """Callback invoked when an error (unexpected exception) errored."""
1662 self.__errored__ = True
1663 with recording(self, False) as sbuf:
1664 # False because there's no need to write "ERROR" to the stderr twice.
1665 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001666 print("ERROR", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001667
Zachary Turnerb1490b62015-08-26 19:44:56 +00001668 def markCleanupError(self):
1669 """Callback invoked when an error occurs while a test is cleaning up."""
1670 self.__cleanup_errored__ = True
1671 with recording(self, False) as sbuf:
1672 # False because there's no need to write "CLEANUP_ERROR" to the stderr twice.
1673 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001674 print("CLEANUP_ERROR", file=sbuf)
Zachary Turnerb1490b62015-08-26 19:44:56 +00001675
Johnny Chenfb4264c2011-08-01 19:50:58 +00001676 def markFailure(self):
1677 """Callback invoked when a failure (test assertion failure) occurred."""
1678 self.__failed__ = True
1679 with recording(self, False) as sbuf:
1680 # False because there's no need to write "FAIL" to the stderr twice.
1681 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001682 print("FAIL", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001683
Enrico Granatae6cedc12013-02-23 01:05:23 +00001684 def markExpectedFailure(self,err,bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001685 """Callback invoked when an expected failure/error occurred."""
1686 self.__expected__ = True
1687 with recording(self, False) as sbuf:
1688 # False because there's no need to write "expected failure" to the
1689 # stderr twice.
1690 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001691 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001692 print("expected failure", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001693 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001694 print("expected failure (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001695
Johnny Chenc5cc6252011-08-15 23:09:08 +00001696 def markSkippedTest(self):
1697 """Callback invoked when a test is skipped."""
1698 self.__skipped__ = True
1699 with recording(self, False) as sbuf:
1700 # False because there's no need to write "skipped test" to the
1701 # stderr twice.
1702 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001703 print("skipped test", file=sbuf)
Johnny Chenc5cc6252011-08-15 23:09:08 +00001704
Enrico Granatae6cedc12013-02-23 01:05:23 +00001705 def markUnexpectedSuccess(self, bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001706 """Callback invoked when an unexpected success occurred."""
1707 self.__unexpected__ = True
1708 with recording(self, False) as sbuf:
1709 # False because there's no need to write "unexpected success" to the
1710 # stderr twice.
1711 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001712 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001713 print("unexpected success", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001714 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001715 print("unexpected success (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001716
Greg Clayton70995582015-01-07 22:25:50 +00001717 def getRerunArgs(self):
1718 return " -f %s.%s" % (self.__class__.__name__, self._testMethodName)
Vince Harron9753dd92015-05-10 15:22:09 +00001719
1720 def getLogBasenameForCurrentTest(self, prefix=None):
1721 """
1722 returns a partial path that can be used as the beginning of the name of multiple
1723 log files pertaining to this test
1724
1725 <session-dir>/<arch>-<compiler>-<test-file>.<test-class>.<test-method>
1726 """
1727 dname = os.path.join(os.environ["LLDB_TEST"],
1728 os.environ["LLDB_SESSION_DIRNAME"])
1729 if not os.path.isdir(dname):
1730 os.mkdir(dname)
1731
1732 compiler = self.getCompiler()
1733
1734 if compiler[1] == ':':
1735 compiler = compiler[2:]
Chaoren Lin636a0e32015-07-17 21:40:11 +00001736 if os.path.altsep is not None:
1737 compiler = compiler.replace(os.path.altsep, os.path.sep)
Vince Harron9753dd92015-05-10 15:22:09 +00001738
Vince Harron19e300f2015-05-12 00:50:54 +00001739 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), "_".join(compiler.split(os.path.sep)))
Vince Harron9753dd92015-05-10 15:22:09 +00001740 if len(fname) > 200:
Vince Harron19e300f2015-05-12 00:50:54 +00001741 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), compiler.split(os.path.sep)[-1])
Vince Harron9753dd92015-05-10 15:22:09 +00001742
1743 if prefix is not None:
1744 fname = "{}-{}".format(prefix, fname)
1745
1746 return os.path.join(dname, fname)
1747
Johnny Chenfb4264c2011-08-01 19:50:58 +00001748 def dumpSessionInfo(self):
1749 """
1750 Dump the debugger interactions leading to a test error/failure. This
1751 allows for more convenient postmortem analysis.
1752
1753 See also LLDBTestResult (dotest.py) which is a singlton class derived
1754 from TextTestResult and overwrites addError, addFailure, and
1755 addExpectedFailure methods to allow us to to mark the test instance as
1756 such.
1757 """
1758
1759 # We are here because self.tearDown() detected that this test instance
1760 # either errored or failed. The lldb.test_result singleton contains
1761 # two lists (erros and failures) which get populated by the unittest
1762 # framework. Look over there for stack trace information.
1763 #
1764 # The lists contain 2-tuples of TestCase instances and strings holding
1765 # formatted tracebacks.
1766 #
1767 # See http://docs.python.org/library/unittest.html#unittest.TestResult.
Vince Harron9753dd92015-05-10 15:22:09 +00001768
Vince Harron35b17dc2015-05-21 18:20:21 +00001769 # output tracebacks into session
Vince Harron9753dd92015-05-10 15:22:09 +00001770 pairs = []
Johnny Chenfb4264c2011-08-01 19:50:58 +00001771 if self.__errored__:
1772 pairs = lldb.test_result.errors
1773 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001774 elif self.__cleanup_errored__:
Zachary Turnerb1490b62015-08-26 19:44:56 +00001775 pairs = lldb.test_result.cleanup_errors
1776 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001777 elif self.__failed__:
1778 pairs = lldb.test_result.failures
1779 prefix = 'Failure'
1780 elif self.__expected__:
1781 pairs = lldb.test_result.expectedFailures
1782 prefix = 'ExpectedFailure'
Johnny Chenc5cc6252011-08-15 23:09:08 +00001783 elif self.__skipped__:
1784 prefix = 'SkippedTest'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001785 elif self.__unexpected__:
Vince Harron35b17dc2015-05-21 18:20:21 +00001786 prefix = 'UnexpectedSuccess'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001787 else:
Vince Harron35b17dc2015-05-21 18:20:21 +00001788 prefix = 'Success'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001789
Johnny Chenc5cc6252011-08-15 23:09:08 +00001790 if not self.__unexpected__ and not self.__skipped__:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001791 for test, traceback in pairs:
1792 if test is self:
Zachary Turnerff890da2015-10-19 23:45:41 +00001793 print(traceback, file=self.session)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001794
Vince Harron35b17dc2015-05-21 18:20:21 +00001795 # put footer (timestamp/rerun instructions) into session
Johnny Chen8082a002011-08-11 00:16:28 +00001796 testMethod = getattr(self, self._testMethodName)
1797 if getattr(testMethod, "__benchmarks_test__", False):
1798 benchmarks = True
1799 else:
1800 benchmarks = False
1801
Vince Harron35b17dc2015-05-21 18:20:21 +00001802 import datetime
Zachary Turnerff890da2015-10-19 23:45:41 +00001803 print("Session info generated @", datetime.datetime.now().ctime(), file=self.session)
1804 print("To rerun this test, issue the following command from the 'test' directory:\n", file=self.session)
1805 print("./dotest.py %s -v %s %s" % (self.getRunOptions(),
Vince Harron35b17dc2015-05-21 18:20:21 +00001806 ('+b' if benchmarks else '-t'),
Zachary Turnerff890da2015-10-19 23:45:41 +00001807 self.getRerunArgs()), file=self.session)
Vince Harron35b17dc2015-05-21 18:20:21 +00001808 self.session.close()
1809 del self.session
1810
1811 # process the log files
Vince Harron1f160372015-05-21 18:51:20 +00001812 log_files_for_this_test = glob.glob(self.log_basename + "*")
Vince Harron35b17dc2015-05-21 18:20:21 +00001813
1814 if prefix != 'Success' or lldbtest_config.log_success:
1815 # keep all log files, rename them to include prefix
1816 dst_log_basename = self.getLogBasenameForCurrentTest(prefix)
1817 for src in log_files_for_this_test:
Zachary Turner306278f2015-05-26 20:26:29 +00001818 if os.path.isfile(src):
1819 dst = src.replace(self.log_basename, dst_log_basename)
1820 if os.name == "nt" and os.path.isfile(dst):
1821 # On Windows, renaming a -> b will throw an exception if b exists. On non-Windows platforms
1822 # it silently replaces the destination. Ultimately this means that atomic renames are not
1823 # guaranteed to be possible on Windows, but we need this to work anyway, so just remove the
1824 # destination first if it already exists.
1825 os.remove(dst)
Zachary Turner5de068b2015-05-26 19:52:24 +00001826
Zachary Turner306278f2015-05-26 20:26:29 +00001827 os.rename(src, dst)
Vince Harron35b17dc2015-05-21 18:20:21 +00001828 else:
1829 # success! (and we don't want log files) delete log files
1830 for log_file in log_files_for_this_test:
Adrian McCarthya7292042015-09-04 20:48:48 +00001831 try:
1832 os.unlink(log_file)
1833 except:
1834 # We've seen consistent unlink failures on Windows, perhaps because the
1835 # just-created log file is being scanned by anti-virus. Empirically, this
1836 # sleep-and-retry approach allows tests to succeed much more reliably.
1837 # Attempts to figure out exactly what process was still holding a file handle
1838 # have failed because running instrumentation like Process Monitor seems to
1839 # slow things down enough that the problem becomes much less consistent.
1840 time.sleep(0.5)
1841 os.unlink(log_file)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001842
1843 # ====================================================
1844 # Config. methods supported through a plugin interface
1845 # (enables reading of the current test configuration)
1846 # ====================================================
1847
1848 def getArchitecture(self):
1849 """Returns the architecture in effect the test suite is running with."""
1850 module = builder_module()
Ed Maste0f434e62015-04-06 15:50:48 +00001851 arch = module.getArchitecture()
1852 if arch == 'amd64':
1853 arch = 'x86_64'
1854 return arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001855
Vince Harron02613762015-05-04 00:17:53 +00001856 def getLldbArchitecture(self):
1857 """Returns the architecture of the lldb binary."""
1858 if not hasattr(self, 'lldbArchitecture'):
1859
1860 # spawn local process
1861 command = [
Vince Harron790d95c2015-05-18 19:39:03 +00001862 lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001863 "-o",
Vince Harron790d95c2015-05-18 19:39:03 +00001864 "file " + lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001865 "-o",
1866 "quit"
1867 ]
1868
1869 output = check_output(command)
1870 str = output.decode("utf-8");
1871
1872 for line in str.splitlines():
1873 m = re.search("Current executable set to '.*' \\((.*)\\)\\.", line)
1874 if m:
1875 self.lldbArchitecture = m.group(1)
1876 break
1877
1878 return self.lldbArchitecture
1879
Johnny Chenfb4264c2011-08-01 19:50:58 +00001880 def getCompiler(self):
1881 """Returns the compiler in effect the test suite is running with."""
1882 module = builder_module()
1883 return module.getCompiler()
1884
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001885 def getCompilerBinary(self):
1886 """Returns the compiler binary the test suite is running with."""
1887 return self.getCompiler().split()[0]
1888
Daniel Malea0aea0162013-02-27 17:29:46 +00001889 def getCompilerVersion(self):
1890 """ Returns a string that represents the compiler version.
1891 Supports: llvm, clang.
1892 """
1893 from lldbutil import which
1894 version = 'unknown'
1895
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001896 compiler = self.getCompilerBinary()
Zachary Turner9ef307b2014-07-22 16:19:29 +00001897 version_output = system([[which(compiler), "-v"]])[1]
Daniel Malea0aea0162013-02-27 17:29:46 +00001898 for line in version_output.split(os.linesep):
Greg Clayton2a844b72013-03-06 02:34:51 +00001899 m = re.search('version ([0-9\.]+)', line)
Daniel Malea0aea0162013-02-27 17:29:46 +00001900 if m:
1901 version = m.group(1)
1902 return version
1903
Ryan Brown57bee1e2015-09-14 22:45:11 +00001904 def getGoCompilerVersion(self):
1905 """ Returns a string that represents the go compiler version, or None if go is not found.
1906 """
1907 compiler = which("go")
1908 if compiler:
1909 version_output = system([[compiler, "version"]])[0]
1910 for line in version_output.split(os.linesep):
1911 m = re.search('go version (devel|go\\S+)', line)
1912 if m:
1913 return m.group(1)
1914 return None
1915
Greg Claytone0d0a762015-04-02 18:24:03 +00001916 def platformIsDarwin(self):
1917 """Returns true if the OS triple for the selected platform is any valid apple OS"""
Robert Flackfb2f6c62015-04-17 08:02:18 +00001918 return platformIsDarwin()
Vince Harron20952cc2015-04-03 01:00:06 +00001919
Robert Flack13c7ad92015-03-30 14:12:17 +00001920 def getPlatform(self):
Robert Flackfb2f6c62015-04-17 08:02:18 +00001921 """Returns the target platform the test suite is running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001922 return getPlatform()
Robert Flack13c7ad92015-03-30 14:12:17 +00001923
Daniel Maleaadaaec92013-08-06 20:51:41 +00001924 def isIntelCompiler(self):
1925 """ Returns true if using an Intel (ICC) compiler, false otherwise. """
1926 return any([x in self.getCompiler() for x in ["icc", "icpc", "icl"]])
1927
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001928 def expectedCompilerVersion(self, compiler_version):
1929 """Returns True iff compiler_version[1] matches the current compiler version.
1930 Use compiler_version[0] to specify the operator used to determine if a match has occurred.
1931 Any operator other than the following defaults to an equality test:
1932 '>', '>=', "=>", '<', '<=', '=<', '!=', "!" or 'not'
1933 """
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001934 if (compiler_version == None):
1935 return True
1936 operator = str(compiler_version[0])
1937 version = compiler_version[1]
1938
1939 if (version == None):
1940 return True
1941 if (operator == '>'):
1942 return self.getCompilerVersion() > version
1943 if (operator == '>=' or operator == '=>'):
1944 return self.getCompilerVersion() >= version
1945 if (operator == '<'):
1946 return self.getCompilerVersion() < version
1947 if (operator == '<=' or operator == '=<'):
1948 return self.getCompilerVersion() <= version
1949 if (operator == '!=' or operator == '!' or operator == 'not'):
1950 return str(version) not in str(self.getCompilerVersion())
1951 return str(version) in str(self.getCompilerVersion())
1952
1953 def expectedCompiler(self, compilers):
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001954 """Returns True iff any element of compilers is a sub-string of the current compiler."""
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001955 if (compilers == None):
1956 return True
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001957
1958 for compiler in compilers:
1959 if compiler in self.getCompiler():
1960 return True
1961
1962 return False
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001963
Ying Chen7091c2c2015-04-21 01:15:47 +00001964 def expectedArch(self, archs):
1965 """Returns True iff any element of archs is a sub-string of the current architecture."""
1966 if (archs == None):
1967 return True
1968
1969 for arch in archs:
1970 if arch in self.getArchitecture():
1971 return True
1972
1973 return False
1974
Johnny Chenfb4264c2011-08-01 19:50:58 +00001975 def getRunOptions(self):
1976 """Command line option for -A and -C to run this test again, called from
1977 self.dumpSessionInfo()."""
1978 arch = self.getArchitecture()
1979 comp = self.getCompiler()
Johnny Chenb7bdd102011-08-24 19:48:51 +00001980 if arch:
1981 option_str = "-A " + arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001982 else:
Johnny Chenb7bdd102011-08-24 19:48:51 +00001983 option_str = ""
1984 if comp:
Johnny Chen531c0852012-03-16 20:44:00 +00001985 option_str += " -C " + comp
Johnny Chenb7bdd102011-08-24 19:48:51 +00001986 return option_str
Johnny Chenfb4264c2011-08-01 19:50:58 +00001987
1988 # ==================================================
1989 # Build methods supported through a plugin interface
1990 # ==================================================
1991
Ed Mastec97323e2014-04-01 18:47:58 +00001992 def getstdlibFlag(self):
1993 """ Returns the proper -stdlib flag, or empty if not required."""
Robert Flack4629c4b2015-05-15 18:54:32 +00001994 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Ed Mastec97323e2014-04-01 18:47:58 +00001995 stdlibflag = "-stdlib=libc++"
1996 else:
1997 stdlibflag = ""
1998 return stdlibflag
1999
Matt Kopec7663b3a2013-09-25 17:44:00 +00002000 def getstdFlag(self):
2001 """ Returns the proper stdflag. """
Daniel Malea55faa402013-05-02 21:44:31 +00002002 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
Daniel Malea0b7c6112013-05-06 19:31:31 +00002003 stdflag = "-std=c++0x"
Daniel Malea55faa402013-05-02 21:44:31 +00002004 else:
2005 stdflag = "-std=c++11"
Matt Kopec7663b3a2013-09-25 17:44:00 +00002006 return stdflag
2007
2008 def buildDriver(self, sources, exe_name):
2009 """ Platform-specific way to build a program that links with LLDB (via the liblldb.so
2010 or LLDB.framework).
2011 """
2012
2013 stdflag = self.getstdFlag()
Ed Mastec97323e2014-04-01 18:47:58 +00002014 stdlibflag = self.getstdlibFlag()
Greg Clayton22fd3b12015-10-26 17:52:16 +00002015
2016 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002017 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002018 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Daniel Malea55faa402013-05-02 21:44:31 +00002019 d = {'CXX_SOURCES' : sources,
2020 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002021 'CFLAGS_EXTRAS' : "%s %s" % (stdflag, stdlibflag),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002022 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2023 'LD_EXTRAS' : "%s -Wl,-rpath,%s" % (dsym, lib_dir),
Daniel Malea55faa402013-05-02 21:44:31 +00002024 }
Ed Maste372c24d2013-07-25 21:02:34 +00002025 elif sys.platform.startswith('freebsd') or sys.platform.startswith("linux") or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002026 d = {'CXX_SOURCES' : sources,
Daniel Malea55faa402013-05-02 21:44:31 +00002027 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002028 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002029 'LD_EXTRAS' : "-L%s -llldb" % lib_dir}
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002030 elif sys.platform.startswith('win'):
2031 d = {'CXX_SOURCES' : sources,
2032 'EXE' : exe_name,
2033 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002034 'LD_EXTRAS' : "-L%s -lliblldb" % os.environ["LLDB_IMPLIB_DIR"]}
Daniel Malea55faa402013-05-02 21:44:31 +00002035 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002036 print("Building LLDB Driver (%s) from sources %s" % (exe_name, sources))
Daniel Malea55faa402013-05-02 21:44:31 +00002037
2038 self.buildDefault(dictionary=d)
2039
Matt Kopec7663b3a2013-09-25 17:44:00 +00002040 def buildLibrary(self, sources, lib_name):
2041 """Platform specific way to build a default library. """
2042
2043 stdflag = self.getstdFlag()
2044
Greg Clayton22fd3b12015-10-26 17:52:16 +00002045 lib_dir = os.environ["LLDB_LIB_DIR"]
Robert Flack4629c4b2015-05-15 18:54:32 +00002046 if self.platformIsDarwin():
Greg Clayton22fd3b12015-10-26 17:52:16 +00002047 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Matt Kopec7663b3a2013-09-25 17:44:00 +00002048 d = {'DYLIB_CXX_SOURCES' : sources,
2049 'DYLIB_NAME' : lib_name,
2050 'CFLAGS_EXTRAS' : "%s -stdlib=libc++" % stdflag,
Greg Clayton22fd3b12015-10-26 17:52:16 +00002051 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2052 'LD_EXTRAS' : "%s -Wl,-rpath,%s -dynamiclib" % (dsym, lib_dir),
Matt Kopec7663b3a2013-09-25 17:44:00 +00002053 }
Robert Flack4629c4b2015-05-15 18:54:32 +00002054 elif self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux' or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Matt Kopec7663b3a2013-09-25 17:44:00 +00002055 d = {'DYLIB_CXX_SOURCES' : sources,
2056 'DYLIB_NAME' : lib_name,
2057 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002058 'LD_EXTRAS' : "-shared -L%s -llldb" % lib_dir}
Robert Flack4629c4b2015-05-15 18:54:32 +00002059 elif self.getPlatform() == 'windows':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002060 d = {'DYLIB_CXX_SOURCES' : sources,
2061 'DYLIB_NAME' : lib_name,
2062 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002063 'LD_EXTRAS' : "-shared -l%s\liblldb.lib" % self.os.environ["LLDB_IMPLIB_DIR"]}
Matt Kopec7663b3a2013-09-25 17:44:00 +00002064 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002065 print("Building LLDB Library (%s) from sources %s" % (lib_name, sources))
Matt Kopec7663b3a2013-09-25 17:44:00 +00002066
2067 self.buildDefault(dictionary=d)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002068
Daniel Malea55faa402013-05-02 21:44:31 +00002069 def buildProgram(self, sources, exe_name):
2070 """ Platform specific way to build an executable from C/C++ sources. """
2071 d = {'CXX_SOURCES' : sources,
2072 'EXE' : exe_name}
2073 self.buildDefault(dictionary=d)
2074
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002075 def buildDefault(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002076 """Platform specific way to build the default binaries."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002077 if lldb.skip_build_and_cleanup:
2078 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002079 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002080 if target_is_android():
2081 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002082 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002083 raise Exception("Don't know how to build default binary")
2084
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002085 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002086 """Platform specific way to build binaries with dsym info."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002087 if lldb.skip_build_and_cleanup:
2088 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002089 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002090 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002091 raise Exception("Don't know how to build binary with dsym")
2092
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002093 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002094 """Platform specific way to build binaries with dwarf maps."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002095 if lldb.skip_build_and_cleanup:
2096 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002097 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002098 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002099 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002100 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002101 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002102
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002103 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2104 """Platform specific way to build binaries with dwarf maps."""
2105 if lldb.skip_build_and_cleanup:
2106 return
2107 module = builder_module()
2108 if target_is_android():
2109 dictionary = append_android_envs(dictionary)
2110 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2111 raise Exception("Don't know how to build binary with dwo")
2112
Ryan Brown57bee1e2015-09-14 22:45:11 +00002113 def buildGo(self):
2114 """Build the default go binary.
2115 """
2116 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2117
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002118 def signBinary(self, binary_path):
2119 if sys.platform.startswith("darwin"):
2120 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2121 call(codesign_cmd, shell=True)
2122
Kuba Breckabeed8212014-09-04 01:03:18 +00002123 def findBuiltClang(self):
2124 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2125 paths_to_try = [
2126 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2127 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2128 "llvm-build/Release/x86_64/Release/bin/clang",
2129 "llvm-build/Debug/x86_64/Debug/bin/clang",
2130 ]
2131 lldb_root_path = os.path.join(os.path.dirname(__file__), "..")
2132 for p in paths_to_try:
2133 path = os.path.join(lldb_root_path, p)
2134 if os.path.exists(path):
2135 return path
Ilia Kd9953052015-03-12 07:19:41 +00002136
2137 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002138 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002139 if os.path.exists(path):
2140 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002141
2142 return os.environ["CC"]
2143
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002144 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002145 """ Returns a dictionary (which can be provided to build* functions above) which
2146 contains OS-specific build flags.
2147 """
2148 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002149 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002150
2151 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002152 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002153 use_libcxx = True
2154
2155 if use_libcxx and self.libcxxPath:
2156 cflags += "-stdlib=libc++ "
2157 if self.libcxxPath:
2158 libcxxInclude = os.path.join(self.libcxxPath, "include")
2159 libcxxLib = os.path.join(self.libcxxPath, "lib")
2160 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2161 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2162
Andrew Kaylor93132f52013-05-28 23:04:25 +00002163 if use_cpp11:
2164 cflags += "-std="
2165 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2166 cflags += "c++0x"
2167 else:
2168 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002169 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002170 cflags += " -stdlib=libc++"
2171 elif "clang" in self.getCompiler():
2172 cflags += " -stdlib=libstdc++"
2173
Andrew Kaylor93132f52013-05-28 23:04:25 +00002174 return {'CFLAGS_EXTRAS' : cflags,
2175 'LD_EXTRAS' : ldflags,
2176 }
2177
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002178 def cleanup(self, dictionary=None):
2179 """Platform specific way to do cleanup after build."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002180 if lldb.skip_build_and_cleanup:
2181 return
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002182 module = builder_module()
2183 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002184 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002185
Daniel Malea55faa402013-05-02 21:44:31 +00002186 def getLLDBLibraryEnvVal(self):
2187 """ Returns the path that the OS-specific library search environment variable
2188 (self.dylibPath) should be set to in order for a program to find the LLDB
2189 library. If an environment variable named self.dylibPath is already set,
2190 the new path is appended to it and returned.
2191 """
2192 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002193 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002194 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002195 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002196 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002197 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002198 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002199 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002200
Ed Maste437f8f62013-09-09 14:04:04 +00002201 def getLibcPlusPlusLibs(self):
Robert Flackfa5ad652015-05-13 20:17:34 +00002202 if self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux':
Ed Maste437f8f62013-09-09 14:04:04 +00002203 return ['libc++.so.1']
2204 else:
2205 return ['libc++.1.dylib','libc++abi.dylib']
2206
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002207# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2208# We change the test methods to create a new test method for each test for each debug info we are
2209# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2210# the new test method we remove the old method at the same time.
2211class LLDBTestCaseFactory(type):
2212 def __new__(cls, name, bases, attrs):
2213 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002214 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002215 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
2216 @dsym_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002217 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002218 def dsym_test_method(self, attrvalue=attrvalue):
2219 self.debug_info = "dsym"
2220 return attrvalue(self)
2221 dsym_method_name = attrname + "_dsym"
2222 dsym_test_method.__name__ = dsym_method_name
2223 newattrs[dsym_method_name] = dsym_test_method
2224
2225 @dwarf_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002226 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002227 def dwarf_test_method(self, attrvalue=attrvalue):
2228 self.debug_info = "dwarf"
2229 return attrvalue(self)
2230 dwarf_method_name = attrname + "_dwarf"
2231 dwarf_test_method.__name__ = dwarf_method_name
2232 newattrs[dwarf_method_name] = dwarf_test_method
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002233
2234 @dwo_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002235 @wraps(attrvalue)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002236 def dwo_test_method(self, attrvalue=attrvalue):
2237 self.debug_info = "dwo"
2238 return attrvalue(self)
2239 dwo_method_name = attrname + "_dwo"
2240 dwo_test_method.__name__ = dwo_method_name
2241 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002242 else:
2243 newattrs[attrname] = attrvalue
2244 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2245
Zachary Turner43a01e42015-10-20 21:06:05 +00002246# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2247@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002248class TestBase(Base):
2249 """
2250 This abstract base class is meant to be subclassed. It provides default
2251 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2252 among other things.
2253
2254 Important things for test class writers:
2255
2256 - Overwrite the mydir class attribute, otherwise your test class won't
2257 run. It specifies the relative directory to the top level 'test' so
2258 the test harness can change to the correct working directory before
2259 running your test.
2260
2261 - The setUp method sets up things to facilitate subsequent interactions
2262 with the debugger as part of the test. These include:
2263 - populate the test method name
2264 - create/get a debugger set with synchronous mode (self.dbg)
2265 - get the command interpreter from with the debugger (self.ci)
2266 - create a result object for use with the command interpreter
2267 (self.res)
2268 - plus other stuffs
2269
2270 - The tearDown method tries to perform some necessary cleanup on behalf
2271 of the test to return the debugger to a good state for the next test.
2272 These include:
2273 - execute any tearDown hooks registered by the test method with
2274 TestBase.addTearDownHook(); examples can be found in
2275 settings/TestSettings.py
2276 - kill the inferior process associated with each target, if any,
2277 and, then delete the target from the debugger's target list
2278 - perform build cleanup before running the next test method in the
2279 same test class; examples of registering for this service can be
2280 found in types/TestIntegerTypes.py with the call:
2281 - self.setTearDownCleanup(dictionary=d)
2282
2283 - Similarly setUpClass and tearDownClass perform classwise setup and
2284 teardown fixtures. The tearDownClass method invokes a default build
2285 cleanup for the entire test class; also, subclasses can implement the
2286 classmethod classCleanup(cls) to perform special class cleanup action.
2287
2288 - The instance methods runCmd and expect are used heavily by existing
2289 test cases to send a command to the command interpreter and to perform
2290 string/pattern matching on the output of such command execution. The
2291 expect method also provides a mode to peform string/pattern matching
2292 without running a command.
2293
2294 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2295 build the binaries used during a particular test scenario. A plugin
2296 should be provided for the sys.platform running the test suite. The
2297 Mac OS X implementation is located in plugins/darwin.py.
2298 """
2299
2300 # Maximum allowed attempts when launching the inferior process.
2301 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2302 maxLaunchCount = 3;
2303
2304 # Time to wait before the next launching attempt in second(s).
2305 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2306 timeWaitNextLaunch = 1.0;
2307
2308 def doDelay(self):
2309 """See option -w of dotest.py."""
2310 if ("LLDB_WAIT_BETWEEN_TEST_CASES" in os.environ and
2311 os.environ["LLDB_WAIT_BETWEEN_TEST_CASES"] == 'YES'):
2312 waitTime = 1.0
2313 if "LLDB_TIME_WAIT_BETWEEN_TEST_CASES" in os.environ:
2314 waitTime = float(os.environ["LLDB_TIME_WAIT_BETWEEN_TEST_CASES"])
2315 time.sleep(waitTime)
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 Chena74bb0a2011-08-01 18:46:13 +00002348 try:
2349 if lldb.blacklist:
2350 className = self.__class__.__name__
2351 classAndMethodName = "%s.%s" % (className, self._testMethodName)
2352 if className in lldb.blacklist:
2353 self.skipTest(lldb.blacklist.get(className))
2354 elif classAndMethodName in lldb.blacklist:
2355 self.skipTest(lldb.blacklist.get(classAndMethodName))
2356 except AttributeError:
2357 pass
2358
Johnny Chened492022011-06-21 00:53:00 +00002359 # Insert some delay between successive test cases if specified.
2360 self.doDelay()
Johnny Chen0ed37c92010-10-07 02:04:14 +00002361
Johnny Chenf2b70232010-08-25 18:49:48 +00002362 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2363 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2364
Johnny Chen430eb762010-10-19 16:00:42 +00002365 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002366 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002367
Daniel Maleae0f8f572013-08-26 23:57:52 +00002368 #
2369 # Warning: MAJOR HACK AHEAD!
2370 # If we are running testsuite remotely (by checking lldb.lldbtest_remote_sandbox),
2371 # redefine the self.dbg.CreateTarget(filename) method to execute a "file filename"
2372 # command, instead. See also runCmd() where it decorates the "file filename" call
2373 # with additional functionality when running testsuite remotely.
2374 #
2375 if lldb.lldbtest_remote_sandbox:
2376 def DecoratedCreateTarget(arg):
2377 self.runCmd("file %s" % arg)
2378 target = self.dbg.GetSelectedTarget()
2379 #
Greg Claytonc6947512013-12-13 19:18:59 +00002380 # SBtarget.LaunchSimple () currently not working for remote platform?
Daniel Maleae0f8f572013-08-26 23:57:52 +00002381 # johnny @ 04/23/2012
2382 #
2383 def DecoratedLaunchSimple(argv, envp, wd):
2384 self.runCmd("run")
2385 return target.GetProcess()
2386 target.LaunchSimple = DecoratedLaunchSimple
2387
2388 return target
2389 self.dbg.CreateTarget = DecoratedCreateTarget
2390 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002391 print("self.dbg.Create is redefined to:\n%s" % getsource_if_available(DecoratedCreateTarget))
Daniel Maleae0f8f572013-08-26 23:57:52 +00002392
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002393 # We want our debugger to be synchronous.
2394 self.dbg.SetAsync(False)
2395
2396 # Retrieve the associated command interpreter instance.
2397 self.ci = self.dbg.GetCommandInterpreter()
2398 if not self.ci:
2399 raise Exception('Could not get the command interpreter')
2400
2401 # And the result object.
2402 self.res = lldb.SBCommandReturnObject()
2403
Johnny Chen44d24972012-04-16 18:55:15 +00002404 # Run global pre-flight code, if defined via the config file.
2405 if lldb.pre_flight:
2406 lldb.pre_flight(self)
2407
Enrico Granatabd0998a2015-10-02 22:53:32 +00002408 if lldb.remote_platform and lldb.remote_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002409 remote_test_dir = lldbutil.join_remote_paths(
2410 lldb.remote_platform_working_dir,
2411 self.getArchitecture(),
2412 str(self.test_number),
2413 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002414 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002415 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002416 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002417
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002418 # This function removes all files from the current working directory while leaving
2419 # the directories in place. The cleaup is required to reduce the disk space required
2420 # by the test suit while leaving the directories untached is neccessary because
2421 # sub-directories might belong to an other test
2422 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002423 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002424 # TODO: Replace the heuristic to remove the files with a logic what collects the
2425 # list of files we have to remove during test runs.
2426 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002427 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002428 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002429 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002430 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002431
Greg Clayton35c91342014-11-17 18:40:27 +00002432 def registerSharedLibrariesWithTarget(self, target, shlibs):
2433 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2434
2435 Any modules in the target that have their remote install file specification set will
2436 get uploaded to the remote host. This function registers the local copies of the
2437 shared libraries with the target and sets their remote install locations so they will
2438 be uploaded when the target is run.
2439 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002440 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002441 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002442
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002443 shlib_environment_var = self.platformContext.shlib_environment_var
2444 shlib_prefix = self.platformContext.shlib_prefix
2445 shlib_extension = '.' + self.platformContext.shlib_extension
2446
2447 working_dir = self.get_process_working_directory()
2448 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2449 # Add any shared libraries to our target if remote so they get
2450 # uploaded into the working directory on the remote side
2451 for name in shlibs:
2452 # The path can be a full path to a shared library, or a make file name like "Foo" for
2453 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2454 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2455 # of the shared library accordingly
2456 if os.path.exists(name):
2457 local_shlib_path = name # name is the full path to the local shared library
2458 else:
2459 # Check relative names
2460 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2461 if not os.path.exists(local_shlib_path):
2462 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002463 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002464 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002465
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002466 # Make sure we found the local shared library in the above code
2467 self.assertTrue(os.path.exists(local_shlib_path))
2468
2469 # Add the shared library to our target
2470 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2471 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002472 # We must set the remote install location if we want the shared library
2473 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002474 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002475 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002476
2477 return environment
2478
Enrico Granata44818162012-10-24 01:23:57 +00002479 # utility methods that tests can use to access the current objects
2480 def target(self):
2481 if not self.dbg:
2482 raise Exception('Invalid debugger instance')
2483 return self.dbg.GetSelectedTarget()
2484
2485 def process(self):
2486 if not self.dbg:
2487 raise Exception('Invalid debugger instance')
2488 return self.dbg.GetSelectedTarget().GetProcess()
2489
2490 def thread(self):
2491 if not self.dbg:
2492 raise Exception('Invalid debugger instance')
2493 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2494
2495 def frame(self):
2496 if not self.dbg:
2497 raise Exception('Invalid debugger instance')
2498 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2499
Greg Claytonc6947512013-12-13 19:18:59 +00002500 def get_process_working_directory(self):
2501 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2502 if lldb.remote_platform:
2503 # Remote tests set the platform working directory up in TestBase.setUp()
2504 return lldb.remote_platform.GetWorkingDirectory()
2505 else:
2506 # local tests change directory into each test subdirectory
2507 return os.getcwd()
2508
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002509 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002510 #import traceback
2511 #traceback.print_stack()
2512
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002513 # Ensure all the references to SB objects have gone away so that we can
2514 # be sure that all test-specific resources have been freed before we
2515 # attempt to delete the targets.
2516 gc.collect()
2517
Johnny Chen3794ad92011-06-15 21:24:24 +00002518 # Delete the target(s) from the debugger as a general cleanup step.
2519 # This includes terminating the process for each target, if any.
2520 # We'd like to reuse the debugger for our next test without incurring
2521 # the initialization overhead.
2522 targets = []
2523 for target in self.dbg:
2524 if target:
2525 targets.append(target)
2526 process = target.GetProcess()
2527 if process:
2528 rc = self.invoke(process, "Kill")
2529 self.assertTrue(rc.Success(), PROCESS_KILLED)
2530 for target in targets:
2531 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002532
Johnny Chen44d24972012-04-16 18:55:15 +00002533 # Run global post-flight code, if defined via the config file.
2534 if lldb.post_flight:
2535 lldb.post_flight(self)
2536
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002537 # Do this last, to make sure it's in reverse order from how we setup.
2538 Base.tearDown(self)
2539
Zachary Turner95812042015-03-26 18:54:21 +00002540 # This must be the last statement, otherwise teardown hooks or other
2541 # lines might depend on this still being active.
2542 del self.dbg
2543
Johnny Chen86268e42011-09-30 21:48:35 +00002544 def switch_to_thread_with_stop_reason(self, stop_reason):
2545 """
2546 Run the 'thread list' command, and select the thread with stop reason as
2547 'stop_reason'. If no such thread exists, no select action is done.
2548 """
2549 from lldbutil import stop_reason_to_str
2550 self.runCmd('thread list')
2551 output = self.res.GetOutput()
2552 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2553 stop_reason_to_str(stop_reason))
2554 for line in output.splitlines():
2555 matched = thread_line_pattern.match(line)
2556 if matched:
2557 self.runCmd('thread select %s' % matched.group(1))
2558
Enrico Granata7594f142013-06-17 22:51:50 +00002559 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002560 """
2561 Ask the command interpreter to handle the command and then check its
2562 return status.
2563 """
2564 # Fail fast if 'cmd' is not meaningful.
2565 if not cmd or len(cmd) == 0:
2566 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002567
Johnny Chen8d55a342010-08-31 17:42:54 +00002568 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002569
Daniel Maleae0f8f572013-08-26 23:57:52 +00002570 # This is an opportunity to insert the 'platform target-install' command if we are told so
2571 # via the settig of lldb.lldbtest_remote_sandbox.
2572 if cmd.startswith("target create "):
2573 cmd = cmd.replace("target create ", "file ")
2574 if cmd.startswith("file ") and lldb.lldbtest_remote_sandbox:
2575 with recording(self, trace) as sbuf:
2576 the_rest = cmd.split("file ")[1]
2577 # Split the rest of the command line.
2578 atoms = the_rest.split()
2579 #
2580 # NOTE: This assumes that the options, if any, follow the file command,
2581 # instead of follow the specified target.
2582 #
2583 target = atoms[-1]
2584 # Now let's get the absolute pathname of our target.
2585 abs_target = os.path.abspath(target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002586 print("Found a file command, target (with absolute pathname)=%s" % abs_target, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002587 fpath, fname = os.path.split(abs_target)
2588 parent_dir = os.path.split(fpath)[0]
2589 platform_target_install_command = 'platform target-install %s %s' % (fpath, lldb.lldbtest_remote_sandbox)
Zachary Turnerff890da2015-10-19 23:45:41 +00002590 print("Insert this command to be run first: %s" % platform_target_install_command, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002591 self.ci.HandleCommand(platform_target_install_command, self.res)
2592 # And this is the file command we want to execute, instead.
2593 #
2594 # Warning: SIDE EFFECT AHEAD!!!
2595 # Populate the remote executable pathname into the lldb namespace,
2596 # so that test cases can grab this thing out of the namespace.
2597 #
2598 lldb.lldbtest_remote_sandboxed_executable = abs_target.replace(parent_dir, lldb.lldbtest_remote_sandbox)
2599 cmd = "file -P %s %s %s" % (lldb.lldbtest_remote_sandboxed_executable, the_rest.replace(target, ''), abs_target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002600 print("And this is the replaced file command: %s" % cmd, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002601
Johnny Chen63dfb272010-09-01 00:15:19 +00002602 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002603
Johnny Chen63dfb272010-09-01 00:15:19 +00002604 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002605 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002606
Johnny Chen150c3cc2010-10-15 01:18:29 +00002607 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002608 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002609 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002610 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002611 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002612 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002613 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002614 print("runCmd failed!", file=sbuf)
2615 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002616
Johnny Chenff3d01d2010-08-20 21:03:09 +00002617 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002618 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002619 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002620 # For process launch, wait some time before possible next try.
2621 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002622 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002623 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002624
Johnny Chen27f212d2010-08-19 23:26:59 +00002625 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002626 self.assertTrue(self.res.Succeeded(),
2627 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002628
Jim Ingham63dfc722012-09-22 00:05:11 +00002629 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2630 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2631
2632 Otherwise, all the arguments have the same meanings as for the expect function"""
2633
2634 trace = (True if traceAlways else trace)
2635
2636 if exe:
2637 # First run the command. If we are expecting error, set check=False.
2638 # Pass the assert message along since it provides more semantic info.
2639 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2640
2641 # Then compare the output against expected strings.
2642 output = self.res.GetError() if error else self.res.GetOutput()
2643
2644 # If error is True, the API client expects the command to fail!
2645 if error:
2646 self.assertFalse(self.res.Succeeded(),
2647 "Command '" + str + "' is expected to fail!")
2648 else:
2649 # No execution required, just compare str against the golden input.
2650 output = str
2651 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002652 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002653
2654 # The heading says either "Expecting" or "Not expecting".
2655 heading = "Expecting" if matching else "Not expecting"
2656
2657 for pattern in patterns:
2658 # Match Objects always have a boolean value of True.
2659 match_object = re.search(pattern, output)
2660 matched = bool(match_object)
2661 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002662 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2663 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002664 if matched:
2665 break
2666
2667 self.assertTrue(matched if matching else not matched,
2668 msg if msg else EXP_MSG(str, exe))
2669
2670 return match_object
2671
Enrico Granata7594f142013-06-17 22:51:50 +00002672 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 +00002673 """
2674 Similar to runCmd; with additional expect style output matching ability.
2675
2676 Ask the command interpreter to handle the command and then check its
2677 return status. The 'msg' parameter specifies an informational assert
2678 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002679 'startstr', matches the substrings contained in 'substrs', and regexp
2680 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002681
2682 If the keyword argument error is set to True, it signifies that the API
2683 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002684 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002685 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002686
2687 If the keyword argument matching is set to False, it signifies that the API
2688 client is expecting the output of the command not to match the golden
2689 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002690
2691 Finally, the required argument 'str' represents the lldb command to be
2692 sent to the command interpreter. In case the keyword argument 'exe' is
2693 set to False, the 'str' is treated as a string to be matched/not-matched
2694 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002695 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002696 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002697
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002698 if exe:
2699 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002700 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002701 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002702
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002703 # Then compare the output against expected strings.
2704 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002705
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002706 # If error is True, the API client expects the command to fail!
2707 if error:
2708 self.assertFalse(self.res.Succeeded(),
2709 "Command '" + str + "' is expected to fail!")
2710 else:
2711 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002712 if isinstance(str,lldb.SBCommandReturnObject):
2713 output = str.GetOutput()
2714 else:
2715 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002716 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002717 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002718
Johnny Chenea88e942010-09-21 21:08:53 +00002719 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002720 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002721
2722 # Start from the startstr, if specified.
2723 # If there's no startstr, set the initial state appropriately.
2724 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002725
Johnny Chen150c3cc2010-10-15 01:18:29 +00002726 if startstr:
2727 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002728 print("%s start string: %s" % (heading, startstr), file=sbuf)
2729 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002730
Johnny Chen86268e42011-09-30 21:48:35 +00002731 # Look for endstr, if specified.
2732 keepgoing = matched if matching else not matched
2733 if endstr:
2734 matched = output.endswith(endstr)
2735 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002736 print("%s end string: %s" % (heading, endstr), file=sbuf)
2737 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002738
Johnny Chenea88e942010-09-21 21:08:53 +00002739 # Look for sub strings, if specified.
2740 keepgoing = matched if matching else not matched
2741 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002742 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002743 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002744 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002745 print("%s sub string: %s" % (heading, str), file=sbuf)
2746 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002747 keepgoing = matched if matching else not matched
2748 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002749 break
2750
Johnny Chenea88e942010-09-21 21:08:53 +00002751 # Search for regular expression patterns, if specified.
2752 keepgoing = matched if matching else not matched
2753 if patterns and keepgoing:
2754 for pattern in patterns:
2755 # Match Objects always have a boolean value of True.
2756 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002757 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002758 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2759 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002760 keepgoing = matched if matching else not matched
2761 if not keepgoing:
2762 break
Johnny Chenea88e942010-09-21 21:08:53 +00002763
2764 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002765 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002766
Johnny Chenf3c59232010-08-25 22:52:45 +00002767 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002768 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002769 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002770
2771 method = getattr(obj, name)
2772 import inspect
2773 self.assertTrue(inspect.ismethod(method),
2774 name + "is a method name of object: " + str(obj))
2775 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002776 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002777 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002778 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002779
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002780 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2781 """Platform specific way to build the default binaries."""
2782 if lldb.skip_build_and_cleanup:
2783 return
2784 module = builder_module()
2785 if target_is_android():
2786 dictionary = append_android_envs(dictionary)
2787 if self.debug_info is None:
2788 return self.buildDefault(architecture, compiler, dictionary, clean)
2789 elif self.debug_info == "dsym":
2790 return self.buildDsym(architecture, compiler, dictionary, clean)
2791 elif self.debug_info == "dwarf":
2792 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002793 elif self.debug_info == "dwo":
2794 return self.buildDwo(architecture, compiler, dictionary, clean)
2795 else:
2796 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002797
Johnny Chenf359cf22011-05-27 23:36:52 +00002798 # =================================================
2799 # Misc. helper methods for debugging test execution
2800 # =================================================
2801
Johnny Chen56b92a72011-07-11 19:15:11 +00002802 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002803 """Debug print a SBValue object, if traceAlways is True."""
Johnny Chende90f1d2011-04-27 17:43:07 +00002804 from lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002805
Johnny Chen8d55a342010-08-31 17:42:54 +00002806 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002807 return
2808
2809 err = sys.stderr
2810 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002811 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2812 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2813 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2814 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2815 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2816 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2817 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2818 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2819 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002820
Johnny Chen36c5eb12011-08-05 20:17:27 +00002821 def DebugSBType(self, type):
2822 """Debug print a SBType object, if traceAlways is True."""
2823 if not traceAlways:
2824 return
2825
2826 err = sys.stderr
2827 err.write(type.GetName() + ":\n")
2828 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2829 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2830 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2831
Johnny Chenb877f1e2011-03-12 01:18:19 +00002832 def DebugPExpect(self, child):
2833 """Debug the spwaned pexpect object."""
2834 if not traceAlways:
2835 return
2836
Zachary Turnerff890da2015-10-19 23:45:41 +00002837 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002838
2839 @classmethod
2840 def RemoveTempFile(cls, file):
2841 if os.path.exists(file):
2842 os.remove(file)