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).
