xref: /nrf52832-nimble/rt-thread/components/utilities/utest/utest.h (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 #ifndef __UTEST_H__
12*10465441SEvalZero #define __UTEST_H__
13*10465441SEvalZero 
14*10465441SEvalZero #include <rtthread.h>
15*10465441SEvalZero #include "utest_log.h"
16*10465441SEvalZero #include "utest_assert.h"
17*10465441SEvalZero 
18*10465441SEvalZero /**
19*10465441SEvalZero  * utest_error
20*10465441SEvalZero  *
21*10465441SEvalZero  * @brief Test result.
22*10465441SEvalZero  *
23*10465441SEvalZero  * @member UTEST_PASSED Test success.
24*10465441SEvalZero  * @member UTEST_FAILED Test failed.
25*10465441SEvalZero  * @member UTEST_PASSED Test skipped.
26*10465441SEvalZero  *
27*10465441SEvalZero */
28*10465441SEvalZero enum utest_error
29*10465441SEvalZero {
30*10465441SEvalZero     UTEST_PASSED  = 0,
31*10465441SEvalZero     UTEST_FAILED  = 1,
32*10465441SEvalZero     UTEST_SKIPPED = 2
33*10465441SEvalZero };
34*10465441SEvalZero typedef enum utest_error utest_err_e;
35*10465441SEvalZero 
36*10465441SEvalZero /**
37*10465441SEvalZero  * utest
38*10465441SEvalZero  *
39*10465441SEvalZero  * @brief utest data structure.
40*10465441SEvalZero  *
41*10465441SEvalZero  * @member error      Error number from enum `utest_error`.
42*10465441SEvalZero  * @member passed_num Total number of tests passed.
43*10465441SEvalZero  * @member failed_num Total number of tests failed.
44*10465441SEvalZero  *
45*10465441SEvalZero */
46*10465441SEvalZero struct utest
47*10465441SEvalZero {
48*10465441SEvalZero     utest_err_e error;
49*10465441SEvalZero     uint32_t passed_num;
50*10465441SEvalZero     uint32_t failed_num;
51*10465441SEvalZero };
52*10465441SEvalZero typedef struct utest *utest_t;
53*10465441SEvalZero 
54*10465441SEvalZero /**
55*10465441SEvalZero  * utest_tc_export
56*10465441SEvalZero  *
57*10465441SEvalZero  * @brief utest testcase data structure.
58*10465441SEvalZero  *        Will export the data to `UtestTcTab` section in flash.
59*10465441SEvalZero  *
60*10465441SEvalZero  * @member name        Testcase name.
61*10465441SEvalZero  * @member run_timeout Testcase maximum test time (Time unit: seconds).
62*10465441SEvalZero  * @member init        Necessary initialization before executing the test case function.
63*10465441SEvalZero  * @member tc          Total number of tests failed.
64*10465441SEvalZero  * @member cleanup     Total number of tests failed.
65*10465441SEvalZero  *
66*10465441SEvalZero */
67*10465441SEvalZero struct utest_tc_export {
68*10465441SEvalZero     const char  *name;
69*10465441SEvalZero     uint32_t     run_timeout;
70*10465441SEvalZero     rt_err_t   (*init)(void);
71*10465441SEvalZero     void       (*tc)(void);
72*10465441SEvalZero     rt_err_t   (*cleanup)(void);
73*10465441SEvalZero };
74*10465441SEvalZero typedef struct utest_tc_export *utest_tc_export_t;
75*10465441SEvalZero 
76*10465441SEvalZero /**
77*10465441SEvalZero  * test_unit_func
78*10465441SEvalZero  *
79*10465441SEvalZero  * @brief Unit test handler function pointer.
80*10465441SEvalZero  *
81*10465441SEvalZero */
82*10465441SEvalZero typedef void (*test_unit_func)(void);
83*10465441SEvalZero 
84*10465441SEvalZero /**
85*10465441SEvalZero  * utest_unit_run
86*10465441SEvalZero  *
87*10465441SEvalZero  * @brief Unit test function executor.
88*10465441SEvalZero  *        No need for the user to call this function directly
89*10465441SEvalZero  *
90*10465441SEvalZero  * @param func           Unit test function.
91*10465441SEvalZero  * @param unit_func_name Unit test function name.
92*10465441SEvalZero  *
93*10465441SEvalZero  * @return void
94*10465441SEvalZero  *
95*10465441SEvalZero */
96*10465441SEvalZero void utest_unit_run(test_unit_func func, const char *unit_func_name);
97*10465441SEvalZero 
98*10465441SEvalZero /**
99*10465441SEvalZero  * utest_handle_get
100*10465441SEvalZero  *
101*10465441SEvalZero  * @brief Get the utest data structure handle.
102*10465441SEvalZero  *        No need for the user to call this function directly
103*10465441SEvalZero  *
104*10465441SEvalZero  * @param void
105*10465441SEvalZero  *
106*10465441SEvalZero  * @return utest_t type. (struct utest *)
107*10465441SEvalZero  *
108*10465441SEvalZero */
109*10465441SEvalZero utest_t utest_handle_get(void);
110*10465441SEvalZero 
111*10465441SEvalZero /**
112*10465441SEvalZero  * UTEST_NAME_MAX_LEN
113*10465441SEvalZero  *
114*10465441SEvalZero  * @brief Testcase name maximum length.
115*10465441SEvalZero  *
116*10465441SEvalZero */
117*10465441SEvalZero #define UTEST_NAME_MAX_LEN (128u)
118*10465441SEvalZero 
119*10465441SEvalZero /**
120*10465441SEvalZero  * UTEST_TC_EXPORT
121*10465441SEvalZero  *
122*10465441SEvalZero  * @brief Export testcase function to `UtestTcTab` section in flash.
123*10465441SEvalZero  *        Used in application layer.
124*10465441SEvalZero  *
125*10465441SEvalZero  * @param testcase The testcase function.
126*10465441SEvalZero  * @param name     The testcase name.
127*10465441SEvalZero  * @param init     The initialization function of the test case.
128*10465441SEvalZero  * @param cleanup  The cleanup function of the test case.
129*10465441SEvalZero  * @param timeout  Testcase maximum test time (Time unit: seconds).
130*10465441SEvalZero  *
131*10465441SEvalZero  * @return None
132*10465441SEvalZero  *
133*10465441SEvalZero */
134*10465441SEvalZero #define UTEST_TC_EXPORT(testcase, name, init, cleanup, timeout)                \
135*10465441SEvalZero     RT_USED static const struct utest_tc_export _utest_testcase                \
136*10465441SEvalZero     SECTION("UtestTcTab") =                                                    \
137*10465441SEvalZero     {                                                                          \
138*10465441SEvalZero         name,                                                                  \
139*10465441SEvalZero         timeout,                                                               \
140*10465441SEvalZero         init,                                                                  \
141*10465441SEvalZero         testcase,                                                              \
142*10465441SEvalZero         cleanup                                                                \
143*10465441SEvalZero     }
144*10465441SEvalZero 
145*10465441SEvalZero /**
146*10465441SEvalZero  * UTEST_UNIT_RUN
147*10465441SEvalZero  *
148*10465441SEvalZero  * @brief Unit test function executor.
149*10465441SEvalZero  *        Used in `testcase` function in application.
150*10465441SEvalZero  *
151*10465441SEvalZero  * @param test_unit_func Unit test function
152*10465441SEvalZero  *
153*10465441SEvalZero  * @return None
154*10465441SEvalZero  *
155*10465441SEvalZero */
156*10465441SEvalZero #define UTEST_UNIT_RUN(test_unit_func)                                         \
157*10465441SEvalZero     utest_unit_run(test_unit_func, #test_unit_func);                           \
158*10465441SEvalZero     if(utest_handle_get()->failed_num != 0) return;
159*10465441SEvalZero 
160*10465441SEvalZero #endif /* __UTEST_H__ */
161