blob: 63be1809c14182817785945085699bf99dcf4140 [file] [log] [blame]
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001"""
2LLDB module which provides the abstract base class of lldb test case.
3
4The concrete subclass can override lldbtest.TesBase in order to inherit the
5common behavior for unitest.TestCase.setUp/tearDown implemented in this file.
6
7The subclass should override the attribute mydir in order for the python runtime
8to locate the individual test cases when running as part of a large test suite
9or when running each test case as a separate python invocation.
10
11./dotest.py provides a test driver which sets up the environment to run the
Johnny Chenc98892e2012-05-16 20:41:28 +000012entire of part of the test suite . Example:
Johnny Chenbf6ffa32010-07-03 03:41:59 +000013
Johnny Chenc98892e2012-05-16 20:41:28 +000014# Exercises the test suite in the types directory....
15/Volumes/data/lldb/svn/ToT/test $ ./dotest.py -A x86_64 types
Johnny Chen57b47382010-09-02 22:25:47 +000016...
Johnny Chend0190a62010-08-23 17:10:44 +000017
Johnny Chenc98892e2012-05-16 20:41:28 +000018Session logs for test failures/errors/unexpected successes will go into directory '2012-05-16-13_35_42'
19Command invoked: python ./dotest.py -A x86_64 types
20compilers=['clang']
Johnny Chend0190a62010-08-23 17:10:44 +000021
Johnny Chenc98892e2012-05-16 20:41:28 +000022Configuration: arch=x86_64 compiler=clang
Johnny Chend0190a62010-08-23 17:10:44 +000023----------------------------------------------------------------------
Johnny Chenc98892e2012-05-16 20:41:28 +000024Collected 72 tests
25
26........................................................................
27----------------------------------------------------------------------
28Ran 72 tests in 135.468s
Johnny Chend0190a62010-08-23 17:10:44 +000029
30OK
Johnny Chenbf6ffa32010-07-03 03:41:59 +000031$
32"""
33
Zachary Turnerff890da2015-10-19 23:45:41 +000034from __future__ import print_function
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000035from __future__ import absolute_import
Zachary Turnerff890da2015-10-19 23:45:41 +000036
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000037# System modules
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +000038import abc
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000039import collections
Zachary Turnerabdb8392015-11-16 22:40:30 +000040from distutils.version import LooseVersion
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +000041import gc
Vince Harron9753dd92015-05-10 15:22:09 +000042import glob
Zachary Turnerba105702015-11-16 23:58:20 +000043import inspect
Johnny Chen90312a82010-09-21 22:34:45 +000044import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000045import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000046import re
Daniel Malea69207462013-06-05 21:07:02 +000047import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000048from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000049import time
Johnny Chena33a93c2010-08-30 23:08:52 +000050import types
Zachary Turner43a01e42015-10-20 21:06:05 +000051
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000052# Third-party modules
53import unittest2
Zachary Turner43a01e42015-10-20 21:06:05 +000054from six import add_metaclass
Zachary Turner814236d2015-10-21 17:48:52 +000055from six import StringIO as SixStringIO
56from six.moves.urllib import parse as urlparse
Zachary Turnercd236b82015-10-26 18:48:24 +000057import six
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000058
59# LLDB modules
60import lldb
Zachary Turner606e3a52015-12-08 01:15:30 +000061from . import configuration
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000062from . import lldbtest_config
63from . import lldbutil
64from . import test_categories
Siva Chandra8af91662015-06-05 00:22:49 +000065
Todd Fiala9187f272015-12-11 18:06:47 +000066from .result_formatter import EventBuilder
67
Vince Harron85d19652015-05-21 19:09:29 +000068# dosep.py starts lots and lots of dotest instances
69# This option helps you find if two (or more) dotest instances are using the same
70# directory at the same time
71# Enable it to cause test failures and stderr messages if dotest instances try to run in
72# the same directory simultaneously
73# it is disabled by default because it litters the test directories with ".dirlock" files
74debug_confirm_directory_exclusivity = False
75
Johnny Chen707b3c92010-10-11 22:25:46 +000076# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000077# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000078
79# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000080if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
81 traceAlways = True
82else:
83 traceAlways = False
84
Johnny Chen707b3c92010-10-11 22:25:46 +000085# By default, doCleanup is True.
86if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
87 doCleanup = False
88else:
89 doCleanup = True
90
Johnny Chen8d55a342010-08-31 17:42:54 +000091
Johnny Chen00778092010-08-09 22:01:17 +000092#
93# Some commonly used assert messages.
94#
95
Johnny Chenaa902922010-09-17 22:45:27 +000096COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
97
Johnny Chen00778092010-08-09 22:01:17 +000098CURRENT_EXECUTABLE_SET = "Current executable set successfully"
99
Johnny Chen7d1d7532010-09-02 21:23:12 +0000100PROCESS_IS_VALID = "Process is valid"
101
102PROCESS_KILLED = "Process is killed successfully"
103
Johnny Chend5f66fc2010-12-23 01:12:19 +0000104PROCESS_EXITED = "Process exited successfully"
105
106PROCESS_STOPPED = "Process status should be stopped"
107
Sean Callanan05834cd2015-07-01 23:56:30 +0000108RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000109
Johnny Chen17941842010-08-09 23:44:24 +0000110RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000111
Johnny Chen67af43f2010-10-05 19:27:32 +0000112BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
113
Johnny Chen17941842010-08-09 23:44:24 +0000114BREAKPOINT_CREATED = "Breakpoint created successfully"
115
Johnny Chenf10af382010-12-04 00:07:24 +0000116BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
117
Johnny Chene76896c2010-08-17 21:33:31 +0000118BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
119
Johnny Chen17941842010-08-09 23:44:24 +0000120BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000121
Johnny Chen703dbd02010-09-30 17:06:24 +0000122BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
123
Johnny Chen164f1e12010-10-15 18:07:09 +0000124BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
125
Greg Clayton5db6b792012-10-24 18:24:14 +0000126MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
127
Johnny Chen89109ed12011-06-27 20:05:23 +0000128OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
129
Johnny Chen5b3a3572010-12-09 18:22:12 +0000130SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
131
Johnny Chenc70b02a2010-09-22 23:00:20 +0000132STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
133
Johnny Chen1691a162011-04-15 16:44:48 +0000134STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
135
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000136STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
137
Johnny Chen5d6c4642010-11-10 23:46:38 +0000138STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000139
Johnny Chen5d6c4642010-11-10 23:46:38 +0000140STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
141 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000142
Johnny Chen2e431ce2010-10-20 18:38:48 +0000143STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
144
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000145STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
146
Johnny Chenc066ab42010-10-14 01:22:03 +0000147STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
148
Johnny Chen00778092010-08-09 22:01:17 +0000149STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
150
Johnny Chenf68cc122011-09-15 21:09:59 +0000151STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
152
Johnny Chen3c884a02010-08-24 22:07:56 +0000153DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
154
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000155VALID_BREAKPOINT = "Got a valid breakpoint"
156
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000157VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
158
Johnny Chen7209d84f2011-05-06 23:26:12 +0000159VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
160
Johnny Chen5ee88192010-08-27 23:47:36 +0000161VALID_FILESPEC = "Got a valid filespec"
162
Johnny Chen025d1b82010-12-08 01:25:21 +0000163VALID_MODULE = "Got a valid module"
164
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000165VALID_PROCESS = "Got a valid process"
166
Johnny Chen025d1b82010-12-08 01:25:21 +0000167VALID_SYMBOL = "Got a valid symbol"
168
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000169VALID_TARGET = "Got a valid target"
170
Matthew Gardinerc928de32014-10-22 07:22:56 +0000171VALID_PLATFORM = "Got a valid platform"
172
Johnny Chen15f247a2012-02-03 20:43:00 +0000173VALID_TYPE = "Got a valid type"
174
Johnny Chen5819ab42011-07-15 22:28:10 +0000175VALID_VARIABLE = "Got a valid variable"
176
Johnny Chen981463d2010-08-25 19:00:04 +0000177VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000178
Johnny Chenf68cc122011-09-15 21:09:59 +0000179WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000180
Sean Callanan05834cd2015-07-01 23:56:30 +0000181def CMD_MSG(str):
182 '''A generic "Command '%s' returns successfully" message generator.'''
183 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000184
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000185def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000186 '''A generic message generator for the completion mechanism.'''
187 return "'%s' successfully completes to '%s'" % (str_before, str_after)
188
Johnny Chenc0c67f22010-11-09 18:42:22 +0000189def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000190 '''A generic "'%s' returns expected result" message generator if exe.
191 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000192 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000193
Johnny Chen3343f042010-10-19 19:11:38 +0000194def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000195 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000196 return "Value of setting '%s' is correct" % setting
197
Johnny Chen27c41232010-08-26 21:49:29 +0000198def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000199 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000200 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000201
Johnny Chen47ceb032010-10-11 23:52:19 +0000202def line_number(filename, string_to_match):
203 """Helper function to return the line number of the first matched string."""
204 with open(filename, 'r') as f:
205 for i, line in enumerate(f):
206 if line.find(string_to_match) != -1:
207 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000208 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000209 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000210
Johnny Chen67af43f2010-10-05 19:27:32 +0000211def pointer_size():
212 """Return the pointer size of the host system."""
213 import ctypes
214 a_pointer = ctypes.c_void_p(0xffff)
215 return 8 * ctypes.sizeof(a_pointer)
216
Johnny Chen57816732012-02-09 02:01:59 +0000217def is_exe(fpath):
218 """Returns true if fpath is an executable."""
219 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
220
221def which(program):
222 """Returns the full path to a program; None otherwise."""
223 fpath, fname = os.path.split(program)
224 if fpath:
225 if is_exe(program):
226 return program
227 else:
228 for path in os.environ["PATH"].split(os.pathsep):
229 exe_file = os.path.join(path, program)
230 if is_exe(exe_file):
231 return exe_file
232 return None
233
Zachary Turner814236d2015-10-21 17:48:52 +0000234class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000235 """
236 A nice little context manager for recording the debugger interactions into
237 our session object. If trace flag is ON, it also emits the interactions
238 into the stderr.
239 """
240 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000241 """Create a SixStringIO instance; record the session obj and trace flag."""
242 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000243 # The test might not have undergone the 'setUp(self)' phase yet, so that
244 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000245 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000246 self.trace = trace
247
248 def __enter__(self):
249 """
250 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000251 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000252 """
253 return self
254
255 def __exit__(self, type, value, tb):
256 """
257 Context management protocol on exit from the body of the with statement.
258 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000259 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000260 """
261 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000262 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000263 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000264 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000265 self.close()
266
Zachary Turner43a01e42015-10-20 21:06:05 +0000267@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000268class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000269
270 @abc.abstractproperty
271 def pid(self):
272 """Returns process PID if has been launched already."""
273
274 @abc.abstractmethod
275 def launch(self, executable, args):
276 """Launches new process with given executable and args."""
277
278 @abc.abstractmethod
279 def terminate(self):
280 """Terminates previously launched process.."""
281
282class _LocalProcess(_BaseProcess):
283
284 def __init__(self, trace_on):
285 self._proc = None
286 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000287 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000288
289 @property
290 def pid(self):
291 return self._proc.pid
292
293 def launch(self, executable, args):
294 self._proc = Popen([executable] + args,
295 stdout = open(os.devnull) if not self._trace_on else None,
296 stdin = PIPE)
297
298 def terminate(self):
299 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000300 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000301 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
302 for sig in signals_to_try:
303 try:
304 self._proc.send_signal(getattr(signal, sig))
305 time.sleep(self._delayafterterminate)
306 if self._proc.poll() != None:
307 return
308 except ValueError:
309 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000310 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000311 time.sleep(self._delayafterterminate)
312 if self._proc.poll() != None:
313 return
314 self._proc.kill()
315 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000316
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000317 def poll(self):
318 return self._proc.poll()
319
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000320class _RemoteProcess(_BaseProcess):
321
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000322 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000323 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000324 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000325
326 @property
327 def pid(self):
328 return self._pid
329
330 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000331 if self._install_remote:
332 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000333 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000334
335 dst_file_spec = lldb.SBFileSpec(dst_path, False)
336 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
337 if err.Fail():
338 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
339 else:
340 dst_path = executable
341 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000342
343 launch_info = lldb.SBLaunchInfo(args)
344 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000345 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000346
347 # Redirect stdout and stderr to /dev/null
348 launch_info.AddSuppressFileAction(1, False, True)
349 launch_info.AddSuppressFileAction(2, False, True)
350
351 err = lldb.remote_platform.Launch(launch_info)
352 if err.Fail():
353 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
354 self._pid = launch_info.GetProcessID()
355
356 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000357 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000358
Johnny Chen690fcef2010-10-15 23:55:05 +0000359# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000360# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000361def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000362 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000363
364 If the exit code was non-zero it raises a CalledProcessError. The
365 CalledProcessError object will have the return code in the returncode
366 attribute and output in the output attribute.
367
368 The arguments are the same as for the Popen constructor. Example:
369
370 >>> check_output(["ls", "-l", "/dev/null"])
371 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
372
373 The stdout argument is not allowed as it is used internally.
374 To capture standard error in the result, use stderr=STDOUT.
375
376 >>> check_output(["/bin/sh", "-c",
377 ... "ls -l non_existent_file ; exit 0"],
378 ... stderr=STDOUT)
379 'ls: non_existent_file: No such file or directory\n'
380 """
381
382 # Assign the sender object to variable 'test' and remove it from kwargs.
383 test = kwargs.pop('sender', None)
384
Zachary Turner9ef307b2014-07-22 16:19:29 +0000385 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
386 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000387 output = ""
388 error = ""
389 for shellCommand in commandList:
390 if 'stdout' in kwargs:
391 raise ValueError('stdout argument not allowed, it will be overridden.')
392 if 'shell' in kwargs and kwargs['shell']==False:
393 raise ValueError('shell=False not allowed')
Zachary Turner48ef8d4c2015-11-18 18:40:16 +0000394 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, universal_newlines=True, **kwargs)
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000395 pid = process.pid
396 this_output, this_error = process.communicate()
397 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000398
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000399 # Enable trace on failure return while tracking down FreeBSD buildbot issues
400 trace = traceAlways
401 if not trace and retcode and sys.platform.startswith("freebsd"):
402 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000403
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000404 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000405 print(file=sbuf)
406 print("os command:", shellCommand, file=sbuf)
407 print("with pid:", pid, file=sbuf)
408 print("stdout:", this_output, file=sbuf)
409 print("stderr:", this_error, file=sbuf)
410 print("retcode:", retcode, file=sbuf)
411 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000412
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000413 if retcode:
414 cmd = kwargs.get("args")
415 if cmd is None:
416 cmd = shellCommand
417 raise CalledProcessError(retcode, cmd)
418 output = output + this_output
419 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000420 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000421
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000422def getsource_if_available(obj):
423 """
424 Return the text of the source code for an object if available. Otherwise,
425 a print representation is returned.
426 """
427 import inspect
428 try:
429 return inspect.getsource(obj)
430 except:
431 return repr(obj)
432
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000433def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000434 if sys.platform.startswith("freebsd"):
435 return __import__("builder_freebsd")
Kamil Rytarowski0b655da2015-12-05 18:46:56 +0000436 if sys.platform.startswith("netbsd"):
437 return __import__("builder_netbsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000438 return __import__("builder_" + sys.platform)
439
Siva Chandra8af91662015-06-05 00:22:49 +0000440def run_adb_command(cmd, device_id):
441 device_id_args = []
442 if device_id:
443 device_id_args = ["-s", device_id]
444 full_cmd = ["adb"] + device_id_args + cmd
445 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
446 stdout, stderr = p.communicate()
447 return p.returncode, stdout, stderr
448
Chaoren Line9bbabc2015-07-18 00:37:55 +0000449def append_android_envs(dictionary):
450 if dictionary is None:
451 dictionary = {}
452 dictionary["OS"] = "Android"
453 if android_device_api() >= 16:
454 dictionary["PIE"] = 1
455 return dictionary
456
Chaoren Lin9070f532015-07-17 22:13:29 +0000457def target_is_android():
458 if not hasattr(target_is_android, 'result'):
459 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
460 match = re.match(".*-.*-.*-android", triple)
461 target_is_android.result = match is not None
462 return target_is_android.result
463
Siva Chandra8af91662015-06-05 00:22:49 +0000464def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000465 if not hasattr(android_device_api, 'result'):
Zachary Turner606e3a52015-12-08 01:15:30 +0000466 assert configuration.lldb_platform_url is not None
Chaoren Lin9070f532015-07-17 22:13:29 +0000467 device_id = None
Zachary Turner606e3a52015-12-08 01:15:30 +0000468 parsed_url = urlparse.urlparse(configuration.lldb_platform_url)
Ying Chenca922bb2015-11-18 19:03:20 +0000469 host_name = parsed_url.netloc.split(":")[0]
470 if host_name != 'localhost':
471 device_id = host_name
472 if device_id.startswith('[') and device_id.endswith(']'):
473 device_id = device_id[1:-1]
Chaoren Lin9070f532015-07-17 22:13:29 +0000474 retcode, stdout, stderr = run_adb_command(
475 ["shell", "getprop", "ro.build.version.sdk"], device_id)
476 if retcode == 0:
477 android_device_api.result = int(stdout)
478 else:
479 raise LookupError(
480 ">>> Unable to determine the API level of the Android device.\n"
481 ">>> stdout:\n%s\n"
482 ">>> stderr:\n%s\n" % (stdout, stderr))
483 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000484
Zachary Turnerabdb8392015-11-16 22:40:30 +0000485def check_expected_version(comparison, expected, actual):
486 def fn_leq(x,y): return x <= y
487 def fn_less(x,y): return x < y
488 def fn_geq(x,y): return x >= y
489 def fn_greater(x,y): return x > y
490 def fn_eq(x,y): return x == y
491 def fn_neq(x,y): return x != y
492
493 op_lookup = {
494 "==": fn_eq,
495 "=": fn_eq,
496 "!=": fn_neq,
497 "<>": fn_neq,
498 ">": fn_greater,
499 "<": fn_less,
500 ">=": fn_geq,
501 "<=": fn_leq
502 }
503 expected_str = '.'.join([str(x) for x in expected])
504 actual_str = '.'.join([str(x) for x in actual])
505
506 return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
507
Johnny Chena74bb0a2011-08-01 18:46:13 +0000508#
509# Decorators for categorizing test cases.
510#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000511from functools import wraps
Pavel Labathffbf9e82015-12-14 13:17:18 +0000512
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000513def add_test_categories(cat):
Pavel Labathffbf9e82015-12-14 13:17:18 +0000514 """Add test categories to a TestCase method"""
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000515 cat = test_categories.validate(cat, True)
516 def impl(func):
Pavel Labathffbf9e82015-12-14 13:17:18 +0000517 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
518 raise Exception("@add_test_categories can only be used to decorate a test method")
519 if hasattr(func, "categories"):
520 cat.extend(func.categories)
521 func.categories = cat
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000522 return func
Pavel Labathffbf9e82015-12-14 13:17:18 +0000523
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000524 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000525
Johnny Chena74bb0a2011-08-01 18:46:13 +0000526def benchmarks_test(func):
527 """Decorate the item as a benchmarks test."""
528 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
529 raise Exception("@benchmarks_test can only be used to decorate a test method")
530 @wraps(func)
531 def wrapper(self, *args, **kwargs):
Zachary Turneraad25fb2015-12-08 18:36:05 +0000532 self.skipTest("benchmarks test")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000533 return func(self, *args, **kwargs)
534
535 # Mark this function as such to separate them from the regular tests.
536 wrapper.__benchmarks_test__ = True
537 return wrapper
538
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000539def no_debug_info_test(func):
540 """Decorate the item as a test what don't use any debug info. If this annotation is specified
541 then the test runner won't generate a separate test for each debug info format. """
542 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
543 raise Exception("@no_debug_info_test can only be used to decorate a test method")
544 @wraps(func)
545 def wrapper(self, *args, **kwargs):
546 return func(self, *args, **kwargs)
547
548 # Mark this function as such to separate them from the regular tests.
549 wrapper.__no_debug_info_test__ = True
550 return wrapper
551
Todd Fialaa41d48c2014-04-28 04:49:40 +0000552def debugserver_test(func):
553 """Decorate the item as a debugserver test."""
554 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
555 raise Exception("@debugserver_test can only be used to decorate a test method")
556 @wraps(func)
557 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000558 if configuration.dont_do_debugserver_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000559 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000560 return func(self, *args, **kwargs)
561
562 # Mark this function as such to separate them from the regular tests.
563 wrapper.__debugserver_test__ = True
564 return wrapper
565
566def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000567 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000568 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
569 raise Exception("@llgs_test can only be used to decorate a test method")
570 @wraps(func)
571 def wrapper(self, *args, **kwargs):
Zachary Turner606e3a52015-12-08 01:15:30 +0000572 if configuration.dont_do_llgs_test:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000573 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000574 return func(self, *args, **kwargs)
575
576 # Mark this function as such to separate them from the regular tests.
577 wrapper.__llgs_test__ = True
578 return wrapper
579
Daniel Maleae0f8f572013-08-26 23:57:52 +0000580def not_remote_testsuite_ready(func):
581 """Decorate the item as a test which is not ready yet for remote testsuite."""
582 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
583 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
584 @wraps(func)
585 def wrapper(self, *args, **kwargs):
Zachary Turnerd865c6b2015-12-08 22:15:48 +0000586 if lldb.remote_platform:
Pavel Labathf882f6f2015-10-12 13:42:16 +0000587 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000588 return func(self, *args, **kwargs)
589
590 # Mark this function as such to separate them from the regular tests.
591 wrapper.__not_ready_for_remote_testsuite_test__ = True
592 return wrapper
593
Ed Maste433790a2014-04-23 12:55:41 +0000594def expectedFailure(expected_fn, bugnumber=None):
595 def expectedFailure_impl(func):
Pavel Labath4da73572016-01-18 14:45:35 +0000596 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
597 raise Exception("Decorator can only be used to decorate a test method")
Ed Maste433790a2014-04-23 12:55:41 +0000598 @wraps(func)
599 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000600 from unittest2 import case
601 self = args[0]
Ed Maste433790a2014-04-23 12:55:41 +0000602 if expected_fn(self):
Pavel Labath25e241b2015-12-16 12:09:45 +0000603 if configuration.results_formatter_object is not None:
604 # Mark this test as expected to fail.
605 configuration.results_formatter_object.handle_event(
606 EventBuilder.event_for_mark_test_expected_failure(self))
Zachary Turner5cb8e672015-11-06 18:14:42 +0000607 xfail_func = unittest2.expectedFailure(func)
608 xfail_func(*args, **kwargs)
609 else:
610 func(*args, **kwargs)
Ed Maste433790a2014-04-23 12:55:41 +0000611 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000612 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
613 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000614 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000615 return expectedFailure_impl(bugnumber)
616 else:
617 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000618
Ying Chen0c352822015-11-16 23:41:02 +0000619# You can also pass not_in(list) to reverse the sense of the test for the arguments that
620# are simple lists, namely oslist, compiler, and debug_info.
621
Zachary Turnere1eb5e32015-12-14 21:26:49 +0000622def not_in(iterable):
Ying Chen0c352822015-11-16 23:41:02 +0000623 return lambda x : x not in iterable
624
Zachary Turnere1eb5e32015-12-14 21:26:49 +0000625def check_list_or_lambda(list_or_lambda, value):
Siva Chandra7dcad312015-11-20 20:30:36 +0000626 if six.callable(list_or_lambda):
627 return list_or_lambda(value)
Adrian McCarthy46155dd2015-12-22 21:01:21 +0000628 elif isinstance(list_or_lambda, list):
629 for item in list_or_lambda:
630 if value in item:
631 return True
632 return False
633 elif isinstance(list_or_lambda, str):
Siva Chandraa3863582015-12-15 00:26:52 +0000634 return value is None or value in list_or_lambda
Zachary Turnere1eb5e32015-12-14 21:26:49 +0000635 else:
Siva Chandraa3863582015-12-15 00:26:52 +0000636 return list_or_lambda is None or value is None or list_or_lambda == value
Ying Chen0c352822015-11-16 23:41:02 +0000637
Ying Chen7091c2c2015-04-21 01:15:47 +0000638# provide a function to xfail on defined oslist, compiler version, and archs
639# if none is specified for any argument, that argument won't be checked and thus means for all
640# for example,
641# @expectedFailureAll, xfail for all platform/compiler/arch,
642# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
643# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Pavel Labath7ead0b92015-12-09 10:54:18 +0000644def 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 +0000645 def fn(self):
Siva Chandra7dcad312015-11-20 20:30:36 +0000646 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
Pavel Labath7ead0b92015-12-09 10:54:18 +0000647 hostoslist_passes = check_list_or_lambda(hostoslist, getHostPlatform())
Siva Chandra7dcad312015-11-20 20:30:36 +0000648 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Adrian McCarthy46155dd2015-12-22 21:01:21 +0000649 arch_passes = check_list_or_lambda(archs, self.getArchitecture())
Zachary Turnerabdb8392015-11-16 22:40:30 +0000650 triple_passes = triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())
Siva Chandra7dcad312015-11-20 20:30:36 +0000651 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +0000652 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))
653 py_version_passes = (py_version is None) or check_expected_version(py_version[0], py_version[1], sys.version_info)
654
655 return (oslist_passes and
Pavel Labath7ead0b92015-12-09 10:54:18 +0000656 hostoslist_passes and
Zachary Turnerabdb8392015-11-16 22:40:30 +0000657 compiler_passes and
658 arch_passes and
659 triple_passes and
660 debug_info_passes and
661 swig_version_passes and
662 py_version_passes)
Ying Chen7091c2c2015-04-21 01:15:47 +0000663 return expectedFailure(fn, bugnumber)
664
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000665def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000666 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
667
668def expectedFailureDwo(bugnumber=None):
669 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000670
671def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000672 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000673
674def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
675 if compiler_version is None:
676 compiler_version=['=', None]
677 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
678
Vince Harron8974ce22015-03-13 19:54:54 +0000679# to XFAIL a specific clang versions, try this
680# @expectedFailureClang('bugnumber', ['<=', '3.4'])
681def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000682 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000683
684def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000685 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000686
Matt Kopec0de53f02013-03-15 19:10:12 +0000687def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000688 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000689
Ed Maste433790a2014-04-23 12:55:41 +0000690def expectedFailureArch(arch, bugnumber=None):
691 def fn(self):
692 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000693 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000694
Enrico Granatae6cedc12013-02-23 01:05:23 +0000695def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000696 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000697
Matt Kopecee969f92013-09-26 23:30:59 +0000698def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000699 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000700
Omair Javaidbaa07492016-01-11 22:52:18 +0000701def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None, archs=None):
Ed Maste433790a2014-04-23 12:55:41 +0000702 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000703 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000704 self.expectedCompiler(compilers) and
Omair Javaidbaa07492016-01-11 22:52:18 +0000705 (archs is None or self.getArchitecture() in archs) and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000706 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000707 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000708
Chaoren Linf7160f32015-06-09 17:39:27 +0000709def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
710 def fn(self):
711 return (getHostPlatform() in oslist and
712 self.expectedCompiler(compilers))
713 return expectedFailure(fn, bugnumber)
714
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000715def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000716 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000717 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000718
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000719def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
720 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000721
Omair Javaidbaa07492016-01-11 22:52:18 +0000722def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None, archs=None):
723 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info, archs=archs)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000724
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000725def expectedFailureNetBSD(bugnumber=None, compilers=None, debug_info=None):
726 return expectedFailureOS(['netbsd'], bugnumber, compilers, debug_info=debug_info)
727
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000728def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
729 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000730
Chaoren Linf7160f32015-06-09 17:39:27 +0000731def expectedFailureHostWindows(bugnumber=None, compilers=None):
732 return expectedFailureHostOS(['windows'], bugnumber, compilers)
733
Pavel Labath090152b2015-08-20 11:37:19 +0000734def matchAndroid(api_levels=None, archs=None):
735 def match(self):
736 if not target_is_android():
737 return False
738 if archs is not None and self.getArchitecture() not in archs:
739 return False
740 if api_levels is not None and android_device_api() not in api_levels:
741 return False
742 return True
743 return match
744
745
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000746def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000747 """ Mark a test as xfail for Android.
748
749 Arguments:
750 bugnumber - The LLVM pr associated with the problem.
751 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000752 for which a test is expected to fail. None means all API level.
753 arch - A sequence of architecture names specifying the architectures
754 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000755 """
Pavel Labath090152b2015-08-20 11:37:19 +0000756 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000757
Pavel Labath773e86f2016-01-05 10:44:36 +0000758# Flakey tests get two chances to run. If they fail the first time round, the result formatter
759# makes sure it is run one more time.
Vince Harron7ac3ea42015-06-26 15:13:21 +0000760def expectedFlakey(expected_fn, bugnumber=None):
761 def expectedFailure_impl(func):
762 @wraps(func)
763 def wrapper(*args, **kwargs):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000764 self = args[0]
Todd Fiala9187f272015-12-11 18:06:47 +0000765 if expected_fn(self):
766 # Send event marking test as explicitly eligible for rerunning.
767 if configuration.results_formatter_object is not None:
768 # Mark this test as rerunnable.
769 configuration.results_formatter_object.handle_event(
770 EventBuilder.event_for_mark_test_rerun_eligible(self))
Pavel Labath773e86f2016-01-05 10:44:36 +0000771 func(*args, **kwargs)
Vince Harron7ac3ea42015-06-26 15:13:21 +0000772 return wrapper
773 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
774 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000775 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000776 return expectedFailure_impl(bugnumber)
777 else:
778 return expectedFailure_impl
779
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000780def expectedFlakeyDwarf(bugnumber=None):
781 def fn(self):
782 return self.debug_info == "dwarf"
783 return expectedFlakey(fn, bugnumber)
784
785def expectedFlakeyDsym(bugnumber=None):
786 def fn(self):
787 return self.debug_info == "dwarf"
788 return expectedFlakey(fn, bugnumber)
789
Vince Harron7ac3ea42015-06-26 15:13:21 +0000790def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
791 def fn(self):
792 return (self.getPlatform() in oslist and
793 self.expectedCompiler(compilers))
794 return expectedFlakey(fn, bugnumber)
795
796def expectedFlakeyDarwin(bugnumber=None, compilers=None):
797 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
798 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
799
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000800def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
801 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
802
Vince Harron7ac3ea42015-06-26 15:13:21 +0000803def expectedFlakeyLinux(bugnumber=None, compilers=None):
804 return expectedFlakeyOS(['linux'], bugnumber, compilers)
805
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000806def expectedFlakeyNetBSD(bugnumber=None, compilers=None):
807 return expectedFlakeyOS(['netbsd'], bugnumber, compilers)
Vince Harron7ac3ea42015-06-26 15:13:21 +0000808
809def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
810 if compiler_version is None:
811 compiler_version=['=', None]
812 def fn(self):
813 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
814 return expectedFlakey(fn, bugnumber)
815
816# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
817def expectedFlakeyClang(bugnumber=None, compiler_version=None):
818 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
819
820# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
821def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
822 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
823
Pavel Labath63a579c2015-09-07 12:15:27 +0000824def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
825 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
826
Greg Clayton12514562013-12-05 22:22:32 +0000827def skipIfRemote(func):
828 """Decorate the item to skip tests if testing remotely."""
829 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
830 raise Exception("@skipIfRemote can only be used to decorate a test method")
831 @wraps(func)
832 def wrapper(*args, **kwargs):
833 from unittest2 import case
834 if lldb.remote_platform:
835 self = args[0]
836 self.skipTest("skip on remote platform")
837 else:
838 func(*args, **kwargs)
839 return wrapper
840
Siva Chandra4470f382015-06-17 22:32:27 +0000841def skipUnlessListedRemote(remote_list=None):
842 def myImpl(func):
843 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
844 raise Exception("@skipIfRemote can only be used to decorate a "
845 "test method")
846
847 @wraps(func)
848 def wrapper(*args, **kwargs):
849 if remote_list and lldb.remote_platform:
850 self = args[0]
851 triple = self.dbg.GetSelectedPlatform().GetTriple()
852 for r in remote_list:
853 if r in triple:
854 func(*args, **kwargs)
855 return
856 self.skipTest("skip on remote platform %s" % str(triple))
857 else:
858 func(*args, **kwargs)
859 return wrapper
860
861 return myImpl
862
Greg Clayton12514562013-12-05 22:22:32 +0000863def skipIfRemoteDueToDeadlock(func):
864 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
865 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
866 raise Exception("@skipIfRemote can only be used to decorate a test method")
867 @wraps(func)
868 def wrapper(*args, **kwargs):
869 from unittest2 import case
870 if lldb.remote_platform:
871 self = args[0]
872 self.skipTest("skip on remote platform (deadlocks)")
873 else:
874 func(*args, **kwargs)
875 return wrapper
876
Enrico Granatab633e432014-10-06 21:37:06 +0000877def skipIfNoSBHeaders(func):
878 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
879 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000880 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000881 @wraps(func)
882 def wrapper(*args, **kwargs):
883 from unittest2 import case
884 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000885 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000886 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000887 else:
888 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000889 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000890 if not os.path.exists(header):
891 self.skipTest("skip because LLDB.h header not found")
892 else:
893 func(*args, **kwargs)
894 return wrapper
895
Enrico Granata5f92a132015-11-05 00:46:25 +0000896def skipIfiOSSimulator(func):
897 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
Zachary Turner606e3a52015-12-08 01:15:30 +0000898 return unittest2.skipIf(configuration.lldb_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
Enrico Granata5f92a132015-11-05 00:46:25 +0000899
Robert Flack13c7ad92015-03-30 14:12:17 +0000900def skipIfFreeBSD(func):
901 """Decorate the item to skip tests that should be skipped on FreeBSD."""
902 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000903
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000904def skipIfNetBSD(func):
905 """Decorate the item to skip tests that should be skipped on NetBSD."""
906 return skipIfPlatform(["netbsd"])(func)
907
Greg Claytone0d0a762015-04-02 18:24:03 +0000908def getDarwinOSTriples():
909 return ['darwin', 'macosx', 'ios']
910
Daniel Maleab3d41a22013-07-09 00:08:01 +0000911def skipIfDarwin(func):
912 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000913 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000914
Robert Flack13c7ad92015-03-30 14:12:17 +0000915def skipIfLinux(func):
916 """Decorate the item to skip tests that should be skipped on Linux."""
917 return skipIfPlatform(["linux"])(func)
918
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000919def skipUnlessHostLinux(func):
920 """Decorate the item to skip tests that should be skipped on any non Linux host."""
921 return skipUnlessHostPlatform(["linux"])(func)
922
Robert Flack13c7ad92015-03-30 14:12:17 +0000923def skipIfWindows(func):
924 """Decorate the item to skip tests that should be skipped on Windows."""
925 return skipIfPlatform(["windows"])(func)
926
Chaoren Line6eea5d2015-06-08 22:13:28 +0000927def skipIfHostWindows(func):
928 """Decorate the item to skip tests that should be skipped on Windows."""
929 return skipIfHostPlatform(["windows"])(func)
930
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000931def skipUnlessWindows(func):
932 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
933 return skipUnlessPlatform(["windows"])(func)
934
Robert Flack13c7ad92015-03-30 14:12:17 +0000935def skipUnlessDarwin(func):
936 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000937 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000938
Ryan Brown57bee1e2015-09-14 22:45:11 +0000939def skipUnlessGoInstalled(func):
940 """Decorate the item to skip tests when no Go compiler is available."""
941 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
942 raise Exception("@skipIfGcc can only be used to decorate a test method")
943 @wraps(func)
944 def wrapper(*args, **kwargs):
945 from unittest2 import case
946 self = args[0]
947 compiler = self.getGoCompilerVersion()
948 if not compiler:
949 self.skipTest("skipping because go compiler not found")
950 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000951 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000952 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000953 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
954 if not match_version:
955 # Couldn't determine version.
956 self.skipTest(
957 "skipping because go version could not be parsed "
958 "out of {}".format(compiler))
959 else:
960 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000961 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000962 compiler_strict_version = StrictVersion(match_version.group(1))
963 if compiler_strict_version < min_strict_version:
964 self.skipTest(
965 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +0000966 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +0000967 compiler_strict_version,
968 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +0000969 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +0000970 return wrapper
971
Robert Flack068898c2015-04-09 18:07:58 +0000972def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +0000973 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +0000974 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
975 if platform.startswith('freebsd'):
976 platform = 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000977 elif platform.startswith('netbsd'):
978 platform = 'netbsd'
Robert Flack068898c2015-04-09 18:07:58 +0000979 return platform
980
Robert Flack6e1fd352015-05-15 12:39:33 +0000981def getHostPlatform():
982 """Returns the host platform running the test suite."""
983 # Attempts to return a platform name matching a target Triple platform.
984 if sys.platform.startswith('linux'):
985 return 'linux'
986 elif sys.platform.startswith('win32'):
987 return 'windows'
988 elif sys.platform.startswith('darwin'):
989 return 'darwin'
990 elif sys.platform.startswith('freebsd'):
991 return 'freebsd'
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +0000992 elif sys.platform.startswith('netbsd'):
993 return 'netbsd'
Robert Flack6e1fd352015-05-15 12:39:33 +0000994 else:
995 return sys.platform
996
Robert Flackfb2f6c62015-04-17 08:02:18 +0000997def platformIsDarwin():
998 """Returns true if the OS triple for the selected platform is any valid apple OS"""
999 return getPlatform() in getDarwinOSTriples()
1000
Robert Flack6e1fd352015-05-15 12:39:33 +00001001def skipIfHostIncompatibleWithRemote(func):
1002 """Decorate the item to skip tests if binaries built on this host are incompatible."""
1003 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1004 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
1005 @wraps(func)
1006 def wrapper(*args, **kwargs):
1007 from unittest2 import case
1008 self = args[0]
1009 host_arch = self.getLldbArchitecture()
1010 host_platform = getHostPlatform()
1011 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +00001012 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +00001013 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
1014 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
1015 elif target_platform != host_platform:
1016 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
1017 else:
1018 func(*args, **kwargs)
1019 return wrapper
1020
Chaoren Line6eea5d2015-06-08 22:13:28 +00001021def skipIfHostPlatform(oslist):
1022 """Decorate the item to skip tests if running on one of the listed host platforms."""
1023 return unittest2.skipIf(getHostPlatform() in oslist,
1024 "skip on %s" % (", ".join(oslist)))
1025
1026def skipUnlessHostPlatform(oslist):
1027 """Decorate the item to skip tests unless running on one of the listed host platforms."""
1028 return unittest2.skipUnless(getHostPlatform() in oslist,
1029 "requires on of %s" % (", ".join(oslist)))
1030
Zachary Turner793d9972015-08-14 23:29:24 +00001031def skipUnlessArch(archlist):
1032 """Decorate the item to skip tests unless running on one of the listed architectures."""
1033 def myImpl(func):
1034 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1035 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1036
1037 @wraps(func)
1038 def wrapper(*args, **kwargs):
1039 self = args[0]
1040 if self.getArchitecture() not in archlist:
1041 self.skipTest("skipping for architecture %s (requires one of %s)" %
1042 (self.getArchitecture(), ", ".join(archlist)))
1043 else:
1044 func(*args, **kwargs)
1045 return wrapper
1046
1047 return myImpl
1048
Robert Flack13c7ad92015-03-30 14:12:17 +00001049def skipIfPlatform(oslist):
1050 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001051 return unittest2.skipIf(getPlatform() in oslist,
1052 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001053
1054def skipUnlessPlatform(oslist):
1055 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001056 return unittest2.skipUnless(getPlatform() in oslist,
1057 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001058
Ying Chen7091c2c2015-04-21 01:15:47 +00001059# provide a function to skip on defined oslist, compiler version, and archs
1060# if none is specified for any argument, that argument won't be checked and thus means for all
1061# for example,
1062# @skipIf, skip for all platform/compiler/arch,
1063# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1064# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1065
1066# TODO: refactor current code, to make skipIfxxx functions to call this function
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001067def 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 +00001068 def fn(self):
Zachary Turnere1eb5e32015-12-14 21:26:49 +00001069 oslist_passes = check_list_or_lambda(oslist, self.getPlatform())
1070 compiler_passes = check_list_or_lambda(self.getCompiler(), compiler) and self.expectedCompilerVersion(compiler_version)
Adrian McCarthy46155dd2015-12-22 21:01:21 +00001071 arch_passes = check_list_or_lambda(archs, self.getArchitecture())
Zachary Turnere1eb5e32015-12-14 21:26:49 +00001072 debug_info_passes = check_list_or_lambda(debug_info, self.debug_info)
Zachary Turnerabdb8392015-11-16 22:40:30 +00001073 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))
1074 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 +00001075 remote_passes = (remote is None) or (remote == (lldb.remote_platform is not None))
Zachary Turnerabdb8392015-11-16 22:40:30 +00001076
1077 return (oslist_passes and
1078 compiler_passes and
1079 arch_passes and
1080 debug_info_passes and
1081 swig_version_passes and
Tamas Berghammerccd6cff2015-12-08 14:08:19 +00001082 py_version_passes and
1083 remote_passes)
Zachary Turnerba105702015-11-16 23:58:20 +00001084
1085 local_vars = locals()
1086 args = [x for x in inspect.getargspec(skipIf).args]
1087 arg_vals = [eval(x, globals(), local_vars) for x in args]
1088 args = [x for x in zip(args, arg_vals) if x[1] is not None]
1089 reasons = ['%s=%s' % (x, str(y)) for (x,y) in args]
1090 return skipTestIfFn(fn, bugnumber, skipReason='skipping because ' + ' && '.join(reasons))
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001091
1092def skipIfDebugInfo(bugnumber=None, debug_info=None):
1093 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1094
Greg Claytonedea2372015-10-07 20:01:13 +00001095def skipIfDWO(bugnumber=None):
1096 return skipIfDebugInfo(bugnumber, ["dwo"])
1097
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001098def skipIfDwarf(bugnumber=None):
1099 return skipIfDebugInfo(bugnumber, ["dwarf"])
1100
1101def skipIfDsym(bugnumber=None):
1102 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001103
1104def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1105 def skipTestIfFn_impl(func):
1106 @wraps(func)
1107 def wrapper(*args, **kwargs):
1108 from unittest2 import case
1109 self = args[0]
1110 if expected_fn(self):
1111 self.skipTest(skipReason)
1112 else:
1113 func(*args, **kwargs)
1114 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001115 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001116 return skipTestIfFn_impl(bugnumber)
1117 else:
1118 return skipTestIfFn_impl
1119
Daniel Maleabe230792013-01-24 23:52:09 +00001120def skipIfGcc(func):
1121 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1122 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001123 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001124 @wraps(func)
1125 def wrapper(*args, **kwargs):
1126 from unittest2 import case
1127 self = args[0]
1128 compiler = self.getCompiler()
1129 if "gcc" in compiler:
1130 self.skipTest("skipping because gcc is the test compiler")
1131 else:
1132 func(*args, **kwargs)
1133 return wrapper
1134
Matt Kopec0de53f02013-03-15 19:10:12 +00001135def skipIfIcc(func):
1136 """Decorate the item to skip tests that should be skipped if building with icc ."""
1137 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1138 raise Exception("@skipIfIcc can only be used to decorate a test method")
1139 @wraps(func)
1140 def wrapper(*args, **kwargs):
1141 from unittest2 import case
1142 self = args[0]
1143 compiler = self.getCompiler()
1144 if "icc" in compiler:
1145 self.skipTest("skipping because icc is the test compiler")
1146 else:
1147 func(*args, **kwargs)
1148 return wrapper
1149
Daniel Malea55faa402013-05-02 21:44:31 +00001150def skipIfi386(func):
1151 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1152 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1153 raise Exception("@skipIfi386 can only be used to decorate a test method")
1154 @wraps(func)
1155 def wrapper(*args, **kwargs):
1156 from unittest2 import case
1157 self = args[0]
1158 if "i386" == self.getArchitecture():
1159 self.skipTest("skipping because i386 is not a supported architecture")
1160 else:
1161 func(*args, **kwargs)
1162 return wrapper
1163
Pavel Labath090152b2015-08-20 11:37:19 +00001164def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001165 """Decorator to skip tests when the target is Android.
1166
1167 Arguments:
1168 api_levels - The API levels for which the test should be skipped. If
1169 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001170 arch - A sequence of architecture names specifying the architectures
1171 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001172 """
1173 def myImpl(func):
1174 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1175 raise Exception("@skipIfTargetAndroid can only be used to "
1176 "decorate a test method")
1177 @wraps(func)
1178 def wrapper(*args, **kwargs):
1179 from unittest2 import case
1180 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001181 if matchAndroid(api_levels, archs)(self):
1182 self.skipTest("skiped on Android target with API %d and architecture %s" %
1183 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001184 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001185 return wrapper
1186 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001187
Ilia Kd9953052015-03-12 07:19:41 +00001188def skipUnlessCompilerRt(func):
1189 """Decorate the item to skip tests if testing remotely."""
1190 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1191 raise Exception("@skipUnless can only be used to decorate a test method")
1192 @wraps(func)
1193 def wrapper(*args, **kwargs):
1194 from unittest2 import case
1195 import os.path
Enrico Granata55d99f02015-11-19 21:45:07 +00001196 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "llvm","projects","compiler-rt")
1197 print(compilerRtPath)
Ilia Kd9953052015-03-12 07:19:41 +00001198 if not os.path.exists(compilerRtPath):
1199 self = args[0]
1200 self.skipTest("skip if compiler-rt not found")
1201 else:
1202 func(*args, **kwargs)
1203 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001204
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001205class _PlatformContext(object):
1206 """Value object class which contains platform-specific options."""
1207
1208 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1209 self.shlib_environment_var = shlib_environment_var
1210 self.shlib_prefix = shlib_prefix
1211 self.shlib_extension = shlib_extension
1212
1213
Johnny Chena74bb0a2011-08-01 18:46:13 +00001214class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001215 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001216 Abstract base for performing lldb (see TestBase) or other generic tests (see
1217 BenchBase for one example). lldbtest.Base works with the test driver to
1218 accomplish things.
1219
Johnny Chen8334dad2010-10-22 23:15:46 +00001220 """
Enrico Granata5020f952012-10-24 21:42:49 +00001221
Enrico Granata19186272012-10-24 21:44:48 +00001222 # The concrete subclass should override this attribute.
1223 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001224
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001225 # Keep track of the old current working directory.
1226 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001227
Greg Clayton4570d3e2013-12-10 23:19:29 +00001228 @staticmethod
1229 def compute_mydir(test_file):
1230 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1231
1232 mydir = TestBase.compute_mydir(__file__)'''
1233 test_dir = os.path.dirname(test_file)
1234 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1235
Johnny Chenfb4264c2011-08-01 19:50:58 +00001236 def TraceOn(self):
1237 """Returns True if we are in trace mode (tracing detailed test execution)."""
1238 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001239
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001240 @classmethod
1241 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001242 """
1243 Python unittest framework class setup fixture.
1244 Do current directory manipulation.
1245 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001246 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001247 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001248 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001249
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001250 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001251 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001252
1253 # Change current working directory if ${LLDB_TEST} is defined.
1254 # See also dotest.py which sets up ${LLDB_TEST}.
1255 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001256 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001257 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001258 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001259 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1260
Vince Harron85d19652015-05-21 19:09:29 +00001261 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001262 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001263 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1264 try:
1265 cls.dir_lock.try_acquire()
1266 # write the class that owns the lock into the lock file
1267 cls.dir_lock.handle.write(cls.__name__)
1268 except IOError as ioerror:
1269 # nothing else should have this directory lock
1270 # wait here until we get a lock
1271 cls.dir_lock.acquire()
1272 # read the previous owner from the lock file
1273 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001274 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 +00001275 raise ioerror
1276
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001277 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001278 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001279 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001280 elif getPlatform() in ("freebsd", "linux", "netbsd"):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001281 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001282 else:
1283 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001284
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001285 @classmethod
1286 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001287 """
1288 Python unittest framework class teardown fixture.
1289 Do class-wide cleanup.
1290 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001291
Zachary Turner742afdb2015-12-11 19:21:49 +00001292 if doCleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001293 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001294 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001295 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001296
Johnny Chen707b3c92010-10-11 22:25:46 +00001297 # Subclass might have specific cleanup function defined.
1298 if getattr(cls, "classCleanup", None):
1299 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001300 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001301 try:
1302 cls.classCleanup()
1303 except:
1304 exc_type, exc_value, exc_tb = sys.exc_info()
1305 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001306
Vince Harron85d19652015-05-21 19:09:29 +00001307 if debug_confirm_directory_exclusivity:
1308 cls.dir_lock.release()
1309 del cls.dir_lock
1310
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001311 # Restore old working directory.
1312 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001313 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001314 os.chdir(cls.oldcwd)
1315
Johnny Chena74bb0a2011-08-01 18:46:13 +00001316 @classmethod
1317 def skipLongRunningTest(cls):
1318 """
1319 By default, we skip long running test case.
1320 This can be overridden by passing '-l' to the test driver (dotest.py).
1321 """
1322 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1323 return False
1324 else:
1325 return True
Johnny Chened492022011-06-21 00:53:00 +00001326
Vince Harron6d3d0f12015-05-10 22:01:59 +00001327 def enableLogChannelsForCurrentTest(self):
1328 if len(lldbtest_config.channels) == 0:
1329 return
1330
1331 # if debug channels are specified in lldbtest_config.channels,
1332 # create a new set of log files for every test
1333 log_basename = self.getLogBasenameForCurrentTest()
1334
1335 # confirm that the file is writeable
1336 host_log_path = "{}-host.log".format(log_basename)
1337 open(host_log_path, 'w').close()
1338
1339 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1340 for channel_with_categories in lldbtest_config.channels:
1341 channel_then_categories = channel_with_categories.split(' ', 1)
1342 channel = channel_then_categories[0]
1343 if len(channel_then_categories) > 1:
1344 categories = channel_then_categories[1]
1345 else:
1346 categories = "default"
1347
Pavel Labath4b70eb72016-01-22 14:50:29 +00001348 if channel == "gdb-remote":
Vince Harron6d3d0f12015-05-10 22:01:59 +00001349 # communicate gdb-remote categories to debugserver
1350 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1351
1352 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1353 if not self.res.Succeeded():
1354 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1355
1356 # Communicate log path name to debugserver & lldb-server
Pavel Labath4b70eb72016-01-22 14:50:29 +00001357 server_log_path = "{}-server.log".format(log_basename)
1358 open(server_log_path, 'w').close()
1359 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
Vince Harron6d3d0f12015-05-10 22:01:59 +00001360
Pavel Labath4b70eb72016-01-22 14:50:29 +00001361 # Communicate channels to lldb-server
1362 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
Vince Harron6d3d0f12015-05-10 22:01:59 +00001363
1364 if len(lldbtest_config.channels) == 0:
1365 return
1366
1367 def disableLogChannelsForCurrentTest(self):
1368 # close all log files that we opened
1369 for channel_and_categories in lldbtest_config.channels:
1370 # channel format - <channel-name> [<category0> [<category1> ...]]
1371 channel = channel_and_categories.split(' ', 1)[0]
1372 self.ci.HandleCommand("log disable " + channel, self.res)
1373 if not self.res.Succeeded():
1374 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1375
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001376 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001377 """Fixture for unittest test case setup.
1378
1379 It works with the test driver to conditionally skip tests and does other
1380 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001381 #import traceback
1382 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001383
Daniel Malea9115f072013-08-06 15:02:32 +00001384 if "LIBCXX_PATH" in os.environ:
1385 self.libcxxPath = os.environ["LIBCXX_PATH"]
1386 else:
1387 self.libcxxPath = None
1388
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001389 if "LLDBMI_EXEC" in os.environ:
1390 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1391 else:
1392 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001393
Johnny Chenebe51722011-10-07 19:21:09 +00001394 # If we spawn an lldb process for test (via pexpect), do not load the
1395 # init file unless told otherwise.
1396 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1397 self.lldbOption = ""
1398 else:
1399 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001400
Johnny Chen985e7402011-08-01 21:13:26 +00001401 # Assign the test method name to self.testMethodName.
1402 #
1403 # For an example of the use of this attribute, look at test/types dir.
1404 # There are a bunch of test cases under test/types and we don't want the
1405 # module cacheing subsystem to be confused with executable name "a.out"
1406 # used for all the test cases.
1407 self.testMethodName = self._testMethodName
1408
Johnny Chen985e7402011-08-01 21:13:26 +00001409 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1410 # with it using pexpect.
1411 self.child = None
1412 self.child_prompt = "(lldb) "
1413 # If the child is interacting with the embedded script interpreter,
1414 # there are two exits required during tear down, first to quit the
1415 # embedded script interpreter and second to quit the lldb command
1416 # interpreter.
1417 self.child_in_script_interpreter = False
1418
Johnny Chenfb4264c2011-08-01 19:50:58 +00001419 # These are for customized teardown cleanup.
1420 self.dict = None
1421 self.doTearDownCleanup = False
1422 # And in rare cases where there are multiple teardown cleanups.
1423 self.dicts = []
1424 self.doTearDownCleanups = False
1425
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001426 # List of spawned subproces.Popen objects
1427 self.subprocesses = []
1428
Daniel Malea69207462013-06-05 21:07:02 +00001429 # List of forked process PIDs
1430 self.forkedProcessPids = []
1431
Johnny Chenfb4264c2011-08-01 19:50:58 +00001432 # Create a string buffer to record the session info, to be dumped into a
1433 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001434 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001435
Vince Harron1f160372015-05-21 18:51:20 +00001436 session_file = "{}.log".format(self.log_basename)
Zachary Turner8d13fab2015-11-07 01:08:15 +00001437 # Python 3 doesn't support unbuffered I/O in text mode. Open buffered.
1438 self.session = open(session_file, "w")
Johnny Chenfb4264c2011-08-01 19:50:58 +00001439
1440 # Optimistically set __errored__, __failed__, __expected__ to False
1441 # initially. If the test errored/failed, the session info
1442 # (self.session) is then dumped into a session specific file for
1443 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001444 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001445 self.__errored__ = False
1446 self.__failed__ = False
1447 self.__expected__ = False
1448 # We are also interested in unexpected success.
1449 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001450 # And skipped tests.
1451 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001452
1453 # See addTearDownHook(self, hook) which allows the client to add a hook
1454 # function to be run during tearDown() time.
1455 self.hooks = []
1456
1457 # See HideStdout(self).
1458 self.sys_stdout_hidden = False
1459
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001460 if self.platformContext:
1461 # set environment variable names for finding shared libraries
1462 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001463
Vince Harron6d3d0f12015-05-10 22:01:59 +00001464 # Create the debugger instance if necessary.
1465 try:
1466 self.dbg = lldb.DBG
1467 except AttributeError:
1468 self.dbg = lldb.SBDebugger.Create()
1469
1470 if not self.dbg:
1471 raise Exception('Invalid debugger instance')
1472
1473 # Retrieve the associated command interpreter instance.
1474 self.ci = self.dbg.GetCommandInterpreter()
1475 if not self.ci:
1476 raise Exception('Could not get the command interpreter')
1477
1478 # And the result object.
1479 self.res = lldb.SBCommandReturnObject()
1480
1481 self.enableLogChannelsForCurrentTest()
1482
Ying Chen0c352822015-11-16 23:41:02 +00001483 #Initialize debug_info
1484 self.debug_info = None
1485
Daniel Malea249287a2013-02-19 16:08:57 +00001486 def setAsync(self, value):
1487 """ Sets async mode to True/False and ensures it is reset after the testcase completes."""
1488 old_async = self.dbg.GetAsync()
1489 self.dbg.SetAsync(value)
1490 self.addTearDownHook(lambda: self.dbg.SetAsync(old_async))
1491
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001492 def cleanupSubprocesses(self):
1493 # Ensure any subprocesses are cleaned up
1494 for p in self.subprocesses:
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001495 p.terminate()
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001496 del p
1497 del self.subprocesses[:]
Daniel Malea69207462013-06-05 21:07:02 +00001498 # Ensure any forked processes are cleaned up
1499 for pid in self.forkedProcessPids:
1500 if os.path.exists("/proc/" + str(pid)):
1501 os.kill(pid, signal.SIGTERM)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001502
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001503 def spawnSubprocess(self, executable, args=[], install_remote=True):
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001504 """ Creates a subprocess.Popen object with the specified executable and arguments,
1505 saves it in self.subprocesses, and returns the object.
1506 NOTE: if using this function, ensure you also call:
1507
1508 self.addTearDownHook(self.cleanupSubprocesses)
1509
1510 otherwise the test suite will leak processes.
1511 """
Tamas Berghammer04f51d12015-03-11 13:51:07 +00001512 proc = _RemoteProcess(install_remote) if lldb.remote_platform else _LocalProcess(self.TraceOn())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +00001513 proc.launch(executable, args)
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001514 self.subprocesses.append(proc)
1515 return proc
1516
Daniel Malea69207462013-06-05 21:07:02 +00001517 def forkSubprocess(self, executable, args=[]):
1518 """ Fork a subprocess with its own group ID.
1519 NOTE: if using this function, ensure you also call:
1520
1521 self.addTearDownHook(self.cleanupSubprocesses)
1522
1523 otherwise the test suite will leak processes.
1524 """
1525 child_pid = os.fork()
1526 if child_pid == 0:
1527 # If more I/O support is required, this can be beefed up.
1528 fd = os.open(os.devnull, os.O_RDWR)
Daniel Malea69207462013-06-05 21:07:02 +00001529 os.dup2(fd, 1)
1530 os.dup2(fd, 2)
1531 # This call causes the child to have its of group ID
1532 os.setpgid(0,0)
1533 os.execvp(executable, [executable] + args)
1534 # Give the child time to get through the execvp() call
1535 time.sleep(0.1)
1536 self.forkedProcessPids.append(child_pid)
1537 return child_pid
1538
Johnny Chenfb4264c2011-08-01 19:50:58 +00001539 def HideStdout(self):
1540 """Hide output to stdout from the user.
1541
1542 During test execution, there might be cases where we don't want to show the
1543 standard output to the user. For example,
1544
Zachary Turner35d017f2015-10-23 17:04:29 +00001545 self.runCmd(r'''sc print("\n\n\tHello!\n")''')
Johnny Chenfb4264c2011-08-01 19:50:58 +00001546
1547 tests whether command abbreviation for 'script' works or not. There is no
1548 need to show the 'Hello' output to the user as long as the 'script' command
1549 succeeds and we are not in TraceOn() mode (see the '-t' option).
1550
1551 In this case, the test method calls self.HideStdout(self) to redirect the
1552 sys.stdout to a null device, and restores the sys.stdout upon teardown.
1553
1554 Note that you should only call this method at most once during a test case
1555 execution. Any subsequent call has no effect at all."""
1556 if self.sys_stdout_hidden:
1557 return
1558
1559 self.sys_stdout_hidden = True
1560 old_stdout = sys.stdout
1561 sys.stdout = open(os.devnull, 'w')
1562 def restore_stdout():
1563 sys.stdout = old_stdout
1564 self.addTearDownHook(restore_stdout)
1565
1566 # =======================================================================
1567 # Methods for customized teardown cleanups as well as execution of hooks.
1568 # =======================================================================
1569
1570 def setTearDownCleanup(self, dictionary=None):
1571 """Register a cleanup action at tearDown() time with a dictinary"""
1572 self.dict = dictionary
1573 self.doTearDownCleanup = True
1574
1575 def addTearDownCleanup(self, dictionary):
1576 """Add a cleanup action at tearDown() time with a dictinary"""
1577 self.dicts.append(dictionary)
1578 self.doTearDownCleanups = True
1579
1580 def addTearDownHook(self, hook):
1581 """
1582 Add a function to be run during tearDown() time.
1583
1584 Hooks are executed in a first come first serve manner.
1585 """
Zachary Turnercd236b82015-10-26 18:48:24 +00001586 if six.callable(hook):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001587 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001588 print("Adding tearDown hook:", getsource_if_available(hook), file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001589 self.hooks.append(hook)
Enrico Granataab0e8312014-11-05 21:31:57 +00001590
1591 return self
Johnny Chenfb4264c2011-08-01 19:50:58 +00001592
Jim Inghamda3a3862014-10-16 23:02:14 +00001593 def deletePexpectChild(self):
Johnny Chen985e7402011-08-01 21:13:26 +00001594 # This is for the case of directly spawning 'lldb' and interacting with it
1595 # using pexpect.
Johnny Chen985e7402011-08-01 21:13:26 +00001596 if self.child and self.child.isalive():
Zachary Turner9ef307b2014-07-22 16:19:29 +00001597 import pexpect
Johnny Chen985e7402011-08-01 21:13:26 +00001598 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001599 print("tearing down the child process....", file=sbuf)
Johnny Chen985e7402011-08-01 21:13:26 +00001600 try:
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001601 if self.child_in_script_interpreter:
1602 self.child.sendline('quit()')
1603 self.child.expect_exact(self.child_prompt)
1604 self.child.sendline('settings set interpreter.prompt-on-quit false')
1605 self.child.sendline('quit')
Johnny Chen985e7402011-08-01 21:13:26 +00001606 self.child.expect(pexpect.EOF)
Ilia K47448c22015-02-11 21:41:58 +00001607 except (ValueError, pexpect.ExceptionPexpect):
1608 # child is already terminated
1609 pass
1610 except OSError as exception:
1611 import errno
1612 if exception.errno != errno.EIO:
1613 # unexpected error
1614 raise
Daniel Maleac9a0ec32013-02-22 00:41:26 +00001615 # child is already terminated
Johnny Chen985e7402011-08-01 21:13:26 +00001616 pass
Shawn Besteb3e9052014-11-06 17:52:15 +00001617 finally:
1618 # Give it one final blow to make sure the child is terminated.
1619 self.child.close()
Jim Inghamda3a3862014-10-16 23:02:14 +00001620
1621 def tearDown(self):
1622 """Fixture for unittest test case teardown."""
1623 #import traceback
1624 #traceback.print_stack()
1625
1626 self.deletePexpectChild()
1627
Johnny Chenfb4264c2011-08-01 19:50:58 +00001628 # Check and run any hook functions.
1629 for hook in reversed(self.hooks):
1630 with recording(self, traceAlways) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00001631 print("Executing tearDown hook:", getsource_if_available(hook), file=sbuf)
Enrico Granataab0e8312014-11-05 21:31:57 +00001632 import inspect
1633 hook_argc = len(inspect.getargspec(hook).args)
Adrian McCarthyaa1f2702016-01-14 22:52:16 +00001634 if hook_argc == 0 or (getattr(hook,'im_self',None) is not None) or (hasattr(hook, '__self__')):
Enrico Granataab0e8312014-11-05 21:31:57 +00001635 hook()
1636 elif hook_argc == 1:
1637 hook(self)
1638 else:
1639 hook() # try the plain call and hope it works
Johnny Chenfb4264c2011-08-01 19:50:58 +00001640
1641 del self.hooks
1642
1643 # Perform registered teardown cleanup.
1644 if doCleanup and self.doTearDownCleanup:
Johnny Chen0fddfb22011-11-17 19:57:27 +00001645 self.cleanup(dictionary=self.dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001646
1647 # In rare cases where there are multiple teardown cleanups added.
1648 if doCleanup and self.doTearDownCleanups:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001649 if self.dicts:
1650 for dict in reversed(self.dicts):
Johnny Chen0fddfb22011-11-17 19:57:27 +00001651 self.cleanup(dictionary=dict)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001652
Vince Harron9753dd92015-05-10 15:22:09 +00001653 self.disableLogChannelsForCurrentTest()
1654
Johnny Chenfb4264c2011-08-01 19:50:58 +00001655 # =========================================================
1656 # Various callbacks to allow introspection of test progress
1657 # =========================================================
1658
1659 def markError(self):
1660 """Callback invoked when an error (unexpected exception) errored."""
1661 self.__errored__ = True
1662 with recording(self, False) as sbuf:
1663 # False because there's no need to write "ERROR" to the stderr twice.
1664 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001665 print("ERROR", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001666
Zachary Turnerb1490b62015-08-26 19:44:56 +00001667 def markCleanupError(self):
1668 """Callback invoked when an error occurs while a test is cleaning up."""
1669 self.__cleanup_errored__ = True
1670 with recording(self, False) as sbuf:
1671 # False because there's no need to write "CLEANUP_ERROR" to the stderr twice.
1672 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001673 print("CLEANUP_ERROR", file=sbuf)
Zachary Turnerb1490b62015-08-26 19:44:56 +00001674
Johnny Chenfb4264c2011-08-01 19:50:58 +00001675 def markFailure(self):
1676 """Callback invoked when a failure (test assertion failure) occurred."""
1677 self.__failed__ = True
1678 with recording(self, False) as sbuf:
1679 # False because there's no need to write "FAIL" to the stderr twice.
1680 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001681 print("FAIL", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001682
Enrico Granatae6cedc12013-02-23 01:05:23 +00001683 def markExpectedFailure(self,err,bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001684 """Callback invoked when an expected failure/error occurred."""
1685 self.__expected__ = True
1686 with recording(self, False) as sbuf:
1687 # False because there's no need to write "expected failure" to the
1688 # stderr twice.
1689 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001690 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001691 print("expected failure", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001692 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001693 print("expected failure (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001694
Johnny Chenc5cc6252011-08-15 23:09:08 +00001695 def markSkippedTest(self):
1696 """Callback invoked when a test is skipped."""
1697 self.__skipped__ = True
1698 with recording(self, False) as sbuf:
1699 # False because there's no need to write "skipped test" to the
1700 # stderr twice.
1701 # Once by the Python unittest framework, and a second time by us.
Zachary Turnerff890da2015-10-19 23:45:41 +00001702 print("skipped test", file=sbuf)
Johnny Chenc5cc6252011-08-15 23:09:08 +00001703
Enrico Granatae6cedc12013-02-23 01:05:23 +00001704 def markUnexpectedSuccess(self, bugnumber):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001705 """Callback invoked when an unexpected success occurred."""
1706 self.__unexpected__ = True
1707 with recording(self, False) as sbuf:
1708 # False because there's no need to write "unexpected success" to the
1709 # stderr twice.
1710 # Once by the Python unittest framework, and a second time by us.
Enrico Granatae6cedc12013-02-23 01:05:23 +00001711 if bugnumber == None:
Zachary Turnerff890da2015-10-19 23:45:41 +00001712 print("unexpected success", file=sbuf)
Enrico Granatae6cedc12013-02-23 01:05:23 +00001713 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00001714 print("unexpected success (problem id:" + str(bugnumber) + ")", file=sbuf)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001715
Greg Clayton70995582015-01-07 22:25:50 +00001716 def getRerunArgs(self):
1717 return " -f %s.%s" % (self.__class__.__name__, self._testMethodName)
Vince Harron9753dd92015-05-10 15:22:09 +00001718
1719 def getLogBasenameForCurrentTest(self, prefix=None):
1720 """
1721 returns a partial path that can be used as the beginning of the name of multiple
1722 log files pertaining to this test
1723
1724 <session-dir>/<arch>-<compiler>-<test-file>.<test-class>.<test-method>
1725 """
1726 dname = os.path.join(os.environ["LLDB_TEST"],
1727 os.environ["LLDB_SESSION_DIRNAME"])
1728 if not os.path.isdir(dname):
1729 os.mkdir(dname)
1730
1731 compiler = self.getCompiler()
1732
1733 if compiler[1] == ':':
1734 compiler = compiler[2:]
Chaoren Lin636a0e32015-07-17 21:40:11 +00001735 if os.path.altsep is not None:
1736 compiler = compiler.replace(os.path.altsep, os.path.sep)
Vince Harron9753dd92015-05-10 15:22:09 +00001737
Vince Harron19e300f2015-05-12 00:50:54 +00001738 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), "_".join(compiler.split(os.path.sep)))
Vince Harron9753dd92015-05-10 15:22:09 +00001739 if len(fname) > 200:
Vince Harron19e300f2015-05-12 00:50:54 +00001740 fname = "{}-{}-{}".format(self.id(), self.getArchitecture(), compiler.split(os.path.sep)[-1])
Vince Harron9753dd92015-05-10 15:22:09 +00001741
1742 if prefix is not None:
1743 fname = "{}-{}".format(prefix, fname)
1744
1745 return os.path.join(dname, fname)
1746
Johnny Chenfb4264c2011-08-01 19:50:58 +00001747 def dumpSessionInfo(self):
1748 """
1749 Dump the debugger interactions leading to a test error/failure. This
1750 allows for more convenient postmortem analysis.
1751
1752 See also LLDBTestResult (dotest.py) which is a singlton class derived
1753 from TextTestResult and overwrites addError, addFailure, and
1754 addExpectedFailure methods to allow us to to mark the test instance as
1755 such.
1756 """
1757
1758 # We are here because self.tearDown() detected that this test instance
1759 # either errored or failed. The lldb.test_result singleton contains
1760 # two lists (erros and failures) which get populated by the unittest
1761 # framework. Look over there for stack trace information.
1762 #
1763 # The lists contain 2-tuples of TestCase instances and strings holding
1764 # formatted tracebacks.
1765 #
1766 # See http://docs.python.org/library/unittest.html#unittest.TestResult.
Vince Harron9753dd92015-05-10 15:22:09 +00001767
Vince Harron35b17dc2015-05-21 18:20:21 +00001768 # output tracebacks into session
Vince Harron9753dd92015-05-10 15:22:09 +00001769 pairs = []
Johnny Chenfb4264c2011-08-01 19:50:58 +00001770 if self.__errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001771 pairs = configuration.test_result.errors
Johnny Chenfb4264c2011-08-01 19:50:58 +00001772 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001773 elif self.__cleanup_errored__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001774 pairs = configuration.test_result.cleanup_errors
Zachary Turnerb1490b62015-08-26 19:44:56 +00001775 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001776 elif self.__failed__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001777 pairs = configuration.test_result.failures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001778 prefix = 'Failure'
1779 elif self.__expected__:
Zachary Turner606e3a52015-12-08 01:15:30 +00001780 pairs = configuration.test_result.expectedFailures
Johnny Chenfb4264c2011-08-01 19:50:58 +00001781 prefix = 'ExpectedFailure'
Johnny Chenc5cc6252011-08-15 23:09:08 +00001782 elif self.__skipped__:
1783 prefix = 'SkippedTest'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001784 elif self.__unexpected__:
Vince Harron35b17dc2015-05-21 18:20:21 +00001785 prefix = 'UnexpectedSuccess'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001786 else:
Vince Harron35b17dc2015-05-21 18:20:21 +00001787 prefix = 'Success'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001788
Johnny Chenc5cc6252011-08-15 23:09:08 +00001789 if not self.__unexpected__ and not self.__skipped__:
Johnny Chenfb4264c2011-08-01 19:50:58 +00001790 for test, traceback in pairs:
1791 if test is self:
Zachary Turnerff890da2015-10-19 23:45:41 +00001792 print(traceback, file=self.session)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001793
Vince Harron35b17dc2015-05-21 18:20:21 +00001794 # put footer (timestamp/rerun instructions) into session
Johnny Chen8082a002011-08-11 00:16:28 +00001795 testMethod = getattr(self, self._testMethodName)
1796 if getattr(testMethod, "__benchmarks_test__", False):
1797 benchmarks = True
1798 else:
1799 benchmarks = False
1800
Vince Harron35b17dc2015-05-21 18:20:21 +00001801 import datetime
Zachary Turnerff890da2015-10-19 23:45:41 +00001802 print("Session info generated @", datetime.datetime.now().ctime(), file=self.session)
1803 print("To rerun this test, issue the following command from the 'test' directory:\n", file=self.session)
1804 print("./dotest.py %s -v %s %s" % (self.getRunOptions(),
Vince Harron35b17dc2015-05-21 18:20:21 +00001805 ('+b' if benchmarks else '-t'),
Zachary Turnerff890da2015-10-19 23:45:41 +00001806 self.getRerunArgs()), file=self.session)
Vince Harron35b17dc2015-05-21 18:20:21 +00001807 self.session.close()
1808 del self.session
1809
1810 # process the log files
Vince Harron1f160372015-05-21 18:51:20 +00001811 log_files_for_this_test = glob.glob(self.log_basename + "*")
Vince Harron35b17dc2015-05-21 18:20:21 +00001812
1813 if prefix != 'Success' or lldbtest_config.log_success:
1814 # keep all log files, rename them to include prefix
1815 dst_log_basename = self.getLogBasenameForCurrentTest(prefix)
1816 for src in log_files_for_this_test:
Zachary Turner306278f2015-05-26 20:26:29 +00001817 if os.path.isfile(src):
1818 dst = src.replace(self.log_basename, dst_log_basename)
1819 if os.name == "nt" and os.path.isfile(dst):
1820 # On Windows, renaming a -> b will throw an exception if b exists. On non-Windows platforms
1821 # it silently replaces the destination. Ultimately this means that atomic renames are not
1822 # guaranteed to be possible on Windows, but we need this to work anyway, so just remove the
1823 # destination first if it already exists.
1824 os.remove(dst)
Zachary Turner5de068b2015-05-26 19:52:24 +00001825
Zachary Turner306278f2015-05-26 20:26:29 +00001826 os.rename(src, dst)
Vince Harron35b17dc2015-05-21 18:20:21 +00001827 else:
1828 # success! (and we don't want log files) delete log files
1829 for log_file in log_files_for_this_test:
Adrian McCarthya7292042015-09-04 20:48:48 +00001830 try:
1831 os.unlink(log_file)
1832 except:
1833 # We've seen consistent unlink failures on Windows, perhaps because the
1834 # just-created log file is being scanned by anti-virus. Empirically, this
1835 # sleep-and-retry approach allows tests to succeed much more reliably.
1836 # Attempts to figure out exactly what process was still holding a file handle
1837 # have failed because running instrumentation like Process Monitor seems to
1838 # slow things down enough that the problem becomes much less consistent.
1839 time.sleep(0.5)
1840 os.unlink(log_file)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001841
1842 # ====================================================
1843 # Config. methods supported through a plugin interface
1844 # (enables reading of the current test configuration)
1845 # ====================================================
1846
1847 def getArchitecture(self):
1848 """Returns the architecture in effect the test suite is running with."""
1849 module = builder_module()
Ed Maste0f434e62015-04-06 15:50:48 +00001850 arch = module.getArchitecture()
1851 if arch == 'amd64':
1852 arch = 'x86_64'
1853 return arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001854
Vince Harron02613762015-05-04 00:17:53 +00001855 def getLldbArchitecture(self):
1856 """Returns the architecture of the lldb binary."""
1857 if not hasattr(self, 'lldbArchitecture'):
1858
1859 # spawn local process
1860 command = [
Vince Harron790d95c2015-05-18 19:39:03 +00001861 lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001862 "-o",
Vince Harron790d95c2015-05-18 19:39:03 +00001863 "file " + lldbtest_config.lldbExec,
Vince Harron02613762015-05-04 00:17:53 +00001864 "-o",
1865 "quit"
1866 ]
1867
1868 output = check_output(command)
1869 str = output.decode("utf-8");
1870
1871 for line in str.splitlines():
1872 m = re.search("Current executable set to '.*' \\((.*)\\)\\.", line)
1873 if m:
1874 self.lldbArchitecture = m.group(1)
1875 break
1876
1877 return self.lldbArchitecture
1878
Johnny Chenfb4264c2011-08-01 19:50:58 +00001879 def getCompiler(self):
1880 """Returns the compiler in effect the test suite is running with."""
1881 module = builder_module()
1882 return module.getCompiler()
1883
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001884 def getCompilerBinary(self):
1885 """Returns the compiler binary the test suite is running with."""
1886 return self.getCompiler().split()[0]
1887
Daniel Malea0aea0162013-02-27 17:29:46 +00001888 def getCompilerVersion(self):
1889 """ Returns a string that represents the compiler version.
1890 Supports: llvm, clang.
1891 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00001892 from .lldbutil import which
Daniel Malea0aea0162013-02-27 17:29:46 +00001893 version = 'unknown'
1894
Oleksiy Vyalovdc4067c2014-11-26 18:30:04 +00001895 compiler = self.getCompilerBinary()
Zachary Turner9ef307b2014-07-22 16:19:29 +00001896 version_output = system([[which(compiler), "-v"]])[1]
Daniel Malea0aea0162013-02-27 17:29:46 +00001897 for line in version_output.split(os.linesep):
Greg Clayton2a844b72013-03-06 02:34:51 +00001898 m = re.search('version ([0-9\.]+)', line)
Daniel Malea0aea0162013-02-27 17:29:46 +00001899 if m:
1900 version = m.group(1)
1901 return version
1902
Ryan Brown57bee1e2015-09-14 22:45:11 +00001903 def getGoCompilerVersion(self):
1904 """ Returns a string that represents the go compiler version, or None if go is not found.
1905 """
1906 compiler = which("go")
1907 if compiler:
1908 version_output = system([[compiler, "version"]])[0]
1909 for line in version_output.split(os.linesep):
1910 m = re.search('go version (devel|go\\S+)', line)
1911 if m:
1912 return m.group(1)
1913 return None
1914
Greg Claytone0d0a762015-04-02 18:24:03 +00001915 def platformIsDarwin(self):
1916 """Returns true if the OS triple for the selected platform is any valid apple OS"""
Robert Flackfb2f6c62015-04-17 08:02:18 +00001917 return platformIsDarwin()
Vince Harron20952cc2015-04-03 01:00:06 +00001918
Robert Flack13c7ad92015-03-30 14:12:17 +00001919 def getPlatform(self):
Robert Flackfb2f6c62015-04-17 08:02:18 +00001920 """Returns the target platform the test suite is running on."""
Robert Flack068898c2015-04-09 18:07:58 +00001921 return getPlatform()
Robert Flack13c7ad92015-03-30 14:12:17 +00001922
Daniel Maleaadaaec92013-08-06 20:51:41 +00001923 def isIntelCompiler(self):
1924 """ Returns true if using an Intel (ICC) compiler, false otherwise. """
1925 return any([x in self.getCompiler() for x in ["icc", "icpc", "icl"]])
1926
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001927 def expectedCompilerVersion(self, compiler_version):
1928 """Returns True iff compiler_version[1] matches the current compiler version.
1929 Use compiler_version[0] to specify the operator used to determine if a match has occurred.
1930 Any operator other than the following defaults to an equality test:
1931 '>', '>=', "=>", '<', '<=', '=<', '!=', "!" or 'not'
1932 """
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001933 if (compiler_version == None):
1934 return True
1935 operator = str(compiler_version[0])
1936 version = compiler_version[1]
1937
1938 if (version == None):
1939 return True
1940 if (operator == '>'):
1941 return self.getCompilerVersion() > version
1942 if (operator == '>=' or operator == '=>'):
1943 return self.getCompilerVersion() >= version
1944 if (operator == '<'):
1945 return self.getCompilerVersion() < version
1946 if (operator == '<=' or operator == '=<'):
1947 return self.getCompilerVersion() <= version
1948 if (operator == '!=' or operator == '!' or operator == 'not'):
1949 return str(version) not in str(self.getCompilerVersion())
1950 return str(version) in str(self.getCompilerVersion())
1951
1952 def expectedCompiler(self, compilers):
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001953 """Returns True iff any element of compilers is a sub-string of the current compiler."""
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001954 if (compilers == None):
1955 return True
Ashok Thirumurthi3b037282013-06-06 14:23:31 +00001956
1957 for compiler in compilers:
1958 if compiler in self.getCompiler():
1959 return True
1960
1961 return False
Ashok Thirumurthic97a6082013-05-17 20:15:07 +00001962
Ying Chen7091c2c2015-04-21 01:15:47 +00001963 def expectedArch(self, archs):
1964 """Returns True iff any element of archs is a sub-string of the current architecture."""
1965 if (archs == None):
1966 return True
1967
1968 for arch in archs:
1969 if arch in self.getArchitecture():
1970 return True
1971
1972 return False
1973
Johnny Chenfb4264c2011-08-01 19:50:58 +00001974 def getRunOptions(self):
1975 """Command line option for -A and -C to run this test again, called from
1976 self.dumpSessionInfo()."""
1977 arch = self.getArchitecture()
1978 comp = self.getCompiler()
Johnny Chenb7bdd102011-08-24 19:48:51 +00001979 if arch:
1980 option_str = "-A " + arch
Johnny Chenfb4264c2011-08-01 19:50:58 +00001981 else:
Johnny Chenb7bdd102011-08-24 19:48:51 +00001982 option_str = ""
1983 if comp:
Johnny Chen531c0852012-03-16 20:44:00 +00001984 option_str += " -C " + comp
Johnny Chenb7bdd102011-08-24 19:48:51 +00001985 return option_str
Johnny Chenfb4264c2011-08-01 19:50:58 +00001986
1987 # ==================================================
1988 # Build methods supported through a plugin interface
1989 # ==================================================
1990
Ed Mastec97323e2014-04-01 18:47:58 +00001991 def getstdlibFlag(self):
1992 """ Returns the proper -stdlib flag, or empty if not required."""
Robert Flack4629c4b2015-05-15 18:54:32 +00001993 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Ed Mastec97323e2014-04-01 18:47:58 +00001994 stdlibflag = "-stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00001995 else: # this includes NetBSD
Ed Mastec97323e2014-04-01 18:47:58 +00001996 stdlibflag = ""
1997 return stdlibflag
1998
Matt Kopec7663b3a2013-09-25 17:44:00 +00001999 def getstdFlag(self):
2000 """ Returns the proper stdflag. """
Daniel Malea55faa402013-05-02 21:44:31 +00002001 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
Daniel Malea0b7c6112013-05-06 19:31:31 +00002002 stdflag = "-std=c++0x"
Daniel Malea55faa402013-05-02 21:44:31 +00002003 else:
2004 stdflag = "-std=c++11"
Matt Kopec7663b3a2013-09-25 17:44:00 +00002005 return stdflag
2006
2007 def buildDriver(self, sources, exe_name):
2008 """ Platform-specific way to build a program that links with LLDB (via the liblldb.so
2009 or LLDB.framework).
2010 """
2011
2012 stdflag = self.getstdFlag()
Ed Mastec97323e2014-04-01 18:47:58 +00002013 stdlibflag = self.getstdlibFlag()
Greg Clayton22fd3b12015-10-26 17:52:16 +00002014
2015 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002016 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002017 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Daniel Malea55faa402013-05-02 21:44:31 +00002018 d = {'CXX_SOURCES' : sources,
2019 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002020 'CFLAGS_EXTRAS' : "%s %s" % (stdflag, stdlibflag),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002021 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2022 'LD_EXTRAS' : "%s -Wl,-rpath,%s" % (dsym, lib_dir),
Daniel Malea55faa402013-05-02 21:44:31 +00002023 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002024 elif sys.platform.rstrip('0123456789') in ('freebsd', 'linux', 'netbsd') or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002025 d = {'CXX_SOURCES' : sources,
Daniel Malea55faa402013-05-02 21:44:31 +00002026 'EXE' : exe_name,
Ed Mastec97323e2014-04-01 18:47:58 +00002027 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002028 'LD_EXTRAS' : "-L%s -llldb" % lib_dir}
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002029 elif sys.platform.startswith('win'):
2030 d = {'CXX_SOURCES' : sources,
2031 'EXE' : exe_name,
2032 'CFLAGS_EXTRAS' : "%s %s -I%s" % (stdflag, stdlibflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002033 'LD_EXTRAS' : "-L%s -lliblldb" % os.environ["LLDB_IMPLIB_DIR"]}
Daniel Malea55faa402013-05-02 21:44:31 +00002034 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002035 print("Building LLDB Driver (%s) from sources %s" % (exe_name, sources))
Daniel Malea55faa402013-05-02 21:44:31 +00002036
2037 self.buildDefault(dictionary=d)
2038
Matt Kopec7663b3a2013-09-25 17:44:00 +00002039 def buildLibrary(self, sources, lib_name):
2040 """Platform specific way to build a default library. """
2041
2042 stdflag = self.getstdFlag()
2043
Greg Clayton22fd3b12015-10-26 17:52:16 +00002044 lib_dir = os.environ["LLDB_LIB_DIR"]
Robert Flack4629c4b2015-05-15 18:54:32 +00002045 if self.platformIsDarwin():
Greg Clayton22fd3b12015-10-26 17:52:16 +00002046 dsym = os.path.join(lib_dir, 'LLDB.framework', 'LLDB')
Matt Kopec7663b3a2013-09-25 17:44:00 +00002047 d = {'DYLIB_CXX_SOURCES' : sources,
2048 'DYLIB_NAME' : lib_name,
2049 'CFLAGS_EXTRAS' : "%s -stdlib=libc++" % stdflag,
Greg Clayton22fd3b12015-10-26 17:52:16 +00002050 'FRAMEWORK_INCLUDES' : "-F%s" % lib_dir,
2051 'LD_EXTRAS' : "%s -Wl,-rpath,%s -dynamiclib" % (dsym, lib_dir),
Matt Kopec7663b3a2013-09-25 17:44:00 +00002052 }
Kamil Rytarowskif5d34b72015-12-10 22:56:56 +00002053 elif self.getPlatform() in ('freebsd', 'linux', 'netbsd') or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Matt Kopec7663b3a2013-09-25 17:44:00 +00002054 d = {'DYLIB_CXX_SOURCES' : sources,
2055 'DYLIB_NAME' : lib_name,
2056 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002057 'LD_EXTRAS' : "-shared -L%s -llldb" % lib_dir}
Robert Flack4629c4b2015-05-15 18:54:32 +00002058 elif self.getPlatform() == 'windows':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +00002059 d = {'DYLIB_CXX_SOURCES' : sources,
2060 'DYLIB_NAME' : lib_name,
2061 'CFLAGS_EXTRAS' : "%s -I%s -fPIC" % (stdflag, os.path.join(os.environ["LLDB_SRC"], "include")),
Greg Clayton22fd3b12015-10-26 17:52:16 +00002062 'LD_EXTRAS' : "-shared -l%s\liblldb.lib" % self.os.environ["LLDB_IMPLIB_DIR"]}
Matt Kopec7663b3a2013-09-25 17:44:00 +00002063 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002064 print("Building LLDB Library (%s) from sources %s" % (lib_name, sources))
Matt Kopec7663b3a2013-09-25 17:44:00 +00002065
2066 self.buildDefault(dictionary=d)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002067
Daniel Malea55faa402013-05-02 21:44:31 +00002068 def buildProgram(self, sources, exe_name):
2069 """ Platform specific way to build an executable from C/C++ sources. """
2070 d = {'CXX_SOURCES' : sources,
2071 'EXE' : exe_name}
2072 self.buildDefault(dictionary=d)
2073
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002074 def buildDefault(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002075 """Platform specific way to build the default binaries."""
2076 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002077 if target_is_android():
2078 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002079 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002080 raise Exception("Don't know how to build default binary")
2081
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002082 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002083 """Platform specific way to build binaries with dsym info."""
2084 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002085 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002086 raise Exception("Don't know how to build binary with dsym")
2087
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002088 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002089 """Platform specific way to build binaries with dwarf maps."""
2090 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002091 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002092 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002093 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002094 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002095
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002096 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2097 """Platform specific way to build binaries with dwarf maps."""
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002098 module = builder_module()
2099 if target_is_android():
2100 dictionary = append_android_envs(dictionary)
2101 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2102 raise Exception("Don't know how to build binary with dwo")
2103
Ryan Brown57bee1e2015-09-14 22:45:11 +00002104 def buildGo(self):
2105 """Build the default go binary.
2106 """
2107 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2108
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002109 def signBinary(self, binary_path):
2110 if sys.platform.startswith("darwin"):
2111 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2112 call(codesign_cmd, shell=True)
2113
Kuba Breckabeed8212014-09-04 01:03:18 +00002114 def findBuiltClang(self):
2115 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2116 paths_to_try = [
2117 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2118 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2119 "llvm-build/Release/x86_64/Release/bin/clang",
2120 "llvm-build/Debug/x86_64/Debug/bin/clang",
2121 ]
Enrico Granata55d99f02015-11-19 21:45:07 +00002122 lldb_root_path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")
Kuba Breckabeed8212014-09-04 01:03:18 +00002123 for p in paths_to_try:
2124 path = os.path.join(lldb_root_path, p)
2125 if os.path.exists(path):
2126 return path
Ilia Kd9953052015-03-12 07:19:41 +00002127
2128 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002129 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002130 if os.path.exists(path):
2131 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002132
2133 return os.environ["CC"]
2134
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002135 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002136 """ Returns a dictionary (which can be provided to build* functions above) which
2137 contains OS-specific build flags.
2138 """
2139 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002140 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002141
2142 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002143 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002144 use_libcxx = True
2145
2146 if use_libcxx and self.libcxxPath:
2147 cflags += "-stdlib=libc++ "
2148 if self.libcxxPath:
2149 libcxxInclude = os.path.join(self.libcxxPath, "include")
2150 libcxxLib = os.path.join(self.libcxxPath, "lib")
2151 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2152 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2153
Andrew Kaylor93132f52013-05-28 23:04:25 +00002154 if use_cpp11:
2155 cflags += "-std="
2156 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2157 cflags += "c++0x"
2158 else:
2159 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002160 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002161 cflags += " -stdlib=libc++"
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002162 elif self.getPlatform() == "netbsd":
2163 cflags += " -stdlib=libstdc++"
Andrew Kaylor93132f52013-05-28 23:04:25 +00002164 elif "clang" in self.getCompiler():
2165 cflags += " -stdlib=libstdc++"
2166
Andrew Kaylor93132f52013-05-28 23:04:25 +00002167 return {'CFLAGS_EXTRAS' : cflags,
2168 'LD_EXTRAS' : ldflags,
2169 }
2170
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002171 def cleanup(self, dictionary=None):
2172 """Platform specific way to do cleanup after build."""
2173 module = builder_module()
2174 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002175 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002176
Daniel Malea55faa402013-05-02 21:44:31 +00002177 def getLLDBLibraryEnvVal(self):
2178 """ Returns the path that the OS-specific library search environment variable
2179 (self.dylibPath) should be set to in order for a program to find the LLDB
2180 library. If an environment variable named self.dylibPath is already set,
2181 the new path is appended to it and returned.
2182 """
2183 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002184 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002185 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002186 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002187 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002188 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002189 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002190 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002191
Ed Maste437f8f62013-09-09 14:04:04 +00002192 def getLibcPlusPlusLibs(self):
Kamil Rytarowski49f9fb82015-12-07 21:25:57 +00002193 if self.getPlatform() in ('freebsd', 'linux', 'netbsd'):
Ed Maste437f8f62013-09-09 14:04:04 +00002194 return ['libc++.so.1']
2195 else:
2196 return ['libc++.1.dylib','libc++abi.dylib']
2197
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002198# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2199# We change the test methods to create a new test method for each test for each debug info we are
2200# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2201# the new test method we remove the old method at the same time.
2202class LLDBTestCaseFactory(type):
2203 def __new__(cls, name, bases, attrs):
2204 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002205 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002206 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002207 target_platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002208
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002209 # If any debug info categories were explicitly tagged, assume that list to be
2210 # authoritative. If none were specified, try with all debug info formats.
2211 all_dbginfo_categories = set(test_categories.debug_info_categories)
2212 categories = set(getattr(attrvalue, "categories", [])) & all_dbginfo_categories
2213 if not categories:
2214 categories = all_dbginfo_categories
2215
2216 supported_categories = [x for x in categories
2217 if test_categories.is_supported_on_platform(x, target_platform)]
Zachary Turner8a927c42015-12-14 22:58:16 +00002218 if "dsym" in supported_categories:
2219 @add_test_categories(["dsym"])
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002220 @wraps(attrvalue)
Zachary Turner8a927c42015-12-14 22:58:16 +00002221 def dsym_test_method(self, attrvalue=attrvalue):
2222 self.debug_info = "dsym"
Zachary Turnerf098e4f2015-12-14 18:49:16 +00002223 return attrvalue(self)
Zachary Turner8a927c42015-12-14 22:58:16 +00002224 dsym_method_name = attrname + "_dsym"
2225 dsym_test_method.__name__ = dsym_method_name
2226 newattrs[dsym_method_name] = dsym_test_method
2227
2228 if "dwarf" in supported_categories:
2229 @add_test_categories(["dwarf"])
2230 @wraps(attrvalue)
2231 def dwarf_test_method(self, attrvalue=attrvalue):
2232 self.debug_info = "dwarf"
2233 return attrvalue(self)
2234 dwarf_method_name = attrname + "_dwarf"
2235 dwarf_test_method.__name__ = dwarf_method_name
2236 newattrs[dwarf_method_name] = dwarf_test_method
2237
2238 if "dwo" in supported_categories:
2239 @add_test_categories(["dwo"])
2240 @wraps(attrvalue)
2241 def dwo_test_method(self, attrvalue=attrvalue):
2242 self.debug_info = "dwo"
2243 return attrvalue(self)
2244 dwo_method_name = attrname + "_dwo"
2245 dwo_test_method.__name__ = dwo_method_name
2246 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002247 else:
2248 newattrs[attrname] = attrvalue
2249 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2250
Zachary Turner43a01e42015-10-20 21:06:05 +00002251# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2252@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002253class TestBase(Base):
2254 """
2255 This abstract base class is meant to be subclassed. It provides default
2256 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2257 among other things.
2258
2259 Important things for test class writers:
2260
2261 - Overwrite the mydir class attribute, otherwise your test class won't
2262 run. It specifies the relative directory to the top level 'test' so
2263 the test harness can change to the correct working directory before
2264 running your test.
2265
2266 - The setUp method sets up things to facilitate subsequent interactions
2267 with the debugger as part of the test. These include:
2268 - populate the test method name
2269 - create/get a debugger set with synchronous mode (self.dbg)
2270 - get the command interpreter from with the debugger (self.ci)
2271 - create a result object for use with the command interpreter
2272 (self.res)
2273 - plus other stuffs
2274
2275 - The tearDown method tries to perform some necessary cleanup on behalf
2276 of the test to return the debugger to a good state for the next test.
2277 These include:
2278 - execute any tearDown hooks registered by the test method with
2279 TestBase.addTearDownHook(); examples can be found in
2280 settings/TestSettings.py
2281 - kill the inferior process associated with each target, if any,
2282 and, then delete the target from the debugger's target list
2283 - perform build cleanup before running the next test method in the
2284 same test class; examples of registering for this service can be
2285 found in types/TestIntegerTypes.py with the call:
2286 - self.setTearDownCleanup(dictionary=d)
2287
2288 - Similarly setUpClass and tearDownClass perform classwise setup and
2289 teardown fixtures. The tearDownClass method invokes a default build
2290 cleanup for the entire test class; also, subclasses can implement the
2291 classmethod classCleanup(cls) to perform special class cleanup action.
2292
2293 - The instance methods runCmd and expect are used heavily by existing
2294 test cases to send a command to the command interpreter and to perform
2295 string/pattern matching on the output of such command execution. The
2296 expect method also provides a mode to peform string/pattern matching
2297 without running a command.
2298
2299 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2300 build the binaries used during a particular test scenario. A plugin
2301 should be provided for the sys.platform running the test suite. The
2302 Mac OS X implementation is located in plugins/darwin.py.
2303 """
2304
2305 # Maximum allowed attempts when launching the inferior process.
2306 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2307 maxLaunchCount = 3;
2308
2309 # Time to wait before the next launching attempt in second(s).
2310 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2311 timeWaitNextLaunch = 1.0;
2312
Enrico Granata165f8af2012-09-21 19:10:53 +00002313 # Returns the list of categories to which this test case belongs
2314 # by default, look for a ".categories" file, and read its contents
2315 # if no such file exists, traverse the hierarchy - we guarantee
2316 # a .categories to exist at the top level directory so we do not end up
2317 # looping endlessly - subclasses are free to define their own categories
2318 # in whatever way makes sense to them
2319 def getCategories(self):
2320 import inspect
2321 import os.path
2322 folder = inspect.getfile(self.__class__)
2323 folder = os.path.dirname(folder)
2324 while folder != '/':
2325 categories_file_name = os.path.join(folder,".categories")
2326 if os.path.exists(categories_file_name):
2327 categories_file = open(categories_file_name,'r')
2328 categories = categories_file.readline()
2329 categories_file.close()
2330 categories = str.replace(categories,'\n','')
2331 categories = str.replace(categories,'\r','')
2332 return categories.split(',')
2333 else:
2334 folder = os.path.dirname(folder)
2335 continue
2336
Johnny Chena74bb0a2011-08-01 18:46:13 +00002337 def setUp(self):
2338 #import traceback
2339 #traceback.print_stack()
2340
2341 # Works with the test driver to conditionally skip tests via decorators.
2342 Base.setUp(self)
2343
Johnny Chenf2b70232010-08-25 18:49:48 +00002344 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2345 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2346
Johnny Chen430eb762010-10-19 16:00:42 +00002347 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002348 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002349
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002350 # We want our debugger to be synchronous.
2351 self.dbg.SetAsync(False)
2352
2353 # Retrieve the associated command interpreter instance.
2354 self.ci = self.dbg.GetCommandInterpreter()
2355 if not self.ci:
2356 raise Exception('Could not get the command interpreter')
2357
2358 # And the result object.
2359 self.res = lldb.SBCommandReturnObject()
2360
Zachary Turner606e3a52015-12-08 01:15:30 +00002361 if lldb.remote_platform and configuration.lldb_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002362 remote_test_dir = lldbutil.join_remote_paths(
Zachary Turner606e3a52015-12-08 01:15:30 +00002363 configuration.lldb_platform_working_dir,
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002364 self.getArchitecture(),
2365 str(self.test_number),
2366 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002367 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002368 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002369 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002370
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002371 # This function removes all files from the current working directory while leaving
2372 # the directories in place. The cleaup is required to reduce the disk space required
2373 # by the test suit while leaving the directories untached is neccessary because
2374 # sub-directories might belong to an other test
2375 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002376 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002377 # TODO: Replace the heuristic to remove the files with a logic what collects the
2378 # list of files we have to remove during test runs.
2379 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002380 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002381 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002382 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002383 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002384
Greg Clayton35c91342014-11-17 18:40:27 +00002385 def registerSharedLibrariesWithTarget(self, target, shlibs):
2386 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2387
2388 Any modules in the target that have their remote install file specification set will
2389 get uploaded to the remote host. This function registers the local copies of the
2390 shared libraries with the target and sets their remote install locations so they will
2391 be uploaded when the target is run.
2392 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002393 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002394 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002395
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002396 shlib_environment_var = self.platformContext.shlib_environment_var
2397 shlib_prefix = self.platformContext.shlib_prefix
2398 shlib_extension = '.' + self.platformContext.shlib_extension
2399
2400 working_dir = self.get_process_working_directory()
2401 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2402 # Add any shared libraries to our target if remote so they get
2403 # uploaded into the working directory on the remote side
2404 for name in shlibs:
2405 # The path can be a full path to a shared library, or a make file name like "Foo" for
2406 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2407 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2408 # of the shared library accordingly
2409 if os.path.exists(name):
2410 local_shlib_path = name # name is the full path to the local shared library
2411 else:
2412 # Check relative names
2413 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2414 if not os.path.exists(local_shlib_path):
2415 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002416 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002417 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002418
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002419 # Make sure we found the local shared library in the above code
2420 self.assertTrue(os.path.exists(local_shlib_path))
2421
2422 # Add the shared library to our target
2423 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2424 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002425 # We must set the remote install location if we want the shared library
2426 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002427 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002428 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002429
2430 return environment
2431
Enrico Granata44818162012-10-24 01:23:57 +00002432 # utility methods that tests can use to access the current objects
2433 def target(self):
2434 if not self.dbg:
2435 raise Exception('Invalid debugger instance')
2436 return self.dbg.GetSelectedTarget()
2437
2438 def process(self):
2439 if not self.dbg:
2440 raise Exception('Invalid debugger instance')
2441 return self.dbg.GetSelectedTarget().GetProcess()
2442
2443 def thread(self):
2444 if not self.dbg:
2445 raise Exception('Invalid debugger instance')
2446 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2447
2448 def frame(self):
2449 if not self.dbg:
2450 raise Exception('Invalid debugger instance')
2451 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2452
Greg Claytonc6947512013-12-13 19:18:59 +00002453 def get_process_working_directory(self):
2454 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2455 if lldb.remote_platform:
2456 # Remote tests set the platform working directory up in TestBase.setUp()
2457 return lldb.remote_platform.GetWorkingDirectory()
2458 else:
2459 # local tests change directory into each test subdirectory
2460 return os.getcwd()
2461
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002462 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002463 #import traceback
2464 #traceback.print_stack()
2465
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002466 # Ensure all the references to SB objects have gone away so that we can
2467 # be sure that all test-specific resources have been freed before we
2468 # attempt to delete the targets.
2469 gc.collect()
2470
Johnny Chen3794ad92011-06-15 21:24:24 +00002471 # Delete the target(s) from the debugger as a general cleanup step.
2472 # This includes terminating the process for each target, if any.
2473 # We'd like to reuse the debugger for our next test without incurring
2474 # the initialization overhead.
2475 targets = []
2476 for target in self.dbg:
2477 if target:
2478 targets.append(target)
2479 process = target.GetProcess()
2480 if process:
2481 rc = self.invoke(process, "Kill")
2482 self.assertTrue(rc.Success(), PROCESS_KILLED)
2483 for target in targets:
2484 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002485
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002486 # Do this last, to make sure it's in reverse order from how we setup.
2487 Base.tearDown(self)
2488
Zachary Turner95812042015-03-26 18:54:21 +00002489 # This must be the last statement, otherwise teardown hooks or other
2490 # lines might depend on this still being active.
2491 del self.dbg
2492
Johnny Chen86268e42011-09-30 21:48:35 +00002493 def switch_to_thread_with_stop_reason(self, stop_reason):
2494 """
2495 Run the 'thread list' command, and select the thread with stop reason as
2496 'stop_reason'. If no such thread exists, no select action is done.
2497 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002498 from .lldbutil import stop_reason_to_str
Johnny Chen86268e42011-09-30 21:48:35 +00002499 self.runCmd('thread list')
2500 output = self.res.GetOutput()
2501 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2502 stop_reason_to_str(stop_reason))
2503 for line in output.splitlines():
2504 matched = thread_line_pattern.match(line)
2505 if matched:
2506 self.runCmd('thread select %s' % matched.group(1))
2507
Enrico Granata7594f142013-06-17 22:51:50 +00002508 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002509 """
2510 Ask the command interpreter to handle the command and then check its
2511 return status.
2512 """
2513 # Fail fast if 'cmd' is not meaningful.
2514 if not cmd or len(cmd) == 0:
2515 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002516
Johnny Chen8d55a342010-08-31 17:42:54 +00002517 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002518
Daniel Maleae0f8f572013-08-26 23:57:52 +00002519 if cmd.startswith("target create "):
2520 cmd = cmd.replace("target create ", "file ")
Daniel Maleae0f8f572013-08-26 23:57:52 +00002521
Johnny Chen63dfb272010-09-01 00:15:19 +00002522 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002523
Johnny Chen63dfb272010-09-01 00:15:19 +00002524 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002525 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002526
Johnny Chen150c3cc2010-10-15 01:18:29 +00002527 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002528 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002529 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002530 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002531 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002532 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002533 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002534 print("runCmd failed!", file=sbuf)
2535 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002536
Johnny Chenff3d01d2010-08-20 21:03:09 +00002537 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002538 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002539 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002540 # For process launch, wait some time before possible next try.
2541 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002542 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002543 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002544
Johnny Chen27f212d2010-08-19 23:26:59 +00002545 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002546 self.assertTrue(self.res.Succeeded(),
2547 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002548
Jim Ingham63dfc722012-09-22 00:05:11 +00002549 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2550 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2551
2552 Otherwise, all the arguments have the same meanings as for the expect function"""
2553
2554 trace = (True if traceAlways else trace)
2555
2556 if exe:
2557 # First run the command. If we are expecting error, set check=False.
2558 # Pass the assert message along since it provides more semantic info.
2559 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2560
2561 # Then compare the output against expected strings.
2562 output = self.res.GetError() if error else self.res.GetOutput()
2563
2564 # If error is True, the API client expects the command to fail!
2565 if error:
2566 self.assertFalse(self.res.Succeeded(),
2567 "Command '" + str + "' is expected to fail!")
2568 else:
2569 # No execution required, just compare str against the golden input.
2570 output = str
2571 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002572 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002573
2574 # The heading says either "Expecting" or "Not expecting".
2575 heading = "Expecting" if matching else "Not expecting"
2576
2577 for pattern in patterns:
2578 # Match Objects always have a boolean value of True.
2579 match_object = re.search(pattern, output)
2580 matched = bool(match_object)
2581 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002582 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2583 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002584 if matched:
2585 break
2586
2587 self.assertTrue(matched if matching else not matched,
2588 msg if msg else EXP_MSG(str, exe))
2589
2590 return match_object
2591
Enrico Granata7594f142013-06-17 22:51:50 +00002592 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 +00002593 """
2594 Similar to runCmd; with additional expect style output matching ability.
2595
2596 Ask the command interpreter to handle the command and then check its
2597 return status. The 'msg' parameter specifies an informational assert
2598 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002599 'startstr', matches the substrings contained in 'substrs', and regexp
2600 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002601
2602 If the keyword argument error is set to True, it signifies that the API
2603 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002604 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002605 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002606
2607 If the keyword argument matching is set to False, it signifies that the API
2608 client is expecting the output of the command not to match the golden
2609 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002610
2611 Finally, the required argument 'str' represents the lldb command to be
2612 sent to the command interpreter. In case the keyword argument 'exe' is
2613 set to False, the 'str' is treated as a string to be matched/not-matched
2614 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002615 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002616 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002617
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002618 if exe:
2619 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002620 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002621 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002622
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002623 # Then compare the output against expected strings.
2624 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002625
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002626 # If error is True, the API client expects the command to fail!
2627 if error:
2628 self.assertFalse(self.res.Succeeded(),
2629 "Command '" + str + "' is expected to fail!")
2630 else:
2631 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002632 if isinstance(str,lldb.SBCommandReturnObject):
2633 output = str.GetOutput()
2634 else:
2635 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002636 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002637 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002638
Johnny Chenea88e942010-09-21 21:08:53 +00002639 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002640 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002641
2642 # Start from the startstr, if specified.
2643 # If there's no startstr, set the initial state appropriately.
2644 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002645
Johnny Chen150c3cc2010-10-15 01:18:29 +00002646 if startstr:
2647 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002648 print("%s start string: %s" % (heading, startstr), file=sbuf)
2649 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002650
Johnny Chen86268e42011-09-30 21:48:35 +00002651 # Look for endstr, if specified.
2652 keepgoing = matched if matching else not matched
2653 if endstr:
2654 matched = output.endswith(endstr)
2655 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002656 print("%s end string: %s" % (heading, endstr), file=sbuf)
2657 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002658
Johnny Chenea88e942010-09-21 21:08:53 +00002659 # Look for sub strings, if specified.
2660 keepgoing = matched if matching else not matched
2661 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002662 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002663 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002664 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002665 print("%s sub string: %s" % (heading, str), file=sbuf)
2666 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002667 keepgoing = matched if matching else not matched
2668 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002669 break
2670
Johnny Chenea88e942010-09-21 21:08:53 +00002671 # Search for regular expression patterns, if specified.
2672 keepgoing = matched if matching else not matched
2673 if patterns and keepgoing:
2674 for pattern in patterns:
2675 # Match Objects always have a boolean value of True.
2676 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002677 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002678 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2679 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002680 keepgoing = matched if matching else not matched
2681 if not keepgoing:
2682 break
Johnny Chenea88e942010-09-21 21:08:53 +00002683
2684 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002685 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002686
Johnny Chenf3c59232010-08-25 22:52:45 +00002687 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002688 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002689 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002690
2691 method = getattr(obj, name)
2692 import inspect
2693 self.assertTrue(inspect.ismethod(method),
2694 name + "is a method name of object: " + str(obj))
2695 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002696 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002697 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002698 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002699
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002700 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2701 """Platform specific way to build the default binaries."""
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002702 module = builder_module()
2703 if target_is_android():
2704 dictionary = append_android_envs(dictionary)
2705 if self.debug_info is None:
2706 return self.buildDefault(architecture, compiler, dictionary, clean)
2707 elif self.debug_info == "dsym":
2708 return self.buildDsym(architecture, compiler, dictionary, clean)
2709 elif self.debug_info == "dwarf":
2710 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002711 elif self.debug_info == "dwo":
2712 return self.buildDwo(architecture, compiler, dictionary, clean)
2713 else:
2714 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002715
Johnny Chenf359cf22011-05-27 23:36:52 +00002716 # =================================================
2717 # Misc. helper methods for debugging test execution
2718 # =================================================
2719
Johnny Chen56b92a72011-07-11 19:15:11 +00002720 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002721 """Debug print a SBValue object, if traceAlways is True."""
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002722 from .lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002723
Johnny Chen8d55a342010-08-31 17:42:54 +00002724 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002725 return
2726
2727 err = sys.stderr
2728 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002729 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2730 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2731 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2732 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2733 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2734 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2735 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2736 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2737 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002738
Johnny Chen36c5eb12011-08-05 20:17:27 +00002739 def DebugSBType(self, type):
2740 """Debug print a SBType object, if traceAlways is True."""
2741 if not traceAlways:
2742 return
2743
2744 err = sys.stderr
2745 err.write(type.GetName() + ":\n")
2746 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2747 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2748 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2749
Johnny Chenb877f1e2011-03-12 01:18:19 +00002750 def DebugPExpect(self, child):
2751 """Debug the spwaned pexpect object."""
2752 if not traceAlways:
2753 return
2754
Zachary Turnerff890da2015-10-19 23:45:41 +00002755 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002756
2757 @classmethod
2758 def RemoveTempFile(cls, file):
2759 if os.path.exists(file):
2760 os.remove(file)