Abstracted the lldb-specific unittest.TestCase.setUp()/tearDown() in a separate

module lldbtest.py and refactored the existing test cases to derive from the
abstract base class lldbtest.TestBase.

MOdified the test driver (dotest.py and dotest.pl) to set up additional
PYTHONPATH component for locating the lldbtest module, which sits in the same
directory.

llvm-svn: 107563
This commit is contained in:
Johnny Chen 2010-07-03 03:41:59 +00:00
parent df44f74290
commit bf6ffa3b89
8 changed files with 108 additions and 135 deletions

View File

@ -1,37 +1,17 @@
"""Test breakpoint by file/line number; and list variables with array types."""
import os, time
import lldb
import unittest
import lldb
import lldbtest
main = False
class TestArrayTypes(lldbtest.TestBase):
class TestArrayTypes(unittest.TestCase):
def setUp(self):
global main
# Save old working directory.
self.oldcwd = os.getcwd()
# Change current working directory if ${LLDB_TEST} is defined.
if ("LLDB_TEST" in os.environ):
os.chdir(os.path.join(os.environ["LLDB_TEST"], "array_types"));
self.dbg = lldb.SBDebugger.Create() if main else lldb.DBG
if not self.dbg.IsValid():
raise Exception('Invalid debugger instance')
self.dbg.SetAsync(False)
self.ci = self.dbg.GetCommandInterpreter()
if not self.ci:
raise Exception('Could not get the command interpreter')
def tearDown(self):
# Restore old working directory.
os.chdir(self.oldcwd)
del self.dbg
mydir = "array_types"
def test_array_types(self):
"""Test 'variable list var_name' on some variables with array types."""
res = lldb.SBCommandReturnObject()
res = self.res
exe = os.path.join(os.getcwd(), "a.out")
self.ci.HandleCommand("file " + exe, res)
self.assertTrue(res.Succeeded())
@ -92,6 +72,5 @@ class TestArrayTypes(unittest.TestCase):
if __name__ == '__main__':
lldb.SBDebugger.Initialize()
main = True
unittest.main()
lldb.SBDebugger.Terminate()

View File

@ -1,37 +1,17 @@
"""Test breakpoint on a class constructor; and variable list the this object."""
import os, time
import lldb
import unittest
import lldb
import lldbtest
main = False
class TestClassTypes(lldbtest.TestBase):
class TestClassTypes(unittest.TestCase):
def setUp(self):
global main
# Save old working directory.
self.oldcwd = os.getcwd()
# Change current working directory if ${LLDB_TEST} is defined.
if ("LLDB_TEST" in os.environ):
os.chdir(os.path.join(os.environ["LLDB_TEST"], "class_types"));
self.dbg = lldb.SBDebugger.Create() if main else lldb.DBG
if not self.dbg.IsValid():
raise Exception('Invalid debugger instance')
self.dbg.SetAsync(False)
self.ci = self.dbg.GetCommandInterpreter()
if not self.ci:
raise Exception('Could not get the command interpreter')
def tearDown(self):
# Restore old working directory.
os.chdir(self.oldcwd)
del self.dbg
mydir = "class_types"
def test_class_types(self):
"""Test 'variable list this' when stopped on a class constructor."""
res = lldb.SBCommandReturnObject()
res = self.res
exe = os.path.join(os.getcwd(), "a.out")
self.ci.HandleCommand("file " + exe, res)
self.assertTrue(res.Succeeded())
@ -69,6 +49,5 @@ class TestClassTypes(unittest.TestCase):
if __name__ == '__main__':
lldb.SBDebugger.Initialize()
main = True
unittest.main()
lldb.SBDebugger.Terminate()

View File

@ -21,9 +21,9 @@ my $testDir = $ARGV[0];
my $dbgPath = "$baseDir/build/Debug/LLDB.framework/Resources/Python";
my $relPath = "$baseDir/build/Release/LLDB.framework/Resources/Python";
if (-d $dbgPath) {
$ENV{'PYTHONPATH'} = "$dbgPath";
$ENV{'PYTHONPATH'} = "$dbgPath:$scriptDir";
} elsif (-d $relPath) {
$ENV{'PYTHONPATH'} = "$relPath";
$ENV{'PYTHONPATH'} = "$relPath:$scriptDir";
}
#print("ENV{PYTHONPATH}=$ENV{'PYTHONPATH'}\n");

View File

