This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
commit f0f94a1235e11a1623024585bb53602aa5feb051 Author: yangjiao <[email protected]> AuthorDate: Tue Aug 15 16:39:29 2023 +0800 testing/cmocka:add a patch. cmocka modification upload Nuttx community preparation: upload a patch with recent changes for cmocka source code. Signed-off-by: yangjiao <[email protected]> --- ...regex-and-add-list-all-testcases-function.patch | 288 +++++++++++++++++++++ testing/cmocka/Makefile | 1 + 2 files changed, 289 insertions(+) diff --git a/testing/cmocka/0003-cmocka-update-method-for-strmatch-to-regex-and-add-list-all-testcases-function.patch b/testing/cmocka/0003-cmocka-update-method-for-strmatch-to-regex-and-add-list-all-testcases-function.patch new file mode 100644 index 000000000..235b87ee9 --- /dev/null +++ b/testing/cmocka/0003-cmocka-update-method-for-strmatch-to-regex-and-add-list-all-testcases-function.patch @@ -0,0 +1,288 @@ +--- a/src/cmocka.c 2023-08-15 15:54:57.439010743 +0800 ++++ cmocka/src/cmocka.c 2023-08-15 15:53:54.240452568 +0800 +@@ -45,6 +45,9 @@ + #include <stdbool.h> + #include <time.h> + #include <float.h> ++#include <regex.h> ++#include <mqueue.h> ++#include <fcntl.h> + + /* + * This allows to add a platform specific header file. Some embedded platforms +@@ -269,6 +272,7 @@ + const char *global_last_failed_assert = NULL; + static int global_skip_test; + static int global_stop_test; ++static int global_list_test; + + /* Keeps a map of the values that functions will have to return to provide */ + /* mocked interfaces. */ +@@ -474,62 +478,18 @@ + return 0; + } + +-static int c_strmatch(const char *str, const char *pattern) +-{ +- int ok; ++static int c_regexmatch(const char *str, const char *pattern){ ++ regex_t re; ++ int ret; + +- if (str == NULL || pattern == NULL) { ++ ret = regcomp(&re, pattern, REG_EXTENDED | REG_NOSUB); ++ if (ret != 0){ + return 0; + } ++ ret = regexec(&re, str, 0, NULL, 0); ++ regfree(&re); + +- for (;;) { +- /* Check if pattern is done */ +- if (*pattern == '\0') { +- /* If string is at the end, we're good */ +- if (*str == '\0') { +- return 1; +- } +- +- return 0; +- } +- +- if (*pattern == '*') { +- /* Move on */ +- pattern++; +- +- /* If we are at the end, everything is fine */ +- if (*pattern == '\0') { +- return 1; +- } +- +- /* Try to match each position */ +- for (; *str != '\0'; str++) { +- ok = c_strmatch(str, pattern); +- if (ok) { +- return 1; +- } +- } +- +- /* No match */ +- return 0; +- } +- +- /* If we are at the end, leave */ +- if (*str == '\0') { +- return 0; +- } +- +- /* Check if we have a single wildcard or matching char */ +- if (*pattern != '?' && *str != *pattern) { +- return 0; +- } +- +- /* Move string and pattern */ +- str++; +- pattern++; +- } +- +- return 0; ++ return (ret == 0)? 1 : 0; + } + + /* Create function results and expected parameter lists. */ +@@ -1850,7 +1810,7 @@ + { + if (result < 0) { + if (error > 0) { +- cmocka_print_error("%s < 0, errno(%d): %s\n", ++ cmocka_print_error("%s < 0, errno(%"PRIi32"): %s\n", + expression, + error, + strerror(error)); +@@ -2667,21 +2627,21 @@ + print_message("[==========] %s: %zu test(s) run.\n", + group_name, + total_executed); +- print_error("[ PASSED ] %u test(s).\n", ++ print_message("[ PASSED ] %u test(s).\n", + (unsigned)(total_passed)); + + if (total_skipped) { +- print_error("[ SKIPPED ] %s: %zu test(s), listed below:\n", ++ print_message("[ SKIPPED ] %s: %zu test(s), listed below:\n", + group_name, + total_skipped); + for (i = 0; i < total_executed; i++) { + struct CMUnitTestState *cmtest = &cm_tests[i]; + + if (cmtest->status == CM_TEST_SKIPPED) { +- print_error("[ SKIPPED ] %s\n", cmtest->test->name); ++ print_message("[ SKIPPED ] %s\n", cmtest->test->name); + } + } +- print_error("\n %zu SKIPPED TEST(S)\n", total_skipped); ++ print_message("\n %zu SKIPPED TEST(S)\n", total_skipped); + } + + if (total_failed) { +@@ -2918,6 +2878,11 @@ + global_skip_filter_pattern = pattern; + } + ++void cmocka_set_list_test(int list_test) ++{ ++ global_list_test = list_test; ++} ++ + /**************************************************************************** + * TIME CALCULATIONS + ****************************************************************************/ +@@ -3194,10 +3159,26 @@ + double total_runtime = 0; + size_t i; + int rc; ++ mqd_t mq_id; + + /* Make sure uintmax_t is at least the size of a pointer. */ + assert_true(sizeof(uintmax_t) >= sizeof(void*)); + ++ /* Display name of testcase/testsuite but not run */ ++ if (global_list_test) { ++ print_message("%s\n", group_name); ++ for (i = 0; i < num_tests; i++) { ++ if (tests[i].name != NULL && ++ (tests[i].test_func != NULL ++ || tests[i].setup_func != NULL ++ || tests[i].teardown_func != NULL)) { ++ print_message("%4s%s\n", "", tests[i].name); ++ }; ++ } ++ ++ return 0; ++ } ++ + cm_tests = libc_calloc(1, sizeof(struct CMUnitTestState) * num_tests); + if (cm_tests == NULL) { + return -1; +@@ -3209,10 +3190,15 @@ + (tests[i].test_func != NULL + || tests[i].setup_func != NULL + || tests[i].teardown_func != NULL)) { ++ cm_tests[total_tests] = (struct CMUnitTestState) { ++ .test = &tests[i], ++ .status = CM_TEST_NOT_STARTED, ++ .state = NULL, ++ }; + if (global_test_filter_pattern != NULL) { + int match; + +- match = c_strmatch(tests[i].name, global_test_filter_pattern); ++ match = c_regexmatch(tests[i].name, global_test_filter_pattern); + if (!match) { + continue; + } +@@ -3220,16 +3206,11 @@ + if (global_skip_filter_pattern != NULL) { + int match; + +- match = c_strmatch(tests[i].name, global_skip_filter_pattern); ++ match = c_regexmatch(tests[i].name, global_skip_filter_pattern); + if (match) { +- continue; ++ cm_tests[i].status = CM_TEST_SKIPPED; + } + } +- cm_tests[total_tests] = (struct CMUnitTestState) { +- .test = &tests[i], +- .status = CM_TEST_NOT_STARTED, +- .state = NULL, +- }; + total_tests++; + } + } +@@ -3261,9 +3242,11 @@ + cmtest->state = cmtest->test->initial_state; + } + +- rc = cmocka_run_one_tests(cmtest); ++ if (cmtest->status != CM_TEST_SKIPPED) { ++ rc = cmocka_run_one_tests(cmtest); ++ total_runtime += cmtest->runtime; ++ } + total_executed++; +- total_runtime += cmtest->runtime; + if (rc == 0) { + switch (cmtest->status) { + case CM_TEST_PASSED: +@@ -3296,7 +3279,7 @@ + break; + } + } else { +- char err_msg[2048] = {0}; ++ char err_msg[256] = {0}; + + snprintf(err_msg, sizeof(err_msg), + "Could not run test: %s", +@@ -3347,6 +3330,24 @@ + total_runtime, + cm_tests); + ++ mq_id = mq_open(CMOCKA_QUEUE_NAME, O_WRONLY); ++ if (mq_id != (mqd_t)-1) { ++ struct cm_summary_counter summary_send = {total_tests, ++ total_failed, ++ total_passed, ++ total_executed, ++ total_errors, ++ total_skipped}; ++ if (mq_send(mq_id, ++ (const char *)&summary_send, ++ sizeof(summary_send), ++ 0) < 0) { ++ perror("mq_send"); ++ } ++ ++ mq_close(mq_id); ++ } ++ + for (i = 0; i < total_tests; i++) { + vcm_free_error(discard_const_p(char, cm_tests[i].error_message)); + } +--- a/include/cmocka.h 2022-09-06 02:12:20.000000000 +0800 ++++ cmocka/include/cmocka.h 2023-08-15 15:53:54.240452568 +0800 +@@ -2279,6 +2279,20 @@ + uintmax_t check_value_data; + } CheckParameterEvent; + ++/* Mutiple suite run summary counter. */ ++#define CMOCKA_QUEUE_NAME "/tmp/cmocka" ++#define CMOCKA_MAX_MSG_SIZE 128 ++#define CMOCKA_MAX_MSG_NUM 15 ++ ++typedef struct cm_summary_counter { ++ int tests; ++ int failed; ++ int passed; ++ int executed; ++ int errors; ++ int skipped; ++} cm_summary_counter; ++ + /* Used by expect_assert_failure() and mock_assert(). */ + extern int global_expecting_assert; + extern jmp_buf global_expect_assert_env; +@@ -2517,6 +2531,15 @@ + */ + void cmocka_set_skip_filter(const char *pattern); + ++/** ++ * @brief Set a flag to list testcase name only. ++ * ++ * This set global list_tests flag to indicate whether to list only, ++ * if list_tests is 1, list only. ++ * ++ * @param list_tests 0 or 1. ++ */ ++void cmocka_set_list_test(int list_test); + /** @} */ + + #endif /* CMOCKA_H_ */ diff --git a/testing/cmocka/Makefile b/testing/cmocka/Makefile index fc852e37f..d887ef180 100644 --- a/testing/cmocka/Makefile +++ b/testing/cmocka/Makefile @@ -41,6 +41,7 @@ cmocka.zip: $(Q) mv cmocka-$(VERSION) cmocka $(Q) patch -p0 < 0001-cmocka.c-Reduce-the-call-stack-consumption-of-printf.patch $(Q) patch -p0 < 0002-cmocka-feature-to-forwarding-cmocka-log-message-to-c.patch + $(Q) patch -p0 < 0003-cmocka-update-method-for-strmatch-to-regex-and-add-list-all-testcases-function.patch context:: cmocka.zip
