xref: /nrf52832-nimble/rt-thread/components/utilities/utest/utest.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2018-11-19     MurphyZhao   the first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #include <rtthread.h>
12*10465441SEvalZero #include <string.h>
13*10465441SEvalZero #include "utest.h"
14*10465441SEvalZero #include <utest_log.h>
15*10465441SEvalZero 
16*10465441SEvalZero #undef DBG_SECTION_NAME
17*10465441SEvalZero #undef DBG_LEVEL
18*10465441SEvalZero #undef DBG_COLOR
19*10465441SEvalZero #undef DBG_ENABLE
20*10465441SEvalZero 
21*10465441SEvalZero #define DBG_ENABLE
22*10465441SEvalZero #define DBG_SECTION_NAME          "utest"
23*10465441SEvalZero #ifdef UTEST_DEBUG
24*10465441SEvalZero #define DBG_LEVEL                 DBG_LOG
25*10465441SEvalZero #else
26*10465441SEvalZero #define DBG_LEVEL                 DBG_INFO
27*10465441SEvalZero #endif
28*10465441SEvalZero #define DBG_COLOR
29*10465441SEvalZero #include <rtdbg.h>
30*10465441SEvalZero 
31*10465441SEvalZero #if RT_CONSOLEBUF_SIZE < 256
32*10465441SEvalZero #error "RT_CONSOLEBUF_SIZE is less than 256!"
33*10465441SEvalZero #endif
34*10465441SEvalZero 
35*10465441SEvalZero static rt_uint8_t utest_log_lv = UTEST_LOG_ALL;
36*10465441SEvalZero static utest_tc_export_t tc_table = RT_NULL;
37*10465441SEvalZero static rt_size_t tc_num;
38*10465441SEvalZero static struct utest local_utest = {UTEST_PASSED, 0, 0};
39*10465441SEvalZero 
40*10465441SEvalZero #if defined(__ICCARM__) || defined(__ICCRX__)         /* for IAR compiler */
41*10465441SEvalZero #pragma section="UtestTcTab"
42*10465441SEvalZero #endif
43*10465441SEvalZero 
utest_log_lv_set(rt_uint8_t lv)44*10465441SEvalZero void utest_log_lv_set(rt_uint8_t lv)
45*10465441SEvalZero {
46*10465441SEvalZero     if (lv == UTEST_LOG_ALL || lv == UTEST_LOG_ASSERT)
47*10465441SEvalZero     {
48*10465441SEvalZero         utest_log_lv = lv;
49*10465441SEvalZero     }
50*10465441SEvalZero }
51*10465441SEvalZero 
utest_init(void)52*10465441SEvalZero int utest_init(void)
53*10465441SEvalZero {
54*10465441SEvalZero     /* initialize the utest commands table.*/
55*10465441SEvalZero #if defined(__CC_ARM)                                 /* ARM C Compiler */
56*10465441SEvalZero     extern const int UtestTcTab$$Base;
57*10465441SEvalZero     extern const int UtestTcTab$$Limit;
58*10465441SEvalZero     tc_table = (utest_tc_export_t)&UtestTcTab$$Base;
59*10465441SEvalZero     tc_num = (utest_tc_export_t)&UtestTcTab$$Limit - tc_table;
60*10465441SEvalZero #elif defined (__ICCARM__) || defined(__ICCRX__)      /* for IAR Compiler */
61*10465441SEvalZero     tc_table = (utest_tc_export_t)__section_begin("UtestTcTab");
62*10465441SEvalZero     tc_num = (utest_tc_export_t)__section_end("UtestTcTab") - tc_table;
63*10465441SEvalZero #elif defined (__GNUC__)                              /* for GCC Compiler */
64*10465441SEvalZero     extern const int __rt_utest_tc_tab_start;
65*10465441SEvalZero     extern const int __rt_utest_tc_tab_end;
66*10465441SEvalZero     tc_table = (utest_tc_export_t)&__rt_utest_tc_tab_start;
67*10465441SEvalZero     tc_num = (utest_tc_export_t) &__rt_utest_tc_tab_end - tc_table;
68*10465441SEvalZero #endif /* defined(__CC_ARM) */
69*10465441SEvalZero 
70*10465441SEvalZero     LOG_I("utest is initialize success.");
71*10465441SEvalZero     LOG_I("total utest testcase num: (%d)", tc_num);
72*10465441SEvalZero     return tc_num;
73*10465441SEvalZero }
74*10465441SEvalZero INIT_COMPONENT_EXPORT(utest_init);
75*10465441SEvalZero 
utest_tc_list(void)76*10465441SEvalZero static void utest_tc_list(void)
77*10465441SEvalZero {
78*10465441SEvalZero     rt_size_t i = 0;
79*10465441SEvalZero 
80*10465441SEvalZero     LOG_I("Commands list : ");
81*10465441SEvalZero 
82*10465441SEvalZero     for (i = 0; i < tc_num; i++)
83*10465441SEvalZero     {
84*10465441SEvalZero         LOG_I("[testcase name]:%s; [run timeout]:%d", tc_table[i].name, tc_table[i].run_timeout);
85*10465441SEvalZero     }
86*10465441SEvalZero }
87*10465441SEvalZero MSH_CMD_EXPORT_ALIAS(utest_tc_list, utest_list, output all utest testcase);
88*10465441SEvalZero 
file_basename(const char * file)89*10465441SEvalZero static const char *file_basename(const char *file)
90*10465441SEvalZero {
91*10465441SEvalZero     char *end_ptr = RT_NULL;
92*10465441SEvalZero     char *rst = RT_NULL;
93*10465441SEvalZero 
94*10465441SEvalZero     if (!((end_ptr = strrchr(file, '\\')) != RT_NULL || \
95*10465441SEvalZero         (end_ptr = strrchr(file, '/')) != RT_NULL) || \
96*10465441SEvalZero         (rt_strlen(file) < 2))
97*10465441SEvalZero     {
98*10465441SEvalZero         rst = (char *)file;
99*10465441SEvalZero     }
100*10465441SEvalZero     else
101*10465441SEvalZero     {
102*10465441SEvalZero         rst = (char *)(end_ptr + 1);
103*10465441SEvalZero     }
104*10465441SEvalZero     return (const char *)rst;
105*10465441SEvalZero }
106*10465441SEvalZero 
utest_run(const char * utest_name)107*10465441SEvalZero static void utest_run(const char *utest_name)
108*10465441SEvalZero {
109*10465441SEvalZero     rt_size_t i = 0;
110*10465441SEvalZero 
111*10465441SEvalZero     LOG_I("[==========] [ utest    ] started");
112*10465441SEvalZero     while(i < tc_num)
113*10465441SEvalZero     {
114*10465441SEvalZero         if (utest_name && rt_strcmp(utest_name, tc_table[i].name))
115*10465441SEvalZero         {
116*10465441SEvalZero             i++;
117*10465441SEvalZero             continue;
118*10465441SEvalZero         }
119*10465441SEvalZero 
120*10465441SEvalZero         LOG_I("[----------] [ testcase ] (%s) started", tc_table[i].name);
121*10465441SEvalZero         if (tc_table[i].init != RT_NULL)
122*10465441SEvalZero         {
123*10465441SEvalZero             if (tc_table[i].init() != RT_EOK)
124*10465441SEvalZero             {
125*10465441SEvalZero                 LOG_E("[  FAILED  ] [ result   ] testcase (%s)", tc_table[i].name);
126*10465441SEvalZero                 goto __tc_continue;
127*10465441SEvalZero             }
128*10465441SEvalZero         }
129*10465441SEvalZero 
130*10465441SEvalZero         if (tc_table[i].tc != RT_NULL)
131*10465441SEvalZero         {
132*10465441SEvalZero             tc_table[i].tc();
133*10465441SEvalZero             if (local_utest.failed_num == 0)
134*10465441SEvalZero             {
135*10465441SEvalZero                 LOG_I("[  PASSED  ] [ result   ] testcase (%s)", tc_table[i].name);
136*10465441SEvalZero             }
137*10465441SEvalZero             else
138*10465441SEvalZero             {
139*10465441SEvalZero                 LOG_E("[  FAILED  ] [ result   ] testcase (%s)", tc_table[i].name);
140*10465441SEvalZero             }
141*10465441SEvalZero         }
142*10465441SEvalZero         else
143*10465441SEvalZero         {
144*10465441SEvalZero             LOG_E("[  FAILED  ] [ result   ] testcase (%s)", tc_table[i].name);
145*10465441SEvalZero         }
146*10465441SEvalZero 
147*10465441SEvalZero         if (tc_table[i].cleanup != RT_NULL)
148*10465441SEvalZero         {
149*10465441SEvalZero             if (tc_table[i].cleanup() != RT_EOK)
150*10465441SEvalZero             {
151*10465441SEvalZero                 LOG_E("[  FAILED  ] [ result   ] testcase (%s)", tc_table[i].name);
152*10465441SEvalZero                 goto __tc_continue;
153*10465441SEvalZero             }
154*10465441SEvalZero         }
155*10465441SEvalZero 
156*10465441SEvalZero __tc_continue:
157*10465441SEvalZero         LOG_I("[----------] [ testcase ] (%s) finished", tc_table[i].name);
158*10465441SEvalZero 
159*10465441SEvalZero         i++;
160*10465441SEvalZero     }
161*10465441SEvalZero     LOG_I("[==========] [ utest    ] finished");
162*10465441SEvalZero }
163*10465441SEvalZero 
utest_testcase_run(int argc,char ** argv)164*10465441SEvalZero static void utest_testcase_run(int argc, char** argv)
165*10465441SEvalZero {
166*10465441SEvalZero     char utest_name[UTEST_NAME_MAX_LEN];
167*10465441SEvalZero 
168*10465441SEvalZero     if (argc == 1)
169*10465441SEvalZero     {
170*10465441SEvalZero         utest_run(RT_NULL);
171*10465441SEvalZero     }
172*10465441SEvalZero     else if (argc == 2)
173*10465441SEvalZero     {
174*10465441SEvalZero         rt_memset(utest_name, 0x0, sizeof(utest_name));
175*10465441SEvalZero         rt_strncpy(utest_name, argv[1], sizeof(utest_name) -1);
176*10465441SEvalZero         utest_run(utest_name);
177*10465441SEvalZero     }
178*10465441SEvalZero     else
179*10465441SEvalZero     {
180*10465441SEvalZero         LOG_E("[  error   ] at (%s:%d), in param error.", __func__, __LINE__);
181*10465441SEvalZero     }
182*10465441SEvalZero }
183*10465441SEvalZero MSH_CMD_EXPORT_ALIAS(utest_testcase_run, utest_run, utest_run [testcase name]);
184*10465441SEvalZero 
utest_handle_get(void)185*10465441SEvalZero utest_t utest_handle_get(void)
186*10465441SEvalZero {
187*10465441SEvalZero     return (utest_t)&local_utest;
188*10465441SEvalZero }
189*10465441SEvalZero 
utest_unit_run(test_unit_func func,const char * unit_func_name)190*10465441SEvalZero void utest_unit_run(test_unit_func func, const char *unit_func_name)
191*10465441SEvalZero {
192*10465441SEvalZero     // LOG_I("[==========] utest unit name: (%s)", unit_func_name);
193*10465441SEvalZero     local_utest.error = UTEST_PASSED;
194*10465441SEvalZero     local_utest.passed_num = 0;
195*10465441SEvalZero     local_utest.failed_num = 0;
196*10465441SEvalZero 
197*10465441SEvalZero     if (func != RT_NULL)
198*10465441SEvalZero     {
199*10465441SEvalZero         func();
200*10465441SEvalZero     }
201*10465441SEvalZero }
202*10465441SEvalZero 
utest_assert(int value,const char * file,int line,const char * func,const char * msg)203*10465441SEvalZero void utest_assert(int value, const char *file, int line, const char *func, const char *msg)
204*10465441SEvalZero {
205*10465441SEvalZero     if (!(value))
206*10465441SEvalZero     {
207*10465441SEvalZero         local_utest.error = UTEST_FAILED;
208*10465441SEvalZero         local_utest.failed_num ++;
209*10465441SEvalZero         LOG_E("[  ASSERT  ] [ unit     ] at (%s); func: (%s:%d); msg: (%s)", file_basename(file), func, line, msg);
210*10465441SEvalZero     }
211*10465441SEvalZero     else
212*10465441SEvalZero     {
213*10465441SEvalZero         if (utest_log_lv == UTEST_LOG_ALL)
214*10465441SEvalZero         {
215*10465441SEvalZero             LOG_D("[    OK    ] [ unit     ] (%s:%d) is passed", func, line);
216*10465441SEvalZero         }
217*10465441SEvalZero         local_utest.error = UTEST_PASSED;
218*10465441SEvalZero         local_utest.passed_num ++;
219*10465441SEvalZero     }
220*10465441SEvalZero }
221*10465441SEvalZero 
utest_assert_string(const char * a,const char * b,rt_bool_t equal,const char * file,int line,const char * func,const char * msg)222*10465441SEvalZero void utest_assert_string(const char *a, const char *b, rt_bool_t equal, const char *file, int line, const char *func, const char *msg)
223*10465441SEvalZero {
224*10465441SEvalZero     if (a == RT_NULL || b == RT_NULL)
225*10465441SEvalZero     {
226*10465441SEvalZero         utest_assert(0, file, line, func, msg);
227*10465441SEvalZero     }
228*10465441SEvalZero 
229*10465441SEvalZero     if (equal)
230*10465441SEvalZero     {
231*10465441SEvalZero         if (rt_strcmp(a, b) == 0)
232*10465441SEvalZero         {
233*10465441SEvalZero             utest_assert(1, file, line, func, msg);
234*10465441SEvalZero         }
235*10465441SEvalZero         else
236*10465441SEvalZero         {
237*10465441SEvalZero             utest_assert(0, file, line, func, msg);
238*10465441SEvalZero         }
239*10465441SEvalZero     }
240*10465441SEvalZero     else
241*10465441SEvalZero     {
242*10465441SEvalZero         if (rt_strcmp(a, b) == 0)
243*10465441SEvalZero         {
244*10465441SEvalZero             utest_assert(0, file, line, func, msg);
245*10465441SEvalZero         }
246*10465441SEvalZero         else
247*10465441SEvalZero         {
248*10465441SEvalZero             utest_assert(1, file, line, func, msg);
249*10465441SEvalZero         }
250*10465441SEvalZero     }
251*10465441SEvalZero }
252*10465441SEvalZero 
utest_assert_buf(const char * a,const char * b,rt_size_t sz,rt_bool_t equal,const char * file,int line,const char * func,const char * msg)253*10465441SEvalZero void utest_assert_buf(const char *a, const char *b, rt_size_t sz, rt_bool_t equal, const char *file, int line, const char *func, const char *msg)
254*10465441SEvalZero {
255*10465441SEvalZero     if (a == RT_NULL || b == RT_NULL)
256*10465441SEvalZero     {
257*10465441SEvalZero         utest_assert(0, file, line, func, msg);
258*10465441SEvalZero     }
259*10465441SEvalZero 
260*10465441SEvalZero     if (equal)
261*10465441SEvalZero     {
262*10465441SEvalZero         if (rt_memcmp(a, b, sz) == 0)
263*10465441SEvalZero         {
264*10465441SEvalZero             utest_assert(1, file, line, func, msg);
265*10465441SEvalZero         }
266*10465441SEvalZero         else
267*10465441SEvalZero         {
268*10465441SEvalZero             utest_assert(0, file, line, func, msg);
269*10465441SEvalZero         }
270*10465441SEvalZero     }
271*10465441SEvalZero     else
272*10465441SEvalZero     {
273*10465441SEvalZero         if (rt_memcmp(a, b, sz) == 0)
274*10465441SEvalZero         {
275*10465441SEvalZero             utest_assert(0, file, line, func, msg);
276*10465441SEvalZero         }
277*10465441SEvalZero         else
278*10465441SEvalZero         {
279*10465441SEvalZero             utest_assert(1, file, line, func, msg);
280*10465441SEvalZero         }
281*10465441SEvalZero     }
282*10465441SEvalZero }
283