161 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			161 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2006-2018, RT-Thread Development Team
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * SPDX-License-Identifier: Apache-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Change Logs:
							 | 
						||
| 
								 | 
							
								 * Date           Author       Notes
							 | 
						||
| 
								 | 
							
								 * 2018-11-19     MurphyZhao   the first version
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __UTEST_H__
							 | 
						||
| 
								 | 
							
								#define __UTEST_H__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <rtthread.h>
							 | 
						||
| 
								 | 
							
								#include "utest_log.h"
							 | 
						||
| 
								 | 
							
								#include "utest_assert.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * utest_error
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @brief Test result.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @member UTEST_PASSED Test success.
							 | 
						||
| 
								 | 
							
								 * @member UTEST_FAILED Test failed.
							 | 
						||
| 
								 | 
							
								 * @member UTEST_PASSED Test skipped.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								enum utest_error
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    UTEST_PASSED  = 0,
							 | 
						||
| 
								 | 
							
								    UTEST_FAILED  = 1,
							 | 
						||
| 
								 | 
							
								    UTEST_SKIPPED = 2
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								typedef enum utest_error utest_err_e;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * utest
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @brief utest data structure.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @member error      Error number from enum `utest_error`.
							 | 
						||
| 
								 | 
							
								 * @member passed_num Total number of tests passed.
							 | 
						||
| 
								 | 
							
								 * @member failed_num Total number of tests failed.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								struct utest
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    utest_err_e error;
							 | 
						||
| 
								 | 
							
								    uint32_t passed_num;
							 | 
						||
| 
								 | 
							
								    uint32_t failed_num;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								typedef struct utest *utest_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * utest_tc_export
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @brief utest testcase data structure.
							 | 
						||
| 
								 | 
							
								 *        Will export the data to `UtestTcTab` section in flash.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @member name        Testcase name.
							 | 
						||
| 
								 | 
							
								 * @member run_timeout Testcase maximum test time (Time unit: seconds).
							 | 
						||
| 
								 | 
							
								 * @member init        Necessary initialization before executing the test case function.
							 | 
						||
| 
								 | 
							
								 * @member tc          Total number of tests failed.
							 | 
						||
| 
								 | 
							
								 * @member cleanup     Total number of tests failed.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								struct utest_tc_export {
							 | 
						||
| 
								 | 
							
								    const char  *name;
							 | 
						||
| 
								 | 
							
								    uint32_t     run_timeout;
							 | 
						||
| 
								 | 
							
								    rt_err_t   (*init)(void);
							 | 
						||
| 
								 | 
							
								    void       (*tc)(void);
							 | 
						||
| 
								 | 
							
								    rt_err_t   (*cleanup)(void);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								typedef struct utest_tc_export *utest_tc_export_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * test_unit_func
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @brief Unit test handler function pointer.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								typedef void (*test_unit_func)(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * utest_unit_run
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @brief Unit test function executor.
							 | 
						||
| 
								 | 
							
								 *        No need for the user to call this function directly
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @param func           Unit test function.
							 | 
						||
| 
								 | 
							
								 * @param unit_func_name Unit test function name.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @return void
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								void utest_unit_run(test_unit_func func, const char *unit_func_name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * utest_handle_get
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @brief Get the utest data structure handle.
							 | 
						||
| 
								 | 
							
								 *        No need for the user to call this function directly
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @param void
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @return utest_t type. (struct utest *)
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								utest_t utest_handle_get(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * UTEST_NAME_MAX_LEN
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @brief Testcase name maximum length.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								#define UTEST_NAME_MAX_LEN (128u)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * UTEST_TC_EXPORT
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @brief Export testcase function to `UtestTcTab` section in flash.
							 | 
						||
| 
								 | 
							
								 *        Used in application layer.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @param testcase The testcase function.
							 | 
						||
| 
								 | 
							
								 * @param name     The testcase name.
							 | 
						||
| 
								 | 
							
								 * @param init     The initialization function of the test case.
							 | 
						||
| 
								 | 
							
								 * @param cleanup  The cleanup function of the test case.
							 | 
						||
| 
								 | 
							
								 * @param timeout  Testcase maximum test time (Time unit: seconds).
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @return None
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								#define UTEST_TC_EXPORT(testcase, name, init, cleanup, timeout)                \
							 | 
						||
| 
								 | 
							
								    RT_USED static const struct utest_tc_export _utest_testcase                \
							 | 
						||
| 
								 | 
							
								    SECTION("UtestTcTab") =                                                    \
							 | 
						||
| 
								 | 
							
								    {                                                                          \
							 | 
						||
| 
								 | 
							
								        name,                                                                  \
							 | 
						||
| 
								 | 
							
								        timeout,                                                               \
							 | 
						||
| 
								 | 
							
								        init,                                                                  \
							 | 
						||
| 
								 | 
							
								        testcase,                                                              \
							 | 
						||
| 
								 | 
							
								        cleanup                                                                \
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * UTEST_UNIT_RUN
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @brief Unit test function executor.
							 | 
						||
| 
								 | 
							
								 *        Used in `testcase` function in application.
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @param test_unit_func Unit test function
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								 * @return None
							 | 
						||
| 
								 | 
							
								 * 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								#define UTEST_UNIT_RUN(test_unit_func)                                         \
							 | 
						||
| 
								 | 
							
								    utest_unit_run(test_unit_func, #test_unit_func);                           \
							 | 
						||
| 
								 | 
							
								    if(utest_handle_get()->failed_num != 0) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* __UTEST_H__ */
							 |