tdc - Adding plugins for tdc

Author: Brenda J. Butler - bjb@mojatatu.com

ADDING PLUGINS
--------------

A new plugin should be written in python as a class that inherits from TdcPlugin.
There are some examples in plugin-lib.

The plugin can be used to add functionality to the test framework,
such as:

- adding commands to be run before and/or after the test suite
- adding commands to be run before and/or after the test cases
- adding commands to be run before and/or after the execute phase of the test cases
- ability to alter the command to be run in any phase:
    pre        (the pre-suite stage)
    prepare
    execute
    verify
    teardown
    post       (the post-suite stage)
- ability to add to the command line args, and use them at run time


The functions in the class should follow the following interfaces:

    def __init__(self)
    def pre_suite(self, testcount, testidlist)     # see "PRE_SUITE" below
    def post_suite(self, ordinal)                  # see "SKIPPING" below
    def pre_case(self, test_ordinal, testid)       # see "PRE_CASE" below
    def post_case(self)
    def pre_execute(self)
    def post_execute(self)
    def adjust_command(self, stage, command)       # see "ADJUST" below
    def add_args(self, parser)                     # see "ADD_ARGS" below
    def check_args(self, args, remaining)          # see "CHECK_ARGS" below


PRE_SUITE

This method takes a testcount (number of tests to be run) and
testidlist (array of test ids for tests that will be run).  This is
useful for various things, including when an exception occurs and the
rest of the tests must be skipped.  The info is stored in the object,
and the post_suite method can refer to it when dumping the "skipped"
TAP output.  The tdc.py script will do that for the test suite as
defined in the test case, but if the plugin is being used to run extra
tests on each test (eg, check for memory leaks on associated
co-processes) then that other tap output can be generated in the
post-suite method using this info passed in to the pre_suite method.


SKIPPING

The post_suite method will receive the ordinal number of the last
test to be attempted.  It can use this info when outputting
the TAP output for the extra test cases.


PRE_CASE

The pre_case method will receive the ordinal number of the test
and the test id.  Useful for outputing the extra test results.


ADJUST

The adjust_command method receives a string representing
the execution stage and a string which is the actual command to be
executed.  The plugin can adjust the command, based on the stage of
execution.

The stages are represented by the following strings:

    'pre'
    'setup'
    'command'
    'verify'
    'teardown'
    'post'

The adjust_command method must return the adjusted command so tdc
can use it.


ADD_ARGS

The add_args method receives the argparser object and can add
arguments to it.  Care should be taken that the new arguments do not
conflict with any from tdc.py or from other plugins that will be used
concurrently.

The add_args method should return the argparser object.


CHECK_ARGS

The check_args method is so that the plugin can do validation on
the args, if needed.  If there is a problem, and Exception should
be raised, with a string that explains the problem.

eg:  raise Exception('plugin xxx, arg -y is wrong, fix it')
