summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohnny Chen <johnny.chen@apple.com>2010-06-25 21:14:08 +0000
committerJohnny Chen <johnny.chen@apple.com>2010-06-25 21:14:08 +0000
commita765c28db3199f9511e1206d1addc3621d688cff (patch)
treebbb886478a0e2654c24117fa3e4d089b10fc24bc
parent07b0a6e4d639f365114cd7d23a193a8450263724 (diff)
downloadbcm5719-llvm-a765c28db3199f9511e1206d1addc3621d688cff.tar.gz
bcm5719-llvm-a765c28db3199f9511e1206d1addc3621d688cff.zip
A simple testing framework for lldb using python's unit testing framework.
Tests for lldb are written as python scripts which take advantage of the script bridging provided by LLDB.framework to interact with lldb core. A specific naming pattern is followed by the .py script to be recognized as a module which implements a test scenario, namely, Test*.py. To specify the directories where "Test*.py" python test scripts are located, you need to pass in a list of directory names. By default, the current working directory is searched if nothing is specified on the command line. An example: [14:10:20] johnny:/Volumes/data/lldb/svn/trunk/test $ ./dotest.py -v example test_choice (TestSequenceFunctions.TestSequenceFunctions) ... ok test_sample (TestSequenceFunctions.TestSequenceFunctions) ... ok test_shuffle (TestSequenceFunctions.TestSequenceFunctions) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK llvm-svn: 106890
-rwxr-xr-xlldb/test/dotest.py136
-rw-r--r--lldb/test/example/TestSequenceFunctions.py34
2 files changed, 170 insertions, 0 deletions
diff --git a/lldb/test/dotest.py b/lldb/test/dotest.py
new file mode 100755
index 00000000000..d622cc00d2e
--- /dev/null
+++ b/lldb/test/dotest.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+
+"""
+A simple testing framework for lldb using python's unit testing framework.
+
+Tests for lldb are written as python scripts which take advantage of the script
+bridging provided by LLDB.framework to interact with lldb core.
+
+A specific naming pattern is followed by the .py script to be recognized as
+a module which implements a test scenario, namely, Test*.py.
+
+To specify the directories where "Test*.py" python test scripts are located,
+you need to pass in a list of directory names. By default, the current
+working directory is searched if nothing is specified on the command line.
+"""
+
+import os
+import sys
+import unittest
+
+#
+# Global variables:
+#
+
+# The test suite.
+suite = unittest.TestSuite()
+
+# Default verbosity is 0.
+verbose = 0
+
+# By default, search from the current working directory.
+testdirs = [ os.getcwd() ]
+
+
+def usage():
+ print """
+Usage: dotest.py [option] [args]
+where options:
+-h : print this help message and exit (also --help)
+-v : do verbose mode of unittest framework
+
+and:
+args : specify a list of directory names to search for python Test*.py scripts
+ if empty, search from the curret working directory, instead
+"""
+
+
+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'):
+ print "This script expects to reside in lldb's test directory."
+ sys.exit(-1)
+
+ base = os.path.abspath(os.path.join(testPath, os.pardir))
+ dbgPath = os.path.join(base, 'build', 'Debug', 'LLDB.framework',
+ 'Resources', 'Python')
+ relPath = os.path.join(base, 'build', 'Release', 'LLDB.framework',
+ 'Resources', 'Python')
+
+ lldbPath = None
+ if os.path.isfile(os.path.join(dbgPath, 'lldb.py')):
+ lldbPath = dbgPath
+ elif os.path.isfile(os.path.join(relPath, 'lldb.py')):
+ lldbPath = relPath
+
+ if not lldbPath:
+ print 'This script requires lldb.py to be in either ' + dbgPath,
+ print ' or' + relPath
+ sys.exit(-1)
+
+ sys.path.append(lldbPath)
+ #print 'sys.path =', sys.path
+
+
+def initTestdirs():
+ """Initialize the list of directories containing our unittest scripts.
+
+ '-h/--help as the first option prints out usage info and exit the program.
+ """
+
+ global verbose
+ global testdirs
+
+ if len(sys.argv) == 1:
+ pass
+ elif sys.argv[1].find('-h') != -1:
+ # Print usage info and exit.
+ usage()
+ sys.exit(0)
+ else:
+ # Process possible verbose flag.
+ index = 1
+ if sys.argv[1].find('-v') != -1:
+ verbose = 2
+ index += 1
+
+ # Gather all the dirs passed on the command line.
+ if len(sys.argv) > index:
+ testdirs = map(os.path.abspath, sys.argv[index:])
+
+ #print "testdirs =", testdirs
+
+
+def visit(prefix, dir, names):
+ """Visitor function for os.path.walk(path, visit, arg)."""
+
+ global suite
+
+ for name in names:
+ if os.path.isdir(os.path.join(dir, name)):
+ continue
+
+ if '.py' == os.path.splitext(name)[1] and name.startswith(prefix):
+ # We found a pattern match for our test case. Add it to the suite.
+ sys.path.append(dir)
+ base = os.path.splitext(name)[0]
+ suite.addTests(unittest.defaultTestLoader.loadTestsFromName(base))
+
+
+#
+# Start the actions by first setting up the module search path for lldb,
+# followed by initializing the test directories, and then walking the directory
+# trees, while collecting the tests into our test suite.
+#
+setupSysPath()
+initTestdirs()
+for testdir in testdirs:
+ os.path.walk(testdir, visit, 'Test')
+
+# Now that we have loaded all the test cases, run the whole test suite.
+#print "test suite =", suite
+#print "verbose =", verbose
+unittest.TextTestRunner(verbosity=verbose).run(suite)
diff --git a/lldb/test/example/TestSequenceFunctions.py b/lldb/test/example/TestSequenceFunctions.py
new file mode 100644
index 00000000000..29ebfe6cefe
--- /dev/null
+++ b/lldb/test/example/TestSequenceFunctions.py
@@ -0,0 +1,34 @@
+"""An example unittest copied from python tutorial."""
+
+import random
+import unittest
+import traceback
+
+class TestSequenceFunctions(unittest.TestCase):
+
+ def setUp(self):
+ #traceback.print_stack()
+ self.seq = range(10)
+
+ def tearDown(self):
+ #traceback.print_stack()
+ pass
+
+ def test_shuffle(self):
+ # make sure the shuffled sequence does not lose any elements
+ random.shuffle(self.seq)
+ self.seq.sort()
+ self.assertEqual(self.seq, range(10))
+
+ def test_choice(self):
+ element = random.choice(self.seq)
+ self.assertTrue(element in self.seq)
+
+ def test_sample(self):
+ self.assertRaises(ValueError, random.sample, self.seq, 20)
+ for element in random.sample(self.seq, 5):
+ self.assertTrue(element in self.seq)
+
+
+if __name__ == '__main__':
+ unittest.main()
OpenPOWER on IntegriCloud