|
|
|
/*
|
|
|
|
* Copyright © 2015 Samsung Electronics Co., Ltd
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
|
|
* a copy of this software and associated documentation files (the
|
|
|
|
* "Software"), to deal in the Software without restriction, including
|
|
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
|
|
* the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice (including the
|
|
|
|
* next paragraph) shall be included in all copies or substantial
|
|
|
|
* portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
* SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
@page zunitc zunitc
|
|
|
|
|
|
|
|
- @ref zunitc_overview
|
|
|
|
- @ref zunitc_overview_return
|
|
|
|
- @ref zunitc_execution
|
|
|
|
- @ref zunitc_execution_commandline
|
|
|
|
- @ref zunitc_execution_matching
|
|
|
|
- @ref zunitc_execution_wildcards
|
|
|
|
- @ref zunitc_execution_repeat
|
|
|
|
- @ref zunitc_execution_randomize
|
|
|
|
- @ref zunitc_fixtures
|
|
|
|
- @ref zunitc_functions
|
|
|
|
|
|
|
|
@section zunitc_overview Overview
|
|
|
|
|
|
|
|
A simple test framework in plain C suitable for basic unit and integration
|
|
|
|
testing.
|
|
|
|
|
|
|
|
The main rationale for creating this framework was to have a simple to use
|
|
|
|
testing framework with tests implemented in C using common patterns and under a
|
|
|
|
compatible license. The structure of the test code and macro use is intended to
|
|
|
|
follow common patterns established by frameworks such as Boost Test and Google
|
|
|
|
Test.
|
|
|
|
|
|
|
|
|
|
|
|
To get started, one or more tests should be defined via ZUC_TEST() and/or
|
|
|
|
ZUC_TEST_F(), which set up automatic test registration via gcc extensions.
|
|
|
|
To actually execute tests, ZUC_RUN_TESTS() should be called.
|
|
|
|
|
|
|
|
|
|
|
|
Tests can use several ZUC_ASSERT_* or ZUC_ASSERTG_* checks to validate
|
|
|
|
conditions. The ZUC_ASSERT_* ones upon failure will mark the current test
|
|
|
|
as failing and immediately execute a return. On the other hand, the
|
|
|
|
ZUC_ASSERTG_* tests will mark the current test as failed and then execute a
|
|
|
|
'goto' targeting the specified label. See @ref zunitc_overview_return for more
|
|
|
|
detail.
|
|
|
|
|
|
|
|
The set of fatal test checks are
|
|
|
|
|
|
|
|
- ZUC_ASSERT_TRUE()
|
|
|
|
- ZUC_ASSERT_FALSE()
|
|
|
|
- ZUC_ASSERT_NULL()
|
|
|
|
- ZUC_ASSERT_NOT_NULL()
|
|
|
|
- ZUC_ASSERT_EQ()
|
|
|
|
- ZUC_ASSERT_NE()
|
|
|
|
- ZUC_ASSERT_LT()
|
|
|
|
- ZUC_ASSERT_LE()
|
|
|
|
- ZUC_ASSERT_GT()
|
|
|
|
- ZUC_ASSERT_GE()
|
|
|
|
- ZUC_ASSERT_STREQ()
|
|
|
|
- ZUC_ASSERT_STRNE()
|
|
|
|
|
|
|
|
and
|
|
|
|
|
|
|
|
- ZUC_ASSERTG_TRUE()
|
|
|
|
- ZUC_ASSERTG_FALSE()
|
|
|
|
- ZUC_ASSERTG_NULL()
|
|
|
|
- ZUC_ASSERTG_NOT_NULL()
|
|
|
|
- ZUC_ASSERTG_EQ()
|
|
|
|
- ZUC_ASSERTG_NE()
|
|
|
|
- ZUC_ASSERTG_LT()
|
|
|
|
- ZUC_ASSERTG_LE()
|
|
|
|
- ZUC_ASSERTG_GT()
|
|
|
|
- ZUC_ASSERTG_GE()
|
|
|
|
- ZUC_ASSERTG_STREQ()
|
|
|
|
- ZUC_ASSERTG_STRNE()
|
|
|
|
|
|
|
|
Unconditional test values for logging and termination are
|
|
|
|
- ZUC_SKIP()
|
|
|
|
- ZUC_FATAL()
|
|
|
|
|
|
|
|
Unconditional message logging for failure cases only is
|
|
|
|
- ZUC_TRACEPOINT()
|
|
|
|
|
|
|
|
@subsection zunitc_overview_return Test Termination and Return
|
|
|
|
|
|
|
|
One key point where this framework differs from some others (especially many
|
|
|
|
common ad hoc test programs) is that it does not use assert() nor exceptions.
|
|
|
|
|
|
|
|
- does not use assert()
|
|
|
|
- can not use throw
|
|
|
|
|
|
|
|
One main implication of this is that when a check fails the current function
|
|
|
|
will be terminated via a 'return' statement and control passed back to the
|
|
|
|
calling function. If the check fails in an individual ZUC_TEST() or ZUC_TEST_F()
|
|
|
|
test function then control is returned to the framework and the current test is
|
|
|
|
deemed completed (either successfully or with failure).
|
|
|
|
|
|
|
|
On the other hand, if a check fails that is being executed in a function called
|
|
|
|
by an individual test, then control will stay in the current test. In order to
|
|
|
|
successfully exit the current test a follow-up check needs to be done after
|
|
|
|
calling functions that might cause a failure.
|
|
|
|
|
|
|
|
@code{.c}
|
|
|
|
...
|
|
|
|
|
|
|
|
/* Call a function that might contain ZUC_ASSERT_* use. */
|
|
|
|
some_helper_function();
|
|
|
|
|
|
|
|
/* Stop the current test if something failed. */
|
|
|
|
ZUC_ASSERT_FALSE(zuc_has_failure());
|
|
|
|
|
|
|
|
/* execution will only reach this point if no failures occurred. */
|
|
|
|
|
|
|
|
...
|
|
|
|
@endcode
|
|
|
|
|
|
|
|
Use of the ZUC_ASSERTG_*() variants can help in certain situations as check
|
|
|
|
failure will trigger a 'goto' statement as opposed to a general 'return'.
|
|
|
|
|
|
|
|
@code{.c}
|
|
|
|
...
|
|
|
|
|
|
|
|
/* Call a function that might contain ZUC_ASSERT_* use. */
|
|
|
|
some_helper_function();
|
|
|
|
|
|
|
|
/* Stop the current test if something failed. */
|
|
|
|
ZUC_ASSERTG_FALSE(zuc_has_failure(), err);
|
|
|
|
|
|
|
|
/* execution will only reach this point if no failures occurred. */
|
|
|
|
...
|
|
|
|
|
|
|
|
err:
|
|
|
|
free(str_a);
|
|
|
|
}
|
|
|
|
...
|
|
|
|
@endcode
|
|
|
|
|
|
|
|
@section zunitc_execution Controlling Execution
|
|
|
|
|
|
|
|
To control execution, the various zuc_set_* functions can be called
|
|
|
|
before invoking ZUC_RUN_TESTS().
|
|
|
|
|
|
|
|
@subsection zunitc_execution_commandline Command-line Parameters
|
|
|
|
|
|
|
|
The current implementation defers processing of command-line parameters
|
|
|
|
to the main application hosting the testing. It is possible that a
|
|
|
|
helper function to process certain parameters may be added.
|
|
|
|
|
|
|
|
@subsection zunitc_execution_matching Matching Patterns for Tests
|
|
|
|
|
|
|
|
The function zuc_set_filter() can be used to specify a pattern for
|
|
|
|
matching or excluding tests from a run. The general form is
|
|
|
|
match1[:match2[:match3..n]][:-exclude1[:exclude2[:exclude3..n]]]
|
|
|
|
|
|
|
|
@subsection zunitc_execution_wildcards Matching Wildcards
|
|
|
|
|
|
|
|
Wildcards can be used in the match/exclude patterns and recognize the
|
|
|
|
following two special characters:
|
|
|
|
- '*' matches any number of characters including zero.
|
|
|
|
- '?' matches any single character.
|
|
|
|
|
|
|
|
This pattern matching is consistent with other testing frameworks and
|
|
|
|
has been chosen in order to make it easier for developers to move
|
|
|
|
between different testing frameworks.
|
|
|
|
|
|
|
|
Calling zuc_list_tests() after zuc_set_filter() can be done to show the
|
|
|
|
effects of the matching without needing to actually run tests.
|
|
|
|
|
|
|
|
@subsection zunitc_execution_repeat Repeating Tests
|
|
|
|
|
|
|
|
Setting the repeat count higher than 1 ( via zuc_set_repeat() ) will
|
|
|
|
cause the tests to be executed several times in a row. This can be
|
|
|
|
useful for stress testing, checking for leaks, etc.
|
|
|
|
|
|
|
|
@subsection zunitc_execution_randomize Randomizing Tests
|
|
|
|
|
|
|
|
Test ordering can be randomized by setting a non-zero positive value to
|
|
|
|
zuc_set_random(). Setting it to 1 will cause the framework to pick a
|
|
|
|
random seed based on the time. A value greater than 1 will be taken as a
|
|
|
|
random seed itself. And setting it to 0 will disable randomization and
|
|
|
|
allow the tests to be executed in their natural ordering.
|
|
|
|
|
|
|
|
@section zunitc_fixtures Fixtures
|
|
|
|
|
|
|
|
Per-suite and per-test setup and teardown fixtures can be implemented by
|
|
|
|
defining an instance of struct zuc_fixture and using it as the first
|
|
|
|
parameter to ZUC_TEST_F().
|
|
|
|
|
|
|
|
@section zunitc_functions Functions
|
|
|
|
|
|
|
|
- ZUC_TEST()
|
|
|
|
- ZUC_TEST_F()
|
|
|
|
- ZUC_RUN_TESTS()
|
|
|
|
- zuc_cleanup()
|
|
|
|
- zuc_list_tests()
|
|
|
|
- zuc_set_filter()
|
|
|
|
- zuc_set_random()
|
|
|
|
- zuc_set_spawn()
|
|
|
|
- zuc_set_output_junit()
|
|
|
|
- zuc_has_skip()
|
|
|
|
- zuc_has_failure()
|
|
|
|
|
|
|
|
*/
|