Implement test suite initialization and termination
This patch adds test suite initialization and termination support to both
C/bash and Python implementations.
Any exported function in a test suite that starts with "mu_init" is used
as an initialization function (returning 0 if the initialization
succeeded) and any function starting with "mu_term" is used as
a termination function. If initialization fails (any initialization
funtion fails), the test suite is skipped.
This makes easier to improve the tester code, without having to code it as
a shell script embedded string. Now the only generated code is the one
that runs the test suites. You can also implement your own test suites
execution function; just write it in a separated C module and don't use
the mkmutest generator.
A new implementation is added. This implementation is dynamic. Test suites
must be compiled as dynamically linked shared objects (.so) and a Python
program (using ctypes module) inspects the shared objects, looking for
test cases, running them and collecting statistics.
The advantage of this implementation is that test suites are completely
isolated, name clashes between test suites can't be possible. The testing
program is completely decoupled from the test suites, and is less
"hackish", in the sense that no code-generation is needed. You compile
your test suites as shared object, and run the tester on them, that's it.
Is much easier to extend too, since is implemented in Python.
The downside is that the test suites are less "debuggeable", you can't
easily plug a gdb to see what's going on there (AFAIK). tmp