blob: 015615bd875b6e17258672ae9f32c1ce0ea16536 [file] [log] [blame]
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001"""
2LLDB module which provides the abstract base class of lldb test case.
3
4The concrete subclass can override lldbtest.TesBase in order to inherit the
5common behavior for unitest.TestCase.setUp/tearDown implemented in this file.
6
7The subclass should override the attribute mydir in order for the python runtime
8to locate the individual test cases when running as part of a large test suite
9or when running each test case as a separate python invocation.
10
11./dotest.py provides a test driver which sets up the environment to run the
Johnny Chenc98892e2012-05-16 20:41:28 +000012entire of part of the test suite . Example:
Johnny Chenbf6ffa32010-07-03 03:41:59 +000013
Johnny Chenc98892e2012-05-16 20:41:28 +000014# Exercises the test suite in the types directory....
15/Volumes/data/lldb/svn/ToT/test $ ./dotest.py -A x86_64 types
Johnny Chen57b47382010-09-02 22:25:47 +000016...
Johnny Chend0190a62010-08-23 17:10:44 +000017
Johnny Chenc98892e2012-05-16 20:41:28 +000018Session logs for test failures/errors/unexpected successes will go into directory '2012-05-16-13_35_42'
19Command invoked: python ./dotest.py -A x86_64 types
20compilers=['clang']
Johnny Chend0190a62010-08-23 17:10:44 +000021
Johnny Chenc98892e2012-05-16 20:41:28 +000022Configuration: arch=x86_64 compiler=clang
Johnny Chend0190a62010-08-23 17:10:44 +000023----------------------------------------------------------------------
Johnny Chenc98892e2012-05-16 20:41:28 +000024Collected 72 tests
25
26........................................................................
27----------------------------------------------------------------------
28Ran 72 tests in 135.468s
Johnny Chend0190a62010-08-23 17:10:44 +000029
30OK
Johnny Chenbf6ffa32010-07-03 03:41:59 +000031$
32"""
33
Zachary Turnerff890da2015-10-19 23:45:41 +000034from __future__ import print_function
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000035from __future__ import absolute_import
Zachary Turnerff890da2015-10-19 23:45:41 +000036
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000037# System modules
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +000038import abc
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000039import collections
Zachary Turnerabdb8392015-11-16 22:40:30 +000040from distutils.version import LooseVersion
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +000041import gc
Vince Harron9753dd92015-05-10 15:22:09 +000042import glob
Zachary Turnerba105702015-11-16 23:58:20 +000043import inspect
Zachary Turner80124962016-01-22 23:54:49 +000044import io
Johnny Chen90312a82010-09-21 22:34:45 +000045import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000046import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000047import re
Daniel Malea69207462013-06-05 21:07:02 +000048import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000049from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000050import time
Johnny Chena33a93c2010-08-30 23:08:52 +000051import types
Zachary Turner43a01e42015-10-20 21:06:05 +000052
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000053# Third-party modules
54import unittest2
Zachary Turner43a01e42015-10-20 21:06:05 +000055from six import add_metaclass
Zachary Turner814236d2015-10-21 17:48:52 +000056from six import StringIO as SixStringIO
57from six.moves.urllib import parse as urlparse
Zachary Turnercd236b82015-10-26 18:48:24 +000058import six
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000059
60# LLDB modules
61import lldb
Zachary Turner606e3a52015-12-08 01:15:30 +000062from . import configuration
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000063from . import lldbtest_config
64from . import lldbutil
65from . import test_categories
Siva Chandra8af91662015-06-05 00:22:49 +000066
Todd Fiala9187f272015-12-11 18:06:47 +000067from .result_formatter import EventBuilder
68
Vince Harron85d19652015-05-21 19:09:29 +000069# dosep.py starts lots and lots of dotest instances
70# This option helps you find if two (or more) dotest instances are using the same
71# directory at the same time
72# Enable it to cause test failures and stderr messages if dotest instances try to run in
73# the same directory simultaneously
74# it is disabled by default because it litters the test directories with ".dirlock" files
75debug_confirm_directory_exclusivity = False
76
Johnny Chen707b3c92010-10-11 22:25:46 +000077# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000078# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000079
80# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000081if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
82 traceAlways = True
83else:
84 traceAlways = False
85
Johnny Chen707b3c92010-10-11 22:25:46 +000086# By default, doCleanup is True.
87if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
88 doCleanup = False
89else:
90 doCleanup = True
91
Johnny Chen8d55a342010-08-31 17:42:54 +000092
Johnny Chen00778092010-08-09 22:01:17 +000093#
94# Some commonly used assert messages.
95#
96
Johnny Chenaa902922010-09-17 22:45:27 +000097COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
98
Johnny Chen00778092010-08-09 22:01:17 +000099CURRENT_EXECUTABLE_SET = "Current executable set successfully"
100
Johnny Chen7d1d7532010-09-02 21:23:12 +0000101PROCESS_IS_VALID = "Process is valid"
102
103PROCESS_KILLED = "Process is killed successfully"
104
Johnny Chend5f66fc2010-12-23 01:12:19 +0000105PROCESS_EXITED = "Process exited successfully"
106
107PROCESS_STOPPED = "Process status should be stopped"
108
Sean Callanan05834cd2015-07-01 23:56:30 +0000109RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000110
Johnny Chen17941842010-08-09 23:44:24 +0000111RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000112
Johnny Chen67af43f2010-10-05 19:27:32 +0000113BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
114
Johnny Chen17941842010-08-09 23:44:24 +0000115BREAKPOINT_CREATED = "Breakpoint created successfully"
116
Johnny Chenf10af382010-12-04 00:07:24 +0000117BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
118
Johnny Chene76896c2010-08-17 21:33:31 +0000119BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
120
Johnny Chen17941842010-08-09 23:44:24 +0000121BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000122
Johnny Chen703dbd02010-09-30 17:06:24 +0000123BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
124
Johnny Chen164f1e12010-10-15 18:07:09 +0000125BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
126
Greg Clayton5db6b792012-10-24 18:24:14 +0000127MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
128
Johnny Chen89109ed12011-06-27 20:05:23 +0000129OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
130
Johnny Chen5b3a3572010-12-09 18:22:12 +0000131SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
132
Johnny Chenc70b02a2010-09-22 23:00:20 +0000133STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
134
Johnny Chen1691a162011-04-15 16:44:48 +0000135STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
136
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000137STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
138
Johnny Chen5d6c4642010-11-10 23:46:38 +0000139STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000140
Johnny Chen5d6c4642010-11-10 23:46:38 +0000141STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
142 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000143
Johnny Chen2e431ce2010-10-20 18:38:48 +0000144STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
145
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000146STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
147
Johnny Chenc066ab42010-10-14 01:22:03 +0000148STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
149
Johnny Chen00778092010-08-09 22:01:17 +0000150STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
151
Johnny Chenf68cc122011-09-15 21:09:59 +0000152STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
153
Johnny Chen3c884a02010-08-24 22:07:56 +0000154DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
155
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000156VALID_BREAKPOINT = "Got a valid breakpoint"
157
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000158VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
159
Johnny Chen7209d84f2011-05-06 23:26:12 +0000160VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
161
Johnny Chen5ee88192010-08-27 23:47:36 +0000162VALID_FILESPEC = "Got a valid filespec"
163
Johnny Chen025d1b82010-12-08 01:25:21 +0000164VALID_MODULE = "Got a valid module"
165
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000166VALID_PROCESS = "Got a valid process"
167
Johnny Chen025d1b82010-12-08 01:25:21 +0000168VALID_SYMBOL = "Got a valid symbol"
169
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000170VALID_TARGET = "Got a valid target"
171
Matthew Gardinerc928de32014-10-22 07:22:56 +0000172VALID_PLATFORM = "Got a valid platform"
173
Johnny Chen15f247a2012-02-03 20:43:00 +0000174VALID_TYPE = "Got a valid type"
175
Johnny Chen5819ab42011-07-15 22:28:10 +0000176VALID_VARIABLE = "Got a valid variable"
177
Johnny Chen981463d2010-08-25 19:00:04 +0000178VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000179
Johnny Chenf68cc122011-09-15 21:09:59 +0000180WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000181
Sean Callanan05834cd2015-07-01 23:56:30 +0000182def CMD_MSG(str):
183 '''A generic "Command '%s' returns successfully" message generator.'''
184 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000185
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000186def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000187 '''A generic message generator for the completion mechanism.'''
188 return "'%s' successfully completes to '%s'" % (str_before, str_after)
189
Johnny Chenc0c67f22010-11-09 18:42:22 +0000190def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000191 '''A generic "'%s' returns expected result" message generator if exe.
192 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000193 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000194
Johnny Chen3343f042010-10-19 19:11:38 +0000195def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000196 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000197 return "Value of setting '%s' is correct" % setting
198
Johnny Chen27c41232010-08-26 21:49:29 +0000199def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000200 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000201 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000202
Johnny Chen47ceb032010-10-11 23:52:19 +0000203def line_number(filename, string_to_match):
204 """Helper function to return the line number of the first matched string."""
Zachary Turner80124962016-01-22 23:54:49 +0000205 with io.open(filename, mode='r', encoding="utf-8") as f:
Johnny Chen47ceb032010-10-11 23:52:19 +0000206 for i, line in enumerate(f):
207 if line.find(string_to_match) != -1:
208 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000209 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000210 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000211
Johnny Chen67af43f2010-10-05 19:27:32 +0000212def pointer_size():
213 """Return the pointer size of the host system."""
214 import ctypes
215 a_pointer = ctypes.c_void_p(0xffff)
216 return 8 * ctypes.sizeof(a_pointer)
217
Johnny Chen57816732012-02-09 02:01:59 +0000218def is_exe(fpath):
219 """Returns true if fpath is an executable."""
220 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
221
222def which(program):
223 """Returns the full path to a program; None otherwise."""
224 fpath, fname = os.path.split(program)
225 if fpath:
226 if is_exe(program):
227 return program
228 else:
229 for path in os.environ["PATH"].split(os.pathsep):
230 exe_file = os.path.join(path, program)
231 if is_exe(exe_file):
232 return exe_file
233 return None
234
Zachary Turner814236d2015-10-21 17:48:52 +0000235class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000236 """
237 A nice little context manager for recording the debugger interactions into
238 our session object. If trace flag is ON, it also emits the interactions
239 into the stderr.
240 """
241 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000242 """Create a SixStringIO instance; record the session obj and trace flag."""
243 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000244 # The test might not have undergone the 'setUp(self)' phase yet, so that
245 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000246 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000247 self.trace = trace
248
249 def __enter__(self):
250 """
251 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000252 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000253 """
254 return self
255
256 def __exit__(self, type, value, tb):
257 """
258 Context management protocol on exit from the body of the with statement.
259 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000260 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000261 """
262 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000263 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000264 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000265 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000266 self.close()
267
Zachary Turner43a01e42015-10-20 21:06:05 +0000268@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000269class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000270
271 @abc.abstractproperty
272 def pid(self):
273 """Returns process PID if has been launched already."""
274
275 @abc.abstractmethod
276 def launch(self, executable, args):
277 """Launches new process with given executable and args."""
278
279 @abc.abstractmethod
280 def terminate(self):
281 """Terminates previously launched process.."""
282
283class _LocalProcess(_BaseProcess):
284
285 def __init__(self, trace_on):
286 self._proc = None
287 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000288 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000289
290 @property
291 def pid(self):
292 return self._proc.pid
293
294 def launch(self, executable, args):
295 self._proc = Popen([executable] + args,
296 stdout = open(os.devnull) if not self._trace_on else None,
297 stdin = PIPE)
298
299 def terminate(self):
300 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000301 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000302 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
303 for sig in signals_to_try:
304 try:
305 self._proc.send_signal(getattr(signal, sig))
306 time.sleep(self._delayafterterminate)
307 if self._proc.poll() != None:
308 return
309 except ValueError:
310 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000311 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000312 time.sleep(self._delayafterterminate)
313 if self._proc.poll() != None:
314 return
315 self._proc.kill()
316 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000317
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000318 def poll(self):
319 return self._proc.poll()
320
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000321class _RemoteProcess(_BaseProcess):
322
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000323 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000324 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000325 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000326
327 @property
328 def pid(self):
329 return self._pid
330
331 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000332 if self._install_remote:
333 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000334 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000335
336 dst_file_spec = lldb.SBFileSpec(dst_path, False)
337 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
338 if err.Fail():
339 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
340 else:
341 dst_path = executable
342 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000343
344 launch_info = lldb.SBLaunchInfo(args)
345 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000346 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000347
348 # Redirect stdout and stderr to /dev/null
349 launch_info.AddSuppressFileAction(1, False, True)
350 launch_info.AddSuppressFileAction(2, False, True)
351
352 err = lldb.remote_platform.Launch(launch_info)
353 if err.Fail():
354 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
355 self._pid = launch_info.GetProcessID()
356
357 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000358 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000359
Johnny Chen690fcef2010-10-15 23:55:05 +0000360# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000361# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000362def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000363 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000364
365 If the exit code was non-zero it raises a CalledProcessError. The
366 CalledProcessError object will have the return code in the returncode
367 attribute and output in the output attribute.
368
369 The arguments are the same as for the Popen constructor. Example:
370
371 >>> check_output(["ls", "-l", "/dev/null"])
372 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
373
374 The stdout argument is not allowed as it is used internally.
375 To capture standard error in the result, use stderr=STDOUT.
376
377 >>> check_output(["/bin/sh", "-c",
378 ... "ls -l non_existent_file ; exit 0"],
379 ... stderr=STDOUT)
380 'ls: non_existent_file: No such file or directory\n'
381 """
382
383 # Assign the sender object to variable 'test' and remove it from kwargs.
384 test = kwargs.pop('sender', None)
385
Zachary Turner9ef307b2014-07-22 16:19:29 +0000386 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
387 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000388 output = ""
389 error = ""
390 for shellCommand in commandList:
391 if 'stdout' in kwargs:
392 raise ValueError('stdout argument not allowed, it will be overridden.')
393 if 'shell' in kwargs and kwargs['shell']==False:
394 raise ValueError('shell=False not allowed')
Zachary Turner48ef8d4c2015-11-18 18:40:16 +0000395 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, universal_newlines=True, **kwargs)
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000396 pid = process.pid
397 this_output, this_error = process.communicate()
398 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000399
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000400 # Enable trace on failure return while tracking down FreeBSD buildbot issues
401 trace = traceAlways
402 if not trace and retcode and sys.platform.startswith("freebsd"):
403 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000404
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000405 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000406 print(file=sbuf)
407 print("os command:", shellCommand, file=sbuf)
408 print("with pid:", pid, file=sbuf)
409 print("stdout:", this_output, file=sbuf)
410 print("stderr:", this_error, file=sbuf)
411 print("retcode:", retcode, file=sbuf)
412 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000413
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000414 if retcode:
415 cmd = kwargs.get("args")
416 if cmd is None:
417 cmd = shellCommand
418 raise CalledProcessError(retcode, cmd)
419 output = output + this_output
420 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000421 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000422
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000423def getsource_if_available(obj):
424 """
425 Return the text of the source code for an object if available. Otherwise,
426 a print representation is returned.
427 """
428 import inspect
429 try:
430 return inspect.getsource(obj)
431 except:
432 return repr(obj)
433
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000434def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000435 if sys.platform.startswith("freebsd"):
436 return __import__("builder_freebsd")
Kamil Rytarowski0b655da2015-12-05 18:46:56 +0000437 if sys.platform.startswith("netbsd"):
438 return __import__("builder_netbsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000439 return __import__("builder_" + sys.platform)
440
Siva Chandra8af91662015-06-05 00:22:49 +0000441def run_adb_command(cmd, device_id):
442 device_id_args = []
443 if device_id:
444 device_id_args = ["-s", device_id]
445 full_cmd = ["adb"] + device_id_args + cmd
446 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
447 stdout, stderr = p.communicate()
448 return p.returncode, stdout, stderr
449
Chaoren Line9bbabc2015-07-18 00:37:55 +0000450def append_android_envs(dictionary):
451 if dictionary is None:
452 dictionary = {}
453 dictionary["OS"] = "Android"
454 if android_device_api() >= 16:
455 dictionary["PIE"] = 1
456 return dictionary
457
Chaoren Lin9070f532015-07-17 22:13:29 +0000458def target_is_android():
459 if not hasattr(target_is_android, 'result'):
460 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
461 match = re.match(".*-.*-.*-android", triple)
462 target_is_android.result = match is not None
463 return target_is_android.result
464
Siva Chandra8af91662015-06-05 00:22:49 +0000465def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000466 if not hasattr(android_device_api, 'result'):
Zachary Turner606e3a52015-12-08 01:15:30 +0000467 assert configuration.lldb_platform_url is not None
Chaoren Lin9070f532015-07-17 22:13:29 +0000468 device_id = None
Zachary Turner606e3a52015-12-08 01:15:30 +0000469 parsed_url = urlparse.urlparse(configuration.lldb_platform_url)
Ying Chenca922bb2015-11-18 19:03:20 +0000470 host_name = parsed_url.netloc.split(":")[0]
471 if host_name != 'localhost':
472 device_id = host_name
473 if device_id.startswith('[') and device_id.endswith(']'):
474 device_id = device_id[1:-1]
Chaoren Lin9070f532015-07-17 22:13:29 +0000475 retcode, stdout, stderr = run_adb_command(
476 ["shell", "getprop", "ro.build.version.sdk"], device_id)
477 if retcode == 0:
478 android_device_api.result = int(stdout)
479 else:
480 raise LookupError(
481 ">>> Unable to determine the API level of the Android device.\n"
482 ">>> stdout:\n%s\n"
483 ">>> stderr:\n%s\n" % (stdout, stderr))
484 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000485
Zachary Turnerabdb8392015-11-16 22:40:30 +0000486def check_expected_version(comparison, expected, actual):
487 def fn_leq(x,y): return x <= y
488 def fn_less(x,y): return x < y
489 def fn_geq(x,y): return x >= y
490 def fn_greater(x,y): return x > y
491 def fn_eq(x,y): return x == y
492 def fn_neq(x,y): return x != y
493
494 op_lookup = {
495 "==": fn_eq,
496 "=": fn_eq,
497 "!=": fn_neq,
498 "<>": fn_neq,
499 ">": fn_greater,
500 "<": fn_less,
501 ">=": fn_geq,
502 "<=": fn_leq
503 }
504 expected_str = '.'.join([str(x) for x in expected])
505 actual_str = '.'.join([str(x) for x in actual])
506
507 return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
508
Johnny Chena74bb0a2011-08-01 18:46:13 +0000509#
510# Decorators for categorizing test cases.
511#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000512from functools import wraps
Pavel Labathffbf9e82015-12-14 13:17:18 +0000513
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000514def add_test_categories(cat):
Pavel Labathffbf9e82015-12-14 13:17:18 +0000515 """Add test categories to a TestCase method"""
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000516 cat = test_categories.validate(cat, True)
517 def impl(func):
Pavel Labathffbf9e82015-12-14 13:17:18 +0000518 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
519 raise Exception("@add_test_categories can only be used to decorate a test method")
520 if hasattr(func, "categories"):
521 cat.extend(func.categories)
522 func.categories = cat
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000523 return func
Pavel Labathffbf9e82015-12-14 13:17:18 +0000524
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000525 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000526
Johnny Chena74bb0a2011-08-01 18:46:13 +0000527def benchmarks_test(func):
528 """Decorate the item as a benchmarks test."""
529 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
530 raise Exception("@benchmarks_test can only be used to decorate a test method")
531 @wraps(func)
532 def wrapper(self, *args, **kwargs):
Zachary Turneraad25fb2015-12-08 18:36:05 +0000533 self.skipTest("benchmarks test")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000534 return func(self, *args, **kwargs)
535
536 # Mark this function as such to separate them from the regular tests.
537 wrapper.__benchmarks_test__ = True
538 return wrapper
539
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000540def no_debug_info_test(func):
541 """Decorate the item as a test what don't use any debug info. If this annotation is specified
542 then the test runner won't generate a separate test for each debug info format. """
543 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
544 raise Exception("@no_debug_info_test can only be used to decorate a test method")
545 @wraps(func)
546 def wrapper(self, *args, **kwargs):
547 return func(self, *args, **kwargs)
548
549 # Mark this function as such to separate them from the regular tests.
550 wrapper.__no_debug_info_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):
Zachary Turner606e3a52015-12-08 01:15:30 +0000559 if configuration.dont_do_debugserver_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000560 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):
Zachary Turner606e3a52015-12-08 01:15:30 +0000573 if configuration.dont_do_llgs_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000574 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):
Zachary Turnerd865c6b2015-12-08 22:15:48 +0000587 if lldb.remote_platform:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000588 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):
Pavel Labath4da73572016-01-18 14:45:35 +0000597 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
598 raise Exception("Decorator can only be used to decorate a test method")
Ed Maste433790a2014-04-23 12:55:41 +0000599 @wraps(func)
600 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000601 from unittest2 import case
602 self = args[0]
Ed Maste433790a2014-04-23 12:55:41 +0000603 if expected_fn(self):
Pavel Labath25e241b2015-12-16 12:09:45 +0000604 if configuration.results_formatter_object is not None:
605 # Mark this test as expected to fail.
606 configuration.results_formatter_object.handle_event(
607 EventBuilder.event_for_mark_test_expected_failure(self))
Zachary Turner5cb8e672015-11-06 18:14:42 +0000608 xfail_func = unittest2.expectedFailure(func)
609 xfail_func(*args, **kwargs)
610 else:
611 func(*args, **kwargs)
Ed Maste433790a2014-04-23 12:55:41 +0000612 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000613 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
614 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000615 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000616 return expectedFailure_impl(bugnumber)
617 else:
618 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000619
Ying Chen0c352822015-11-16 23:41:02 +0000620# You can also pass not_in(list) to reverse the sense of the test for the arguments that
621# are simple lists, namely oslist, compiler, and debug_info.
622
Zachary Turnere1eb5e32015-12-14 21:26:49 +0000623def not_in(iterable):
Ying Chen0c352822015-11-16 23:41:02 +0000624 return lambda x : x not in iterable
625
Zachary Turnere1eb5e32015-12-14 21:26:49 +0000626def check_list_or_lambda(list_or_lambda, value):
Siva Chandra7dcad312015-11-20 20:30:36 +0000627 if six.callable(list_or_lambda):
628 return list_or_lambda(value)
Adrian McCarthy46155dd2015-12-22 21:01:21 +0000629 elif isinstance(list_or_lambda, list):
630 for item in list_or_lambda:
631 if value in item:
632 return True
633 return False
634 elif isinstance(list_or_lambda, str):
Siva Chandraa3863582015-12-15 00:26:52 +0000635 return value is None or value in list_or_lambda
Zachary Turnere1eb5e32015-12-14 21:26:49 +0000636 else:
Siva Chandraa3863582015-12-15 00:26:52 +0000637 return list_or_lambda is None or value is None or list_or_lambda == value
Ying Chen0c352822015-11-16 23:41:02 +0000638
Ying Chen7091c2c2015-04-21 01:15:47 +0000639# provide a function to xfail on defined oslist, compiler version, and archs
640# if none is specified for any argument, that argument won't be checked and thus means for all
641# for example,
642# @expectedFailureAll, xfail for all platform/compiler/arch,
643# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
644# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Pavel Labath7ead0b92015-12-09 10:54:18 +0000645def expectedFailureAll(bugnumber=None, oslist=None, hostoslist=None, compiler=None, compiler_version=None, archs=None, triple=None, debug_info=None, swig_version=None, py_version=None):
Ying Chen7091c2c2015-04-21 01:15:47 +0000646 def fn(self):
Siva Chandra7dcad312015-11-20 20:30:36 +0000647 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
Pavel Labath7ead0b92015-12-09 10:54:18 +0000648 hostoslist_passes = check_list_or_lambda(hostoslist, getHostPlatform())
Siva Chandra7dcad312015-11-20 20:30:36 +0000649 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Adrian McCarthy46155dd2015-12-22 21:01:21 +0000650 arch_passes = check_list_or_lambda(archs, self.getArchitecture())
Zachary Turnerabdb8392015-11-16 22:40:30 +0000651 triple_passes = triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())
Siva Chandra7dcad312015-11-20 20:30:36 +0000652 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000653 swig_version_passes = (swig_version is None) or (not hasattr(lldb, 'swig_version')) or (check_expected_version(swig_version[0], swig_version[1], lldb.swig_version))
654 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
655
656 return (oslist_passes and
Pavel Labath7ead0b92015-12-09 10:54:18 +0000657 hostoslist_passes and
Zachary Turnerabdb8392015-11-16 22:40:30 +0000658 compiler_passes and
659 arch_passes and
660 triple_passes and
661 debug_info_passes and
662 swig_version_passes and
663 py_version_passes)
Ying Chen7091c2c2015-04-21 01:15:47 +0000664 return expectedFailure(fn, bugnumber)
665
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000666def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000667 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
668
669def expectedFailureDwo(bugnumber=None):
670 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000671
672def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000673 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000674
675def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
676 if compiler_version is None:
677 compiler_version=['=', None]
678 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
679
Vince Harron8974ce22015-03-13 19:54:54 +0000680# to XFAIL a specific clang versions, try this
681# @expectedFailureClang('bugnumber', ['<=', '3.4'])
682def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000683 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000684
685def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000686 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000687
Matt Kopec0de53f02013-03-15 19:10:12 +0000688def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000689 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000690
Ed Maste433790a2014-04-23 12:55:41 +0000691def expectedFailureArch(arch, bugnumber=None):
692 def fn(self):
693 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000694 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000695
Enrico Granatae6cedc12013-02-23 01:05:23 +0000696def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000697 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000698
Matt Kopecee969f92013-09-26 23:30:59 +0000699def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000700 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000701
Omair Javaidbaa07492016-01-11 22:52:18 +0000702def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None, archs=None):
Ed Maste433790a2014-04-23 12:55:41 +0000703 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000704 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000705 self.expectedCompiler(compilers) and
Omair Javaidbaa07492016-01-11 22:52:18 +0000706 (archs is None or self.getArchitecture() in archs) and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000707 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000708 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000709
Chaoren Linf7160f32015-06-09 17:39:27 +0000710def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
711 def fn(self):
712 return (getHostPlatform() in oslist and
713 self.expectedCompiler(compilers))
714 return expectedFailure(fn, bugnumber)
715
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000716def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000717 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000718 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000719
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000720def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
721 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000722
Omair Javaidbaa07492016-01-11 22:52:18 +0000723def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None, archs=None):
724 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info, archs=archs)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000725
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000726def expectedFailureNetBSD(bugnumber=None, compilers=None, debug_info=None):
727 return expectedFailureOS(['netbsd'], bugnumber, compilers, debug_info=debug_info)
728
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000729def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
730 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000731
Chaoren Linf7160f32015-06-09 17:39:27 +0000732def expectedFailureHostWindows(bugnumber=None, compilers=None):
733 return expectedFailureHostOS(['windows'], bugnumber, compilers)
734
Pavel Labath090152b2015-08-20 11:37:19 +0000735def matchAndroid(api_levels=None, archs=None):
736 def match(self):
737 if not target_is_android():
738 return False
739 if archs is not None and self.getArchitecture() not in archs:
740 return False
741 if api_levels is not None and android_device_api() not in api_levels:
742 return False
743 return True
744 return match
745
746
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000747def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000748 """ Mark a test as xfail for Android.
749
750 Arguments:
751 bugnumber - The LLVM pr associated with the problem.
752 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000753 for which a test is expected to fail. None means all API level.
754 arch - A sequence of architecture names specifying the architectures
755 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000756 """
Pavel Labath090152b2015-08-20 11:37:19 +0000757 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000758
Pavel Labath773e86f2016-01-05 10:44:36 +0000759# Flakey tests get two chances to run. If they fail the first time round, the result formatter
760# makes sure it is run one more time.
Vince Harron7ac3ea42015-06-26 15:13:21 +0000761def expectedFlakey(expected_fn, bugnumber=None):
762 def expectedFailure_impl(func):
763 @wraps(func)
764 def wrapper(*args, **kwargs):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000765 self = args[0]
Todd Fiala9187f272015-12-11 18:06:47 +0000766 if expected_fn(self):
767 # Send event marking test as explicitly eligible for rerunning.
768 if configuration.results_formatter_object is not None:
769 # Mark this test as rerunnable.
770 configuration.results_formatter_object.handle_event(
771 EventBuilder.event_for_mark_test_rerun_eligible(self))
Pavel Labath773e86f2016-01-05 10:44:36 +0000772 func(*args, **kwargs)
Vince Harron7ac3ea42015-06-26 15:13:21 +0000773 return wrapper
774 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
775 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000776 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000777 return expectedFailure_impl(bugnumber)
778 else:
779 return expectedFailure_impl
780
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000781def expectedFlakeyDwarf(bugnumber=None):
782 def fn(self):
783 return self.debug_info == "dwarf"
784 return expectedFlakey(fn, bugnumber)
785
786def expectedFlakeyDsym(bugnumber=None):
787 def fn(self):
788 return self.debug_info == "dwarf"
789 return expectedFlakey(fn, bugnumber)
790
Vince Harron7ac3ea42015-06-26 15:13:21 +0000791def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
792 def fn(self):
793 return (self.getPlatform() in oslist and
794 self.expectedCompiler(compilers))
795 return expectedFlakey(fn, bugnumber)
796
797def expectedFlakeyDarwin(bugnumber=None, compilers=None):
798 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
799 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
800
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000801def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
802 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
803
Vince Harron7ac3ea42015-06-26 15:13:21 +0000804def expectedFlakeyLinux(bugnumber=None, compilers=None):
805 return expectedFlakeyOS(['linux'], bugnumber, compilers)
806
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000807def expectedFlakeyNetBSD(bugnumber=None, compilers=None):
808 return expectedFlakeyOS(['netbsd'], bugnumber, compilers)
Vince Harron7ac3ea42015-06-26 15:13:21 +0000809
810def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
811 if compiler_version is None:
812 compiler_version=['=', None]
813 def fn(self):
814 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
815 return expectedFlakey(fn, bugnumber)
816
817# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
818def expectedFlakeyClang(bugnumber=None, compiler_version=None):
819 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
820
821# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
822def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
823 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
824
Pavel Labath63a579c2015-09-07 12:15:27 +0000825def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
826 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
827
Greg Clayton12514562013-12-05 22:22:32 +0000828def skipIfRemote(func):
829 """Decorate the item to skip tests if testing remotely."""
830 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
831 raise Exception("@skipIfRemote can only be used to decorate a test method")
832 @wraps(func)
833 def wrapper(*args, **kwargs):
834 from unittest2 import case
835 if lldb.remote_platform:
836 self = args[0]
837 self.skipTest("skip on remote platform")
838 else:
839 func(*args, **kwargs)
840 return wrapper
841
Siva Chandra4470f382015-06-17 22:32:27 +0000842def skipUnlessListedRemote(remote_list=None):
843 def myImpl(func):
844 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
845 raise Exception("@skipIfRemote can only be used to decorate a "
846 "test method")
847
848 @wraps(func)
849 def wrapper(*args, **kwargs):
850 if remote_list and lldb.remote_platform:
851 self = args[0]
852 triple = self.dbg.GetSelectedPlatform().GetTriple()
853 for r in remote_list:
854 if r in triple:
855 func(*args, **kwargs)
856 return
857 self.skipTest("skip on remote platform %s" % str(triple))
858 else:
859 func(*args, **kwargs)
860 return wrapper
861
862 return myImpl
863
Greg Clayton12514562013-12-05 22:22:32 +0000864def skipIfRemoteDueToDeadlock(func):
865 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
866 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
867 raise Exception("@skipIfRemote can only be used to decorate a test method")
868 @wraps(func)
869 def wrapper(*args, **kwargs):
870 from unittest2 import case
871 if lldb.remote_platform:
872 self = args[0]
873 self.skipTest("skip on remote platform (deadlocks)")
874 else:
875 func(*args, **kwargs)
876 return wrapper
877
Enrico Granatab633e432014-10-06 21:37:06 +0000878def skipIfNoSBHeaders(func):
879 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
880 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000881 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000882 @wraps(func)
883 def wrapper(*args, **kwargs):
884 from unittest2 import case
885 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000886 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000887 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000888 else:
889 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000890 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000891 if not os.path.exists(header):
892 self.skipTest("skip because LLDB.h header not found")
893 else:
894 func(*args, **kwargs)
895 return wrapper
896
Enrico Granata5f92a132015-11-05 00:46:25 +0000897def skipIfiOSSimulator(func):
898 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
Zachary Turner606e3a52015-12-08 01:15:30 +0000899 return unittest2.skipIf(configuration.lldb_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
Enrico Granata5f92a132015-11-05 00:46:25 +0000900
Robert Flack13c7ad92015-03-30 14:12:17 +0000901def skipIfFreeBSD(func):
902 """Decorate the item to skip tests that should be skipped on FreeBSD."""
903 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000904
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000905def skipIfNetBSD(func):
906 """Decorate the item to skip tests that should be skipped on NetBSD."""
907 return skipIfPlatform(["netbsd"])(func)
908
Greg Claytone0d0a762015-04-02 18:24:03 +0000909def getDarwinOSTriples():
910 return ['darwin', 'macosx', 'ios']
911
Daniel Maleab3d41a22013-07-09 00:08:01 +0000912def skipIfDarwin(func):
913 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000914 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000915
Robert Flack13c7ad92015-03-30 14:12:17 +0000916def skipIfLinux(func):
917 """Decorate the item to skip tests that should be skipped on Linux."""
918 return skipIfPlatform(["linux"])(func)
919
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000920def skipUnlessHostLinux(func):
921 """Decorate the item to skip tests that should be skipped on any non Linux host."""
922 return skipUnlessHostPlatform(["linux"])(func)
923
Robert Flack13c7ad92015-03-30 14:12:17 +0000924def skipIfWindows(func):
925 """Decorate the item to skip tests that should be skipped on Windows."""
926 return skipIfPlatform(["windows"])(func)
927
Chaoren Line6eea5d2015-06-08 22:13:28 +0000928def skipIfHostWindows(func):
929 """Decorate the item to skip tests that should be skipped on Windows."""
930 return skipIfHostPlatform(["windows"])(func)
931
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000932def skipUnlessWindows(func):
933 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
934 return skipUnlessPlatform(["windows"])(func)
935
Robert Flack13c7ad92015-03-30 14:12:17 +0000936def skipUnlessDarwin(func):
937 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000938 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000939
Ryan Brown57bee1e2015-09-14 22:45:11 +0000940def skipUnlessGoInstalled(func):
941 """Decorate the item to skip tests when no Go compiler is available."""
942 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
943 raise Exception("@skipIfGcc can only be used to decorate a test method")
944 @wraps(func)
945 def wrapper(*args, **kwargs):
946 from unittest2 import case
947 self = args[0]
948 compiler = self.getGoCompilerVersion()
949 if not compiler:
950 self.skipTest("skipping because go compiler not found")
951 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000952 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000953 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000954 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
955 if not match_version:
956 # Couldn't determine version.
957 self.skipTest(
958 "skipping because go version could not be parsed "
959 "out of {}".format(compiler))
960 else:
961 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000962 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000963 compiler_strict_version = StrictVersion(match_version.group(1))
964 if compiler_strict_version < min_strict_version:
965 self.skipTest(
966 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +0000967 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +0000968 compiler_strict_version,
969 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +0000970 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +0000971 return wrapper
972
Robert Flack068898c2015-04-09 18:07:58 +0000973def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +0000974 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +0000975 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
976 if platform.startswith('freebsd'):
977 platform = 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000978 elif platform.startswith('netbsd'):
979 platform = 'netbsd'
Robert Flack068898c2015-04-09 18:07:58 +0000980 return platform
981
Robert Flack6e1fd352015-05-15 12:39:33 +0000982def getHostPlatform():
983 """Returns the host platform running the test suite."""
984 # Attempts to return a platform name matching a target Triple platform.
985 if sys.platform.startswith('linux'):
986 return 'linux'
987 elif sys.platform.startswith('win32'):
988 return 'windows'
989 elif sys.platform.startswith('darwin'):
990 return 'darwin'
991 elif sys.platform.startswith('freebsd'):
992 return 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000993 elif sys.platform.startswith('netbsd'):
994 return 'netbsd'
Robert Flack6e1fd352015-05-15 12:39:33 +0000995 else:
996 return sys.platform
997
Robert Flackfb2f6c62015-04-17 08:02:18 +0000998def platformIsDarwin():
999 """Returns true if the OS triple for the selected platform is any valid apple OS"""
1000 return getPlatform() in getDarwinOSTriples()
1001
Robert Flack6e1fd352015-05-15 12:39:33 +00001002def skipIfHostIncompatibleWithRemote(func):
1003 """Decorate the item to skip tests if binaries built on this host are incompatible."""
1004 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1005 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
1006 @wraps(func)
1007 def wrapper(*args, **kwargs):
1008 from unittest2 import case
1009 self = args[0]
1010 host_arch = self.getLldbArchitecture()
1011 host_platform = getHostPlatform()
1012 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +00001013 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +00001014 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
1015 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
1016 elif target_platform != host_platform:
1017 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
1018 else:
1019 func(*args, **kwargs)
1020 return wrapper
1021
Chaoren Line6eea5d2015-06-08 22:13:28 +00001022def skipIfHostPlatform(oslist):
1023 """Decorate the item to skip tests if running on one of the listed host platforms."""
1024 return unittest2.skipIf(getHostPlatform() in oslist,
1025 "skip on %s" % (", ".join(oslist)))
1026
1027def skipUnlessHostPlatform(oslist):
1028 """Decorate the item to skip tests unless running on one of the listed host platforms."""
1029 return unittest2.skipUnless(getHostPlatform() in oslist,
1030 "requires on of %s" % (", ".join(oslist)))
1031
Zachary Turner793d9972015-08-14 23:29:24 +00001032def skipUnlessArch(archlist):
1033 """Decorate the item to skip tests unless running on one of the listed architectures."""
1034 def myImpl(func):
1035 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1036 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1037
1038 @wraps(func)
1039 def wrapper(*args, **kwargs):
1040 self = args[0]
1041 if self.getArchitecture() not in archlist:
1042 self.skipTest("skipping for architecture %s (requires one of %s)" %
1043 (self.getArchitecture(), ", ".join(archlist)))
1044 else:
1045 func(*args, **kwargs)
1046 return wrapper
1047
1048 return myImpl
1049
Robert Flack13c7ad92015-03-30 14:12:17 +00001050def skipIfPlatform(oslist):
1051 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001052 return unittest2.skipIf(getPlatform() in oslist,
1053 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001054
1055def skipUnlessPlatform(oslist):
1056 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001057 return unittest2.skipUnless(getPlatform() in oslist,
1058 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001059
Ying Chen7091c2c2015-04-21 01:15:47 +00001060# provide a function to skip on defined oslist, compiler version, and archs
1061# if none is specified for any argument, that argument won't be checked and thus means for all
1062# for example,
1063# @skipIf, skip for all platform/compiler/arch,
1064# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1065# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1066
1067# TODO: refactor current code, to make skipIfxxx functions to call this function
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001068def skipIf(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, debug_info=None, swig_version=None, py_version=None, remote=None):
Ying Chen7091c2c2015-04-21 01:15:47 +00001069 def fn(self):
Zachary Turnere1eb5e32015-12-14 21:26:49 +00001070 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
1071 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Adrian McCarthy46155dd2015-12-22 21:01:21 +00001072 arch_passes = check_list_or_lambda(archs, self.getArchitecture())
Zachary Turnere1eb5e32015-12-14 21:26:49 +00001073 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +00001074 swig_version_passes = (swig_version is None) or (not hasattr(lldb, 'swig_version')) or (check_expected_version(swig_version[0], swig_version[1], lldb.swig_version))
1075 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001076 remote_passes = (remote is None) or (remote == (lldb.remote_platform is not None))
Zachary Turnerabdb8392015-11-16 22:40:30 +00001077
1078 return (oslist_passes and
1079 compiler_passes and
1080 arch_passes and
1081 debug_info_passes and
1082 swig_version_passes and
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001083 py_version_passes and
1084 remote_passes)
Zachary Turnerba105702015-11-16 23:58:20 +00001085
1086 local_vars = locals()
1087 args = [x for x in inspect.getargspec(skipIf).args]
1088 arg_vals = [eval(x, globals(), local_vars) for x in args]
1089 args = [x for x in zip(args, arg_vals) if x[1] is not None]
1090 reasons = ['%s=%s' % (x, str(y)) for (x,y) in args]
1091 return skipTestIfFn(fn, bugnumber, skipReason='skipping because ' + ' && '.join(reasons))
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001092
1093def skipIfDebugInfo(bugnumber=None, debug_info=None):
1094 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1095
Greg Claytonedea2372015-10-07 20:01:13 +00001096def skipIfDWO(bugnumber=None):
1097 return skipIfDebugInfo(bugnumber, ["dwo"])
1098
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001099def skipIfDwarf(bugnumber=None):
1100 return skipIfDebugInfo(bugnumber, ["dwarf"])
1101
1102def skipIfDsym(bugnumber=None):
1103 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001104
1105def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1106 def skipTestIfFn_impl(func):
1107 @wraps(func)
1108 def wrapper(*args, **kwargs):
1109 from unittest2 import case
1110 self = args[0]
1111 if expected_fn(self):
1112 self.skipTest(skipReason)
1113 else:
1114 func(*args, **kwargs)
1115 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001116 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001117 return skipTestIfFn_impl(bugnumber)
1118 else:
1119 return skipTestIfFn_impl
1120
Daniel Maleabe230792013-01-24 23:52:09 +00001121def skipIfGcc(func):
1122 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1123 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001124 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001125 @wraps(func)
1126 def wrapper(*args, **kwargs):
1127 from unittest2 import case
1128 self = args[0]
1129 compiler = self.getCompiler()
1130 if "gcc" in compiler:
1131 self.skipTest("skipping because gcc is the test compiler")
1132 else:
1133 func(*args, **kwargs)
1134 return wrapper
1135
Matt Kopec0de53f02013-03-15 19:10:12 +00001136def skipIfIcc(func):
1137 """Decorate the item to skip tests that should be skipped if building with icc ."""
1138 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1139 raise Exception("@skipIfIcc can only be used to decorate a test method")
1140 @wraps(func)
1141 def wrapper(*args, **kwargs):
1142 from unittest2 import case
1143 self = args[0]
1144 compiler = self.getCompiler()
1145 if "icc" in compiler:
1146 self.skipTest("skipping because icc is the test compiler")
1147 else:
1148 func(*args, **kwargs)
1149 return wrapper
1150
Daniel Malea55faa402013-05-02 21:44:31 +00001151def skipIfi386(func):
1152 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1153 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1154 raise Exception("@skipIfi386 can only be used to decorate a test method")
1155 @wraps(func)
1156 def wrapper(*args, **kwargs):
1157 from unittest2 import case
1158 self = args[0]
1159 if "i386" == self.getArchitecture():
1160 self.skipTest("skipping because i386 is not a supported architecture")
1161 else:
1162 func(*args, **kwargs)
1163 return wrapper
1164
Pavel Labath090152b2015-08-20 11:37:19 +00001165def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001166 """Decorator to skip tests when the target is Android.
1167
1168 Arguments:
1169 api_levels - The API levels for which the test should be skipped. If
1170 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001171 arch - A sequence of architecture names specifying the architectures
1172 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001173 """
1174 def myImpl(func):
1175 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1176 raise Exception("@skipIfTargetAndroid can only be used to "
1177 "decorate a test method")
1178 @wraps(func)
1179 def wrapper(*args, **kwargs):
1180 from unittest2 import case
1181 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001182 if matchAndroid(api_levels, archs)(self):
1183 self.skipTest("skiped on Android target with API %d and architecture %s" %
1184 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001185 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001186 return wrapper
1187 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001188
Ilia Kd9953052015-03-12 07:19:41 +00001189def skipUnlessCompilerRt(func):
1190 """Decorate the item to skip tests if testing remotely."""
1191 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1192 raise Exception("@skipUnless can only be used to decorate a test method")
1193 @wraps(func)
1194 def wrapper(*args, **kwargs):
1195 from unittest2 import case
1196 import os.path
Enrico Granata55d99f02015-11-19 21:45:07 +00001197 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "llvm","projects","compiler-rt")
1198 print(compilerRtPath)
Ilia Kd9953052015-03-12 07:19:41 +00001199 if not os.path.exists(compilerRtPath):
1200 self = args[0]
1201 self.skipTest("skip if compiler-rt not found")
1202 else:
1203 func(*args, **kwargs)
1204 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001205
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001206class _PlatformContext(object):
1207 """Value object class which contains platform-specific options."""
1208
1209 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1210 self.shlib_environment_var = shlib_environment_var
1211 self.shlib_prefix = shlib_prefix
1212 self.shlib_extension = shlib_extension
1213
1214
Johnny Chena74bb0a2011-08-01 18:46:13 +00001215class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001216 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001217 Abstract base for performing lldb (see TestBase) or other generic tests (see
1218 BenchBase for one example). lldbtest.Base works with the test driver to
1219 accomplish things.
1220
Johnny Chen8334dad2010-10-22 23:15:46 +00001221 """
Enrico Granata5020f952012-10-24 21:42:49 +00001222
Enrico Granata19186272012-10-24 21:44:48 +00001223 # The concrete subclass should override this attribute.
1224 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001225
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001226 # Keep track of the old current working directory.
1227 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001228
Greg Clayton4570d3e2013-12-10 23:19:29 +00001229 @staticmethod
1230 def compute_mydir(test_file):
1231 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1232
1233 mydir = TestBase.compute_mydir(__file__)'''
1234 test_dir = os.path.dirname(test_file)
1235 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1236
Johnny Chenfb4264c2011-08-01 19:50:58 +00001237 def TraceOn(self):
1238 """Returns True if we are in trace mode (tracing detailed test execution)."""
1239 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001240
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001241 @classmethod
1242 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001243 """
1244 Python unittest framework class setup fixture.
1245 Do current directory manipulation.
1246 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001247 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001248 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001249 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001250
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001251 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001252 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001253
1254 # Change current working directory if ${LLDB_TEST} is defined.
1255 # See also dotest.py which sets up ${LLDB_TEST}.
1256 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001257 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001258 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001259 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001260 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1261
Vince Harron85d19652015-05-21 19:09:29 +00001262 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001263 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001264 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1265 try:
1266 cls.dir_lock.try_acquire()
1267 # write the class that owns the lock into the lock file
1268 cls.dir_lock.handle.write(cls.__name__)
1269 except IOError as ioerror:
1270 # nothing else should have this directory lock
1271 # wait here until we get a lock
1272 cls.dir_lock.acquire()
1273 # read the previous owner from the lock file
1274 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001275 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 +00001276 raise ioerror
1277
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001278 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001279 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001280 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001281 elif getPlatform() in ("freebsd", "linux", "netbsd"):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001282 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001283 else:
1284 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001285
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001286 @classmethod
1287 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001288 """
1289 Python unittest framework class teardown fixture.
1290 Do class-wide cleanup.
1291 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001292
Zachary Turner742afdb2015-12-11 19:21:49 +00001293 if doCleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001294 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001295 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001296 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001297
Johnny Chen707b3c92010-10-11 22:25:46 +00001298 # Subclass might have specific cleanup function defined.
1299 if getattr(cls, "classCleanup", None):
1300 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001301 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001302 try:
1303 cls.classCleanup()
1304 except:
1305 exc_type, exc_value, exc_tb = sys.exc_info()
1306 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001307
Vince Harron85d19652015-05-21 19:09:29 +00001308 if debug_confirm_directory_exclusivity:
1309 cls.dir_lock.release()
1310 del cls.dir_lock
1311
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001312 # Restore old working directory.
1313 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001314 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001315 os.chdir(cls.oldcwd)
1316
Johnny Chena74bb0a2011-08-01 18:46:13 +00001317 @classmethod
1318 def skipLongRunningTest(cls):
1319 """
1320 By default, we skip long running test case.
1321 This can be overridden by passing '-l' to the test driver (dotest.py).
1322 """
1323 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1324 return False
1325 else:
1326 return True
Johnny Chened492022011-06-21 00:53:00 +00001327
Vince Harron6d3d0f12015-05-10 22:01:59 +00001328 def enableLogChannelsForCurrentTest(self):
1329 if len(lldbtest_config.channels) == 0:
1330 return
1331
1332 # if debug channels are specified in lldbtest_config.channels,
1333 # create a new set of log files for every test
1334 log_basename = self.getLogBasenameForCurrentTest()
1335
1336 # confirm that the file is writeable
1337 host_log_path = "{}-host.log".format(log_basename)
1338 open(host_log_path, 'w').close()
1339
1340 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1341 for channel_with_categories in lldbtest_config.channels:
1342 channel_then_categories = channel_with_categories.split(' ', 1)
1343 channel = channel_then_categories[0]
1344 if len(channel_then_categories) > 1:
1345 categories = channel_then_categories[1]
1346 else:
1347 categories = "default"
1348
Pavel Labath4b70eb72016-01-22 14:50:29 +00001349 if channel == "gdb-remote":
Vince Harron6d3d0f12015-05-10 22:01:59 +00001350 # communicate gdb-remote categories to debugserver
1351 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1352
1353 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1354 if not self.res.Succeeded():
1355 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1356
1357 # Communicate log path name to debugserver & lldb-server
Pavel Labath4b70eb72016-01-22 14:50:29 +00001358 server_log_path = "{}-server.log".format(log_basename)
1359 open(server_log_path, 'w').close()
1360 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
Vince Harron6d3d0f12015-05-10 22:01:59 +00001361
Pavel Labath4b70eb72016-01-22 14:50:29 +00001362 # Communicate channels to lldb-server
1363 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
Vince Harron6d3d0f12015-05-10 22:01:59 +00001364
1365 if len(lldbtest_config.channels) == 0:
1366 return
1367
1368 def disableLogChannelsForCurrentTest(self):
1369 # close all log files that we opened
1370 for channel_and_categories in lldbtest_config.channels:
1371 # channel format - <channel-name> [<category0> [<category1> ...]]
1372 channel = channel_and_categories.split(' ', 1)[0]
1373 self.ci.HandleCommand("log disable " + channel, self.res)
1374 if not self.res.Succeeded():
1375 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1376
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001377 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001378 """Fixture for unittest test case setup.
1379
1380 It works with the test driver to conditionally skip tests and does other
1381 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001382 #import traceback
1383 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001384
Daniel Malea9115f072013-08-06 15:02:32 +00001385 if "LIBCXX_PATH" in os.environ:
1386 self.libcxxPath = os.environ["LIBCXX_PATH"]
1387 else:
1388 self.libcxxPath = None
1389
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001390 if "LLDBMI_EXEC" in os.environ:
1391 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1392 else:
1393 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001394
Johnny Chenebe51722011-10-07 19:21:09 +00001395 # If we spawn an lldb process for test (via pexpect), do not load the
1396 # init file unless told otherwise.
1397 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1398 self.lldbOption = ""
1399 else:
1400 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001401
Johnny Chen985e7402011-08-01 21:13:26 +00001402 # Assign the test method name to self.testMethodName.
1403 #
1404 # For an example of the use of this attribute, look at test/types dir.
1405 # There are a bunch of test cases under test/types and we don't want the
1406 # module cacheing subsystem to be confused with executable name "a.out"
1407 # used for all the test cases.
1408 self.testMethodName = self._testMethodName
1409
Johnny Chen985e7402011-08-01 21:13:26 +00001410 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1411 # with it using pexpect.
1412 self.child = None
1413 self.child_prompt = "(lldb) "
1414 # If the child is interacting with the embedded script interpreter,
1415 # there are two exits required during tear down, first to quit the
1416 # embedded script interpreter and second to quit the lldb command
1417 # interpreter.
1418 self.child_in_script_interpreter = False
1419
Johnny Chenfb4264c2011-08-01 19:50:58 +00001420 # These are for customized teardown cleanup.
1421 self.dict = None
1422 self.doTearDownCleanup = False
1423 # And in rare cases where there are multiple teardown cleanups.
1424 self.dicts = []
1425 self.doTearDownCleanups = False
1426
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001427 # List of spawned subproces.Popen objects
1428 self.subprocesses = []
1429
Daniel Malea69207462013-06-05 21:07:02 +00001430 # List of forked process PIDs
1431 self.forkedProcessPids = []
1432
Johnny Chenfb4264c2011-08-01 19:50:58 +00001433 # Create a string buffer to record the session info, to be dumped into a
1434 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001435 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001436
Vince Harron1f160372015-05-21 18:51:20 +00001437 session_file = "{}.log".format(self.log_basename)
Zachary Turner8d13fab2015-11-07 01:08:15 +00001438 # Python 3 doesn't support unbuffered I/O in text mode. Open buffered.
1439 self.session = open(session_file, "w")
Johnny Chenfb4264c2011-08-01 19:50:58 +00001440
1441 # Optimistically set __errored__, __failed__, __expected__ to False
1442 # initially. If the test errored/failed, the session info
1443 # (self.session) is then dumped into a session specific file for
1444 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001445 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001446 self.__errored__ = False
1447 self.__failed__ = False
1448 self.__expected__ = False
1449 # We are also interested in unexpected success.
1450 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001451 # And skipped tests.
1452 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001453
1454 # See addTearDownHook(self, hook) which allows the client to add a hook
1455 # function to be run during tearDown() time.
1456 self.hooks = []
1457
1458 # See HideStdout(self).
1459 self.sys_stdout_hidden = False
1460
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001461 if self.platformContext:
1462 # set environment variable names for finding shared libraries
1463 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001464
Vince Harron6d3d0f12015-05-10 22:01:59 +00001465 # Create the debugger instance if necessary.
1466 try:
1467 self.dbg = lldb.DBG
1468 except AttributeError:
1469 self.dbg = lldb.SBDebugger.Create()
1470
1471 if not self.dbg:
1472 raise Exception('Invalid debugger instance')
1473
1474 # Retrieve the associated command interpreter instance.
1475 self.ci = self.dbg.GetCommandInterpreter()
1476 if not self.ci:
1477 raise Exception('Could not get the command interpreter')
1478
1479 # And the result object.
1480 self.res = lldb.SBCommandReturnObject()
1481
1482 self.enableLogChannelsForCurrentTest()
1483
Ying Chen0c352822015-11-16 23:41:02 +00001484 #Initialize debug_info
1485 self.debug_info = None
1486
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)
Adrian McCarthyaa1f2702016-01-14 22:52:16 +00001635 if hook_argc == 0 or (getattr(hook,'im_self',None) is not None) or (hasattr(hook, '__self__')):
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__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001772 pairs = configuration.test_result.errors
Johnny Chenfb4264c2011-08-01 19:50:58 +00001773 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001774 elif self.__cleanup_errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001775 pairs = configuration.test_result.cleanup_errors
Zachary Turnerb1490b62015-08-26 19:44:56 +00001776 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001777 elif self.__failed__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001778 pairs = configuration.test_result.failures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001779 prefix = 'Failure'
1780 elif self.__expected__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001781 pairs = configuration.test_result.expectedFailures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001782 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 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00001893 from .lldbutil import which
Daniel Malea0aea0162013-02-27 17:29:46 +00001894 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++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001996 else: # this includes NetBSD
Ed Mastec97323e2014-04-01 18:47:58 +00001997 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 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002025 elif sys.platform.rstrip('0123456789') in ('freebsd', 'linux', 'netbsd') 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 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002054 elif self.getPlatform() in ('freebsd', 'linux', 'netbsd') 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."""
2077 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002078 if target_is_android():
2079 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002080 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002081 raise Exception("Don't know how to build default binary")
2082
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002083 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002084 """Platform specific way to build binaries with dsym info."""
2085 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002086 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002087 raise Exception("Don't know how to build binary with dsym")
2088
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002089 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002090 """Platform specific way to build binaries with dwarf maps."""
2091 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002092 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002093 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002094 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002095 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002096
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002097 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2098 """Platform specific way to build binaries with dwarf maps."""
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002099 module = builder_module()
2100 if target_is_android():
2101 dictionary = append_android_envs(dictionary)
2102 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2103 raise Exception("Don't know how to build binary with dwo")
2104
Ryan Brown57bee1e2015-09-14 22:45:11 +00002105 def buildGo(self):
2106 """Build the default go binary.
2107 """
2108 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2109
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002110 def signBinary(self, binary_path):
2111 if sys.platform.startswith("darwin"):
2112 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2113 call(codesign_cmd, shell=True)
2114
Kuba Breckabeed8212014-09-04 01:03:18 +00002115 def findBuiltClang(self):
2116 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2117 paths_to_try = [
2118 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2119 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2120 "llvm-build/Release/x86_64/Release/bin/clang",
2121 "llvm-build/Debug/x86_64/Debug/bin/clang",
2122 ]
Enrico Granata55d99f02015-11-19 21:45:07 +00002123 lldb_root_path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")
Kuba Breckabeed8212014-09-04 01:03:18 +00002124 for p in paths_to_try:
2125 path = os.path.join(lldb_root_path, p)
2126 if os.path.exists(path):
2127 return path
Ilia Kd9953052015-03-12 07:19:41 +00002128
2129 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002130 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002131 if os.path.exists(path):
2132 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002133
2134 return os.environ["CC"]
2135
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002136 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002137 """ Returns a dictionary (which can be provided to build* functions above) which
2138 contains OS-specific build flags.
2139 """
2140 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002141 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002142
2143 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002144 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002145 use_libcxx = True
2146
2147 if use_libcxx and self.libcxxPath:
2148 cflags += "-stdlib=libc++ "
2149 if self.libcxxPath:
2150 libcxxInclude = os.path.join(self.libcxxPath, "include")
2151 libcxxLib = os.path.join(self.libcxxPath, "lib")
2152 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2153 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2154
Andrew Kaylor93132f52013-05-28 23:04:25 +00002155 if use_cpp11:
2156 cflags += "-std="
2157 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2158 cflags += "c++0x"
2159 else:
2160 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002161 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002162 cflags += " -stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002163 elif self.getPlatform() == "netbsd":
2164 cflags += " -stdlib=libstdc++"
Andrew Kaylor93132f52013-05-28 23:04:25 +00002165 elif "clang" in self.getCompiler():
2166 cflags += " -stdlib=libstdc++"
2167
Andrew Kaylor93132f52013-05-28 23:04:25 +00002168 return {'CFLAGS_EXTRAS' : cflags,
2169 'LD_EXTRAS' : ldflags,
2170 }
2171
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002172 def cleanup(self, dictionary=None):
2173 """Platform specific way to do cleanup after build."""
2174 module = builder_module()
2175 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002176 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002177
Daniel Malea55faa402013-05-02 21:44:31 +00002178 def getLLDBLibraryEnvVal(self):
2179 """ Returns the path that the OS-specific library search environment variable
2180 (self.dylibPath) should be set to in order for a program to find the LLDB
2181 library. If an environment variable named self.dylibPath is already set,
2182 the new path is appended to it and returned.
2183 """
2184 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002185 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002186 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002187 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002188 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002189 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002190 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002191 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002192
Ed Maste437f8f62013-09-09 14:04:04 +00002193 def getLibcPlusPlusLibs(self):
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002194 if self.getPlatform() in ('freebsd', 'linux', 'netbsd'):
Ed Maste437f8f62013-09-09 14:04:04 +00002195 return ['libc++.so.1']
2196 else:
2197 return ['libc++.1.dylib','libc++abi.dylib']
2198
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002199# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2200# We change the test methods to create a new test method for each test for each debug info we are
2201# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2202# the new test method we remove the old method at the same time.
2203class LLDBTestCaseFactory(type):
2204 def __new__(cls, name, bases, attrs):
2205 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002206 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002207 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002208 target_platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002209
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002210 # If any debug info categories were explicitly tagged, assume that list to be
2211 # authoritative. If none were specified, try with all debug info formats.
2212 all_dbginfo_categories = set(test_categories.debug_info_categories)
2213 categories = set(getattr(attrvalue, "categories", [])) & all_dbginfo_categories
2214 if not categories:
2215 categories = all_dbginfo_categories
2216
2217 supported_categories = [x for x in categories
2218 if test_categories.is_supported_on_platform(x, target_platform)]
Zachary Turner8a927c42015-12-14 22:58:16 +00002219 if "dsym" in supported_categories:
2220 @add_test_categories(["dsym"])
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002221 @wraps(attrvalue)
Zachary Turner8a927c42015-12-14 22:58:16 +00002222 def dsym_test_method(self, attrvalue=attrvalue):
2223 self.debug_info = "dsym"
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002224 return attrvalue(self)
Zachary Turner8a927c42015-12-14 22:58:16 +00002225 dsym_method_name = attrname + "_dsym"
2226 dsym_test_method.__name__ = dsym_method_name
2227 newattrs[dsym_method_name] = dsym_test_method
2228
2229 if "dwarf" in supported_categories:
2230 @add_test_categories(["dwarf"])
2231 @wraps(attrvalue)
2232 def dwarf_test_method(self, attrvalue=attrvalue):
2233 self.debug_info = "dwarf"
2234 return attrvalue(self)
2235 dwarf_method_name = attrname + "_dwarf"
2236 dwarf_test_method.__name__ = dwarf_method_name
2237 newattrs[dwarf_method_name] = dwarf_test_method
2238
2239 if "dwo" in supported_categories:
2240 @add_test_categories(["dwo"])
2241 @wraps(attrvalue)
2242 def dwo_test_method(self, attrvalue=attrvalue):
2243 self.debug_info = "dwo"
2244 return attrvalue(self)
2245 dwo_method_name = attrname + "_dwo"
2246 dwo_test_method.__name__ = dwo_method_name
2247 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002248 else:
2249 newattrs[attrname] = attrvalue
2250 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2251
Zachary Turner43a01e42015-10-20 21:06:05 +00002252# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2253@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002254class TestBase(Base):
2255 """
2256 This abstract base class is meant to be subclassed. It provides default
2257 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2258 among other things.
2259
2260 Important things for test class writers:
2261
2262 - Overwrite the mydir class attribute, otherwise your test class won't
2263 run. It specifies the relative directory to the top level 'test' so
2264 the test harness can change to the correct working directory before
2265 running your test.
2266
2267 - The setUp method sets up things to facilitate subsequent interactions
2268 with the debugger as part of the test. These include:
2269 - populate the test method name
2270 - create/get a debugger set with synchronous mode (self.dbg)
2271 - get the command interpreter from with the debugger (self.ci)
2272 - create a result object for use with the command interpreter
2273 (self.res)
2274 - plus other stuffs
2275
2276 - The tearDown method tries to perform some necessary cleanup on behalf
2277 of the test to return the debugger to a good state for the next test.
2278 These include:
2279 - execute any tearDown hooks registered by the test method with
2280 TestBase.addTearDownHook(); examples can be found in
2281 settings/TestSettings.py
2282 - kill the inferior process associated with each target, if any,
2283 and, then delete the target from the debugger's target list
2284 - perform build cleanup before running the next test method in the
2285 same test class; examples of registering for this service can be
2286 found in types/TestIntegerTypes.py with the call:
2287 - self.setTearDownCleanup(dictionary=d)
2288
2289 - Similarly setUpClass and tearDownClass perform classwise setup and
2290 teardown fixtures. The tearDownClass method invokes a default build
2291 cleanup for the entire test class; also, subclasses can implement the
2292 classmethod classCleanup(cls) to perform special class cleanup action.
2293
2294 - The instance methods runCmd and expect are used heavily by existing
2295 test cases to send a command to the command interpreter and to perform
2296 string/pattern matching on the output of such command execution. The
2297 expect method also provides a mode to peform string/pattern matching
2298 without running a command.
2299
2300 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2301 build the binaries used during a particular test scenario. A plugin
2302 should be provided for the sys.platform running the test suite. The
2303 Mac OS X implementation is located in plugins/darwin.py.
2304 """
2305
2306 # Maximum allowed attempts when launching the inferior process.
2307 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2308 maxLaunchCount = 3;
2309
2310 # Time to wait before the next launching attempt in second(s).
2311 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2312 timeWaitNextLaunch = 1.0;
2313
Enrico Granata165f8af2012-09-21 19:10:53 +00002314 # Returns the list of categories to which this test case belongs
2315 # by default, look for a ".categories" file, and read its contents
2316 # if no such file exists, traverse the hierarchy - we guarantee
2317 # a .categories to exist at the top level directory so we do not end up
2318 # looping endlessly - subclasses are free to define their own categories
2319 # in whatever way makes sense to them
2320 def getCategories(self):
2321 import inspect
2322 import os.path
2323 folder = inspect.getfile(self.__class__)
2324 folder = os.path.dirname(folder)
2325 while folder != '/':
2326 categories_file_name = os.path.join(folder,".categories")
2327 if os.path.exists(categories_file_name):
2328 categories_file = open(categories_file_name,'r')
2329 categories = categories_file.readline()
2330 categories_file.close()
2331 categories = str.replace(categories,'\n','')
2332 categories = str.replace(categories,'\r','')
2333 return categories.split(',')
2334 else:
2335 folder = os.path.dirname(folder)
2336 continue
2337
Johnny Chena74bb0a2011-08-01 18:46:13 +00002338 def setUp(self):
2339 #import traceback
2340 #traceback.print_stack()
2341
2342 # Works with the test driver to conditionally skip tests via decorators.
2343 Base.setUp(self)
2344
Johnny Chenf2b70232010-08-25 18:49:48 +00002345 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2346 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2347
Johnny Chen430eb762010-10-19 16:00:42 +00002348 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002349 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002350
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002351 # We want our debugger to be synchronous.
2352 self.dbg.SetAsync(False)
2353
2354 # Retrieve the associated command interpreter instance.
2355 self.ci = self.dbg.GetCommandInterpreter()
2356 if not self.ci:
2357 raise Exception('Could not get the command interpreter')
2358
2359 # And the result object.
2360 self.res = lldb.SBCommandReturnObject()
2361
Zachary Turner606e3a52015-12-08 01:15:30 +00002362 if lldb.remote_platform and configuration.lldb_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002363 remote_test_dir = lldbutil.join_remote_paths(
Zachary Turner606e3a52015-12-08 01:15:30 +00002364 configuration.lldb_platform_working_dir,
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002365 self.getArchitecture(),
2366 str(self.test_number),
2367 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002368 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002369 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002370 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002371
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002372 # This function removes all files from the current working directory while leaving
2373 # the directories in place. The cleaup is required to reduce the disk space required
2374 # by the test suit while leaving the directories untached is neccessary because
2375 # sub-directories might belong to an other test
2376 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002377 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002378 # TODO: Replace the heuristic to remove the files with a logic what collects the
2379 # list of files we have to remove during test runs.
2380 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002381 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002382 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002383 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002384 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002385
Greg Clayton35c91342014-11-17 18:40:27 +00002386 def registerSharedLibrariesWithTarget(self, target, shlibs):
2387 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2388
2389 Any modules in the target that have their remote install file specification set will
2390 get uploaded to the remote host. This function registers the local copies of the
2391 shared libraries with the target and sets their remote install locations so they will
2392 be uploaded when the target is run.
2393 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002394 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002395 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002396
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002397 shlib_environment_var = self.platformContext.shlib_environment_var
2398 shlib_prefix = self.platformContext.shlib_prefix
2399 shlib_extension = '.' + self.platformContext.shlib_extension
2400
2401 working_dir = self.get_process_working_directory()
2402 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2403 # Add any shared libraries to our target if remote so they get
2404 # uploaded into the working directory on the remote side
2405 for name in shlibs:
2406 # The path can be a full path to a shared library, or a make file name like "Foo" for
2407 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2408 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2409 # of the shared library accordingly
2410 if os.path.exists(name):
2411 local_shlib_path = name # name is the full path to the local shared library
2412 else:
2413 # Check relative names
2414 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2415 if not os.path.exists(local_shlib_path):
2416 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002417 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002418 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002419
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002420 # Make sure we found the local shared library in the above code
2421 self.assertTrue(os.path.exists(local_shlib_path))
2422
2423 # Add the shared library to our target
2424 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2425 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002426 # We must set the remote install location if we want the shared library
2427 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002428 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002429 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002430
2431 return environment
2432
Enrico Granata44818162012-10-24 01:23:57 +00002433 # utility methods that tests can use to access the current objects
2434 def target(self):
2435 if not self.dbg:
2436 raise Exception('Invalid debugger instance')
2437 return self.dbg.GetSelectedTarget()
2438
2439 def process(self):
2440 if not self.dbg:
2441 raise Exception('Invalid debugger instance')
2442 return self.dbg.GetSelectedTarget().GetProcess()
2443
2444 def thread(self):
2445 if not self.dbg:
2446 raise Exception('Invalid debugger instance')
2447 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2448
2449 def frame(self):
2450 if not self.dbg:
2451 raise Exception('Invalid debugger instance')
2452 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2453
Greg Claytonc6947512013-12-13 19:18:59 +00002454 def get_process_working_directory(self):
2455 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2456 if lldb.remote_platform:
2457 # Remote tests set the platform working directory up in TestBase.setUp()
2458 return lldb.remote_platform.GetWorkingDirectory()
2459 else:
2460 # local tests change directory into each test subdirectory
2461 return os.getcwd()
2462
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002463 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002464 #import traceback
2465 #traceback.print_stack()
2466
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002467 # Ensure all the references to SB objects have gone away so that we can
2468 # be sure that all test-specific resources have been freed before we
2469 # attempt to delete the targets.
2470 gc.collect()
2471
Johnny Chen3794ad92011-06-15 21:24:24 +00002472 # Delete the target(s) from the debugger as a general cleanup step.
2473 # This includes terminating the process for each target, if any.
2474 # We'd like to reuse the debugger for our next test without incurring
2475 # the initialization overhead.
2476 targets = []
2477 for target in self.dbg:
2478 if target:
2479 targets.append(target)
2480 process = target.GetProcess()
2481 if process:
2482 rc = self.invoke(process, "Kill")
2483 self.assertTrue(rc.Success(), PROCESS_KILLED)
2484 for target in targets:
2485 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002486
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002487 # Do this last, to make sure it's in reverse order from how we setup.
2488 Base.tearDown(self)
2489
Zachary Turner95812042015-03-26 18:54:21 +00002490 # This must be the last statement, otherwise teardown hooks or other
2491 # lines might depend on this still being active.
2492 del self.dbg
2493
Johnny Chen86268e42011-09-30 21:48:35 +00002494 def switch_to_thread_with_stop_reason(self, stop_reason):
2495 """
2496 Run the 'thread list' command, and select the thread with stop reason as
2497 'stop_reason'. If no such thread exists, no select action is done.
2498 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002499 from .lldbutil import stop_reason_to_str
Johnny Chen86268e42011-09-30 21:48:35 +00002500 self.runCmd('thread list')
2501 output = self.res.GetOutput()
2502 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2503 stop_reason_to_str(stop_reason))
2504 for line in output.splitlines():
2505 matched = thread_line_pattern.match(line)
2506 if matched:
2507 self.runCmd('thread select %s' % matched.group(1))
2508
Enrico Granata7594f142013-06-17 22:51:50 +00002509 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002510 """
2511 Ask the command interpreter to handle the command and then check its
2512 return status.
2513 """
2514 # Fail fast if 'cmd' is not meaningful.
2515 if not cmd or len(cmd) == 0:
2516 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002517
Johnny Chen8d55a342010-08-31 17:42:54 +00002518 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002519
Daniel Maleae0f8f572013-08-26 23:57:52 +00002520 if cmd.startswith("target create "):
2521 cmd = cmd.replace("target create ", "file ")
Daniel Maleae0f8f572013-08-26 23:57:52 +00002522
Johnny Chen63dfb272010-09-01 00:15:19 +00002523 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002524
Johnny Chen63dfb272010-09-01 00:15:19 +00002525 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002526 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002527
Johnny Chen150c3cc2010-10-15 01:18:29 +00002528 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002529 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002530 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002531 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002532 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002533 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002534 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002535 print("runCmd failed!", file=sbuf)
2536 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002537
Johnny Chenff3d01d2010-08-20 21:03:09 +00002538 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002539 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002540 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002541 # For process launch, wait some time before possible next try.
2542 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002543 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002544 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002545
Johnny Chen27f212d2010-08-19 23:26:59 +00002546 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002547 self.assertTrue(self.res.Succeeded(),
2548 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002549
Jim Ingham63dfc722012-09-22 00:05:11 +00002550 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2551 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2552
2553 Otherwise, all the arguments have the same meanings as for the expect function"""
2554
2555 trace = (True if traceAlways else trace)
2556
2557 if exe:
2558 # First run the command. If we are expecting error, set check=False.
2559 # Pass the assert message along since it provides more semantic info.
2560 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2561
2562 # Then compare the output against expected strings.
2563 output = self.res.GetError() if error else self.res.GetOutput()
2564
2565 # If error is True, the API client expects the command to fail!
2566 if error:
2567 self.assertFalse(self.res.Succeeded(),
2568 "Command '" + str + "' is expected to fail!")
2569 else:
2570 # No execution required, just compare str against the golden input.
2571 output = str
2572 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002573 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002574
2575 # The heading says either "Expecting" or "Not expecting".
2576 heading = "Expecting" if matching else "Not expecting"
2577
2578 for pattern in patterns:
2579 # Match Objects always have a boolean value of True.
2580 match_object = re.search(pattern, output)
2581 matched = bool(match_object)
2582 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002583 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2584 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002585 if matched:
2586 break
2587
2588 self.assertTrue(matched if matching else not matched,
2589 msg if msg else EXP_MSG(str, exe))
2590
2591 return match_object
2592
Enrico Granata7594f142013-06-17 22:51:50 +00002593 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 +00002594 """
2595 Similar to runCmd; with additional expect style output matching ability.
2596
2597 Ask the command interpreter to handle the command and then check its
2598 return status. The 'msg' parameter specifies an informational assert
2599 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002600 'startstr', matches the substrings contained in 'substrs', and regexp
2601 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002602
2603 If the keyword argument error is set to True, it signifies that the API
2604 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002605 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002606 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002607
2608 If the keyword argument matching is set to False, it signifies that the API
2609 client is expecting the output of the command not to match the golden
2610 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002611
2612 Finally, the required argument 'str' represents the lldb command to be
2613 sent to the command interpreter. In case the keyword argument 'exe' is
2614 set to False, the 'str' is treated as a string to be matched/not-matched
2615 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002616 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002617 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002618
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002619 if exe:
2620 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002621 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002622 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002623
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002624 # Then compare the output against expected strings.
2625 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002626
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002627 # If error is True, the API client expects the command to fail!
2628 if error:
2629 self.assertFalse(self.res.Succeeded(),
2630 "Command '" + str + "' is expected to fail!")
2631 else:
2632 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002633 if isinstance(str,lldb.SBCommandReturnObject):
2634 output = str.GetOutput()
2635 else:
2636 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002637 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002638 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002639
Johnny Chenea88e942010-09-21 21:08:53 +00002640 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002641 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002642
2643 # Start from the startstr, if specified.
2644 # If there's no startstr, set the initial state appropriately.
2645 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002646
Johnny Chen150c3cc2010-10-15 01:18:29 +00002647 if startstr:
2648 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002649 print("%s start string: %s" % (heading, startstr), file=sbuf)
2650 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002651
Johnny Chen86268e42011-09-30 21:48:35 +00002652 # Look for endstr, if specified.
2653 keepgoing = matched if matching else not matched
2654 if endstr:
2655 matched = output.endswith(endstr)
2656 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002657 print("%s end string: %s" % (heading, endstr), file=sbuf)
2658 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002659
Johnny Chenea88e942010-09-21 21:08:53 +00002660 # Look for sub strings, if specified.
2661 keepgoing = matched if matching else not matched
2662 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002663 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002664 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002665 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002666 print("%s sub string: %s" % (heading, str), file=sbuf)
2667 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002668 keepgoing = matched if matching else not matched
2669 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002670 break
2671
Johnny Chenea88e942010-09-21 21:08:53 +00002672 # Search for regular expression patterns, if specified.
2673 keepgoing = matched if matching else not matched
2674 if patterns and keepgoing:
2675 for pattern in patterns:
2676 # Match Objects always have a boolean value of True.
2677 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002678 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002679 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2680 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002681 keepgoing = matched if matching else not matched
2682 if not keepgoing:
2683 break
Johnny Chenea88e942010-09-21 21:08:53 +00002684
2685 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002686 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002687
Johnny Chenf3c59232010-08-25 22:52:45 +00002688 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002689 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002690 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002691
2692 method = getattr(obj, name)
2693 import inspect
2694 self.assertTrue(inspect.ismethod(method),
2695 name + "is a method name of object: " + str(obj))
2696 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002697 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002698 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002699 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002700
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002701 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2702 """Platform specific way to build the default binaries."""
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002703 module = builder_module()
2704 if target_is_android():
2705 dictionary = append_android_envs(dictionary)
2706 if self.debug_info is None:
2707 return self.buildDefault(architecture, compiler, dictionary, clean)
2708 elif self.debug_info == "dsym":
2709 return self.buildDsym(architecture, compiler, dictionary, clean)
2710 elif self.debug_info == "dwarf":
2711 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002712 elif self.debug_info == "dwo":
2713 return self.buildDwo(architecture, compiler, dictionary, clean)
2714 else:
2715 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002716
Johnny Chenf359cf22011-05-27 23:36:52 +00002717 # =================================================
2718 # Misc. helper methods for debugging test execution
2719 # =================================================
2720
Johnny Chen56b92a72011-07-11 19:15:11 +00002721 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002722 """Debug print a SBValue object, if traceAlways is True."""
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002723 from .lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002724
Johnny Chen8d55a342010-08-31 17:42:54 +00002725 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002726 return
2727
2728 err = sys.stderr
2729 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002730 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2731 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2732 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2733 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2734 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2735 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2736 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2737 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2738 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002739
Johnny Chen36c5eb12011-08-05 20:17:27 +00002740 def DebugSBType(self, type):
2741 """Debug print a SBType object, if traceAlways is True."""
2742 if not traceAlways:
2743 return
2744
2745 err = sys.stderr
2746 err.write(type.GetName() + ":\n")
2747 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2748 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2749 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2750
Johnny Chenb877f1e2011-03-12 01:18:19 +00002751 def DebugPExpect(self, child):
2752 """Debug the spwaned pexpect object."""
2753 if not traceAlways:
2754 return
2755
Zachary Turnerff890da2015-10-19 23:45:41 +00002756 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002757
2758 @classmethod
2759 def RemoveTempFile(cls, file):
2760 if os.path.exists(file):
2761 os.remove(file)