lasso
|
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <signal.h>
#include <setjmp.h>
Go to the source code of this file.
Defines | |
#define | STRINGIFY_(X) #X |
#define | STRINGIFY(X) STRINGIFY_(X) |
#define | CHECK_ERR(A) check_equal( iBase_SUCCESS, (A), "iBase_SUCCESS", #A, __LINE__, __FILE__ ) |
#define | CHECK(A) check_true( (A), #A, __LINE__, __FILE__ ) |
#define | CHECK_EQUAL(EXP, ACT) check_equal( (EXP), (ACT), #EXP, #ACT, __LINE__, __FILE__ ) |
#define | CHECK_REAL_EQUAL(EXP, ACT, EPS) check_equal( (EXP), (ACT), (EPS), #EXP, #ACT, __LINE__, __FILE__ ) |
#define | CHECK_ARRAYS_EQUAL(EXP, EXP_LEN, ACT, ACT_LEN) check_array_equal( (EXP), (EXP_LEN), (ACT), (ACT_LEN), #EXP, #ACT, __LINE__, __FILE__ ) |
#define | RUN_TEST(FUNC) run_test( &FUNC, #FUNC ) |
#define | EXCEPTION_MODE 1 |
#define | FORK_MODE 2 |
#define | LONGJMP_MODE 3 |
#define | FLAG_ERROR siglongjmp( jmpenv, -1 ) |
#define | EQUAL_TEST_IMPL(TEST, TYPE) |
Typedefs | |
typedef void(* | sigfunc_t )(int) |
typedef void(* | test_func )(void) |
Functions | |
void | sighandler (int sig) |
int | sethandler (int sig) |
int | init_signal_handlers () |
void | flag_error () |
int | run_test (test_func test, const char *func_name) |
void | check_equal (int A, int B, const char *sA, const char *sB, int line, const char *file) |
void | check_equal (unsigned A, unsigned B, const char *sA, const char *sB, int line, const char *file) |
void | check_equal (long A, long B, const char *sA, const char *sB, int line, const char *file) |
void | check_equal (unsigned long A, unsigned long B, const char *sA, const char *sB, int line, const char *file) |
void | check_equal (void *A, void *B, const char *sA, const char *sB, int line, const char *file) |
void | check_equal (const char *A, const char *B, const char *sA, const char *sB, int line, const char *file) |
void | check_equal (const std::string &A, const std::string &B, const char *sA, const char *sB, int line, const char *file) |
void | check_equal (float A, float B, float eps, const char *sA, const char *sB, int line, const char *file) |
void | check_equal (double A, double B, float eps, const char *sA, const char *sB, int line, const char *file) |
void | check_true (bool cond, const char *str, int line, const char *file) |
Variables | |
sigjmp_buf | jmpenv |
int | junk_init_var = init_signal_handlers() |
#define CHECK | ( | A | ) | check_true( (A), #A, __LINE__, __FILE__ ) |
Ensure that A is true
Definition at line 18 of file TestUtil.hpp.
#define CHECK_ARRAYS_EQUAL | ( | EXP, | |
EXP_LEN, | |||
ACT, | |||
ACT_LEN | |||
) | check_array_equal( (EXP), (EXP_LEN), (ACT), (ACT_LEN), #EXP, #ACT, __LINE__, __FILE__ ) |
Check that two arrays contain the same values in the same order
Definition at line 24 of file TestUtil.hpp.
#define CHECK_EQUAL | ( | EXP, | |
ACT | |||
) | check_equal( (EXP), (ACT), #EXP, #ACT, __LINE__, __FILE__ ) |
Check that two values are equal
Definition at line 20 of file TestUtil.hpp.
#define CHECK_ERR | ( | A | ) | check_equal( iBase_SUCCESS, (A), "iBase_SUCCESS", #A, __LINE__, __FILE__ ) |
Check that A is MB_SUCCESS
Definition at line 16 of file TestUtil.hpp.
#define CHECK_REAL_EQUAL | ( | EXP, | |
ACT, | |||
EPS | |||
) | check_equal( (EXP), (ACT), (EPS), #EXP, #ACT, __LINE__, __FILE__ ) |
Check that two real (float or double) values are equal within EPS
Definition at line 22 of file TestUtil.hpp.
#define EQUAL_TEST_IMPL | ( | TEST, | |
TYPE | |||
) |
if( !(TEST) ) { \ printf( "Equality Test Failed: %s == %s\n", sA, sB ); \ printf( " at line %d of '%s'\n", line, file ); \ printf( " Expected value: %" #TYPE "\n", A ); \ printf( " Actual value: %" #TYPE "\n", B ); \ printf( "\n" ); \ flag_error(); \ }
Definition at line 335 of file TestUtil.hpp.
#define EXCEPTION_MODE 1 |
Definition at line 34 of file TestUtil.hpp.
#define FLAG_ERROR siglongjmp( jmpenv, -1 ) |
Definition at line 101 of file TestUtil.hpp.
#define FORK_MODE 2 |
Definition at line 39 of file TestUtil.hpp.
#define LONGJMP_MODE 3 |
Definition at line 48 of file TestUtil.hpp.
Run a test Argument should be a function with the signature: void func(void) Evaluates to zero if test is successful, one otherwise.
Definition at line 29 of file TestUtil.hpp.
#define STRINGIFY | ( | X | ) | STRINGIFY_(X) |
Definition at line 7 of file TestUtil.hpp.
#define STRINGIFY_ | ( | X | ) | #X |
Definition at line 6 of file TestUtil.hpp.
typedef void(* sigfunc_t)(int) |
Definition at line 125 of file TestUtil.hpp.
typedef void(* test_func)(void) |
Definition at line 239 of file TestUtil.hpp.
void check_equal | ( | int | A, |
int | B, | ||
const char * | sA, | ||
const char * | sB, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 344 of file TestUtil.hpp.
{ EQUAL_TEST_IMPL( A == B, d ) }
void check_equal | ( | unsigned | A, |
unsigned | B, | ||
const char * | sA, | ||
const char * | sB, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 347 of file TestUtil.hpp.
{ EQUAL_TEST_IMPL( A == B, u ) }
void check_equal | ( | long | A, |
long | B, | ||
const char * | sA, | ||
const char * | sB, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 350 of file TestUtil.hpp.
{ EQUAL_TEST_IMPL( A == B, ld ) }
void check_equal | ( | unsigned long | A, |
unsigned long | B, | ||
const char * | sA, | ||
const char * | sB, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 353 of file TestUtil.hpp.
{ EQUAL_TEST_IMPL( A == B, lu ) }
void check_equal | ( | void * | A, |
void * | B, | ||
const char * | sA, | ||
const char * | sB, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 356 of file TestUtil.hpp.
{ EQUAL_TEST_IMPL( A == B, p ) }
void check_equal | ( | const char * | A, |
const char * | B, | ||
const char * | sA, | ||
const char * | sB, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 359 of file TestUtil.hpp.
{ EQUAL_TEST_IMPL( !strcmp((A),(B)), s ) }
void check_equal | ( | const std::string & | A, |
const std::string & | B, | ||
const char * | sA, | ||
const char * | sB, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 362 of file TestUtil.hpp.
{ check_equal( A.c_str(), B.c_str(), sA, sB, line, file); }
void check_equal | ( | float | A, |
float | B, | ||
float | eps, | ||
const char * | sA, | ||
const char * | sB, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 365 of file TestUtil.hpp.
{ EQUAL_TEST_IMPL( fabsf(A - B) <= eps, f ) }
void check_equal | ( | double | A, |
double | B, | ||
float | eps, | ||
const char * | sA, | ||
const char * | sB, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 368 of file TestUtil.hpp.
{ EQUAL_TEST_IMPL( fabs(A - B) <= eps, f ) }
void check_true | ( | bool | cond, |
const char * | str, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 371 of file TestUtil.hpp.
{ if( !cond ) { printf( "Test Failed: %s\n", str ); printf( " at line %d of '%s'\n", line, file ); printf( "\n" ); flag_error(); } }
void flag_error | ( | ) | [inline] |
Definition at line 230 of file TestUtil.hpp.
{ FLAG_ERROR; }
int init_signal_handlers | ( | ) |
Definition at line 142 of file TestUtil.hpp.
{ int result = 0; /* Don't trap these. It is unlikely that a test would ever generate such a signal on its own and trapping them interfers with a user's ability to stop a test. SIGHUP implies that the controlling terminal was closed. If the user does ctrl-C or ctrl-\ (SIGINT and SIGQUIT, respectively) and we trap these then just the current test stops. If we leave the default behavior for them then the whole test suite stops. The latter is likely the desired behavior. SIGTERM is the default signal sent by the 'kill' command. #ifdef SIGHUP result += sethandler( SIGHUP ); #endif #ifdef SIGINT result += sethandler( SIGINT ); #endif #ifdef SIGQUIT result += sethandler( SIGQUIT ); #endif #ifdef SIGTERM result += sethandler( SIGTERM ); #endif */ #ifdef SIGILL result += sethandler( SIGILL ); #endif #ifdef SIGTRAP result += sethandler( SIGTRAP ); #endif #ifdef SIGABRT result += sethandler( SIGABRT ); #endif #ifdef SIGBUS result += sethandler( SIGBUS ); #endif #ifdef SIGFPE result += sethandler( SIGFPE ); #endif #ifdef SIGSEGV result += sethandler( SIGSEGV ); #endif /* Catching these causes problems with mpich2 1.3.1p1 and a test should never receive such a signal anyway. #ifdef SIGUSR1 result += sethandler( SIGUSR1 ); #endif #ifdef SIGUSR2 result += sethandler( SIGUSR2 ); #endif */ /* Don't trap SIGCHLD. The only way a test should receive such a signal is if it actually forked a child process. That is unlikely, but if it does happen the test probably wants to handle the signal itself. #ifdef SIGCHLD result += sethandler( SIGCHLD ); #endif */ #ifdef SIGPIPE result += sethandler( SIGPIPE ); #endif #ifdef SIGIO result += sethandler( SIGIO ); #endif #ifdef SIGSYS result += sethandler( SIGSYS ); #endif return result; }
Definition at line 240 of file TestUtil.hpp.
{ printf("Running %s ...\n", func_name ); #if MODE == EXCEPTION_MODE /* On Windows, run all tests in same process. Flag errors by throwing an exception. */ try { (*test)(); return 0; } catch (ErrorExcept) { printf( " %s: FAILED\n", func_name ); return 1; } catch (...) { printf( " %s: UNCAUGHT EXCEPTION\n", func_name ); return 1; } #elif MODE == FORK_MODE /* For non-Windows OSs, fork() and run test in child process. */ pid_t pid = fork(); int status; /* Fork failed? */ if (pid == -1) { perror( "fork()" ); abort(); /* abort all tests (can't fork child processes) */ } /* If child process*/ if (pid == 0) { (*test)(); /* call test function */ exit(0); /* if function returned, then it succeeded */ } /* If here, then parent process */ /* Wait until child process exits */ waitpid( pid, &status, 0 ); /* Check child exit status */ if (WIFSIGNALED(status)) { if (WTERMSIG(status)) printf(" %s: TERMINATED (signal %d)\n", func_name, (int)WTERMSIG(status) ); if (WCOREDUMP(status)) printf(" %s: CORE DUMP\n", func_name); return 1; } else if(WEXITSTATUS(status)) { printf( " %s: FAILED\n", func_name ); return 1; } else { return 0; } #elif MODE == LONGJMP_MODE // Save stack state at this location. int rval = sigsetjmp( jmpenv, 1 ); // If rval is zero, then we haven't run the test yet. // If rval is non-zero then // a) we ran the test // b) the test failed // c) we did a longjmp back to the location where we called setsigjmp. // run test if (!rval) { (*test)(); return 0; } // some check failed else if (rval == -1) { printf( " %s: FAILED\n", func_name ); return 1; } // a signal was raised (e.g. segfault) else { printf( " %s: TERMINATED (signal %d)\n", func_name, rval ); return 1; } #else #error "MODE not set" #endif // MODE }
int sethandler | ( | int | sig | ) |
Definition at line 129 of file TestUtil.hpp.
{ sigfunc_t h = signal( sig, &sighandler ); if (h == SIG_ERR) return 1; // If user-defined signal handler (or signal is ignored), // than unregister our handler. else if (h != SIG_DFL) signal( sig, h ); return 0; }
void sighandler | ( | int | sig | ) |
Definition at line 119 of file TestUtil.hpp.
{ signal( sig, sighandler ); siglongjmp(jmpenv, sig); // should never return from longjmp exit(1); }
sigjmp_buf jmpenv |
Definition at line 113 of file TestUtil.hpp.
int junk_init_var = init_signal_handlers() |
Definition at line 219 of file TestUtil.hpp.