blob: 9d0c4e2559f95ad9b67de45fc6cdeb288f4b2f35 [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
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +000040import gc
Vince Harron9753dd92015-05-10 15:22:09 +000041import glob
Johnny Chen90312a82010-09-21 22:34:45 +000042import os, sys, traceback
Enrico Granata7e137e32012-10-24 18:14:21 +000043import os.path
Johnny Chenea88e942010-09-21 21:08:53 +000044import re
Daniel Malea69207462013-06-05 21:07:02 +000045import signal
Johnny Chen8952a2d2010-08-30 21:35:00 +000046from subprocess import *
Johnny Chenf2b70232010-08-25 18:49:48 +000047import time
Johnny Chena33a93c2010-08-30 23:08:52 +000048import types
Zachary Turner43a01e42015-10-20 21:06:05 +000049
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000050# Third-party modules
51import unittest2
Zachary Turner43a01e42015-10-20 21:06:05 +000052from six import add_metaclass
Zachary Turner814236d2015-10-21 17:48:52 +000053from six import StringIO as SixStringIO
54from six.moves.urllib import parse as urlparse
Zachary Turnercd236b82015-10-26 18:48:24 +000055import six
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000056
57# LLDB modules
58import lldb
59from . import lldbtest_config
60from . import lldbutil
61from . import test_categories
Siva Chandra8af91662015-06-05 00:22:49 +000062
Vince Harron85d19652015-05-21 19:09:29 +000063# dosep.py starts lots and lots of dotest instances
64# This option helps you find if two (or more) dotest instances are using the same
65# directory at the same time
66# Enable it to cause test failures and stderr messages if dotest instances try to run in
67# the same directory simultaneously
68# it is disabled by default because it litters the test directories with ".dirlock" files
69debug_confirm_directory_exclusivity = False
70
Johnny Chen707b3c92010-10-11 22:25:46 +000071# See also dotest.parseOptionsAndInitTestdirs(), where the environment variables
Johnny Chend2047fa2011-01-19 18:18:47 +000072# LLDB_COMMAND_TRACE and LLDB_DO_CLEANUP are set from '-t' and '-r dir' options.
Johnny Chen707b3c92010-10-11 22:25:46 +000073
74# By default, traceAlways is False.
Johnny Chen8d55a342010-08-31 17:42:54 +000075if "LLDB_COMMAND_TRACE" in os.environ and os.environ["LLDB_COMMAND_TRACE"]=="YES":
76 traceAlways = True
77else:
78 traceAlways = False
79
Johnny Chen707b3c92010-10-11 22:25:46 +000080# By default, doCleanup is True.
81if "LLDB_DO_CLEANUP" in os.environ and os.environ["LLDB_DO_CLEANUP"]=="NO":
82 doCleanup = False
83else:
84 doCleanup = True
85
Johnny Chen8d55a342010-08-31 17:42:54 +000086
Johnny Chen00778092010-08-09 22:01:17 +000087#
88# Some commonly used assert messages.
89#
90
Johnny Chenaa902922010-09-17 22:45:27 +000091COMMAND_FAILED_AS_EXPECTED = "Command has failed as expected"
92
Johnny Chen00778092010-08-09 22:01:17 +000093CURRENT_EXECUTABLE_SET = "Current executable set successfully"
94
Johnny Chen7d1d7532010-09-02 21:23:12 +000095PROCESS_IS_VALID = "Process is valid"
96
97PROCESS_KILLED = "Process is killed successfully"
98
Johnny Chend5f66fc2010-12-23 01:12:19 +000099PROCESS_EXITED = "Process exited successfully"
100
101PROCESS_STOPPED = "Process status should be stopped"
102
Sean Callanan05834cd2015-07-01 23:56:30 +0000103RUN_SUCCEEDED = "Process is launched successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000104
Johnny Chen17941842010-08-09 23:44:24 +0000105RUN_COMPLETED = "Process exited successfully"
Johnny Chen00778092010-08-09 22:01:17 +0000106
Johnny Chen67af43f2010-10-05 19:27:32 +0000107BACKTRACE_DISPLAYED_CORRECTLY = "Backtrace displayed correctly"
108
Johnny Chen17941842010-08-09 23:44:24 +0000109BREAKPOINT_CREATED = "Breakpoint created successfully"
110
Johnny Chenf10af382010-12-04 00:07:24 +0000111BREAKPOINT_STATE_CORRECT = "Breakpoint state is correct"
112
Johnny Chene76896c2010-08-17 21:33:31 +0000113BREAKPOINT_PENDING_CREATED = "Pending breakpoint created successfully"
114
Johnny Chen17941842010-08-09 23:44:24 +0000115BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
Johnny Chen00778092010-08-09 22:01:17 +0000116
Johnny Chen703dbd02010-09-30 17:06:24 +0000117BREAKPOINT_HIT_TWICE = "Breakpoint resolved with hit cout = 2"
118
Johnny Chen164f1e12010-10-15 18:07:09 +0000119BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
120
Greg Clayton5db6b792012-10-24 18:24:14 +0000121MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
122
Johnny Chen89109ed12011-06-27 20:05:23 +0000123OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
124
Johnny Chen5b3a3572010-12-09 18:22:12 +0000125SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"
126
Johnny Chenc70b02a2010-09-22 23:00:20 +0000127STEP_OUT_SUCCEEDED = "Thread step-out succeeded"
128
Johnny Chen1691a162011-04-15 16:44:48 +0000129STOPPED_DUE_TO_EXC_BAD_ACCESS = "Process should be stopped due to bad access exception"
130
Ashok Thirumurthib4e51342013-05-17 15:35:15 +0000131STOPPED_DUE_TO_ASSERT = "Process should be stopped due to an assertion"
132
Johnny Chen5d6c4642010-11-10 23:46:38 +0000133STOPPED_DUE_TO_BREAKPOINT = "Process should be stopped due to breakpoint"
Johnny Chende0338b2010-11-10 20:20:06 +0000134
Johnny Chen5d6c4642010-11-10 23:46:38 +0000135STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS = "%s, %s" % (
136 STOPPED_DUE_TO_BREAKPOINT, "instead, the actual stop reason is: '%s'")
Johnny Chen00778092010-08-09 22:01:17 +0000137
Johnny Chen2e431ce2010-10-20 18:38:48 +0000138STOPPED_DUE_TO_BREAKPOINT_CONDITION = "Stopped due to breakpoint condition"
139
Johnny Chen0a3d1ca2010-12-13 21:49:58 +0000140STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT = "Stopped due to breakpoint and ignore count"
141
Johnny Chenc066ab42010-10-14 01:22:03 +0000142STOPPED_DUE_TO_SIGNAL = "Process state is stopped due to signal"
143
Johnny Chen00778092010-08-09 22:01:17 +0000144STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
145
Johnny Chenf68cc122011-09-15 21:09:59 +0000146STOPPED_DUE_TO_WATCHPOINT = "Process should be stopped due to watchpoint"
147
Johnny Chen3c884a02010-08-24 22:07:56 +0000148DATA_TYPES_DISPLAYED_CORRECTLY = "Data type(s) displayed correctly"
149
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000150VALID_BREAKPOINT = "Got a valid breakpoint"
151
Johnny Chen5bfb8ee2010-10-22 18:10:25 +0000152VALID_BREAKPOINT_LOCATION = "Got a valid breakpoint location"
153
Johnny Chen7209d84f2011-05-06 23:26:12 +0000154VALID_COMMAND_INTERPRETER = "Got a valid command interpreter"
155
Johnny Chen5ee88192010-08-27 23:47:36 +0000156VALID_FILESPEC = "Got a valid filespec"
157
Johnny Chen025d1b82010-12-08 01:25:21 +0000158VALID_MODULE = "Got a valid module"
159
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000160VALID_PROCESS = "Got a valid process"
161
Johnny Chen025d1b82010-12-08 01:25:21 +0000162VALID_SYMBOL = "Got a valid symbol"
163
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000164VALID_TARGET = "Got a valid target"
165
Matthew Gardinerc928de32014-10-22 07:22:56 +0000166VALID_PLATFORM = "Got a valid platform"
167
Johnny Chen15f247a2012-02-03 20:43:00 +0000168VALID_TYPE = "Got a valid type"
169
Johnny Chen5819ab42011-07-15 22:28:10 +0000170VALID_VARIABLE = "Got a valid variable"
171
Johnny Chen981463d2010-08-25 19:00:04 +0000172VARIABLES_DISPLAYED_CORRECTLY = "Variable(s) displayed correctly"
Johnny Chen00778092010-08-09 22:01:17 +0000173
Johnny Chenf68cc122011-09-15 21:09:59 +0000174WATCHPOINT_CREATED = "Watchpoint created successfully"
Johnny Chen5fca8ca2010-08-26 20:04:17 +0000175
Sean Callanan05834cd2015-07-01 23:56:30 +0000176def CMD_MSG(str):
177 '''A generic "Command '%s' returns successfully" message generator.'''
178 return "Command '%s' returns successfully" % str
Johnny Chenc0c67f22010-11-09 18:42:22 +0000179
Johnny Chen3bc8ae42012-03-15 19:10:00 +0000180def COMPLETION_MSG(str_before, str_after):
Johnny Chen98aceb02012-01-20 23:02:51 +0000181 '''A generic message generator for the completion mechanism.'''
182 return "'%s' successfully completes to '%s'" % (str_before, str_after)
183
Johnny Chenc0c67f22010-11-09 18:42:22 +0000184def EXP_MSG(str, exe):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000185 '''A generic "'%s' returns expected result" message generator if exe.
186 Otherwise, it generates "'%s' matches expected result" message.'''
Johnny Chenc0c67f22010-11-09 18:42:22 +0000187 return "'%s' %s expected result" % (str, 'returns' if exe else 'matches')
Johnny Chen17941842010-08-09 23:44:24 +0000188
Johnny Chen3343f042010-10-19 19:11:38 +0000189def SETTING_MSG(setting):
Johnny Chenaacf92e2011-05-31 22:16:51 +0000190 '''A generic "Value of setting '%s' is correct" message generator.'''
Johnny Chen3343f042010-10-19 19:11:38 +0000191 return "Value of setting '%s' is correct" % setting
192
Johnny Chen27c41232010-08-26 21:49:29 +0000193def EnvArray():
Johnny Chenaacf92e2011-05-31 22:16:51 +0000194 """Returns an env variable array from the os.environ map object."""
Zachary Turner606e1e32015-10-23 17:53:51 +0000195 return list(map(lambda k,v: k+"="+v, list(os.environ.keys()), list(os.environ.values())))
Johnny Chen27c41232010-08-26 21:49:29 +0000196
Johnny Chen47ceb032010-10-11 23:52:19 +0000197def line_number(filename, string_to_match):
198 """Helper function to return the line number of the first matched string."""
199 with open(filename, 'r') as f:
200 for i, line in enumerate(f):
201 if line.find(string_to_match) != -1:
202 # Found our match.
Johnny Chencd9b7772010-10-12 00:09:25 +0000203 return i+1
Johnny Chen1691a162011-04-15 16:44:48 +0000204 raise Exception("Unable to find '%s' within file %s" % (string_to_match, filename))
Johnny Chen47ceb032010-10-11 23:52:19 +0000205
Johnny Chen67af43f2010-10-05 19:27:32 +0000206def pointer_size():
207 """Return the pointer size of the host system."""
208 import ctypes
209 a_pointer = ctypes.c_void_p(0xffff)
210 return 8 * ctypes.sizeof(a_pointer)
211
Johnny Chen57816732012-02-09 02:01:59 +0000212def is_exe(fpath):
213 """Returns true if fpath is an executable."""
214 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
215
216def which(program):
217 """Returns the full path to a program; None otherwise."""
218 fpath, fname = os.path.split(program)
219 if fpath:
220 if is_exe(program):
221 return program
222 else:
223 for path in os.environ["PATH"].split(os.pathsep):
224 exe_file = os.path.join(path, program)
225 if is_exe(exe_file):
226 return exe_file
227 return None
228
Zachary Turner814236d2015-10-21 17:48:52 +0000229class recording(SixStringIO):
Johnny Chen150c3cc2010-10-15 01:18:29 +0000230 """
231 A nice little context manager for recording the debugger interactions into
232 our session object. If trace flag is ON, it also emits the interactions
233 into the stderr.
234 """
235 def __init__(self, test, trace):
Zachary Turner814236d2015-10-21 17:48:52 +0000236 """Create a SixStringIO instance; record the session obj and trace flag."""
237 SixStringIO.__init__(self)
Johnny Chen0241f142011-08-16 22:06:17 +0000238 # The test might not have undergone the 'setUp(self)' phase yet, so that
239 # the attribute 'session' might not even exist yet.
Johnny Chenbfcf37f2011-08-16 17:06:45 +0000240 self.session = getattr(test, "session", None) if test else None
Johnny Chen150c3cc2010-10-15 01:18:29 +0000241 self.trace = trace
242
243 def __enter__(self):
244 """
245 Context management protocol on entry to the body of the with statement.
Zachary Turner814236d2015-10-21 17:48:52 +0000246 Just return the SixStringIO object.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000247 """
248 return self
249
250 def __exit__(self, type, value, tb):
251 """
252 Context management protocol on exit from the body of the with statement.
253 If trace is ON, it emits the recordings into stderr. Always add the
Zachary Turner814236d2015-10-21 17:48:52 +0000254 recordings to our session object. And close the SixStringIO object, too.
Johnny Chen150c3cc2010-10-15 01:18:29 +0000255 """
256 if self.trace:
Zachary Turnerff890da2015-10-19 23:45:41 +0000257 print(self.getvalue(), file=sys.stderr)
Johnny Chen690fcef2010-10-15 23:55:05 +0000258 if self.session:
Zachary Turnerff890da2015-10-19 23:45:41 +0000259 print(self.getvalue(), file=self.session)
Johnny Chen150c3cc2010-10-15 01:18:29 +0000260 self.close()
261
Zachary Turner43a01e42015-10-20 21:06:05 +0000262@add_metaclass(abc.ABCMeta)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000263class _BaseProcess(object):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000264
265 @abc.abstractproperty
266 def pid(self):
267 """Returns process PID if has been launched already."""
268
269 @abc.abstractmethod
270 def launch(self, executable, args):
271 """Launches new process with given executable and args."""
272
273 @abc.abstractmethod
274 def terminate(self):
275 """Terminates previously launched process.."""
276
277class _LocalProcess(_BaseProcess):
278
279 def __init__(self, trace_on):
280 self._proc = None
281 self._trace_on = trace_on
Ilia K725abcb2015-04-15 13:35:49 +0000282 self._delayafterterminate = 0.1
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000283
284 @property
285 def pid(self):
286 return self._proc.pid
287
288 def launch(self, executable, args):
289 self._proc = Popen([executable] + args,
290 stdout = open(os.devnull) if not self._trace_on else None,
291 stdin = PIPE)
292
293 def terminate(self):
294 if self._proc.poll() == None:
Ilia K725abcb2015-04-15 13:35:49 +0000295 # Terminate _proc like it does the pexpect
Adrian McCarthy137d7ba2015-07-07 14:47:34 +0000296 signals_to_try = [sig for sig in ['SIGHUP', 'SIGCONT', 'SIGINT'] if sig in dir(signal)]
297 for sig in signals_to_try:
298 try:
299 self._proc.send_signal(getattr(signal, sig))
300 time.sleep(self._delayafterterminate)
301 if self._proc.poll() != None:
302 return
303 except ValueError:
304 pass # Windows says SIGINT is not a valid signal to send
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000305 self._proc.terminate()
Ilia K725abcb2015-04-15 13:35:49 +0000306 time.sleep(self._delayafterterminate)
307 if self._proc.poll() != None:
308 return
309 self._proc.kill()
310 time.sleep(self._delayafterterminate)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000311
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000312 def poll(self):
313 return self._proc.poll()
314
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000315class _RemoteProcess(_BaseProcess):
316
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000317 def __init__(self, install_remote):
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000318 self._pid = None
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000319 self._install_remote = install_remote
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000320
321 @property
322 def pid(self):
323 return self._pid
324
325 def launch(self, executable, args):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000326 if self._install_remote:
327 src_path = executable
Chaoren Lin5d76b1b2015-06-06 00:25:50 +0000328 dst_path = lldbutil.append_to_process_working_directory(os.path.basename(executable))
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000329
330 dst_file_spec = lldb.SBFileSpec(dst_path, False)
331 err = lldb.remote_platform.Install(lldb.SBFileSpec(src_path, True), dst_file_spec)
332 if err.Fail():
333 raise Exception("remote_platform.Install('%s', '%s') failed: %s" % (src_path, dst_path, err))
334 else:
335 dst_path = executable
336 dst_file_spec = lldb.SBFileSpec(executable, False)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000337
338 launch_info = lldb.SBLaunchInfo(args)
339 launch_info.SetExecutableFile(dst_file_spec, True)
Chaoren Lin3e2bdb42015-05-11 17:53:39 +0000340 launch_info.SetWorkingDirectory(lldb.remote_platform.GetWorkingDirectory())
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000341
342 # Redirect stdout and stderr to /dev/null
343 launch_info.AddSuppressFileAction(1, False, True)
344 launch_info.AddSuppressFileAction(2, False, True)
345
346 err = lldb.remote_platform.Launch(launch_info)
347 if err.Fail():
348 raise Exception("remote_platform.Launch('%s', '%s') failed: %s" % (dst_path, args, err))
349 self._pid = launch_info.GetProcessID()
350
351 def terminate(self):
Tamas Berghammer04f51d12015-03-11 13:51:07 +0000352 lldb.remote_platform.Kill(self._pid)
Oleksiy Vyalov1ef7b2c2015-02-04 23:19:15 +0000353
Johnny Chen690fcef2010-10-15 23:55:05 +0000354# From 2.7's subprocess.check_output() convenience function.
Johnny Chenac77f3b2011-03-23 20:28:59 +0000355# Return a tuple (stdoutdata, stderrdata).
Zachary Turner9ef307b2014-07-22 16:19:29 +0000356def system(commands, **kwargs):
Johnny Chen8eb14a92011-11-16 22:44:28 +0000357 r"""Run an os command with arguments and return its output as a byte string.
Johnny Chen690fcef2010-10-15 23:55:05 +0000358
359 If the exit code was non-zero it raises a CalledProcessError. The
360 CalledProcessError object will have the return code in the returncode
361 attribute and output in the output attribute.
362
363 The arguments are the same as for the Popen constructor. Example:
364
365 >>> check_output(["ls", "-l", "/dev/null"])
366 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
367
368 The stdout argument is not allowed as it is used internally.
369 To capture standard error in the result, use stderr=STDOUT.
370
371 >>> check_output(["/bin/sh", "-c",
372 ... "ls -l non_existent_file ; exit 0"],
373 ... stderr=STDOUT)
374 'ls: non_existent_file: No such file or directory\n'
375 """
376
377 # Assign the sender object to variable 'test' and remove it from kwargs.
378 test = kwargs.pop('sender', None)
379
Zachary Turner9ef307b2014-07-22 16:19:29 +0000380 # [['make', 'clean', 'foo'], ['make', 'foo']] -> ['make clean foo', 'make foo']
381 commandList = [' '.join(x) for x in commands]
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000382 output = ""
383 error = ""
384 for shellCommand in commandList:
385 if 'stdout' in kwargs:
386 raise ValueError('stdout argument not allowed, it will be overridden.')
387 if 'shell' in kwargs and kwargs['shell']==False:
388 raise ValueError('shell=False not allowed')
389 process = Popen(shellCommand, stdout=PIPE, stderr=PIPE, shell=True, **kwargs)
390 pid = process.pid
391 this_output, this_error = process.communicate()
392 retcode = process.poll()
Zachary Turner9ef307b2014-07-22 16:19:29 +0000393
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000394 # Enable trace on failure return while tracking down FreeBSD buildbot issues
395 trace = traceAlways
396 if not trace and retcode and sys.platform.startswith("freebsd"):
397 trace = True
Johnny Chen690fcef2010-10-15 23:55:05 +0000398
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000399 with recording(test, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +0000400 print(file=sbuf)
401 print("os command:", shellCommand, file=sbuf)
402 print("with pid:", pid, file=sbuf)
403 print("stdout:", this_output, file=sbuf)
404 print("stderr:", this_error, file=sbuf)
405 print("retcode:", retcode, file=sbuf)
406 print(file=sbuf)
Ed Maste6e496332014-08-05 20:33:17 +0000407
Zachary Turner65fe1eb2015-03-26 16:43:25 +0000408 if retcode:
409 cmd = kwargs.get("args")
410 if cmd is None:
411 cmd = shellCommand
412 raise CalledProcessError(retcode, cmd)
413 output = output + this_output
414 error = error + this_error
Johnny Chenac77f3b2011-03-23 20:28:59 +0000415 return (output, error)
Johnny Chen690fcef2010-10-15 23:55:05 +0000416
Johnny Chenab9c1dd2010-11-01 20:35:01 +0000417def getsource_if_available(obj):
418 """
419 Return the text of the source code for an object if available. Otherwise,
420 a print representation is returned.
421 """
422 import inspect
423 try:
424 return inspect.getsource(obj)
425 except:
426 return repr(obj)
427
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000428def builder_module():
Ed Maste4d90f0f2013-07-25 13:24:34 +0000429 if sys.platform.startswith("freebsd"):
430 return __import__("builder_freebsd")
Peter Collingbourne19f48d52011-06-20 19:06:20 +0000431 return __import__("builder_" + sys.platform)
432
Siva Chandra8af91662015-06-05 00:22:49 +0000433def run_adb_command(cmd, device_id):
434 device_id_args = []
435 if device_id:
436 device_id_args = ["-s", device_id]
437 full_cmd = ["adb"] + device_id_args + cmd
438 p = Popen(full_cmd, stdout=PIPE, stderr=PIPE)
439 stdout, stderr = p.communicate()
440 return p.returncode, stdout, stderr
441
Chaoren Line9bbabc2015-07-18 00:37:55 +0000442def append_android_envs(dictionary):
443 if dictionary is None:
444 dictionary = {}
445 dictionary["OS"] = "Android"
446 if android_device_api() >= 16:
447 dictionary["PIE"] = 1
448 return dictionary
449
Chaoren Lin9070f532015-07-17 22:13:29 +0000450def target_is_android():
451 if not hasattr(target_is_android, 'result'):
452 triple = lldb.DBG.GetSelectedPlatform().GetTriple()
453 match = re.match(".*-.*-.*-android", triple)
454 target_is_android.result = match is not None
455 return target_is_android.result
456
Siva Chandra8af91662015-06-05 00:22:49 +0000457def android_device_api():
Chaoren Lin9070f532015-07-17 22:13:29 +0000458 if not hasattr(android_device_api, 'result'):
459 assert lldb.platform_url is not None
460 device_id = None
461 parsed_url = urlparse.urlparse(lldb.platform_url)
462 if parsed_url.scheme == "adb":
463 device_id = parsed_url.netloc.split(":")[0]
464 retcode, stdout, stderr = run_adb_command(
465 ["shell", "getprop", "ro.build.version.sdk"], device_id)
466 if retcode == 0:
467 android_device_api.result = int(stdout)
468 else:
469 raise LookupError(
470 ">>> Unable to determine the API level of the Android device.\n"
471 ">>> stdout:\n%s\n"
472 ">>> stderr:\n%s\n" % (stdout, stderr))
473 return android_device_api.result
Siva Chandra8af91662015-06-05 00:22:49 +0000474
Johnny Chena74bb0a2011-08-01 18:46:13 +0000475#
476# Decorators for categorizing test cases.
477#
Johnny Chena74bb0a2011-08-01 18:46:13 +0000478from functools import wraps
Pavel Labathdc8b2d32015-10-26 09:28:32 +0000479def add_test_categories(cat):
480 """Decorate an item with test categories"""
481 cat = test_categories.validate(cat, True)
482 def impl(func):
483 func.getCategories = lambda test: cat
484 return func
485 return impl
Johnny Chena74bb0a2011-08-01 18:46:13 +0000486
Johnny Chena74bb0a2011-08-01 18:46:13 +0000487def benchmarks_test(func):
488 """Decorate the item as a benchmarks test."""
489 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
490 raise Exception("@benchmarks_test can only be used to decorate a test method")
491 @wraps(func)
492 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000493 if not lldb.just_do_benchmarks_test:
494 self.skipTest("benchmarks tests")
Johnny Chena74bb0a2011-08-01 18:46:13 +0000495 return func(self, *args, **kwargs)
496
497 # Mark this function as such to separate them from the regular tests.
498 wrapper.__benchmarks_test__ = True
499 return wrapper
500
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000501def no_debug_info_test(func):
502 """Decorate the item as a test what don't use any debug info. If this annotation is specified
503 then the test runner won't generate a separate test for each debug info format. """
504 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
505 raise Exception("@no_debug_info_test can only be used to decorate a test method")
506 @wraps(func)
507 def wrapper(self, *args, **kwargs):
508 return func(self, *args, **kwargs)
509
510 # Mark this function as such to separate them from the regular tests.
511 wrapper.__no_debug_info_test__ = True
512 return wrapper
513
Johnny Chenf1548d42012-04-06 00:56:05 +0000514def dsym_test(func):
515 """Decorate the item as a dsym test."""
516 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
517 raise Exception("@dsym_test can only be used to decorate a test method")
518 @wraps(func)
519 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000520 if lldb.dont_do_dsym_test:
521 self.skipTest("dsym tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000522 return func(self, *args, **kwargs)
523
524 # Mark this function as such to separate them from the regular tests.
525 wrapper.__dsym_test__ = True
526 return wrapper
527
528def dwarf_test(func):
529 """Decorate the item as a dwarf test."""
530 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
531 raise Exception("@dwarf_test can only be used to decorate a test method")
532 @wraps(func)
533 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000534 if lldb.dont_do_dwarf_test:
535 self.skipTest("dwarf tests")
Johnny Chenf1548d42012-04-06 00:56:05 +0000536 return func(self, *args, **kwargs)
537
538 # Mark this function as such to separate them from the regular tests.
539 wrapper.__dwarf_test__ = True
540 return wrapper
541
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000542def dwo_test(func):
543 """Decorate the item as a dwo test."""
544 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
545 raise Exception("@dwo_test can only be used to decorate a test method")
546 @wraps(func)
547 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000548 if lldb.dont_do_dwo_test:
549 self.skipTest("dwo tests")
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000550 return func(self, *args, **kwargs)
551
552 # Mark this function as such to separate them from the regular tests.
553 wrapper.__dwo_test__ = True
554 return wrapper
555
Todd Fialaa41d48c2014-04-28 04:49:40 +0000556def debugserver_test(func):
557 """Decorate the item as a debugserver test."""
558 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
559 raise Exception("@debugserver_test can only be used to decorate a test method")
560 @wraps(func)
561 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000562 if lldb.dont_do_debugserver_test:
563 self.skipTest("debugserver tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000564 return func(self, *args, **kwargs)
565
566 # Mark this function as such to separate them from the regular tests.
567 wrapper.__debugserver_test__ = True
568 return wrapper
569
570def llgs_test(func):
Robert Flack8cc4cf12015-03-06 14:36:33 +0000571 """Decorate the item as a lldb-server test."""
Todd Fialaa41d48c2014-04-28 04:49:40 +0000572 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
573 raise Exception("@llgs_test can only be used to decorate a test method")
574 @wraps(func)
575 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000576 if lldb.dont_do_llgs_test:
577 self.skipTest("llgs tests")
Todd Fialaa41d48c2014-04-28 04:49:40 +0000578 return func(self, *args, **kwargs)
579
580 # Mark this function as such to separate them from the regular tests.
581 wrapper.__llgs_test__ = True
582 return wrapper
583
Daniel Maleae0f8f572013-08-26 23:57:52 +0000584def not_remote_testsuite_ready(func):
585 """Decorate the item as a test which is not ready yet for remote testsuite."""
586 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
587 raise Exception("@not_remote_testsuite_ready can only be used to decorate a test method")
588 @wraps(func)
589 def wrapper(self, *args, **kwargs):
Pavel Labathf882f6f2015-10-12 13:42:16 +0000590 if lldb.lldbtest_remote_sandbox or lldb.remote_platform:
591 self.skipTest("not ready for remote testsuite")
Daniel Maleae0f8f572013-08-26 23:57:52 +0000592 return func(self, *args, **kwargs)
593
594 # Mark this function as such to separate them from the regular tests.
595 wrapper.__not_ready_for_remote_testsuite_test__ = True
596 return wrapper
597
Ed Maste433790a2014-04-23 12:55:41 +0000598def expectedFailure(expected_fn, bugnumber=None):
599 def expectedFailure_impl(func):
600 @wraps(func)
601 def wrapper(*args, **kwargs):
Enrico Granata43f62132013-02-23 01:28:30 +0000602 from unittest2 import case
603 self = args[0]
Ed Maste433790a2014-04-23 12:55:41 +0000604 if expected_fn(self):
Zachary Turner5cb8e672015-11-06 18:14:42 +0000605 xfail_func = unittest2.expectedFailure(func)
606 xfail_func(*args, **kwargs)
607 else:
608 func(*args, **kwargs)
Ed Maste433790a2014-04-23 12:55:41 +0000609 return wrapper
Ying Chen464d1e12015-03-27 00:26:52 +0000610 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
611 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000612 if six.callable(bugnumber):
Ying Chen464d1e12015-03-27 00:26:52 +0000613 return expectedFailure_impl(bugnumber)
614 else:
615 return expectedFailure_impl
Ed Maste433790a2014-04-23 12:55:41 +0000616
Ying Chen7091c2c2015-04-21 01:15:47 +0000617# provide a function to xfail on defined oslist, compiler version, and archs
618# if none is specified for any argument, that argument won't be checked and thus means for all
619# for example,
620# @expectedFailureAll, xfail for all platform/compiler/arch,
621# @expectedFailureAll(compiler='gcc'), xfail for gcc on all platform/architecture
622# @expectedFailureAll(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), xfail for gcc>=4.9 on linux with i386
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000623def expectedFailureAll(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, triple=None, debug_info=None):
Ying Chen7091c2c2015-04-21 01:15:47 +0000624 def fn(self):
625 return ((oslist is None or self.getPlatform() in oslist) and
626 (compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))) and
Tamas Berghammercf6f92a2015-09-07 15:50:19 +0000627 self.expectedArch(archs) and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000628 (triple is None or re.match(triple, lldb.DBG.GetSelectedPlatform().GetTriple())) and
629 (debug_info is None or self.debug_info in debug_info))
Ying Chen7091c2c2015-04-21 01:15:47 +0000630 return expectedFailure(fn, bugnumber)
631
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000632def expectedFailureDwarf(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000633 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwarf")
634
635def expectedFailureDwo(bugnumber=None):
636 return expectedFailureAll(bugnumber=bugnumber, debug_info="dwo")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000637
638def expectedFailureDsym(bugnumber=None):
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +0000639 return expectedFailureAll(bugnumber=bugnumber, debug_info="dsym")
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000640
641def expectedFailureCompiler(compiler, compiler_version=None, bugnumber=None):
642 if compiler_version is None:
643 compiler_version=['=', None]
644 return expectedFailureAll(bugnumber=bugnumber, compiler=compiler, compiler_version=compiler_version)
645
Vince Harron8974ce22015-03-13 19:54:54 +0000646# to XFAIL a specific clang versions, try this
647# @expectedFailureClang('bugnumber', ['<=', '3.4'])
648def expectedFailureClang(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000649 return expectedFailureCompiler('clang', compiler_version, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000650
651def expectedFailureGcc(bugnumber=None, compiler_version=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000652 return expectedFailureCompiler('gcc', compiler_version, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000653
Matt Kopec0de53f02013-03-15 19:10:12 +0000654def expectedFailureIcc(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000655 return expectedFailureCompiler('icc', None, bugnumber)
Matt Kopec0de53f02013-03-15 19:10:12 +0000656
Ed Maste433790a2014-04-23 12:55:41 +0000657def expectedFailureArch(arch, bugnumber=None):
658 def fn(self):
659 return arch in self.getArchitecture()
Ying Chen464d1e12015-03-27 00:26:52 +0000660 return expectedFailure(fn, bugnumber)
Daniel Malea249287a2013-02-19 16:08:57 +0000661
Enrico Granatae6cedc12013-02-23 01:05:23 +0000662def expectedFailurei386(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000663 return expectedFailureArch('i386', bugnumber)
Johnny Chena33843f2011-12-22 21:14:31 +0000664
Matt Kopecee969f92013-09-26 23:30:59 +0000665def expectedFailurex86_64(bugnumber=None):
Ying Chen464d1e12015-03-27 00:26:52 +0000666 return expectedFailureArch('x86_64', bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000667
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000668def expectedFailureOS(oslist, bugnumber=None, compilers=None, debug_info=None):
Ed Maste433790a2014-04-23 12:55:41 +0000669 def fn(self):
Robert Flack13c7ad92015-03-30 14:12:17 +0000670 return (self.getPlatform() in oslist and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000671 self.expectedCompiler(compilers) and
672 (debug_info is None or self.debug_info in debug_info))
Ying Chen464d1e12015-03-27 00:26:52 +0000673 return expectedFailure(fn, bugnumber)
Ed Maste433790a2014-04-23 12:55:41 +0000674
Chaoren Linf7160f32015-06-09 17:39:27 +0000675def expectedFailureHostOS(oslist, bugnumber=None, compilers=None):
676 def fn(self):
677 return (getHostPlatform() in oslist and
678 self.expectedCompiler(compilers))
679 return expectedFailure(fn, bugnumber)
680
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000681def expectedFailureDarwin(bugnumber=None, compilers=None, debug_info=None):
Robert Flackefa49c22015-03-26 19:34:26 +0000682 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000683 return expectedFailureOS(getDarwinOSTriples(), bugnumber, compilers, debug_info=debug_info)
Matt Kopecee969f92013-09-26 23:30:59 +0000684
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000685def expectedFailureFreeBSD(bugnumber=None, compilers=None, debug_info=None):
686 return expectedFailureOS(['freebsd'], bugnumber, compilers, debug_info=debug_info)
Ed Maste24a7f7d2013-07-24 19:47:08 +0000687
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000688def expectedFailureLinux(bugnumber=None, compilers=None, debug_info=None):
689 return expectedFailureOS(['linux'], bugnumber, compilers, debug_info=debug_info)
Matt Kopece9ea0da2013-05-07 19:29:28 +0000690
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000691def expectedFailureWindows(bugnumber=None, compilers=None, debug_info=None):
692 return expectedFailureOS(['windows'], bugnumber, compilers, debug_info=debug_info)
Zachary Turner80c2c602014-12-09 19:28:00 +0000693
Chaoren Linf7160f32015-06-09 17:39:27 +0000694def expectedFailureHostWindows(bugnumber=None, compilers=None):
695 return expectedFailureHostOS(['windows'], bugnumber, compilers)
696
Pavel Labath090152b2015-08-20 11:37:19 +0000697def matchAndroid(api_levels=None, archs=None):
698 def match(self):
699 if not target_is_android():
700 return False
701 if archs is not None and self.getArchitecture() not in archs:
702 return False
703 if api_levels is not None and android_device_api() not in api_levels:
704 return False
705 return True
706 return match
707
708
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000709def expectedFailureAndroid(bugnumber=None, api_levels=None, archs=None):
Siva Chandra8af91662015-06-05 00:22:49 +0000710 """ Mark a test as xfail for Android.
711
712 Arguments:
713 bugnumber - The LLVM pr associated with the problem.
714 api_levels - A sequence of numbers specifying the Android API levels
Tamas Berghammer050d1e82015-07-22 11:00:06 +0000715 for which a test is expected to fail. None means all API level.
716 arch - A sequence of architecture names specifying the architectures
717 for which a test is expected to fail. None means all architectures.
Siva Chandra8af91662015-06-05 00:22:49 +0000718 """
Pavel Labath090152b2015-08-20 11:37:19 +0000719 return expectedFailure(matchAndroid(api_levels, archs), bugnumber)
Pavel Labath674bc7b2015-05-29 14:54:46 +0000720
Vince Harron7ac3ea42015-06-26 15:13:21 +0000721# if the test passes on the first try, we're done (success)
722# if the test fails once, then passes on the second try, raise an ExpectedFailure
723# if the test fails twice in a row, re-throw the exception from the second test run
724def expectedFlakey(expected_fn, bugnumber=None):
725 def expectedFailure_impl(func):
726 @wraps(func)
727 def wrapper(*args, **kwargs):
728 from unittest2 import case
729 self = args[0]
730 try:
731 func(*args, **kwargs)
Ying Chen0a7202b2015-07-01 22:44:27 +0000732 # don't retry if the test case is already decorated with xfail or skip
733 except (case._ExpectedFailure, case.SkipTest, case._UnexpectedSuccess):
734 raise
Vince Harron7ac3ea42015-06-26 15:13:21 +0000735 except Exception:
736 if expected_fn(self):
Ying Chen0a7202b2015-07-01 22:44:27 +0000737 # before retry, run tearDown for previous run and setup for next
Vince Harron7ac3ea42015-06-26 15:13:21 +0000738 try:
Ying Chen0a7202b2015-07-01 22:44:27 +0000739 self.tearDown()
740 self.setUp()
Vince Harron7ac3ea42015-06-26 15:13:21 +0000741 func(*args, **kwargs)
742 except Exception:
743 # oh snap! two failures in a row, record a failure/error
744 raise
745 # record the expected failure
746 raise case._ExpectedFailure(sys.exc_info(), bugnumber)
747 else:
748 raise
749 return wrapper
750 # if bugnumber is not-callable(incluing None), that means decorator function is called with optional arguments
751 # return decorator in this case, so it will be used to decorating original method
Zachary Turnercd236b82015-10-26 18:48:24 +0000752 if six.callable(bugnumber):
Vince Harron7ac3ea42015-06-26 15:13:21 +0000753 return expectedFailure_impl(bugnumber)
754 else:
755 return expectedFailure_impl
756
Tamas Berghammerc8fd1302015-09-30 10:12:40 +0000757def expectedFlakeyDwarf(bugnumber=None):
758 def fn(self):
759 return self.debug_info == "dwarf"
760 return expectedFlakey(fn, bugnumber)
761
762def expectedFlakeyDsym(bugnumber=None):
763 def fn(self):
764 return self.debug_info == "dwarf"
765 return expectedFlakey(fn, bugnumber)
766
Vince Harron7ac3ea42015-06-26 15:13:21 +0000767def expectedFlakeyOS(oslist, bugnumber=None, compilers=None):
768 def fn(self):
769 return (self.getPlatform() in oslist and
770 self.expectedCompiler(compilers))
771 return expectedFlakey(fn, bugnumber)
772
773def expectedFlakeyDarwin(bugnumber=None, compilers=None):
774 # For legacy reasons, we support both "darwin" and "macosx" as OS X triples.
775 return expectedFlakeyOS(getDarwinOSTriples(), bugnumber, compilers)
776
777def expectedFlakeyLinux(bugnumber=None, compilers=None):
778 return expectedFlakeyOS(['linux'], bugnumber, compilers)
779
780def expectedFlakeyFreeBSD(bugnumber=None, compilers=None):
781 return expectedFlakeyOS(['freebsd'], bugnumber, compilers)
782
783def expectedFlakeyCompiler(compiler, compiler_version=None, bugnumber=None):
784 if compiler_version is None:
785 compiler_version=['=', None]
786 def fn(self):
787 return compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version)
788 return expectedFlakey(fn, bugnumber)
789
790# @expectedFlakeyClang('bugnumber', ['<=', '3.4'])
791def expectedFlakeyClang(bugnumber=None, compiler_version=None):
792 return expectedFlakeyCompiler('clang', compiler_version, bugnumber)
793
794# @expectedFlakeyGcc('bugnumber', ['<=', '3.4'])
795def expectedFlakeyGcc(bugnumber=None, compiler_version=None):
796 return expectedFlakeyCompiler('gcc', compiler_version, bugnumber)
797
Pavel Labath63a579c2015-09-07 12:15:27 +0000798def expectedFlakeyAndroid(bugnumber=None, api_levels=None, archs=None):
799 return expectedFlakey(matchAndroid(api_levels, archs), bugnumber)
800
Greg Clayton12514562013-12-05 22:22:32 +0000801def skipIfRemote(func):
802 """Decorate the item to skip tests if testing remotely."""
803 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
804 raise Exception("@skipIfRemote can only be used to decorate a test method")
805 @wraps(func)
806 def wrapper(*args, **kwargs):
807 from unittest2 import case
808 if lldb.remote_platform:
809 self = args[0]
810 self.skipTest("skip on remote platform")
811 else:
812 func(*args, **kwargs)
813 return wrapper
814
Siva Chandra4470f382015-06-17 22:32:27 +0000815def skipUnlessListedRemote(remote_list=None):
816 def myImpl(func):
817 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
818 raise Exception("@skipIfRemote can only be used to decorate a "
819 "test method")
820
821 @wraps(func)
822 def wrapper(*args, **kwargs):
823 if remote_list and lldb.remote_platform:
824 self = args[0]
825 triple = self.dbg.GetSelectedPlatform().GetTriple()
826 for r in remote_list:
827 if r in triple:
828 func(*args, **kwargs)
829 return
830 self.skipTest("skip on remote platform %s" % str(triple))
831 else:
832 func(*args, **kwargs)
833 return wrapper
834
835 return myImpl
836
Greg Clayton12514562013-12-05 22:22:32 +0000837def skipIfRemoteDueToDeadlock(func):
838 """Decorate the item to skip tests if testing remotely due to the test deadlocking."""
839 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
840 raise Exception("@skipIfRemote can only be used to decorate a test method")
841 @wraps(func)
842 def wrapper(*args, **kwargs):
843 from unittest2 import case
844 if lldb.remote_platform:
845 self = args[0]
846 self.skipTest("skip on remote platform (deadlocks)")
847 else:
848 func(*args, **kwargs)
849 return wrapper
850
Enrico Granatab633e432014-10-06 21:37:06 +0000851def skipIfNoSBHeaders(func):
852 """Decorate the item to mark tests that should be skipped when LLDB is built with no SB API headers."""
853 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Ed Maste59cca5d2014-10-07 01:57:52 +0000854 raise Exception("@skipIfNoSBHeaders can only be used to decorate a test method")
Enrico Granatab633e432014-10-06 21:37:06 +0000855 @wraps(func)
856 def wrapper(*args, **kwargs):
857 from unittest2 import case
858 self = args[0]
Shawn Best181b09b2014-11-08 00:04:04 +0000859 if sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +0000860 header = os.path.join(os.environ["LLDB_LIB_DIR"], 'LLDB.framework', 'Versions','Current','Headers','LLDB.h')
Shawn Best181b09b2014-11-08 00:04:04 +0000861 else:
862 header = os.path.join(os.environ["LLDB_SRC"], "include", "lldb", "API", "LLDB.h")
Enrico Granatab633e432014-10-06 21:37:06 +0000863 platform = sys.platform
Enrico Granatab633e432014-10-06 21:37:06 +0000864 if not os.path.exists(header):
865 self.skipTest("skip because LLDB.h header not found")
866 else:
867 func(*args, **kwargs)
868 return wrapper
869
Enrico Granata5f92a132015-11-05 00:46:25 +0000870def skipIfiOSSimulator(func):
871 """Decorate the item to skip tests that should be skipped on the iOS Simulator."""
872 return unittest2.skipIf(hasattr(lldb, 'remote_platform_name') and lldb.remote_platform_name == 'ios-simulator', 'skip on the iOS Simulator')(func)
873
Robert Flack13c7ad92015-03-30 14:12:17 +0000874def skipIfFreeBSD(func):
875 """Decorate the item to skip tests that should be skipped on FreeBSD."""
876 return skipIfPlatform(["freebsd"])(func)
Zachary Turnerc7826522014-08-13 17:44:53 +0000877
Greg Claytone0d0a762015-04-02 18:24:03 +0000878def getDarwinOSTriples():
879 return ['darwin', 'macosx', 'ios']
880
Daniel Maleab3d41a22013-07-09 00:08:01 +0000881def skipIfDarwin(func):
882 """Decorate the item to skip tests that should be skipped on Darwin."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000883 return skipIfPlatform(getDarwinOSTriples())(func)
Daniel Maleab3d41a22013-07-09 00:08:01 +0000884
Robert Flack13c7ad92015-03-30 14:12:17 +0000885def skipIfLinux(func):
886 """Decorate the item to skip tests that should be skipped on Linux."""
887 return skipIfPlatform(["linux"])(func)
888
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +0000889def skipUnlessHostLinux(func):
890 """Decorate the item to skip tests that should be skipped on any non Linux host."""
891 return skipUnlessHostPlatform(["linux"])(func)
892
Robert Flack13c7ad92015-03-30 14:12:17 +0000893def skipIfWindows(func):
894 """Decorate the item to skip tests that should be skipped on Windows."""
895 return skipIfPlatform(["windows"])(func)
896
Chaoren Line6eea5d2015-06-08 22:13:28 +0000897def skipIfHostWindows(func):
898 """Decorate the item to skip tests that should be skipped on Windows."""
899 return skipIfHostPlatform(["windows"])(func)
900
Adrian McCarthyd9dbae52015-09-16 18:17:11 +0000901def skipUnlessWindows(func):
902 """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
903 return skipUnlessPlatform(["windows"])(func)
904
Robert Flack13c7ad92015-03-30 14:12:17 +0000905def skipUnlessDarwin(func):
906 """Decorate the item to skip tests that should be skipped on any non Darwin platform."""
Greg Claytone0d0a762015-04-02 18:24:03 +0000907 return skipUnlessPlatform(getDarwinOSTriples())(func)
Robert Flack13c7ad92015-03-30 14:12:17 +0000908
Ryan Brown57bee1e2015-09-14 22:45:11 +0000909def skipUnlessGoInstalled(func):
910 """Decorate the item to skip tests when no Go compiler is available."""
911 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
912 raise Exception("@skipIfGcc can only be used to decorate a test method")
913 @wraps(func)
914 def wrapper(*args, **kwargs):
915 from unittest2 import case
916 self = args[0]
917 compiler = self.getGoCompilerVersion()
918 if not compiler:
919 self.skipTest("skipping because go compiler not found")
920 else:
Todd Fialabe5dfc52015-10-06 19:15:56 +0000921 # Ensure the version is the minimum version supported by
Todd Fiala02c08d02015-10-06 22:14:33 +0000922 # the LLDB go support.
Todd Fialabe5dfc52015-10-06 19:15:56 +0000923 match_version = re.search(r"(\d+\.\d+(\.\d+)?)", compiler)
924 if not match_version:
925 # Couldn't determine version.
926 self.skipTest(
927 "skipping because go version could not be parsed "
928 "out of {}".format(compiler))
929 else:
930 from distutils.version import StrictVersion
Todd Fiala02c08d02015-10-06 22:14:33 +0000931 min_strict_version = StrictVersion("1.4.0")
Todd Fialabe5dfc52015-10-06 19:15:56 +0000932 compiler_strict_version = StrictVersion(match_version.group(1))
933 if compiler_strict_version < min_strict_version:
934 self.skipTest(
935 "skipping because available go version ({}) does "
Todd Fiala02c08d02015-10-06 22:14:33 +0000936 "not meet minimum required go version ({})".format(
Todd Fialabe5dfc52015-10-06 19:15:56 +0000937 compiler_strict_version,
938 min_strict_version))
Todd Fiala9f236802015-10-06 19:23:22 +0000939 func(*args, **kwargs)
Ryan Brown57bee1e2015-09-14 22:45:11 +0000940 return wrapper
941
Robert Flack068898c2015-04-09 18:07:58 +0000942def getPlatform():
Robert Flack6e1fd352015-05-15 12:39:33 +0000943 """Returns the target platform which the tests are running on."""
Robert Flack068898c2015-04-09 18:07:58 +0000944 platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
945 if platform.startswith('freebsd'):
946 platform = 'freebsd'
947 return platform
948
Robert Flack6e1fd352015-05-15 12:39:33 +0000949def getHostPlatform():
950 """Returns the host platform running the test suite."""
951 # Attempts to return a platform name matching a target Triple platform.
952 if sys.platform.startswith('linux'):
953 return 'linux'
954 elif sys.platform.startswith('win32'):
955 return 'windows'
956 elif sys.platform.startswith('darwin'):
957 return 'darwin'
958 elif sys.platform.startswith('freebsd'):
959 return 'freebsd'
960 else:
961 return sys.platform
962
Robert Flackfb2f6c62015-04-17 08:02:18 +0000963def platformIsDarwin():
964 """Returns true if the OS triple for the selected platform is any valid apple OS"""
965 return getPlatform() in getDarwinOSTriples()
966
Robert Flack6e1fd352015-05-15 12:39:33 +0000967def skipIfHostIncompatibleWithRemote(func):
968 """Decorate the item to skip tests if binaries built on this host are incompatible."""
969 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
970 raise Exception("@skipIfHostIncompatibleWithRemote can only be used to decorate a test method")
971 @wraps(func)
972 def wrapper(*args, **kwargs):
973 from unittest2 import case
974 self = args[0]
975 host_arch = self.getLldbArchitecture()
976 host_platform = getHostPlatform()
977 target_arch = self.getArchitecture()
Robert Flack4629c4b2015-05-15 18:54:32 +0000978 target_platform = 'darwin' if self.platformIsDarwin() else self.getPlatform()
Robert Flack6e1fd352015-05-15 12:39:33 +0000979 if not (target_arch == 'x86_64' and host_arch == 'i386') and host_arch != target_arch:
980 self.skipTest("skipping because target %s is not compatible with host architecture %s" % (target_arch, host_arch))
981 elif target_platform != host_platform:
982 self.skipTest("skipping because target is %s but host is %s" % (target_platform, host_platform))
983 else:
984 func(*args, **kwargs)
985 return wrapper
986
Chaoren Line6eea5d2015-06-08 22:13:28 +0000987def skipIfHostPlatform(oslist):
988 """Decorate the item to skip tests if running on one of the listed host platforms."""
989 return unittest2.skipIf(getHostPlatform() in oslist,
990 "skip on %s" % (", ".join(oslist)))
991
992def skipUnlessHostPlatform(oslist):
993 """Decorate the item to skip tests unless running on one of the listed host platforms."""
994 return unittest2.skipUnless(getHostPlatform() in oslist,
995 "requires on of %s" % (", ".join(oslist)))
996
Zachary Turner793d9972015-08-14 23:29:24 +0000997def skipUnlessArch(archlist):
998 """Decorate the item to skip tests unless running on one of the listed architectures."""
999 def myImpl(func):
1000 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1001 raise Exception("@skipUnlessArch can only be used to decorate a test method")
1002
1003 @wraps(func)
1004 def wrapper(*args, **kwargs):
1005 self = args[0]
1006 if self.getArchitecture() not in archlist:
1007 self.skipTest("skipping for architecture %s (requires one of %s)" %
1008 (self.getArchitecture(), ", ".join(archlist)))
1009 else:
1010 func(*args, **kwargs)
1011 return wrapper
1012
1013 return myImpl
1014
Robert Flack13c7ad92015-03-30 14:12:17 +00001015def skipIfPlatform(oslist):
1016 """Decorate the item to skip tests if running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001017 return unittest2.skipIf(getPlatform() in oslist,
1018 "skip on %s" % (", ".join(oslist)))
Robert Flack13c7ad92015-03-30 14:12:17 +00001019
1020def skipUnlessPlatform(oslist):
1021 """Decorate the item to skip tests unless running on one of the listed platforms."""
Robert Flack068898c2015-04-09 18:07:58 +00001022 return unittest2.skipUnless(getPlatform() in oslist,
1023 "requires on of %s" % (", ".join(oslist)))
Daniel Maleab3d41a22013-07-09 00:08:01 +00001024
Daniel Malea48359902013-05-14 20:48:54 +00001025def skipIfLinuxClang(func):
1026 """Decorate the item to skip tests that should be skipped if building on
1027 Linux with clang.
1028 """
1029 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1030 raise Exception("@skipIfLinuxClang can only be used to decorate a test method")
1031 @wraps(func)
1032 def wrapper(*args, **kwargs):
1033 from unittest2 import case
1034 self = args[0]
1035 compiler = self.getCompiler()
Vince Harronc8492672015-05-04 02:59:19 +00001036 platform = self.getPlatform()
1037 if "clang" in compiler and platform == "linux":
Daniel Malea48359902013-05-14 20:48:54 +00001038 self.skipTest("skipping because Clang is used on Linux")
1039 else:
1040 func(*args, **kwargs)
1041 return wrapper
1042
Ying Chen7091c2c2015-04-21 01:15:47 +00001043# provide a function to skip on defined oslist, compiler version, and archs
1044# if none is specified for any argument, that argument won't be checked and thus means for all
1045# for example,
1046# @skipIf, skip for all platform/compiler/arch,
1047# @skipIf(compiler='gcc'), skip for gcc on all platform/architecture
1048# @skipIf(bugnumber, ["linux"], "gcc", ['>=', '4.9'], ['i386']), skip for gcc>=4.9 on linux with i386
1049
1050# TODO: refactor current code, to make skipIfxxx functions to call this function
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001051def skipIf(bugnumber=None, oslist=None, compiler=None, compiler_version=None, archs=None, debug_info=None):
Ying Chen7091c2c2015-04-21 01:15:47 +00001052 def fn(self):
1053 return ((oslist is None or self.getPlatform() in oslist) and
1054 (compiler is None or (compiler in self.getCompiler() and self.expectedCompilerVersion(compiler_version))) and
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001055 self.expectedArch(archs) and
1056 (debug_info is None or self.debug_info in debug_info))
1057 return skipTestIfFn(fn, bugnumber, skipReason="skipping because os:%s compiler: %s %s arch: %s debug info: %s"%(oslist, compiler, compiler_version, archs, debug_info))
1058
1059def skipIfDebugInfo(bugnumber=None, debug_info=None):
1060 return skipIf(bugnumber=bugnumber, debug_info=debug_info)
1061
Greg Claytonedea2372015-10-07 20:01:13 +00001062def skipIfDWO(bugnumber=None):
1063 return skipIfDebugInfo(bugnumber, ["dwo"])
1064
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00001065def skipIfDwarf(bugnumber=None):
1066 return skipIfDebugInfo(bugnumber, ["dwarf"])
1067
1068def skipIfDsym(bugnumber=None):
1069 return skipIfDebugInfo(bugnumber, ["dsym"])
Ying Chen7091c2c2015-04-21 01:15:47 +00001070
1071def skipTestIfFn(expected_fn, bugnumber=None, skipReason=None):
1072 def skipTestIfFn_impl(func):
1073 @wraps(func)
1074 def wrapper(*args, **kwargs):
1075 from unittest2 import case
1076 self = args[0]
1077 if expected_fn(self):
1078 self.skipTest(skipReason)
1079 else:
1080 func(*args, **kwargs)
1081 return wrapper
Zachary Turnercd236b82015-10-26 18:48:24 +00001082 if six.callable(bugnumber):
Ying Chen7091c2c2015-04-21 01:15:47 +00001083 return skipTestIfFn_impl(bugnumber)
1084 else:
1085 return skipTestIfFn_impl
1086
Daniel Maleabe230792013-01-24 23:52:09 +00001087def skipIfGcc(func):
1088 """Decorate the item to skip tests that should be skipped if building with gcc ."""
1089 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
Daniel Malea0aea0162013-02-27 17:29:46 +00001090 raise Exception("@skipIfGcc can only be used to decorate a test method")
Daniel Maleabe230792013-01-24 23:52:09 +00001091 @wraps(func)
1092 def wrapper(*args, **kwargs):
1093 from unittest2 import case
1094 self = args[0]
1095 compiler = self.getCompiler()
1096 if "gcc" in compiler:
1097 self.skipTest("skipping because gcc is the test compiler")
1098 else:
1099 func(*args, **kwargs)
1100 return wrapper
1101
Matt Kopec0de53f02013-03-15 19:10:12 +00001102def skipIfIcc(func):
1103 """Decorate the item to skip tests that should be skipped if building with icc ."""
1104 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1105 raise Exception("@skipIfIcc can only be used to decorate a test method")
1106 @wraps(func)
1107 def wrapper(*args, **kwargs):
1108 from unittest2 import case
1109 self = args[0]
1110 compiler = self.getCompiler()
1111 if "icc" in compiler:
1112 self.skipTest("skipping because icc is the test compiler")
1113 else:
1114 func(*args, **kwargs)
1115 return wrapper
1116
Daniel Malea55faa402013-05-02 21:44:31 +00001117def skipIfi386(func):
1118 """Decorate the item to skip tests that should be skipped if building 32-bit."""
1119 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1120 raise Exception("@skipIfi386 can only be used to decorate a test method")
1121 @wraps(func)
1122 def wrapper(*args, **kwargs):
1123 from unittest2 import case
1124 self = args[0]
1125 if "i386" == self.getArchitecture():
1126 self.skipTest("skipping because i386 is not a supported architecture")
1127 else:
1128 func(*args, **kwargs)
1129 return wrapper
1130
Pavel Labath090152b2015-08-20 11:37:19 +00001131def skipIfTargetAndroid(api_levels=None, archs=None):
Siva Chandra77f20fc2015-06-05 19:54:49 +00001132 """Decorator to skip tests when the target is Android.
1133
1134 Arguments:
1135 api_levels - The API levels for which the test should be skipped. If
1136 it is None, then the test will be skipped for all API levels.
Pavel Labath090152b2015-08-20 11:37:19 +00001137 arch - A sequence of architecture names specifying the architectures
1138 for which a test is skipped. None means all architectures.
Siva Chandra77f20fc2015-06-05 19:54:49 +00001139 """
1140 def myImpl(func):
1141 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1142 raise Exception("@skipIfTargetAndroid can only be used to "
1143 "decorate a test method")
1144 @wraps(func)
1145 def wrapper(*args, **kwargs):
1146 from unittest2 import case
1147 self = args[0]
Pavel Labath090152b2015-08-20 11:37:19 +00001148 if matchAndroid(api_levels, archs)(self):
1149 self.skipTest("skiped on Android target with API %d and architecture %s" %
1150 (android_device_api(), self.getArchitecture()))
Tamas Berghammer1253a812015-03-13 10:12:25 +00001151 func(*args, **kwargs)
Siva Chandra77f20fc2015-06-05 19:54:49 +00001152 return wrapper
1153 return myImpl
Tamas Berghammer1253a812015-03-13 10:12:25 +00001154
Ilia Kd9953052015-03-12 07:19:41 +00001155def skipUnlessCompilerRt(func):
1156 """Decorate the item to skip tests if testing remotely."""
1157 if isinstance(func, type) and issubclass(func, unittest2.TestCase):
1158 raise Exception("@skipUnless can only be used to decorate a test method")
1159 @wraps(func)
1160 def wrapper(*args, **kwargs):
1161 from unittest2 import case
1162 import os.path
1163 compilerRtPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "projects", "compiler-rt")
1164 if not os.path.exists(compilerRtPath):
1165 self = args[0]
1166 self.skipTest("skip if compiler-rt not found")
1167 else:
1168 func(*args, **kwargs)
1169 return wrapper
Daniel Malea55faa402013-05-02 21:44:31 +00001170
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001171class _PlatformContext(object):
1172 """Value object class which contains platform-specific options."""
1173
1174 def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
1175 self.shlib_environment_var = shlib_environment_var
1176 self.shlib_prefix = shlib_prefix
1177 self.shlib_extension = shlib_extension
1178
1179
Johnny Chena74bb0a2011-08-01 18:46:13 +00001180class Base(unittest2.TestCase):
Johnny Chen8334dad2010-10-22 23:15:46 +00001181 """
Johnny Chena74bb0a2011-08-01 18:46:13 +00001182 Abstract base for performing lldb (see TestBase) or other generic tests (see
1183 BenchBase for one example). lldbtest.Base works with the test driver to
1184 accomplish things.
1185
Johnny Chen8334dad2010-10-22 23:15:46 +00001186 """
Enrico Granata5020f952012-10-24 21:42:49 +00001187
Enrico Granata19186272012-10-24 21:44:48 +00001188 # The concrete subclass should override this attribute.
1189 mydir = None
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001190
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001191 # Keep track of the old current working directory.
1192 oldcwd = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001193
Greg Clayton4570d3e2013-12-10 23:19:29 +00001194 @staticmethod
1195 def compute_mydir(test_file):
1196 '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
1197
1198 mydir = TestBase.compute_mydir(__file__)'''
1199 test_dir = os.path.dirname(test_file)
1200 return test_dir[len(os.environ["LLDB_TEST"])+1:]
1201
Johnny Chenfb4264c2011-08-01 19:50:58 +00001202 def TraceOn(self):
1203 """Returns True if we are in trace mode (tracing detailed test execution)."""
1204 return traceAlways
Greg Clayton4570d3e2013-12-10 23:19:29 +00001205
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001206 @classmethod
1207 def setUpClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001208 """
1209 Python unittest framework class setup fixture.
1210 Do current directory manipulation.
1211 """
Johnny Chenf02ec122010-07-03 20:41:42 +00001212 # Fail fast if 'mydir' attribute is not overridden.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001213 if not cls.mydir or len(cls.mydir) == 0:
Johnny Chenf02ec122010-07-03 20:41:42 +00001214 raise Exception("Subclasses must override the 'mydir' attribute.")
Enrico Granata7e137e32012-10-24 18:14:21 +00001215
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001216 # Save old working directory.
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001217 cls.oldcwd = os.getcwd()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001218
1219 # Change current working directory if ${LLDB_TEST} is defined.
1220 # See also dotest.py which sets up ${LLDB_TEST}.
1221 if ("LLDB_TEST" in os.environ):
Vince Harron85d19652015-05-21 19:09:29 +00001222 full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001223 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001224 print("Change dir to:", full_dir, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001225 os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
1226
Vince Harron85d19652015-05-21 19:09:29 +00001227 if debug_confirm_directory_exclusivity:
Zachary Turnerb48b4042015-05-21 20:16:02 +00001228 import lock
Vince Harron85d19652015-05-21 19:09:29 +00001229 cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
1230 try:
1231 cls.dir_lock.try_acquire()
1232 # write the class that owns the lock into the lock file
1233 cls.dir_lock.handle.write(cls.__name__)
1234 except IOError as ioerror:
1235 # nothing else should have this directory lock
1236 # wait here until we get a lock
1237 cls.dir_lock.acquire()
1238 # read the previous owner from the lock file
1239 lock_id = cls.dir_lock.handle.read()
Zachary Turnerff890da2015-10-19 23:45:41 +00001240 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 +00001241 raise ioerror
1242
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001243 # Set platform context.
Robert Flackfb2f6c62015-04-17 08:02:18 +00001244 if platformIsDarwin():
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001245 cls.platformContext = _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
Robert Flackfb2f6c62015-04-17 08:02:18 +00001246 elif getPlatform() == "linux" or getPlatform() == "freebsd":
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001247 cls.platformContext = _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001248 else:
1249 cls.platformContext = None
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00001250
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001251 @classmethod
1252 def tearDownClass(cls):
Johnny Chenda884342010-10-01 22:59:49 +00001253 """
1254 Python unittest framework class teardown fixture.
1255 Do class-wide cleanup.
1256 """
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001257
Johnny Chen0fddfb22011-11-17 19:57:27 +00001258 if doCleanup and not lldb.skip_build_and_cleanup:
Johnny Chen707b3c92010-10-11 22:25:46 +00001259 # First, let's do the platform-specific cleanup.
Peter Collingbourne19f48d52011-06-20 19:06:20 +00001260 module = builder_module()
Zachary Turnerb1490b62015-08-26 19:44:56 +00001261 module.cleanup()
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001262
Johnny Chen707b3c92010-10-11 22:25:46 +00001263 # Subclass might have specific cleanup function defined.
1264 if getattr(cls, "classCleanup", None):
1265 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001266 print("Call class-specific cleanup function for class:", cls, file=sys.stderr)
Johnny Chen707b3c92010-10-11 22:25:46 +00001267 try:
1268 cls.classCleanup()
1269 except:
1270 exc_type, exc_value, exc_tb = sys.exc_info()
1271 traceback.print_exception(exc_type, exc_value, exc_tb)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001272
Vince Harron85d19652015-05-21 19:09:29 +00001273 if debug_confirm_directory_exclusivity:
1274 cls.dir_lock.release()
1275 del cls.dir_lock
1276
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001277 # Restore old working directory.
1278 if traceAlways:
Zachary Turnerff890da2015-10-19 23:45:41 +00001279 print("Restore dir to:", cls.oldcwd, file=sys.stderr)
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001280 os.chdir(cls.oldcwd)
1281
Johnny Chena74bb0a2011-08-01 18:46:13 +00001282 @classmethod
1283 def skipLongRunningTest(cls):
1284 """
1285 By default, we skip long running test case.
1286 This can be overridden by passing '-l' to the test driver (dotest.py).
1287 """
1288 if "LLDB_SKIP_LONG_RUNNING_TEST" in os.environ and "NO" == os.environ["LLDB_SKIP_LONG_RUNNING_TEST"]:
1289 return False
1290 else:
1291 return True
Johnny Chened492022011-06-21 00:53:00 +00001292
Vince Harron6d3d0f12015-05-10 22:01:59 +00001293 def enableLogChannelsForCurrentTest(self):
1294 if len(lldbtest_config.channels) == 0:
1295 return
1296
1297 # if debug channels are specified in lldbtest_config.channels,
1298 # create a new set of log files for every test
1299 log_basename = self.getLogBasenameForCurrentTest()
1300
1301 # confirm that the file is writeable
1302 host_log_path = "{}-host.log".format(log_basename)
1303 open(host_log_path, 'w').close()
1304
1305 log_enable = "log enable -Tpn -f {} ".format(host_log_path)
1306 for channel_with_categories in lldbtest_config.channels:
1307 channel_then_categories = channel_with_categories.split(' ', 1)
1308 channel = channel_then_categories[0]
1309 if len(channel_then_categories) > 1:
1310 categories = channel_then_categories[1]
1311 else:
1312 categories = "default"
1313
1314 if channel == "gdb-remote":
1315 # communicate gdb-remote categories to debugserver
1316 os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
1317
1318 self.ci.HandleCommand(log_enable + channel_with_categories, self.res)
1319 if not self.res.Succeeded():
1320 raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
1321
1322 # Communicate log path name to debugserver & lldb-server
1323 server_log_path = "{}-server.log".format(log_basename)
1324 open(server_log_path, 'w').close()
1325 os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
1326
1327 # Communicate channels to lldb-server
1328 os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
1329
1330 if len(lldbtest_config.channels) == 0:
1331 return
1332
1333 def disableLogChannelsForCurrentTest(self):
1334 # close all log files that we opened
1335 for channel_and_categories in lldbtest_config.channels:
1336 # channel format - <channel-name> [<category0> [<category1> ...]]
1337 channel = channel_and_categories.split(' ', 1)[0]
1338 self.ci.HandleCommand("log disable " + channel, self.res)
1339 if not self.res.Succeeded():
1340 raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
1341
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001342 def setUp(self):
Johnny Chenfb4264c2011-08-01 19:50:58 +00001343 """Fixture for unittest test case setup.
1344
1345 It works with the test driver to conditionally skip tests and does other
1346 initializations."""
Johnny Chen1a9f4dd2010-09-16 01:53:04 +00001347 #import traceback
1348 #traceback.print_stack()
Johnny Chenbf6ffa32010-07-03 03:41:59 +00001349
Daniel Malea9115f072013-08-06 15:02:32 +00001350 if "LIBCXX_PATH" in os.environ:
1351 self.libcxxPath = os.environ["LIBCXX_PATH"]
1352 else:
1353 self.libcxxPath = None
1354
Hafiz Abid Qadeer1cbac4e2014-11-25 10:41:57 +00001355 if "LLDBMI_EXEC" in os.environ:
1356 self.lldbMiExec = os.environ["LLDBMI_EXEC"]
1357 else:
1358 self.lldbMiExec = None
Vince Harron790d95c2015-05-18 19:39:03 +00001359
Johnny Chenebe51722011-10-07 19:21:09 +00001360 # If we spawn an lldb process for test (via pexpect), do not load the
1361 # init file unless told otherwise.
1362 if "NO_LLDBINIT" in os.environ and "NO" == os.environ["NO_LLDBINIT"]:
1363 self.lldbOption = ""
1364 else:
1365 self.lldbOption = "--no-lldbinit"
Johnny Chenaaa82ff2011-08-02 22:54:37 +00001366
Johnny Chen985e7402011-08-01 21:13:26 +00001367 # Assign the test method name to self.testMethodName.
1368 #
1369 # For an example of the use of this attribute, look at test/types dir.
1370 # There are a bunch of test cases under test/types and we don't want the
1371 # module cacheing subsystem to be confused with executable name "a.out"
1372 # used for all the test cases.
1373 self.testMethodName = self._testMethodName
1374
Johnny Chen5ccbccf2011-07-30 01:39:58 +00001375 # Benchmarks test is decorated with @benchmarks_test,
1376 # which also sets the "__benchmarks_test__" attribute of the
1377 # function object to True.
1378 try:
1379 if lldb.just_do_benchmarks_test:
1380 testMethod = getattr(self, self._testMethodName)
1381 if getattr(testMethod, "__benchmarks_test__", False):
1382 pass
1383 else:
1384 self.skipTest("non benchmarks test")
Johnny Chen4533dad2011-05-31 23:21:42 +00001385 except AttributeError:
1386 pass
Johnny Chenf3e22ac2010-12-10 18:52:10 +00001387
Johnny Chen985e7402011-08-01 21:13:26 +00001388 # This is for the case of directly spawning 'lldb'/'gdb' and interacting
1389 # with it using pexpect.
1390 self.child = None
1391 self.child_prompt = "(lldb) "
1392 # If the child is interacting with the embedded script interpreter,
1393 # there are two exits required during tear down, first to quit the
1394 # embedded script interpreter and second to quit the lldb command
1395 # interpreter.
1396 self.child_in_script_interpreter = False
1397
Johnny Chenfb4264c2011-08-01 19:50:58 +00001398 # These are for customized teardown cleanup.
1399 self.dict = None
1400 self.doTearDownCleanup = False
1401 # And in rare cases where there are multiple teardown cleanups.
1402 self.dicts = []
1403 self.doTearDownCleanups = False
1404
Daniel Malea2dd69bb2013-02-15 21:21:52 +00001405 # List of spawned subproces.Popen objects
1406 self.subprocesses = []
1407
Daniel Malea69207462013-06-05 21:07:02 +00001408 # List of forked process PIDs
1409 self.forkedProcessPids = []
1410
Johnny Chenfb4264c2011-08-01 19:50:58 +00001411 # Create a string buffer to record the session info, to be dumped into a
1412 # test case specific file if test failure is encountered.
Vince Harron1f160372015-05-21 18:51:20 +00001413 self.log_basename = self.getLogBasenameForCurrentTest()
Vince Harron35b17dc2015-05-21 18:20:21 +00001414
Vince Harron1f160372015-05-21 18:51:20 +00001415 session_file = "{}.log".format(self.log_basename)
Vince Harron35b17dc2015-05-21 18:20:21 +00001416 unbuffered = 0 # 0 is the constant for unbuffered
Vince Harron1f160372015-05-21 18:51:20 +00001417 self.session = open(session_file, "w", unbuffered)
Johnny Chenfb4264c2011-08-01 19:50:58 +00001418
1419 # Optimistically set __errored__, __failed__, __expected__ to False
1420 # initially. If the test errored/failed, the session info
1421 # (self.session) is then dumped into a session specific file for
1422 # diagnosis.
Zachary Turnerb1490b62015-08-26 19:44:56 +00001423 self.__cleanup_errored__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001424 self.__errored__ = False
1425 self.__failed__ = False
1426 self.__expected__ = False
1427 # We are also interested in unexpected success.
1428 self.__unexpected__ = False
Johnny Chenf79b0762011-08-16 00:48:58 +00001429 # And skipped tests.
1430 self.__skipped__ = False
Johnny Chenfb4264c2011-08-01 19:50:58 +00001431
1432 # See addTearDownHook(self, hook) which allows the client to add a hook
1433 # function to be run during tearDown() time.
1434 self.hooks = []
1435
1436 # See HideStdout(self).
1437 self.sys_stdout_hidden = False
1438
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00001439 if self.platformContext:
1440 # set environment variable names for finding shared libraries
1441 self.dylibPath = self.platformContext.shlib_environment_var
Daniel Malea179ff292012-11-26 21:21:11 +00001442
Vince Harron6d3d0f12015-05-10 22:01:59 +00001443 # Create the debugger instance if necessary.
1444 try:
1445 self.dbg = lldb.DBG
1446 except AttributeError:
1447 self.dbg = lldb.SBDebugger.Create()
1448
1449 if not self.dbg:
1450 raise Exception('Invalid debugger instance')
1451
1452 # Retrieve the associated command interpreter instance.
1453 self.ci = self.dbg.GetCommandInterpreter()
1454 if not self.ci:
1455 raise Exception('Could not get the command interpreter')
1456
1457 # And the result object.
1458 self.res = lldb.SBCommandReturnObject()
1459
1460 self.enableLogChannelsForCurrentTest()
1461
Johnny Chen2a808582011-10-19 16:48:07 +00001462 def runHooks(self, child=None, child_prompt=None, use_cmd_api=False):
Johnny Chena737ba52011-10-19 01:06:21 +00001463 """Perform the run hooks to bring lldb debugger to the desired state.
1464
Johnny Chen2a808582011-10-19 16:48:07 +00001465 By default, expect a pexpect spawned child and child prompt to be
1466 supplied (use_cmd_api=False). If use_cmd_api is true, ignore the child
1467 and child prompt and use self.runCmd() to run the hooks one by one.
1468
Johnny Chena737ba52011-10-19 01:06:21 +00001469 Note that child is a process spawned by pexpect.spawn(). If not, your
1470 test case is mostly likely going to fail.
1471
1472 See also dotest.py where lldb.runHooks are processed/populated.
1473 """
1474 if not lldb.runHooks:
1475 self.skipTest("No runhooks specified for lldb, skip the test")
Johnny Chen2a808582011-10-19 16:48:07 +00001476 if use_cmd_api:
1477 for hook in lldb.runhooks:
1478 self.runCmd(hook)
1479 else:
1480 if not child or not child_prompt:
1481 self.fail("Both child and child_prompt need to be defined.")
1482 for hook in lldb.runHooks:
1483 child.sendline(hook)
1484 child.expect_exact(child_prompt)
Johnny Chena737ba52011-10-19 01:06:21 +00001485
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)
Enrico Granata6e0566c2014-11-17 19:00:20 +00001634 if hook_argc == 0 or getattr(hook,'im_self',None):
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__:
1771 pairs = lldb.test_result.errors
1772 prefix = 'Error'
Zachary Turner14181db2015-09-11 21:27:37 +00001773 elif self.__cleanup_errored__:
Zachary Turnerb1490b62015-08-26 19:44:56 +00001774 pairs = lldb.test_result.cleanup_errors
1775 prefix = 'CleanupError'
Johnny Chenfb4264c2011-08-01 19:50:58 +00001776 elif self.__failed__:
1777 pairs = lldb.test_result.failures
1778 prefix = 'Failure'
1779 elif self.__expected__:
1780 pairs = lldb.test_result.expectedFailures
1781 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++"
1995 else:
1996 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 }
Ed Maste372c24d2013-07-25 21:02:34 +00002024 elif sys.platform.startswith('freebsd') or sys.platform.startswith("linux") or os.environ.get('LLDB_BUILD_TYPE') == 'Makefile':
Adrian McCarthyb016b3c2015-03-27 20:47:35 +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 }
Robert Flack4629c4b2015-05-15 18:54:32 +00002053 elif self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux' 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."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002076 if lldb.skip_build_and_cleanup:
2077 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002078 module = builder_module()
Chaoren Line9bbabc2015-07-18 00:37:55 +00002079 if target_is_android():
2080 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002081 if not module.buildDefault(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002082 raise Exception("Don't know how to build default binary")
2083
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002084 def buildDsym(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002085 """Platform specific way to build binaries with dsym info."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002086 if lldb.skip_build_and_cleanup:
2087 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002088 module = builder_module()
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002089 if not module.buildDsym(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002090 raise Exception("Don't know how to build binary with dsym")
2091
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002092 def buildDwarf(self, architecture=None, compiler=None, dictionary=None, clean=True):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002093 """Platform specific way to build binaries with dwarf maps."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002094 if lldb.skip_build_and_cleanup:
2095 return
Johnny Chenfb4264c2011-08-01 19:50:58 +00002096 module = builder_module()
Chaoren Lin9070f532015-07-17 22:13:29 +00002097 if target_is_android():
Chaoren Line9bbabc2015-07-18 00:37:55 +00002098 dictionary = append_android_envs(dictionary)
Johnny Chenfdc80a5c2012-02-01 01:49:50 +00002099 if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
Johnny Chenfb4264c2011-08-01 19:50:58 +00002100 raise Exception("Don't know how to build binary with dwarf")
Johnny Chena74bb0a2011-08-01 18:46:13 +00002101
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002102 def buildDwo(self, architecture=None, compiler=None, dictionary=None, clean=True):
2103 """Platform specific way to build binaries with dwarf maps."""
2104 if lldb.skip_build_and_cleanup:
2105 return
2106 module = builder_module()
2107 if target_is_android():
2108 dictionary = append_android_envs(dictionary)
2109 if not module.buildDwo(self, architecture, compiler, dictionary, clean):
2110 raise Exception("Don't know how to build binary with dwo")
2111
Ryan Brown57bee1e2015-09-14 22:45:11 +00002112 def buildGo(self):
2113 """Build the default go binary.
2114 """
2115 system([[which('go'), 'build -gcflags "-N -l" -o a.out main.go']])
2116
Oleksiy Vyalov49b71c62015-01-22 20:03:21 +00002117 def signBinary(self, binary_path):
2118 if sys.platform.startswith("darwin"):
2119 codesign_cmd = "codesign --force --sign lldb_codesign %s" % (binary_path)
2120 call(codesign_cmd, shell=True)
2121
Kuba Breckabeed8212014-09-04 01:03:18 +00002122 def findBuiltClang(self):
2123 """Tries to find and use Clang from the build directory as the compiler (instead of the system compiler)."""
2124 paths_to_try = [
2125 "llvm-build/Release+Asserts/x86_64/Release+Asserts/bin/clang",
2126 "llvm-build/Debug+Asserts/x86_64/Debug+Asserts/bin/clang",
2127 "llvm-build/Release/x86_64/Release/bin/clang",
2128 "llvm-build/Debug/x86_64/Debug/bin/clang",
2129 ]
2130 lldb_root_path = os.path.join(os.path.dirname(__file__), "..")
2131 for p in paths_to_try:
2132 path = os.path.join(lldb_root_path, p)
2133 if os.path.exists(path):
2134 return path
Ilia Kd9953052015-03-12 07:19:41 +00002135
2136 # Tries to find clang at the same folder as the lldb
Vince Harron790d95c2015-05-18 19:39:03 +00002137 path = os.path.join(os.path.dirname(lldbtest_config.lldbExec), "clang")
Ilia Kd9953052015-03-12 07:19:41 +00002138 if os.path.exists(path):
2139 return path
Kuba Breckabeed8212014-09-04 01:03:18 +00002140
2141 return os.environ["CC"]
2142
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002143 def getBuildFlags(self, use_cpp11=True, use_libcxx=False, use_libstdcxx=False):
Andrew Kaylor93132f52013-05-28 23:04:25 +00002144 """ Returns a dictionary (which can be provided to build* functions above) which
2145 contains OS-specific build flags.
2146 """
2147 cflags = ""
Tamas Berghammer765b5e52015-02-25 13:26:28 +00002148 ldflags = ""
Daniel Malea9115f072013-08-06 15:02:32 +00002149
2150 # On Mac OS X, unless specifically requested to use libstdc++, use libc++
Robert Flack4629c4b2015-05-15 18:54:32 +00002151 if not use_libstdcxx and self.platformIsDarwin():
Daniel Malea9115f072013-08-06 15:02:32 +00002152 use_libcxx = True
2153
2154 if use_libcxx and self.libcxxPath:
2155 cflags += "-stdlib=libc++ "
2156 if self.libcxxPath:
2157 libcxxInclude = os.path.join(self.libcxxPath, "include")
2158 libcxxLib = os.path.join(self.libcxxPath, "lib")
2159 if os.path.isdir(libcxxInclude) and os.path.isdir(libcxxLib):
2160 cflags += "-nostdinc++ -I%s -L%s -Wl,-rpath,%s " % (libcxxInclude, libcxxLib, libcxxLib)
2161
Andrew Kaylor93132f52013-05-28 23:04:25 +00002162 if use_cpp11:
2163 cflags += "-std="
2164 if "gcc" in self.getCompiler() and "4.6" in self.getCompilerVersion():
2165 cflags += "c++0x"
2166 else:
2167 cflags += "c++11"
Robert Flack4629c4b2015-05-15 18:54:32 +00002168 if self.platformIsDarwin() or self.getPlatform() == "freebsd":
Andrew Kaylor93132f52013-05-28 23:04:25 +00002169 cflags += " -stdlib=libc++"
2170 elif "clang" in self.getCompiler():
2171 cflags += " -stdlib=libstdc++"
2172
Andrew Kaylor93132f52013-05-28 23:04:25 +00002173 return {'CFLAGS_EXTRAS' : cflags,
2174 'LD_EXTRAS' : ldflags,
2175 }
2176
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002177 def cleanup(self, dictionary=None):
2178 """Platform specific way to do cleanup after build."""
Johnny Chen0fddfb22011-11-17 19:57:27 +00002179 if lldb.skip_build_and_cleanup:
2180 return
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002181 module = builder_module()
2182 if not module.cleanup(self, dictionary):
Johnny Chen0fddfb22011-11-17 19:57:27 +00002183 raise Exception("Don't know how to do cleanup with dictionary: "+dictionary)
Johnny Chen9f4f5d92011-08-12 20:19:22 +00002184
Daniel Malea55faa402013-05-02 21:44:31 +00002185 def getLLDBLibraryEnvVal(self):
2186 """ Returns the path that the OS-specific library search environment variable
2187 (self.dylibPath) should be set to in order for a program to find the LLDB
2188 library. If an environment variable named self.dylibPath is already set,
2189 the new path is appended to it and returned.
2190 """
2191 existing_library_path = os.environ[self.dylibPath] if self.dylibPath in os.environ else None
Greg Clayton22fd3b12015-10-26 17:52:16 +00002192 lib_dir = os.environ["LLDB_LIB_DIR"]
Daniel Malea55faa402013-05-02 21:44:31 +00002193 if existing_library_path:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002194 return "%s:%s" % (existing_library_path, lib_dir)
Daniel Malea55faa402013-05-02 21:44:31 +00002195 elif sys.platform.startswith("darwin"):
Greg Clayton22fd3b12015-10-26 17:52:16 +00002196 return os.path.join(lib_dir, 'LLDB.framework')
Daniel Malea55faa402013-05-02 21:44:31 +00002197 else:
Greg Clayton22fd3b12015-10-26 17:52:16 +00002198 return lib_dir
Johnny Chena74bb0a2011-08-01 18:46:13 +00002199
Ed Maste437f8f62013-09-09 14:04:04 +00002200 def getLibcPlusPlusLibs(self):
Robert Flackfa5ad652015-05-13 20:17:34 +00002201 if self.getPlatform() == 'freebsd' or self.getPlatform() == 'linux':
Ed Maste437f8f62013-09-09 14:04:04 +00002202 return ['libc++.so.1']
2203 else:
2204 return ['libc++.1.dylib','libc++abi.dylib']
2205
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002206# Metaclass for TestBase to change the list of test metods when a new TestCase is loaded.
2207# We change the test methods to create a new test method for each test for each debug info we are
2208# testing. The name of the new test method will be '<original-name>_<debug-info>' and with adding
2209# the new test method we remove the old method at the same time.
2210class LLDBTestCaseFactory(type):
2211 def __new__(cls, name, bases, attrs):
2212 newattrs = {}
Zachary Turner606e1e32015-10-23 17:53:51 +00002213 for attrname, attrvalue in attrs.items():
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002214 if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
2215 @dsym_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002216 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002217 def dsym_test_method(self, attrvalue=attrvalue):
2218 self.debug_info = "dsym"
2219 return attrvalue(self)
2220 dsym_method_name = attrname + "_dsym"
2221 dsym_test_method.__name__ = dsym_method_name
2222 newattrs[dsym_method_name] = dsym_test_method
2223
2224 @dwarf_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002225 @wraps(attrvalue)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002226 def dwarf_test_method(self, attrvalue=attrvalue):
2227 self.debug_info = "dwarf"
2228 return attrvalue(self)
2229 dwarf_method_name = attrname + "_dwarf"
2230 dwarf_test_method.__name__ = dwarf_method_name
2231 newattrs[dwarf_method_name] = dwarf_test_method
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002232
2233 @dwo_test
Pavel Labathdc8b2d32015-10-26 09:28:32 +00002234 @wraps(attrvalue)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002235 def dwo_test_method(self, attrvalue=attrvalue):
2236 self.debug_info = "dwo"
2237 return attrvalue(self)
2238 dwo_method_name = attrname + "_dwo"
2239 dwo_test_method.__name__ = dwo_method_name
2240 newattrs[dwo_method_name] = dwo_test_method
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002241 else:
2242 newattrs[attrname] = attrvalue
2243 return super(LLDBTestCaseFactory, cls).__new__(cls, name, bases, newattrs)
2244
Zachary Turner43a01e42015-10-20 21:06:05 +00002245# Setup the metaclass for this class to change the list of the test methods when a new class is loaded
2246@add_metaclass(LLDBTestCaseFactory)
Johnny Chena74bb0a2011-08-01 18:46:13 +00002247class TestBase(Base):
2248 """
2249 This abstract base class is meant to be subclassed. It provides default
2250 implementations for setUpClass(), tearDownClass(), setUp(), and tearDown(),
2251 among other things.
2252
2253 Important things for test class writers:
2254
2255 - Overwrite the mydir class attribute, otherwise your test class won't
2256 run. It specifies the relative directory to the top level 'test' so
2257 the test harness can change to the correct working directory before
2258 running your test.
2259
2260 - The setUp method sets up things to facilitate subsequent interactions
2261 with the debugger as part of the test. These include:
2262 - populate the test method name
2263 - create/get a debugger set with synchronous mode (self.dbg)
2264 - get the command interpreter from with the debugger (self.ci)
2265 - create a result object for use with the command interpreter
2266 (self.res)
2267 - plus other stuffs
2268
2269 - The tearDown method tries to perform some necessary cleanup on behalf
2270 of the test to return the debugger to a good state for the next test.
2271 These include:
2272 - execute any tearDown hooks registered by the test method with
2273 TestBase.addTearDownHook(); examples can be found in
2274 settings/TestSettings.py
2275 - kill the inferior process associated with each target, if any,
2276 and, then delete the target from the debugger's target list
2277 - perform build cleanup before running the next test method in the
2278 same test class; examples of registering for this service can be
2279 found in types/TestIntegerTypes.py with the call:
2280 - self.setTearDownCleanup(dictionary=d)
2281
2282 - Similarly setUpClass and tearDownClass perform classwise setup and
2283 teardown fixtures. The tearDownClass method invokes a default build
2284 cleanup for the entire test class; also, subclasses can implement the
2285 classmethod classCleanup(cls) to perform special class cleanup action.
2286
2287 - The instance methods runCmd and expect are used heavily by existing
2288 test cases to send a command to the command interpreter and to perform
2289 string/pattern matching on the output of such command execution. The
2290 expect method also provides a mode to peform string/pattern matching
2291 without running a command.
2292
2293 - The build methods buildDefault, buildDsym, and buildDwarf are used to
2294 build the binaries used during a particular test scenario. A plugin
2295 should be provided for the sys.platform running the test suite. The
2296 Mac OS X implementation is located in plugins/darwin.py.
2297 """
2298
2299 # Maximum allowed attempts when launching the inferior process.
2300 # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable.
2301 maxLaunchCount = 3;
2302
2303 # Time to wait before the next launching attempt in second(s).
2304 # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable.
2305 timeWaitNextLaunch = 1.0;
2306
2307 def doDelay(self):
2308 """See option -w of dotest.py."""
2309 if ("LLDB_WAIT_BETWEEN_TEST_CASES" in os.environ and
2310 os.environ["LLDB_WAIT_BETWEEN_TEST_CASES"] == 'YES'):
2311 waitTime = 1.0
2312 if "LLDB_TIME_WAIT_BETWEEN_TEST_CASES" in os.environ:
2313 waitTime = float(os.environ["LLDB_TIME_WAIT_BETWEEN_TEST_CASES"])
2314 time.sleep(waitTime)
2315
Enrico Granata165f8af2012-09-21 19:10:53 +00002316 # Returns the list of categories to which this test case belongs
2317 # by default, look for a ".categories" file, and read its contents
2318 # if no such file exists, traverse the hierarchy - we guarantee
2319 # a .categories to exist at the top level directory so we do not end up
2320 # looping endlessly - subclasses are free to define their own categories
2321 # in whatever way makes sense to them
2322 def getCategories(self):
2323 import inspect
2324 import os.path
2325 folder = inspect.getfile(self.__class__)
2326 folder = os.path.dirname(folder)
2327 while folder != '/':
2328 categories_file_name = os.path.join(folder,".categories")
2329 if os.path.exists(categories_file_name):
2330 categories_file = open(categories_file_name,'r')
2331 categories = categories_file.readline()
2332 categories_file.close()
2333 categories = str.replace(categories,'\n','')
2334 categories = str.replace(categories,'\r','')
2335 return categories.split(',')
2336 else:
2337 folder = os.path.dirname(folder)
2338 continue
2339
Johnny Chena74bb0a2011-08-01 18:46:13 +00002340 def setUp(self):
2341 #import traceback
2342 #traceback.print_stack()
2343
2344 # Works with the test driver to conditionally skip tests via decorators.
2345 Base.setUp(self)
2346
Johnny Chena74bb0a2011-08-01 18:46:13 +00002347 try:
2348 if lldb.blacklist:
2349 className = self.__class__.__name__
2350 classAndMethodName = "%s.%s" % (className, self._testMethodName)
2351 if className in lldb.blacklist:
2352 self.skipTest(lldb.blacklist.get(className))
2353 elif classAndMethodName in lldb.blacklist:
2354 self.skipTest(lldb.blacklist.get(classAndMethodName))
2355 except AttributeError:
2356 pass
2357
Johnny Chened492022011-06-21 00:53:00 +00002358 # Insert some delay between successive test cases if specified.
2359 self.doDelay()
Johnny Chen0ed37c92010-10-07 02:04:14 +00002360
Johnny Chenf2b70232010-08-25 18:49:48 +00002361 if "LLDB_MAX_LAUNCH_COUNT" in os.environ:
2362 self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"])
2363
Johnny Chen430eb762010-10-19 16:00:42 +00002364 if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ:
Johnny Chen4921b112010-11-29 20:20:34 +00002365 self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"])
Johnny Chenf2b70232010-08-25 18:49:48 +00002366
Daniel Maleae0f8f572013-08-26 23:57:52 +00002367 #
2368 # Warning: MAJOR HACK AHEAD!
2369 # If we are running testsuite remotely (by checking lldb.lldbtest_remote_sandbox),
2370 # redefine the self.dbg.CreateTarget(filename) method to execute a "file filename"
2371 # command, instead. See also runCmd() where it decorates the "file filename" call
2372 # with additional functionality when running testsuite remotely.
2373 #
2374 if lldb.lldbtest_remote_sandbox:
2375 def DecoratedCreateTarget(arg):
2376 self.runCmd("file %s" % arg)
2377 target = self.dbg.GetSelectedTarget()
2378 #
Greg Claytonc6947512013-12-13 19:18:59 +00002379 # SBtarget.LaunchSimple () currently not working for remote platform?
Daniel Maleae0f8f572013-08-26 23:57:52 +00002380 # johnny @ 04/23/2012
2381 #
2382 def DecoratedLaunchSimple(argv, envp, wd):
2383 self.runCmd("run")
2384 return target.GetProcess()
2385 target.LaunchSimple = DecoratedLaunchSimple
2386
2387 return target
2388 self.dbg.CreateTarget = DecoratedCreateTarget
2389 if self.TraceOn():
Zachary Turnerff890da2015-10-19 23:45:41 +00002390 print("self.dbg.Create is redefined to:\n%s" % getsource_if_available(DecoratedCreateTarget))
Daniel Maleae0f8f572013-08-26 23:57:52 +00002391
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002392 # We want our debugger to be synchronous.
2393 self.dbg.SetAsync(False)
2394
2395 # Retrieve the associated command interpreter instance.
2396 self.ci = self.dbg.GetCommandInterpreter()
2397 if not self.ci:
2398 raise Exception('Could not get the command interpreter')
2399
2400 # And the result object.
2401 self.res = lldb.SBCommandReturnObject()
2402
Johnny Chen44d24972012-04-16 18:55:15 +00002403 # Run global pre-flight code, if defined via the config file.
2404 if lldb.pre_flight:
2405 lldb.pre_flight(self)
2406
Enrico Granatabd0998a2015-10-02 22:53:32 +00002407 if lldb.remote_platform and lldb.remote_platform_working_dir:
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00002408 remote_test_dir = lldbutil.join_remote_paths(
2409 lldb.remote_platform_working_dir,
2410 self.getArchitecture(),
2411 str(self.test_number),
2412 self.mydir)
Zachary Turner14116682015-10-26 18:48:14 +00002413 error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
Greg Claytonfb909312013-11-23 01:58:15 +00002414 if error.Success():
Greg Claytonfb909312013-11-23 01:58:15 +00002415 lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002416
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002417 # This function removes all files from the current working directory while leaving
2418 # the directories in place. The cleaup is required to reduce the disk space required
2419 # by the test suit while leaving the directories untached is neccessary because
2420 # sub-directories might belong to an other test
2421 def clean_working_directory():
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002422 # TODO: Make it working on Windows when we need it for remote debugging support
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002423 # TODO: Replace the heuristic to remove the files with a logic what collects the
2424 # list of files we have to remove during test runs.
2425 shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
Tamas Berghammerf2addf82015-10-07 12:38:29 +00002426 lldb.remote_platform.Run(shell_cmd)
Tamas Berghammer11db2d32015-10-07 14:52:16 +00002427 self.addTearDownHook(clean_working_directory)
Greg Claytonfb909312013-11-23 01:58:15 +00002428 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002429 print("error: making remote directory '%s': %s" % (remote_test_dir, error))
Greg Claytonfb909312013-11-23 01:58:15 +00002430
Greg Clayton35c91342014-11-17 18:40:27 +00002431 def registerSharedLibrariesWithTarget(self, target, shlibs):
2432 '''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing
2433
2434 Any modules in the target that have their remote install file specification set will
2435 get uploaded to the remote host. This function registers the local copies of the
2436 shared libraries with the target and sets their remote install locations so they will
2437 be uploaded when the target is run.
2438 '''
Zachary Turnerbe40b2f2014-12-02 21:32:44 +00002439 if not shlibs or not self.platformContext:
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002440 return None
Greg Clayton35c91342014-11-17 18:40:27 +00002441
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002442 shlib_environment_var = self.platformContext.shlib_environment_var
2443 shlib_prefix = self.platformContext.shlib_prefix
2444 shlib_extension = '.' + self.platformContext.shlib_extension
2445
2446 working_dir = self.get_process_working_directory()
2447 environment = ['%s=%s' % (shlib_environment_var, working_dir)]
2448 # Add any shared libraries to our target if remote so they get
2449 # uploaded into the working directory on the remote side
2450 for name in shlibs:
2451 # The path can be a full path to a shared library, or a make file name like "Foo" for
2452 # "libFoo.dylib" or "libFoo.so", or "Foo.so" for "Foo.so" or "libFoo.so", or just a
2453 # basename like "libFoo.so". So figure out which one it is and resolve the local copy
2454 # of the shared library accordingly
2455 if os.path.exists(name):
2456 local_shlib_path = name # name is the full path to the local shared library
2457 else:
2458 # Check relative names
2459 local_shlib_path = os.path.join(os.getcwd(), shlib_prefix + name + shlib_extension)
2460 if not os.path.exists(local_shlib_path):
2461 local_shlib_path = os.path.join(os.getcwd(), name + shlib_extension)
Greg Clayton35c91342014-11-17 18:40:27 +00002462 if not os.path.exists(local_shlib_path):
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002463 local_shlib_path = os.path.join(os.getcwd(), name)
Greg Clayton35c91342014-11-17 18:40:27 +00002464
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002465 # Make sure we found the local shared library in the above code
2466 self.assertTrue(os.path.exists(local_shlib_path))
2467
2468 # Add the shared library to our target
2469 shlib_module = target.AddModule(local_shlib_path, None, None, None)
2470 if lldb.remote_platform:
Greg Clayton35c91342014-11-17 18:40:27 +00002471 # We must set the remote install location if we want the shared library
2472 # to get uploaded to the remote target
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00002473 remote_shlib_path = lldbutil.append_to_process_working_directory(os.path.basename(local_shlib_path))
Greg Clayton35c91342014-11-17 18:40:27 +00002474 shlib_module.SetRemoteInstallFileSpec(lldb.SBFileSpec(remote_shlib_path, False))
Oleksiy Vyalova3ff6af2014-12-01 23:21:18 +00002475
2476 return environment
2477
Enrico Granata44818162012-10-24 01:23:57 +00002478 # utility methods that tests can use to access the current objects
2479 def target(self):
2480 if not self.dbg:
2481 raise Exception('Invalid debugger instance')
2482 return self.dbg.GetSelectedTarget()
2483
2484 def process(self):
2485 if not self.dbg:
2486 raise Exception('Invalid debugger instance')
2487 return self.dbg.GetSelectedTarget().GetProcess()
2488
2489 def thread(self):
2490 if not self.dbg:
2491 raise Exception('Invalid debugger instance')
2492 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
2493
2494 def frame(self):
2495 if not self.dbg:
2496 raise Exception('Invalid debugger instance')
2497 return self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
2498
Greg Claytonc6947512013-12-13 19:18:59 +00002499 def get_process_working_directory(self):
2500 '''Get the working directory that should be used when launching processes for local or remote processes.'''
2501 if lldb.remote_platform:
2502 # Remote tests set the platform working directory up in TestBase.setUp()
2503 return lldb.remote_platform.GetWorkingDirectory()
2504 else:
2505 # local tests change directory into each test subdirectory
2506 return os.getcwd()
2507
Johnny Chenbf6ffa32010-07-03 03:41:59 +00002508 def tearDown(self):
Johnny Chen7d1d7532010-09-02 21:23:12 +00002509 #import traceback
2510 #traceback.print_stack()
2511
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00002512 # Ensure all the references to SB objects have gone away so that we can
2513 # be sure that all test-specific resources have been freed before we
2514 # attempt to delete the targets.
2515 gc.collect()
2516
Johnny Chen3794ad92011-06-15 21:24:24 +00002517 # Delete the target(s) from the debugger as a general cleanup step.
2518 # This includes terminating the process for each target, if any.
2519 # We'd like to reuse the debugger for our next test without incurring
2520 # the initialization overhead.
2521 targets = []
2522 for target in self.dbg:
2523 if target:
2524 targets.append(target)
2525 process = target.GetProcess()
2526 if process:
2527 rc = self.invoke(process, "Kill")
2528 self.assertTrue(rc.Success(), PROCESS_KILLED)
2529 for target in targets:
2530 self.dbg.DeleteTarget(target)
Johnny Chen6ca006c2010-08-16 21:28:10 +00002531
Johnny Chen44d24972012-04-16 18:55:15 +00002532 # Run global post-flight code, if defined via the config file.
2533 if lldb.post_flight:
2534 lldb.post_flight(self)
2535
Zachary Turner65fe1eb2015-03-26 16:43:25 +00002536 # Do this last, to make sure it's in reverse order from how we setup.
2537 Base.tearDown(self)
2538
Zachary Turner95812042015-03-26 18:54:21 +00002539 # This must be the last statement, otherwise teardown hooks or other
2540 # lines might depend on this still being active.
2541 del self.dbg
2542
Johnny Chen86268e42011-09-30 21:48:35 +00002543 def switch_to_thread_with_stop_reason(self, stop_reason):
2544 """
2545 Run the 'thread list' command, and select the thread with stop reason as
2546 'stop_reason'. If no such thread exists, no select action is done.
2547 """
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002548 from .lldbutil import stop_reason_to_str
Johnny Chen86268e42011-09-30 21:48:35 +00002549 self.runCmd('thread list')
2550 output = self.res.GetOutput()
2551 thread_line_pattern = re.compile("^[ *] thread #([0-9]+):.*stop reason = %s" %
2552 stop_reason_to_str(stop_reason))
2553 for line in output.splitlines():
2554 matched = thread_line_pattern.match(line)
2555 if matched:
2556 self.runCmd('thread select %s' % matched.group(1))
2557
Enrico Granata7594f142013-06-17 22:51:50 +00002558 def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False):
Johnny Chen27f212d2010-08-19 23:26:59 +00002559 """
2560 Ask the command interpreter to handle the command and then check its
2561 return status.
2562 """
2563 # Fail fast if 'cmd' is not meaningful.
2564 if not cmd or len(cmd) == 0:
2565 raise Exception("Bad 'cmd' parameter encountered")
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002566
Johnny Chen8d55a342010-08-31 17:42:54 +00002567 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002568
Daniel Maleae0f8f572013-08-26 23:57:52 +00002569 # This is an opportunity to insert the 'platform target-install' command if we are told so
2570 # via the settig of lldb.lldbtest_remote_sandbox.
2571 if cmd.startswith("target create "):
2572 cmd = cmd.replace("target create ", "file ")
2573 if cmd.startswith("file ") and lldb.lldbtest_remote_sandbox:
2574 with recording(self, trace) as sbuf:
2575 the_rest = cmd.split("file ")[1]
2576 # Split the rest of the command line.
2577 atoms = the_rest.split()
2578 #
2579 # NOTE: This assumes that the options, if any, follow the file command,
2580 # instead of follow the specified target.
2581 #
2582 target = atoms[-1]
2583 # Now let's get the absolute pathname of our target.
2584 abs_target = os.path.abspath(target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002585 print("Found a file command, target (with absolute pathname)=%s" % abs_target, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002586 fpath, fname = os.path.split(abs_target)
2587 parent_dir = os.path.split(fpath)[0]
2588 platform_target_install_command = 'platform target-install %s %s' % (fpath, lldb.lldbtest_remote_sandbox)
Zachary Turnerff890da2015-10-19 23:45:41 +00002589 print("Insert this command to be run first: %s" % platform_target_install_command, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002590 self.ci.HandleCommand(platform_target_install_command, self.res)
2591 # And this is the file command we want to execute, instead.
2592 #
2593 # Warning: SIDE EFFECT AHEAD!!!
2594 # Populate the remote executable pathname into the lldb namespace,
2595 # so that test cases can grab this thing out of the namespace.
2596 #
2597 lldb.lldbtest_remote_sandboxed_executable = abs_target.replace(parent_dir, lldb.lldbtest_remote_sandbox)
2598 cmd = "file -P %s %s %s" % (lldb.lldbtest_remote_sandboxed_executable, the_rest.replace(target, ''), abs_target)
Zachary Turnerff890da2015-10-19 23:45:41 +00002599 print("And this is the replaced file command: %s" % cmd, file=sbuf)
Daniel Maleae0f8f572013-08-26 23:57:52 +00002600
Johnny Chen63dfb272010-09-01 00:15:19 +00002601 running = (cmd.startswith("run") or cmd.startswith("process launch"))
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002602
Johnny Chen63dfb272010-09-01 00:15:19 +00002603 for i in range(self.maxLaunchCount if running else 1):
Enrico Granata7594f142013-06-17 22:51:50 +00002604 self.ci.HandleCommand(cmd, self.res, inHistory)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002605
Johnny Chen150c3cc2010-10-15 01:18:29 +00002606 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002607 print("runCmd:", cmd, file=sbuf)
Johnny Chenab254f52010-10-15 16:13:00 +00002608 if not check:
Zachary Turnerff890da2015-10-19 23:45:41 +00002609 print("check of return status not required", file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002610 if self.res.Succeeded():
Zachary Turnerff890da2015-10-19 23:45:41 +00002611 print("output:", self.res.GetOutput(), file=sbuf)
Johnny Chenf2b70232010-08-25 18:49:48 +00002612 else:
Zachary Turnerff890da2015-10-19 23:45:41 +00002613 print("runCmd failed!", file=sbuf)
2614 print(self.res.GetError(), file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002615
Johnny Chenff3d01d2010-08-20 21:03:09 +00002616 if self.res.Succeeded():
Johnny Chenf2b70232010-08-25 18:49:48 +00002617 break
Johnny Chen150c3cc2010-10-15 01:18:29 +00002618 elif running:
Johnny Chencf7f74e2011-01-19 02:02:08 +00002619 # For process launch, wait some time before possible next try.
2620 time.sleep(self.timeWaitNextLaunch)
Johnny Chen552d6712012-08-01 19:56:04 +00002621 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002622 print("Command '" + cmd + "' failed!", file=sbuf)
Johnny Chen5bbb88f2010-08-20 17:57:32 +00002623
Johnny Chen27f212d2010-08-19 23:26:59 +00002624 if check:
Sean Callanan05834cd2015-07-01 23:56:30 +00002625 self.assertTrue(self.res.Succeeded(),
2626 msg if msg else CMD_MSG(cmd))
Johnny Chen27f212d2010-08-19 23:26:59 +00002627
Jim Ingham63dfc722012-09-22 00:05:11 +00002628 def match (self, str, patterns, msg=None, trace=False, error=False, matching=True, exe=True):
2629 """run command in str, and match the result against regexp in patterns returning the match object for the first matching pattern
2630
2631 Otherwise, all the arguments have the same meanings as for the expect function"""
2632
2633 trace = (True if traceAlways else trace)
2634
2635 if exe:
2636 # First run the command. If we are expecting error, set check=False.
2637 # Pass the assert message along since it provides more semantic info.
2638 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error)
2639
2640 # Then compare the output against expected strings.
2641 output = self.res.GetError() if error else self.res.GetOutput()
2642
2643 # If error is True, the API client expects the command to fail!
2644 if error:
2645 self.assertFalse(self.res.Succeeded(),
2646 "Command '" + str + "' is expected to fail!")
2647 else:
2648 # No execution required, just compare str against the golden input.
2649 output = str
2650 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002651 print("looking at:", output, file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002652
2653 # The heading says either "Expecting" or "Not expecting".
2654 heading = "Expecting" if matching else "Not expecting"
2655
2656 for pattern in patterns:
2657 # Match Objects always have a boolean value of True.
2658 match_object = re.search(pattern, output)
2659 matched = bool(match_object)
2660 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002661 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2662 print("Matched" if matched else "Not matched", file=sbuf)
Jim Ingham63dfc722012-09-22 00:05:11 +00002663 if matched:
2664 break
2665
2666 self.assertTrue(matched if matching else not matched,
2667 msg if msg else EXP_MSG(str, exe))
2668
2669 return match_object
2670
Enrico Granata7594f142013-06-17 22:51:50 +00002671 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 +00002672 """
2673 Similar to runCmd; with additional expect style output matching ability.
2674
2675 Ask the command interpreter to handle the command and then check its
2676 return status. The 'msg' parameter specifies an informational assert
2677 message. We expect the output from running the command to start with
Johnny Chenea88e942010-09-21 21:08:53 +00002678 'startstr', matches the substrings contained in 'substrs', and regexp
2679 matches the patterns contained in 'patterns'.
Johnny Chenb3307862010-09-17 22:28:51 +00002680
2681 If the keyword argument error is set to True, it signifies that the API
2682 client is expecting the command to fail. In this case, the error stream
Johnny Chenaa902922010-09-17 22:45:27 +00002683 from running the command is retrieved and compared against the golden
Johnny Chenb3307862010-09-17 22:28:51 +00002684 input, instead.
Johnny Chenea88e942010-09-21 21:08:53 +00002685
2686 If the keyword argument matching is set to False, it signifies that the API
2687 client is expecting the output of the command not to match the golden
2688 input.
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002689
2690 Finally, the required argument 'str' represents the lldb command to be
2691 sent to the command interpreter. In case the keyword argument 'exe' is
2692 set to False, the 'str' is treated as a string to be matched/not-matched
2693 against the golden input.
Johnny Chen27f212d2010-08-19 23:26:59 +00002694 """
Johnny Chen8d55a342010-08-31 17:42:54 +00002695 trace = (True if traceAlways else trace)
Johnny Chend0190a62010-08-23 17:10:44 +00002696
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002697 if exe:
2698 # First run the command. If we are expecting error, set check=False.
Johnny Chen62d4f862010-10-28 21:10:32 +00002699 # Pass the assert message along since it provides more semantic info.
Enrico Granata7594f142013-06-17 22:51:50 +00002700 self.runCmd(str, msg=msg, trace = (True if trace else False), check = not error, inHistory=inHistory)
Johnny Chen27f212d2010-08-19 23:26:59 +00002701
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002702 # Then compare the output against expected strings.
2703 output = self.res.GetError() if error else self.res.GetOutput()
Johnny Chenb3307862010-09-17 22:28:51 +00002704
Johnny Chen9c48b8d2010-09-21 23:33:30 +00002705 # If error is True, the API client expects the command to fail!
2706 if error:
2707 self.assertFalse(self.res.Succeeded(),
2708 "Command '" + str + "' is expected to fail!")
2709 else:
2710 # No execution required, just compare str against the golden input.
Enrico Granatabc08ab42012-10-23 00:09:02 +00002711 if isinstance(str,lldb.SBCommandReturnObject):
2712 output = str.GetOutput()
2713 else:
2714 output = str
Johnny Chen150c3cc2010-10-15 01:18:29 +00002715 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002716 print("looking at:", output, file=sbuf)
Johnny Chenb3307862010-09-17 22:28:51 +00002717
Johnny Chenea88e942010-09-21 21:08:53 +00002718 # The heading says either "Expecting" or "Not expecting".
Johnny Chen150c3cc2010-10-15 01:18:29 +00002719 heading = "Expecting" if matching else "Not expecting"
Johnny Chenea88e942010-09-21 21:08:53 +00002720
2721 # Start from the startstr, if specified.
2722 # If there's no startstr, set the initial state appropriately.
2723 matched = output.startswith(startstr) if startstr else (True if matching else False)
Johnny Chenb145bba2010-08-20 18:25:15 +00002724
Johnny Chen150c3cc2010-10-15 01:18:29 +00002725 if startstr:
2726 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002727 print("%s start string: %s" % (heading, startstr), file=sbuf)
2728 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenb145bba2010-08-20 18:25:15 +00002729
Johnny Chen86268e42011-09-30 21:48:35 +00002730 # Look for endstr, if specified.
2731 keepgoing = matched if matching else not matched
2732 if endstr:
2733 matched = output.endswith(endstr)
2734 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002735 print("%s end string: %s" % (heading, endstr), file=sbuf)
2736 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chen86268e42011-09-30 21:48:35 +00002737
Johnny Chenea88e942010-09-21 21:08:53 +00002738 # Look for sub strings, if specified.
2739 keepgoing = matched if matching else not matched
2740 if substrs and keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002741 for str in substrs:
Johnny Chenb052f6c2010-09-23 23:35:28 +00002742 matched = output.find(str) != -1
Johnny Chen150c3cc2010-10-15 01:18:29 +00002743 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002744 print("%s sub string: %s" % (heading, str), file=sbuf)
2745 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002746 keepgoing = matched if matching else not matched
2747 if not keepgoing:
Johnny Chen27f212d2010-08-19 23:26:59 +00002748 break
2749
Johnny Chenea88e942010-09-21 21:08:53 +00002750 # Search for regular expression patterns, if specified.
2751 keepgoing = matched if matching else not matched
2752 if patterns and keepgoing:
2753 for pattern in patterns:
2754 # Match Objects always have a boolean value of True.
2755 matched = bool(re.search(pattern, output))
Johnny Chen150c3cc2010-10-15 01:18:29 +00002756 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002757 print("%s pattern: %s" % (heading, pattern), file=sbuf)
2758 print("Matched" if matched else "Not matched", file=sbuf)
Johnny Chenea88e942010-09-21 21:08:53 +00002759 keepgoing = matched if matching else not matched
2760 if not keepgoing:
2761 break
Johnny Chenea88e942010-09-21 21:08:53 +00002762
2763 self.assertTrue(matched if matching else not matched,
Johnny Chenc0c67f22010-11-09 18:42:22 +00002764 msg if msg else EXP_MSG(str, exe))
Johnny Chen27f212d2010-08-19 23:26:59 +00002765
Johnny Chenf3c59232010-08-25 22:52:45 +00002766 def invoke(self, obj, name, trace=False):
Johnny Chen61703c92010-08-25 22:56:10 +00002767 """Use reflection to call a method dynamically with no argument."""
Johnny Chen8d55a342010-08-31 17:42:54 +00002768 trace = (True if traceAlways else trace)
Johnny Chenf3c59232010-08-25 22:52:45 +00002769
2770 method = getattr(obj, name)
2771 import inspect
2772 self.assertTrue(inspect.ismethod(method),
2773 name + "is a method name of object: " + str(obj))
2774 result = method()
Johnny Chen150c3cc2010-10-15 01:18:29 +00002775 with recording(self, trace) as sbuf:
Zachary Turnerff890da2015-10-19 23:45:41 +00002776 print(str(method) + ":", result, file=sbuf)
Johnny Chenf3c59232010-08-25 22:52:45 +00002777 return result
Johnny Chen827edff2010-08-27 00:15:48 +00002778
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002779 def build(self, architecture=None, compiler=None, dictionary=None, clean=True):
2780 """Platform specific way to build the default binaries."""
2781 if lldb.skip_build_and_cleanup:
2782 return
2783 module = builder_module()
2784 if target_is_android():
2785 dictionary = append_android_envs(dictionary)
2786 if self.debug_info is None:
2787 return self.buildDefault(architecture, compiler, dictionary, clean)
2788 elif self.debug_info == "dsym":
2789 return self.buildDsym(architecture, compiler, dictionary, clean)
2790 elif self.debug_info == "dwarf":
2791 return self.buildDwarf(architecture, compiler, dictionary, clean)
Tamas Berghammer4c0c7a72015-10-07 10:02:17 +00002792 elif self.debug_info == "dwo":
2793 return self.buildDwo(architecture, compiler, dictionary, clean)
2794 else:
2795 self.fail("Can't build for debug info: %s" % self.debug_info)
Tamas Berghammerc8fd1302015-09-30 10:12:40 +00002796
Johnny Chenf359cf22011-05-27 23:36:52 +00002797 # =================================================
2798 # Misc. helper methods for debugging test execution
2799 # =================================================
2800
Johnny Chen56b92a72011-07-11 19:15:11 +00002801 def DebugSBValue(self, val):
Johnny Chen8d55a342010-08-31 17:42:54 +00002802 """Debug print a SBValue object, if traceAlways is True."""
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00002803 from .lldbutil import value_type_to_str
Johnny Chen87bb5892010-11-03 21:37:58 +00002804
Johnny Chen8d55a342010-08-31 17:42:54 +00002805 if not traceAlways:
Johnny Chen827edff2010-08-27 00:15:48 +00002806 return
2807
2808 err = sys.stderr
2809 err.write(val.GetName() + ":\n")
Johnny Chen86268e42011-09-30 21:48:35 +00002810 err.write('\t' + "TypeName -> " + val.GetTypeName() + '\n')
2811 err.write('\t' + "ByteSize -> " + str(val.GetByteSize()) + '\n')
2812 err.write('\t' + "NumChildren -> " + str(val.GetNumChildren()) + '\n')
2813 err.write('\t' + "Value -> " + str(val.GetValue()) + '\n')
2814 err.write('\t' + "ValueAsUnsigned -> " + str(val.GetValueAsUnsigned())+ '\n')
2815 err.write('\t' + "ValueType -> " + value_type_to_str(val.GetValueType()) + '\n')
2816 err.write('\t' + "Summary -> " + str(val.GetSummary()) + '\n')
2817 err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
2818 err.write('\t' + "Location -> " + val.GetLocation() + '\n')
Johnny Chen827edff2010-08-27 00:15:48 +00002819
Johnny Chen36c5eb12011-08-05 20:17:27 +00002820 def DebugSBType(self, type):
2821 """Debug print a SBType object, if traceAlways is True."""
2822 if not traceAlways:
2823 return
2824
2825 err = sys.stderr
2826 err.write(type.GetName() + ":\n")
2827 err.write('\t' + "ByteSize -> " + str(type.GetByteSize()) + '\n')
2828 err.write('\t' + "IsPointerType -> " + str(type.IsPointerType()) + '\n')
2829 err.write('\t' + "IsReferenceType -> " + str(type.IsReferenceType()) + '\n')
2830
Johnny Chenb877f1e2011-03-12 01:18:19 +00002831 def DebugPExpect(self, child):
2832 """Debug the spwaned pexpect object."""
2833 if not traceAlways:
2834 return
2835
Zachary Turnerff890da2015-10-19 23:45:41 +00002836 print(child)
Filipe Cabecinhas0eec15a2012-06-20 10:13:40 +00002837
2838 @classmethod
2839 def RemoveTempFile(cls, file):
2840 if os.path.exists(file):
2841 os.remove(file)