
Unit test

This directory contains the unit test support for the RMr
library.  The basic test is run with the follwing command:

	ksh unit_test.ksh

To run a specific test (e.g. ring_test.c) run:
	ksh unit_test.ksh ring_test.c

The script runs the unit test(s) given, and if they pass then
runs an analysis on the .gcov files generated to generate
coverage information.  By default, pass/fail of the test is
based only on the success or failure of the unit tests which
are testing functionality.  The unit test script can report
an overall failure if coverage is below the indicated threshold
when given the strict option (-s).

The analysis of .gcov files generates output shown below which
is thought to be more straight forward than the typical stuff
gcov produces:

unit_test.ksh ring_test.c
ring_test.c --------------------------------------
[OK]   100% uta_ring_insert
[OK]   100% uta_ring_extract
[OK]   100% uta_ring_free
[LOW]   76% uta_mk_ring
[PASS]  91% ../src/common/src/ring_static.c


The output shows, for each function, the coverage (column 2) and an
interpretation (ok or low) wthin an overall pass or fail.


Because of the static nature of the RMr library, tests with the
intent of providing coverage information, as opposed just to providing
functional verification, are a bit trickier.  To that end, the test
files in this directory are organised with three file name formats:

	test_*.c  tools for testing, not tests

	*_test.c  main test programmes which can be compiled in
			  a stand-alone manner (e.g. gcc foo_test.c)

	*_static_test.c  Test functions which are real tests and are
			  included by one or more stand-alone driver.

The unit_test script will search only for *_test.c and will ignore
*_static_test.c files when building it's list for testing.


Use the command 'unit_test.ksh -?' to see the usage information
and complete set of options available.


Merging .gcov files
As some unit test programmes may not be able/designed to cover all 
of a module completely, the script will merge each .gcov prooduced
with the prior, matching, file after each pass.  The result is a
final .gcov file that shows the coverage of the module over all 
tests.  This allows a true coverage value to be determined while 
permitting more simple tests to be used without the requirement of
each test to cover everything.


Discounting
The unit test script makes a discount pass on low coverage files in
attempt to discount the coverage rate by ignoring what are considered
to be difficult to reach blocks in the code.  Currently, these blocks
are limited to what appear to be tests for memory allocation, failure
and/or nil pointer handling.  If code blocks of this sort are found,
they are not counted against the coverage for the module.  If the -v
option is given, an augmented coverage listing is saved in .dcov which
shows the discounted lines with a string of equal signs (====) rather
than the gcov hash string (###).

The discount check is applied only if an entire module has a lower
than accepted coverage rate, and can be forced for all modules with
the -f option.

To illustrate, the following code checks the return from the system
library strdup() call which is very unlikely to fail under test without
going to extremes and substituting for the system lib.  Thus, the
block which checks for a nil pointer has been discounted:

     -:  354:
     1:  355:    dbuf = strdup( buf );
     1:  356:    if( dbuf == NULL  ) {
 =====:  357:        errno = ENOMEM;
 =====:  358:        return 0;
     -:  359:    }

A final discount pass is made on all merged .gcov files after all unit 
tests are finished. This final pass should indicate the true discounted
coverage


Target Coverage
By default, a target coverage of 80% is used. For some modules this may
be impossible to achieve, so to prevent always failing these modules
may be listed in the .targets file with their expected minimum coverage.
Module names need to be qualified (e.g. ../src/common/src/foo.c.


Sonar XML Files
If the -x option is given on the unit test script, then two XML files 
will be generated for Sonar.  These are gcov.xml and dcov.xml and are 
the coverage information as reflected in the merged .gcov files and in
the .dcov files produced during the final pass.   The XML files should
be uploaded to Sonar only after a complete unit test run is made, otherwise
the coverage information may be lacking (reflecting only the last test
executed and not a full complement of tests).

-----------------------------------------------------------------------
A note about ksh (A.K.A Korn shell, or kshell)
Ksh is preferred for more complex scripts such as the unit test
script as it does not have some of the limitations that bash
(and other knock-offs) have.
