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