2018-01-10 05:22:31 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
2014-10-03 19:04:23 +04:00
/*
* kselftest . h : kselftest framework return codes to include from
* selftests .
*
* Copyright ( c ) 2014 Shuah Khan < shuahkh @ osg . samsung . com >
* Copyright ( c ) 2014 Samsung Electronics Co . , Ltd .
*
*/
# ifndef __KSELFTEST_H
# define __KSELFTEST_H
2019-07-20 03:03:32 +03:00
# include <errno.h>
2014-10-03 19:04:23 +04:00
# include <stdlib.h>
# include <unistd.h>
2017-06-28 17:40:20 +03:00
# include <stdarg.h>
2019-01-19 03:12:14 +03:00
# include <stdio.h>
2014-10-03 19:04:23 +04:00
2015-05-13 07:07:56 +03:00
/* define kselftest exit codes */
# define KSFT_PASS 0
# define KSFT_FAIL 1
# define KSFT_XFAIL 2
# define KSFT_XPASS 3
2018-05-02 01:03:28 +03:00
# define KSFT_SKIP 4
2015-05-13 07:07:56 +03:00
2014-10-03 19:04:23 +04:00
/* counters */
struct ksft_count {
unsigned int ksft_pass ;
unsigned int ksft_fail ;
unsigned int ksft_xfail ;
unsigned int ksft_xpass ;
unsigned int ksft_xskip ;
2017-08-05 00:07:19 +03:00
unsigned int ksft_error ;
2014-10-03 19:04:23 +04:00
} ;
static struct ksft_count ksft_cnt ;
2019-04-25 02:12:37 +03:00
static unsigned int ksft_plan ;
2014-10-03 19:04:23 +04:00
2017-06-12 09:56:47 +03:00
static inline int ksft_test_num ( void )
{
return ksft_cnt . ksft_pass + ksft_cnt . ksft_fail +
ksft_cnt . ksft_xfail + ksft_cnt . ksft_xpass +
2017-08-05 00:07:19 +03:00
ksft_cnt . ksft_xskip + ksft_cnt . ksft_error ;
2017-06-12 09:56:47 +03:00
}
2014-10-03 19:04:23 +04:00
static inline void ksft_inc_pass_cnt ( void ) { ksft_cnt . ksft_pass + + ; }
static inline void ksft_inc_fail_cnt ( void ) { ksft_cnt . ksft_fail + + ; }
static inline void ksft_inc_xfail_cnt ( void ) { ksft_cnt . ksft_xfail + + ; }
static inline void ksft_inc_xpass_cnt ( void ) { ksft_cnt . ksft_xpass + + ; }
static inline void ksft_inc_xskip_cnt ( void ) { ksft_cnt . ksft_xskip + + ; }
2017-08-05 00:07:19 +03:00
static inline void ksft_inc_error_cnt ( void ) { ksft_cnt . ksft_error + + ; }
2014-10-03 19:04:23 +04:00
2017-07-24 22:55:18 +03:00
static inline int ksft_get_pass_cnt ( void ) { return ksft_cnt . ksft_pass ; }
static inline int ksft_get_fail_cnt ( void ) { return ksft_cnt . ksft_fail ; }
static inline int ksft_get_xfail_cnt ( void ) { return ksft_cnt . ksft_xfail ; }
static inline int ksft_get_xpass_cnt ( void ) { return ksft_cnt . ksft_xpass ; }
static inline int ksft_get_xskip_cnt ( void ) { return ksft_cnt . ksft_xskip ; }
2017-08-05 00:07:19 +03:00
static inline int ksft_get_error_cnt ( void ) { return ksft_cnt . ksft_error ; }
2017-07-24 22:55:18 +03:00
2017-06-12 09:56:47 +03:00
static inline void ksft_print_header ( void )
{
2018-02-22 03:11:54 +03:00
if ( ! ( getenv ( " KSFT_TAP_LEVEL " ) ) )
printf ( " TAP version 13 \n " ) ;
2017-06-12 09:56:47 +03:00
}
2019-04-25 02:12:37 +03:00
static inline void ksft_set_plan ( unsigned int plan )
{
ksft_plan = plan ;
printf ( " 1..%d \n " , ksft_plan ) ;
}
2014-10-03 19:04:23 +04:00
static inline void ksft_print_cnts ( void )
{
2019-04-25 02:12:37 +03:00
if ( ksft_plan ! = ksft_test_num ( ) )
printf ( " # Planned tests != run tests (%u != %u) \n " ,
ksft_plan , ksft_test_num ( ) ) ;
2019-04-25 02:12:35 +03:00
printf ( " # Pass %d Fail %d Xfail %d Xpass %d Skip %d Error %d \n " ,
2017-07-24 22:55:18 +03:00
ksft_cnt . ksft_pass , ksft_cnt . ksft_fail ,
ksft_cnt . ksft_xfail , ksft_cnt . ksft_xpass ,
2017-08-05 00:07:19 +03:00
ksft_cnt . ksft_xskip , ksft_cnt . ksft_error ) ;
2017-06-12 09:56:47 +03:00
}
2017-06-28 17:40:21 +03:00
static inline void ksft_print_msg ( const char * msg , . . . )
{
2019-07-20 03:03:32 +03:00
int saved_errno = errno ;
2017-06-28 17:40:21 +03:00
va_list args ;
va_start ( args , msg ) ;
printf ( " # " ) ;
2019-07-20 03:03:32 +03:00
errno = saved_errno ;
2017-06-28 17:40:21 +03:00
vprintf ( msg , args ) ;
va_end ( args ) ;
}
2017-06-28 17:40:20 +03:00
static inline void ksft_test_result_pass ( const char * msg , . . . )
2017-06-12 09:56:47 +03:00
{
2019-07-20 03:03:32 +03:00
int saved_errno = errno ;
2017-06-28 17:40:20 +03:00
va_list args ;
2017-06-12 09:56:47 +03:00
ksft_cnt . ksft_pass + + ;
2017-06-28 17:40:20 +03:00
va_start ( args , msg ) ;
printf ( " ok %d " , ksft_test_num ( ) ) ;
2019-07-20 03:03:32 +03:00
errno = saved_errno ;
2017-06-28 17:40:20 +03:00
vprintf ( msg , args ) ;
va_end ( args ) ;
2017-06-12 09:56:47 +03:00
}
2017-06-28 17:40:20 +03:00
static inline void ksft_test_result_fail ( const char * msg , . . . )
2017-06-12 09:56:47 +03:00
{
2019-07-20 03:03:32 +03:00
int saved_errno = errno ;
2017-06-28 17:40:20 +03:00
va_list args ;
2017-06-12 09:56:47 +03:00
ksft_cnt . ksft_fail + + ;
2017-06-28 17:40:20 +03:00
va_start ( args , msg ) ;
printf ( " not ok %d " , ksft_test_num ( ) ) ;
2019-07-20 03:03:32 +03:00
errno = saved_errno ;
2017-06-28 17:40:20 +03:00
vprintf ( msg , args ) ;
va_end ( args ) ;
2017-06-12 09:56:47 +03:00
}
2017-06-28 17:40:20 +03:00
static inline void ksft_test_result_skip ( const char * msg , . . . )
2017-06-12 09:56:47 +03:00
{
2019-07-20 03:03:32 +03:00
int saved_errno = errno ;
2017-06-28 17:40:20 +03:00
va_list args ;
2017-06-12 09:56:47 +03:00
ksft_cnt . ksft_xskip + + ;
2017-06-28 17:40:20 +03:00
va_start ( args , msg ) ;
2020-06-23 03:15:42 +03:00
printf ( " ok %d # SKIP " , ksft_test_num ( ) ) ;
2019-07-20 03:03:32 +03:00
errno = saved_errno ;
2017-06-28 17:40:20 +03:00
vprintf ( msg , args ) ;
va_end ( args ) ;
2014-10-03 19:04:23 +04:00
}
2017-08-05 00:07:19 +03:00
static inline void ksft_test_result_error ( const char * msg , . . . )
{
2019-07-20 03:03:32 +03:00
int saved_errno = errno ;
2017-08-05 00:07:19 +03:00
va_list args ;
ksft_cnt . ksft_error + + ;
va_start ( args , msg ) ;
printf ( " not ok %d # error " , ksft_test_num ( ) ) ;
2019-07-20 03:03:32 +03:00
errno = saved_errno ;
2017-08-05 00:07:19 +03:00
vprintf ( msg , args ) ;
va_end ( args ) ;
}
2014-10-03 19:04:23 +04:00
static inline int ksft_exit_pass ( void )
{
2017-06-12 09:56:47 +03:00
ksft_print_cnts ( ) ;
2015-05-13 07:07:56 +03:00
exit ( KSFT_PASS ) ;
2014-10-03 19:04:23 +04:00
}
2017-06-12 09:56:47 +03:00
2014-10-03 19:04:23 +04:00
static inline int ksft_exit_fail ( void )
{
2017-06-12 09:56:47 +03:00
printf ( " Bail out! \n " ) ;
ksft_print_cnts ( ) ;
2015-05-13 07:07:56 +03:00
exit ( KSFT_FAIL ) ;
2014-10-03 19:04:23 +04:00
}
2017-06-12 09:56:47 +03:00
2017-06-28 17:40:20 +03:00
static inline int ksft_exit_fail_msg ( const char * msg , . . . )
2017-06-12 09:56:47 +03:00
{
2019-07-20 03:03:32 +03:00
int saved_errno = errno ;
2017-06-28 17:40:20 +03:00
va_list args ;
va_start ( args , msg ) ;
printf ( " Bail out! " ) ;
2019-07-20 03:03:32 +03:00
errno = saved_errno ;
2017-06-28 17:40:20 +03:00
vprintf ( msg , args ) ;
va_end ( args ) ;
2017-06-12 09:56:47 +03:00
ksft_print_cnts ( ) ;
exit ( KSFT_FAIL ) ;
}
2014-10-03 19:04:23 +04:00
static inline int ksft_exit_xfail ( void )
{
2017-06-12 09:56:47 +03:00
ksft_print_cnts ( ) ;
2015-05-13 07:07:56 +03:00
exit ( KSFT_XFAIL ) ;
2014-10-03 19:04:23 +04:00
}
2017-06-12 09:56:47 +03:00
2014-10-03 19:04:23 +04:00
static inline int ksft_exit_xpass ( void )
{
2017-06-12 09:56:47 +03:00
ksft_print_cnts ( ) ;
2015-05-13 07:07:56 +03:00
exit ( KSFT_XPASS ) ;
2014-10-03 19:04:23 +04:00
}
2017-06-12 09:56:47 +03:00
2017-06-28 17:40:20 +03:00
static inline int ksft_exit_skip ( const char * msg , . . . )
2014-10-03 19:04:23 +04:00
{
2020-06-23 03:15:42 +03:00
int saved_errno = errno ;
va_list args ;
2017-06-28 17:40:20 +03:00
2020-06-23 03:15:42 +03:00
va_start ( args , msg ) ;
/*
* FIXME : several tests misuse ksft_exit_skip so produce
* something sensible if some tests have already been run
* or a plan has been printed . Those tests should use
* ksft_test_result_skip or ksft_exit_fail_msg instead .
*/
if ( ksft_plan | | ksft_test_num ( ) ) {
ksft_cnt . ksft_xskip + + ;
printf ( " ok %d # SKIP " , 1 + ksft_test_num ( ) ) ;
} else {
printf ( " 1..0 # SKIP " ) ;
}
if ( msg ) {
2019-07-20 03:03:32 +03:00
errno = saved_errno ;
2017-06-28 17:40:20 +03:00
vprintf ( msg , args ) ;
va_end ( args ) ;
}
2020-06-23 03:15:42 +03:00
if ( ksft_test_num ( ) )
ksft_print_cnts ( ) ;
2015-05-13 07:07:56 +03:00
exit ( KSFT_SKIP ) ;
2014-10-03 19:04:23 +04:00
}
# endif /* __KSELFTEST_H */