/* * 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() */