|  | This README file describes the files and directories related to the Python test | 
|  | suite under the current 'test' directory. | 
|  |  | 
|  | o dotest.py | 
|  |  | 
|  | Provides the test driver for the test suite.  To invoke it, cd to the 'test' | 
|  | directory and issue the './dotest.py' command or './dotest.py -v' for more | 
|  | verbose output.  '.dotest.py -h' prints out the help messge. | 
|  |  | 
|  | A specific naming pattern is followed by the .py script under the 'test' | 
|  | directory in order to be recognized by 'dotest.py' test driver as a module | 
|  | which implements a test case, namely, Test*.py. | 
|  |  | 
|  | Some example usages: | 
|  |  | 
|  | 1. ./dotest.py -v . 2> ~/Developer/Log/lldbtest.log0 | 
|  | This runs the test suite and directs the run log to a file. | 
|  |  | 
|  | 2. LLDB_LOG=/tmp/lldb.log GDB_REMOTE_LOG=/tmp/gdb-remote.log ./dotest.py -v . 2> ~/Developer/Log/lldbtest.log | 
|  | This runs the test suite, with logging turned on for the lldb as well as | 
|  | the process.gdb-remote channels and directs the run log to a file. | 
|  |  | 
|  | o lldbtest.py | 
|  |  | 
|  | Provides an abstract base class of lldb test case named 'TestBase', which in | 
|  | turn inherits from Python's unittest.TestCase.  The concrete subclass can | 
|  | override lldbtest.TestBase in order to inherit the common behavior for | 
|  | unittest.TestCase.setUp/tearDown implemented in this file. | 
|  |  | 
|  | To provide a test case, the concrete subclass provides methods whose names | 
|  | start with the letters test.  For more details about the Python's unittest | 
|  | framework, go to http://docs.python.org/library/unittest.html. | 
|  |  | 
|  | ./command_source/TestCommandSource.py provides a simple example of test case | 
|  | which overrides lldbtest.TestBase to exercise the lldb's 'command source' | 
|  | command.  The subclass should override the attribute 'mydir' in order for the | 
|  | 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. | 
|  |  | 
|  | The doc string provides more details about the setup required for running a | 
|  | test case on its own.  To run the whole test suite, 'dotest.py' is all you | 
|  | need to do. | 
|  |  | 
|  | o subdirectories of 'test' | 
|  |  | 
|  | Most of them predate the introduction of the python test suite and contain | 
|  | example C/C++/ObjC source files which get compiled into executables which are | 
|  | to be exercised by the debugger. | 
|  |  | 
|  | For such subdirectory which has an associated Test*.py file, it was added as | 
|  | part of the Python-based test suite to test lldb functionality. | 
|  |  | 
|  | Some of the subdirectories, for example, the 'help' subdirectory, do not have | 
|  | C/C++/ObjC source files; they were created to house the Python test case which | 
|  | does not involve lldb reading in an executable file at all. | 
|  |  | 
|  | The sample_test directory contains examples of both a full and an "inline" | 
|  | testcase that run a process to a breakpoint and check a local variable.  These | 
|  | are convenient starting points for adding new tests. | 
|  |  | 
|  | o make directory | 
|  |  | 
|  | Contains Makefile.rules, which can be utilized by test cases to write Makefile | 
|  | based rules to build binaries for the inferiors. | 
|  |  | 
|  | By default, the built executable name is a.out, which can be overwritten by | 
|  | specifying your EXE make variable, via the Makefile under the specific test | 
|  | directory or via supplying a Python dictionary to the build method in your | 
|  | Python test script.  An example of the latter can be found in | 
|  | test/lang/objc/radar-9691614/TestObjCMethodReturningBOOL.py, where: | 
|  |  | 
|  | def test_method_ret_BOOL_with_dsym(self): | 
|  | """Test that objective-c method returning BOOL works correctly.""" | 
|  | d = {'EXE': self.exe_name} | 
|  | self.buildDsym(dictionary=d) | 
|  | self.setTearDownCleanup(dictionary=d) | 
|  | self.objc_method_ret_BOOL(self.exe_name) | 
|  |  | 
|  | def test_method_ret_BOOL_with_dwarf(self): | 
|  | """Test that objective-c method returning BOOL works correctly.""" | 
|  | d = {'EXE': self.exe_name} | 
|  | self.buildDwarf(dictionary=d) | 
|  | self.setTearDownCleanup(dictionary=d) | 
|  | self.objc_method_ret_BOOL(self.exe_name) | 
|  |  | 
|  | def setUp(self): | 
|  | # Call super's setUp(). | 
|  | TestBase.setUp(self) | 
|  | # We'll use the test method name as the exe_name. | 
|  | self.exe_name = self.testMethodName | 
|  | # Find the line number to break inside main(). | 
|  | self.main_source = "main.m" | 
|  | self.line = line_number(self.main_source, '// Set breakpoint here.') | 
|  |  | 
|  | The exe names for the two test methods are equal to the test method names and | 
|  | are therefore guaranteed different. | 
|  |  | 
|  | o plugins directory | 
|  |  | 
|  | Contains platform specific plugin to build binaries with dsym/dwarf debugging | 
|  | info.  Other platform specific functionalities may be added in the future. | 
|  |  | 
|  | o unittest2 directory | 
|  |  | 
|  | Many new features were added to unittest in Python 2.7, including test | 
|  | discovery. unittest2 allows you to use these features with earlier versions of | 
|  | Python. | 
|  |  | 
|  | It currently has unittest2 0.5.1 from http://pypi.python.org/pypi/unittest2. | 
|  | Version 0.5.1 of unittest2 has feature parity with unittest in Python 2.7 | 
|  | final. If you want to ensure that your tests run identically under unittest2 | 
|  | and unittest in Python 2.7 you should use unittest2 0.5.1. | 
|  |  | 
|  | Later versions of unittest2 include changes in unittest made in Python 3.2 and | 
|  | onwards after the release of Python 2.7. | 
|  |  | 
|  | o dotest.pl | 
|  |  | 
|  | In case you wonder, there is also a 'dotest.pl' perl script file.  It was | 
|  | created to visit each Python test case under the specified directory and | 
|  | invoke Python's builtin unittest.main() on each test case. | 
|  |  | 
|  | It does not take advantage of the test runner and test suite functionality | 
|  | provided by Python's unitest framework.  Its existence is because we want a | 
|  | different way of running the whole test suite.  As lldb and the Python test | 
|  | suite become more reliable, we don't expect to be using 'dotest.pl' anymore. | 
|  |  | 
|  | Note: dotest.pl has been moved to the attic directory. | 
|  |  | 
|  | o Profiling dotest.py runs | 
|  |  | 
|  | I used the following command line thingy to do the profiling on a SnowLeopard | 
|  | machine: | 
|  |  | 
|  | $ DOTEST_PROFILE=YES DOTEST_SCRIPT_DIR=/Volumes/data/lldb/svn/trunk/test /System/Library/Frameworks/Python.framework/Versions/Current/lib/python2.6/cProfile.py -o my.profile ./dotest.py -v -w 2> ~/Developer/Log/lldbtest.log | 
|  |  | 
|  | After that, I used the pstats.py module to browse the statistics: | 
|  |  | 
|  | $ python /System/Library/Frameworks/Python.framework/Versions/Current/lib/python2.6/pstats.py my.profile | 
|  |  | 
|  | o Writing test cases: | 
|  |  | 
|  | We strongly prefer writing test cases using the SB API's rather than the runCmd & expect. | 
|  | Unless you are actually testing some feature of the command line, please don't write | 
|  | command based tests.  For historical reasons there are plenty of examples of tests in the | 
|  | test suite that use runCmd where they shouldn't, but don't copy them, copy the plenty that | 
|  | do use the SB API's instead. | 
|  |  | 
|  | The reason for this is that our policy is that we will maintain compatibility with the | 
|  | SB API's.  But we don't make any similar guarantee about the details of command result format. | 
|  | If your test is using the command line, it is going to have to check against the command result | 
|  | text, and you either end up writing your check  pattern by checking as little as possible so | 
|  | you won't be exposed to random changes in the text; in which case you can end up missing some | 
|  | failure, or you test too much and it means irrelevant changes break your tests. | 
|  |  | 
|  | However, if you use the Python API's it is possible to check all the results you want | 
|  | to check in a very explicit way, which makes the tests much more robust. | 
|  |  | 
|  | Even if you are testing that a command-line command does some specific thing, it is still | 
|  | better in general to use the SB API's to drive to the point where you want to run the test, | 
|  | then use SBInterpreter::HandleCommand to run the command.  You get the full result text | 
|  | from the command in the command return object, and all the part where you are driving the | 
|  | debugger to the point you want to test will be more robust. | 
|  |  | 
|  | The sample_test directory contains a standard and an "inline" test that are good starting | 
|  | points for writing a new test. | 
|  |  | 
|  | o Attaching in test cases: | 
|  |  | 
|  | If you need to attach to inferiors in your tests, you must make sure the inferior calls | 
|  | lldb_enable_attach(), before the debugger attempts to attach. This function performs any | 
|  | platform-specific processing needed to enable attaching to this process (e.g., on Linux, we | 
|  | execute prctl(PR_SET_TRACER) syscall to disable protections present in some Linux systems). |