@ -53,14 +53,14 @@ def setupSysPath():
"""Add LLDB.framework/Resources/Python to the search paths for modules."""
# Get the directory containing the current script.
testPath = sys.path[0]
if not testPath.endswith('test'):
scriptPath = sys.path[0]
if not scriptPath.endswith('test'):
print "This script expects to reside in lldb's test directory."
sys.exit(-1)
os.environ["LLDB_TEST"] = testPath
os.environ["LLDB_TEST"] = scriptPath
base = os.path.abspath(os.path.join(testPath, os.pardir))
base = os.path.abspath(os.path.join(scriptPath, os.pardir))
dbgPath = os.path.join(base, 'build', 'Debug', 'LLDB.framework',
'Resources', 'Python')
relPath = os.path.join(base, 'build', 'Release', 'LLDB.framework',
@ -78,6 +78,7 @@ def setupSysPath():
sys.exit(-1)
sys.path.append(lldbPath)
sys.path.append(scriptPath)
def initTestdirs():

View File

@ -1,39 +1,21 @@
"""Test variable with function ptr type and that break on the function works."""
import os, time
import lldb
import unittest
import lldb
import lldbtest
main = False
class TestClassTypes(lldbtest.TestBase):
class TestClassTypes(unittest.TestCase):
def setUp(self):
global main
# Save old working directory.
self.oldcwd = os.getcwd()
# Change current working directory if ${LLDB_TEST} is defined.
if ("LLDB_TEST" in os.environ):
os.chdir(os.path.join(os.environ["LLDB_TEST"], "function_types"));
self.dbg = lldb.SBDebugger.Create() if main else lldb.DBG
if not self.dbg.IsValid():
raise Exception('Invalid debugger instance')
self.dbg.SetAsync(False)
self.ci = self.dbg.GetCommandInterpreter()
if not self.ci:
raise Exception('Could not get the command interpreter')
def tearDown(self):
# Restore old working directory.
os.chdir(self.oldcwd)
del self.dbg
mydir = "function_types"
def test_function_types(self):
"""Test 'callback' has function ptr type, then break on the function."""
res = lldb.SBCommandReturnObject()
res = self.res
exe = os.path.join(os.getcwd(), "a.out")
self.ci.HandleCommand("file " + exe, res)
print "os.getcwd(): ", os.getcwd()
print "file a.out :", res.GetOutput()
self.assertTrue(res.Succeeded())
# Break inside the main.
@ -85,6 +67,5 @@ class TestClassTypes(unittest.TestCase):
if __name__ == '__main__':
lldb.SBDebugger.Initialize()
main = True
unittest.main()
lldb.SBDebugger.Terminate()

View File

@ -1,37 +1,17 @@
"""Show global variables and check that they do indeed have global scopes."""
import os, time
import lldb
import unittest
import lldb
import lldbtest
main = False
class TestClassTypes(lldbtest.TestBase):
class TestClassTypes(unittest.TestCase):
def setUp(self):
global main
# Save old working directory.
self.oldcwd = os.getcwd()
# Change current working directory if ${LLDB_TEST} is defined.
if ("LLDB_TEST" in os.environ):
os.chdir(os.path.join(os.environ["LLDB_TEST"], "global_variables"));
self.dbg = lldb.SBDebugger.Create() if main else lldb.DBG
if not self.dbg.IsValid():
raise Exception('Invalid debugger instance')
self.dbg.SetAsync(False)
self.ci = self.dbg.GetCommandInterpreter()
if not self.ci:
raise Exception('Could not get the command interpreter')
def tearDown(self):
# Restore old working directory.
os.chdir(self.oldcwd)
del self.dbg
mydir = "global_variables"
def test_global_variables(self):
"""Test 'variable list -s -a' which omits args and shows scopes."""
res = lldb.SBCommandReturnObject()
res = self.res
exe = os.path.join(os.getcwd(), "a.out")
self.ci.HandleCommand("file " + exe, res)
self.assertTrue(res.Succeeded())
@ -75,6 +55,5 @@ class TestClassTypes(unittest.TestCase):
if __name__ == '__main__':
lldb.SBDebugger.Initialize()
main = True
unittest.main()
lldb.SBDebugger.Terminate()

View File

@ -1,33 +1,13 @@
"""Test lldb help command."""
import os, time
import lldb
import unittest
import lldb
import lldbtest
main = False
class TestHelpCommand(lldbtest.TestBase):
class TestHelpCommand(unittest.TestCase):
def setUp(self):
global main
# Save old working directory.
self.oldcwd = os.getcwd()
# Change current working directory if ${LLDB_TEST} is defined.
if ("LLDB_TEST" in os.environ):
os.chdir(os.path.join(os.environ["LLDB_TEST"], "help"));
self.dbg = lldb.SBDebugger.Create() if main else lldb.DBG
if not self.dbg.IsValid():
raise Exception('Invalid debugger instance')
self.dbg.SetAsync(False)
self.ci = self.dbg.GetCommandInterpreter()
if not self.ci:
raise Exception('Could not get the command interpreter')
def tearDown(self):
# Restore old working directory.
os.chdir(self.oldcwd)
del self.dbg
mydir = "help"
def test_simplehelp(self):
"""A simple test of 'help' command and its output."""
@ -53,6 +33,5 @@ class TestHelpCommand(unittest.TestCase):
if __name__ == '__main__':
lldb.SBDebugger.Initialize()
main = True
unittest.main()
lldb.SBDebugger.Terminate()

75
lldb/test/lldbtest.py Normal file
View File

@ -0,0 +1,75 @@
"""
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 unittest
import lldb
class TestBase(unittest.TestCase):
"""This LLDB abstract base class is meant to be subclassed."""
# The concrete subclass should override this attribute.
mydir = ""
def setUp(self):
# 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 NameError:
self.dbg = lldb.SBDebugger.Create()
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):
del self.dbg
# Restore old working directory.
os.chdir(self.oldcwd)