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