From 2c92af5a802817dc70b350022895ea7880985d66 Mon Sep 17 00:00:00 2001 From: Ningx Zhao Date: Thu, 4 Jun 2020 17:27:41 +0800 Subject: [PATCH] tests: dlist to add a testcase and add some tags Add a testcase to verify some operations running in constant time. Add new informative Doxygen tags Signed-off-by: Ningx Zhao --- tests/unit/list/dlist.c | 83 ++++++++++++++++++++++++++++++++++++++++- tests/unit/list/main.c | 2 + 2 files changed, 83 insertions(+), 2 deletions(-) diff --git a/tests/unit/list/dlist.c b/tests/unit/list/dlist.c index 9bec411c44..1eaffa5697 100644 --- a/tests/unit/list/dlist.c +++ b/tests/unit/list/dlist.c @@ -6,6 +6,7 @@ #include #include +#include "time.h" static sys_dlist_t test_list; @@ -161,13 +162,91 @@ static inline bool verify_tail_head(sys_dlist_t *list, return true; } + +static enum dlist_perf_stats {PEEK_HEAD_TAIL, INSERT_REMOVE} operation; +clock_t check_dlist_perf(sys_dlist_t *test_dlist, size_t size) +{ + struct container_node node_ii[30] = {0}; + struct container_node test_node; + + sys_dlist_init(test_dlist); + zassert_true(sys_dlist_is_empty(test_dlist), NULL); + + /*avoid that array index is overflow*/ + size = size < 30 ? size : 30; + + for (int i = 0; i < size; i++) { + sys_dlist_append(test_dlist, &node_ii[i].node); + } + + clock_t start = 0, finish = 0; + + start = clock(); + for (int i = 0; i < 10000; i++) { + switch (operation) { + case PEEK_HEAD_TAIL: + sys_dlist_peek_head(test_dlist); + sys_dlist_peek_tail(test_dlist); + break; + case INSERT_REMOVE: + sys_dlist_insert(&node_ii[size/2].node, + &test_node.node); + sys_dlist_remove(&test_node.node); + break; + default: + /*Just running without no operations*/ + break; + } + } + finish = clock(); + + return finish - start; +} + +void check_some_operations(enum dlist_perf_stats op) +{ + clock_t const_time[3] = {0}; + + operation = op; + /*test list size is 10 nodes*/ + const_time[0] = check_dlist_perf(&test_list, 10); + /*test list size is 20 nodes*/ + const_time[1] = check_dlist_perf(&test_list, 20); + /*test list size is 30 nodes*/ + const_time[2] = check_dlist_perf(&test_list, 30); + + zassert_within(const_time[0], const_time[1], 20, NULL); + zassert_within(const_time[1], const_time[2], 20, NULL); +} /** * @addtogroup unit_tests * @{ */ /** - * @brief Verify doubly linked list funtionalities + * @brief test dlist some operations running in constant time. + * + * @details + * Define a double list, and record the time of running some + * operations by API clock() in usr/libc of native posix platform + * Verify some operations running in constant time. + * + * @ingroup lib_list_tests + * + * @see sys_dlist_peek_head(), sys_dlist_peek_tail(), + * sys_dlist_insert(), sys_dlist_remove(). + */ +void test_check_dlist_perf(void) +{ + /**TESTPOINT: test peek head and tail in constant time*/ + check_some_operations(PEEK_HEAD_TAIL); + /**TESTPOINT: test insert and remove in constant time*/ + check_some_operations(INSERT_REMOVE); +} + + +/** + * @brief Verify doubly linked list functionalities * * @see sys_dlist_append(), sys_dlist_remove(), sys_dlist_prepend(), * sys_dlist_remove(), sys_dlist_insert(), sys_dlist_peek_next() @@ -281,7 +360,7 @@ void test_dlist(void) zassert_true((verify_emptyness(&test_list)), "test_list should be empty"); - /* test iterator from a node */ + /* test iterator of "for each" style from a node */ struct data_node { sys_dnode_t node; int data; diff --git a/tests/unit/list/main.c b/tests/unit/list/main.c index e37dfb1c98..9719009e20 100644 --- a/tests/unit/list/main.c +++ b/tests/unit/list/main.c @@ -9,11 +9,13 @@ extern void test_slist(void); extern void test_sflist(void); extern void test_dlist(void); +extern void test_check_dlist_perf(void); void test_main(void) { ztest_test_suite(dlist, ztest_unit_test(test_dlist), + ztest_unit_test(test_check_dlist_perf), ztest_unit_test(test_slist), ztest_unit_test(test_sflist) );