blob: 75f7e518da45506b78091e450be1f28fa6d79c70 [file] [log] [blame]
"""
LLDB module which provides the abstract base class of lldb test case.
The concrete subclass can override lldbtest.TesBase in order to inherit the
common behavior for unitest.TestCase.setUp/tearDown implemented in this file.
The subclass should override the attribute mydir in order for the python runtime
to locate the individual test cases when running as part of a large test suite
or when running each test case as a separate python invocation.
./dotest.py provides a test driver which sets up the environment to run the
entire test suite. Users who want to run a test case on its own can specify the
LLDB_TEST and PYTHONPATH environment variables, for example:
$ export LLDB_TEST=$PWD
$ export PYTHONPATH=/Volumes/data/lldb/svn/trunk/build/Debug/LLDB.framework/Resources/Python:$LLDB_TEST
$ echo $LLDB_TEST
/Volumes/data/lldb/svn/trunk/test
$ echo $PYTHONPATH
/Volumes/data/lldb/svn/trunk/build/Debug/LLDB.framework/Resources/Python:/Volumes/data/lldb/svn/trunk/test
$ python function_types/TestFunctionTypes.py
.
----------------------------------------------------------------------
Ran 1 test in 0.363s
OK
$
"""
import os
import unittest2
import lldb
#
# Some commonly used assert messages.
#
CURRENT_EXECUTABLE_SET = "Current executable set successfully"
RUN_STOPPED = "Process is stopped successfully"
RUN_COMPLETED = "Process exited successfully"
BREAKPOINT_CREATED = "Breakpoint created successfully"
BREAKPOINT_HIT_ONCE = "Breakpoint resolved with hit cout = 1"
STOPPED_DUE_TO_BREAKPOINT = "Process state is stopped due to breakpoint"
STOPPED_DUE_TO_STEP_IN = "Process state is stopped due to step in"
VARIABLES_DISPLAYED_CORRECTLY = "Show specified variable(s) correctly"
#
# And a generic "Command '%s' returns successfully" message generator.
#
def CMD_MSG(command):
return "Command '%s' returns successfully" % (command)
class TestBase(unittest2.TestCase):
"""This LLDB abstract base class is meant to be subclassed."""
# The concrete subclass should override this attribute.
mydir = None
# State pertaining to the inferior process, if any.
runStarted = False
def setUp(self):
#import traceback
#traceback.print_stack()
# Fail fast if 'mydir' attribute is not overridden.
if not self.mydir or len(self.mydir) == 0:
raise Exception("Subclasses must override the 'mydir' attribute.")
# Save old working directory.
self.oldcwd = os.getcwd()
# Change current working directory if ${LLDB_TEST} is defined.
# See also dotest.py which sets up ${LLDB_TEST}.
if ("LLDB_TEST" in os.environ):
os.chdir(os.path.join(os.environ["LLDB_TEST"], self.mydir));
# Create the debugger instance if necessary.
try:
self.dbg = lldb.DBG
except AttributeError:
self.dbg = lldb.SBDebugger.Create()
if not self.dbg.IsValid():
raise Exception('Invalid debugger instance')
# We want our debugger to be synchronous.
self.dbg.SetAsync(False)
# Retrieve the associated command interpreter instance.
self.ci = self.dbg.GetCommandInterpreter()
if not self.ci:
raise Exception('Could not get the command interpreter')
# And the result object.
self.res = lldb.SBCommandReturnObject()
def tearDown(self):
# Finish the inferior process, if it was "run" previously.
if self.runStarted:
self.ci.HandleCommand("continue", self.res)
del self.dbg
# Restore old working directory.
os.chdir(self.oldcwd)