/**

@mainpage

This is the online reference for developing with the cmocka library. It
documents the cmocka C API.

cmocka is an elegant unit testing framework for C with support for mock
objects. It only requires the standard C library, works on a lot of platforms
(including embedded) and with different compilers.

http://cmocka.org/

@section main-features Features

Tests written with cmocka are compiled into stand-alone executables and linked with the
CMock library, the standard C library and module being tested. Any symbols
external to the module being tested should be mocked - replaced with functions
that return values determined by the test - within the test application. Even
though significant differences may exist between the target execution
environment of a code module and the environment used to test the code the unit
testing is still valid since its goal is to test the logic of a code modules at
a functional level and not necessarily all of its interactions with the target
execution environment.

The CMocka library provides:

 - Support for mock objects.
 - Test fixtures.
 - Only requires a C library
 - Exception handling for signals (SIGSEGV, SIGILL, ...)
 - No use of fork()
 - Very well tested
 - Testing of memory leaks, buffer overflows and underflows.
 - A set of assert macros.
 - Several supported output formats (stdout, TAP, xUnit XML, Subunit)
 - License: Apache License 2.0

@section main-test A cmocka test

Test cases are functions with the signature void function(void **state).  Test
applications initialize a table with test case function pointers using
unit_test() macros. This table is then passed to the run_tests() macro to
execute the tests. run_tests() sets up the appropriate exception / signal
handlers and other data structures prior to running each test function. When a
unit test is complete run_tests() performs various checks to determine whether
the test succeeded.

@code
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

/* A test case that does nothing and succeeds. */
static void null_test_success(void **state) {
    (void) state; /* unused */
}

int main(void) {
    const struct CMUnitTest tests[] = {
        cmocka_unit_test(null_test_success),
    };

    return cmocka_run_group_tests(tests, NULL, NULL);
}
@endcode

@section main-mock Mock objects

You may already have heard the term "Mock Object". It describes a special case
of an object that mimics a real instance of an interface in order to provide
enough of that interface for testing. While there are several unit testing
frameworks that already provide some easy to use interface for creating
different kinds of "fake" objects for testing, there may be some confusion in
terms of how these test objects are programmed and what the behavioral
differences are between them.

Mock objects include some logic and the test driver is able to modify the
behaviour and state. The object can call some functions or act on different
input (abort a test if it is wrong). The test driver injects what it expects
the mock object to return. CMocka provides and API to easily mock code.

<a href="https://lwn.net/Articles/558106/">Learn more ...</a>

@section main-embedded Embedded platforms

It is possible that some embedded platforms do not provide definitions for
required types or that the guards to protect them are not defined. To address
this issue you can create a header file name 'cmocka_platform.h' with the
required types and definitions. After that point cmake to the include directory
using:

<pre>
    cmake -DCMOCKA_PLATFORM_INCLUDE=/home/compiler/my/include_directory ..
</pre>

@section main-threads Threading

cmocka is not fully thread safe and it is not the goal of it to be it. We have
several global variables to track test states. They are marked as thread local
but it is possible that you still run into issues. However if you use cmocka
for writing tests in an application which uses threads, you can set the
following envionment variable:

<pre>
    CMOCKA_TEST_ABORT='1' ./my_threading_test
</pre>

With this environment variable set to '1', cmocka will call <tt>abort()</tt> if
a test fails.

@section main-output Output formats

By default, cmocka prints human-readable test output to stderr. It is
possible to configure several other output formats.  The configuration is
done using the <tt>CMOCKA_MESSAGE_OUTPUT</tt> environment variable. The
supported values are:
 - <tt>STDOUT</tt> for the default standard output printer
 - <tt>SUBUNIT</tt> for subunit output
 - <tt>TAP</tt> for Test Anything Protocol (TAP) output
 - <tt>XML</tt> for xUnit XML format
The case doesn't matter.

The XML output goes to stderr by default. If the environment variable
<tt>CMOCKA_XML_FILE</tt> exists and the file specified by this variable
doesn't exist yet, then cmocka will put the output to this file. Note
that if you are have several groups you should set <tt>CMOCKA_XML_FILE</tt>
to <tt>CMOCKA_XML_FILE=cm_%%g.xml</tt>. In this %g will be replaced by
the group_name of the test and a file will be created for each group,
othwerwise all groups will be printed into the same file.

*/
