/* * Check: a unit test framework for C * Copyright (C) 2001, 2002 Arien Malec * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef CHECK_IMPL_H #define CHECK_IMPL_H /* This header should be included by any module that needs to know the implementation details of the check structures Include stdio.h, time.h, & list.h before this header */ #define US_PER_SEC 1000000 #define NANOS_PER_SECONDS 1000000000 /** calculate the difference in useconds out of two "struct timespec"s */ #define DIFF_IN_USEC(begin, end) \ ( (((end).tv_sec - (begin).tv_sec) * US_PER_SEC) + \ ((end).tv_nsec/1000) - ((begin).tv_nsec/1000) ) typedef struct TF { TFun fn; int loop_start; int loop_end; const char *name; int signal; signed char allowed_exit_value; } TF; struct Suite { const char *name; List *tclst; /* List of test cases */ }; typedef struct Fixture { int ischecked; SFun fun; } Fixture; struct TCase { const char *name; struct timespec timeout; List *tflst; /* list of test functions */ List *unch_sflst; List *unch_tflst; List *ch_sflst; List *ch_tflst; List *tags; }; typedef struct TestStats { int n_checked; int n_failed; int n_errors; } TestStats; struct TestResult { enum test_result rtype; /* Type of result */ enum ck_result_ctx ctx; /* When the result occurred */ char *file; /* File where the test occured */ int line; /* Line number where the test occurred */ int iter; /* The iteration value for looping tests */ int duration; /* duration of this test in microseconds */ const char *tcname; /* Test case that generated the result */ const char *tname; /* Test that generated the result */ char *msg; /* Failure message */ }; TestResult *tr_create(void); void tr_reset(TestResult * tr); void tr_free(TestResult * tr); enum cl_event { CLINITLOG_SR, /* Initialize log file */ CLENDLOG_SR, /* Tests are complete */ CLSTART_SR, /* Suite runner start */ CLSTART_S, /* Suite start */ CLEND_SR, /* Suite runner end */ CLEND_S, /* Suite end */ CLSTART_T, /* A test case is about to run */ CLEND_T /* Test case end */ }; typedef void (*LFun) (SRunner *, FILE *, enum print_output, void *, enum cl_event); typedef struct Log { FILE *lfile; LFun lfun; int close; enum print_output mode; } Log; struct SRunner { List *slst; /* List of Suite objects */ TestStats *stats; /* Run statistics */ List *resultlst; /* List of unit test results */ const char *log_fname; /* name of log file */ const char *xml_fname; /* name of xml output file */ const char *tap_fname; /* name of tap output file */ List *loglst; /* list of Log objects */ enum fork_status fstat; /* controls if suites are forked or not NOTE: Don't use this value directly, instead use srunner_fork_status */ }; void set_fork_status(enum fork_status fstat); enum fork_status cur_fork_status(void); clockid_t check_get_clockid(void); unsigned int tcase_matching_tag(TCase *tc, List *check_for); List *tag_string_to_list(const char *tags_string); #endif /* CHECK_IMPL_H */