1*84e872a0SLloyd Pique /* 2*84e872a0SLloyd Pique * Copyright © 2012 Intel Corporation 3*84e872a0SLloyd Pique * 4*84e872a0SLloyd Pique * Permission is hereby granted, free of charge, to any person obtaining 5*84e872a0SLloyd Pique * a copy of this software and associated documentation files (the 6*84e872a0SLloyd Pique * "Software"), to deal in the Software without restriction, including 7*84e872a0SLloyd Pique * without limitation the rights to use, copy, modify, merge, publish, 8*84e872a0SLloyd Pique * distribute, sublicense, and/or sell copies of the Software, and to 9*84e872a0SLloyd Pique * permit persons to whom the Software is furnished to do so, subject to 10*84e872a0SLloyd Pique * the following conditions: 11*84e872a0SLloyd Pique * 12*84e872a0SLloyd Pique * The above copyright notice and this permission notice (including the 13*84e872a0SLloyd Pique * next paragraph) shall be included in all copies or substantial 14*84e872a0SLloyd Pique * portions of the Software. 15*84e872a0SLloyd Pique * 16*84e872a0SLloyd Pique * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17*84e872a0SLloyd Pique * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18*84e872a0SLloyd Pique * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19*84e872a0SLloyd Pique * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 20*84e872a0SLloyd Pique * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 21*84e872a0SLloyd Pique * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22*84e872a0SLloyd Pique * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23*84e872a0SLloyd Pique * SOFTWARE. 24*84e872a0SLloyd Pique */ 25*84e872a0SLloyd Pique #ifndef _TEST_RUNNER_H_ 26*84e872a0SLloyd Pique #define _TEST_RUNNER_H_ 27*84e872a0SLloyd Pique 28*84e872a0SLloyd Pique #ifdef NDEBUG 29*84e872a0SLloyd Pique #error "Tests must not be built with NDEBUG defined, they rely on assert()." 30*84e872a0SLloyd Pique #endif 31*84e872a0SLloyd Pique 32*84e872a0SLloyd Pique #include <unistd.h> 33*84e872a0SLloyd Pique 34*84e872a0SLloyd Pique struct test { 35*84e872a0SLloyd Pique const char *name; 36*84e872a0SLloyd Pique void (*run)(void); 37*84e872a0SLloyd Pique int must_fail; 38*84e872a0SLloyd Pique } __attribute__ ((aligned (16))); 39*84e872a0SLloyd Pique 40*84e872a0SLloyd Pique #define TEST(name) \ 41*84e872a0SLloyd Pique static void name(void); \ 42*84e872a0SLloyd Pique \ 43*84e872a0SLloyd Pique const struct test test##name \ 44*84e872a0SLloyd Pique __attribute__ ((used, section ("test_section"))) = { \ 45*84e872a0SLloyd Pique #name, name, 0 \ 46*84e872a0SLloyd Pique }; \ 47*84e872a0SLloyd Pique \ 48*84e872a0SLloyd Pique static void name(void) 49*84e872a0SLloyd Pique 50*84e872a0SLloyd Pique #define FAIL_TEST(name) \ 51*84e872a0SLloyd Pique static void name(void); \ 52*84e872a0SLloyd Pique \ 53*84e872a0SLloyd Pique const struct test test##name \ 54*84e872a0SLloyd Pique __attribute__ ((used, section ("test_section"))) = { \ 55*84e872a0SLloyd Pique #name, name, 1 \ 56*84e872a0SLloyd Pique }; \ 57*84e872a0SLloyd Pique \ 58*84e872a0SLloyd Pique static void name(void) 59*84e872a0SLloyd Pique 60*84e872a0SLloyd Pique int 61*84e872a0SLloyd Pique count_open_fds(void); 62*84e872a0SLloyd Pique 63*84e872a0SLloyd Pique void 64*84e872a0SLloyd Pique exec_fd_leak_check(int nr_expected_fds); /* never returns */ 65*84e872a0SLloyd Pique 66*84e872a0SLloyd Pique void 67*84e872a0SLloyd Pique check_fd_leaks(int supposed_fds); 68*84e872a0SLloyd Pique 69*84e872a0SLloyd Pique /* 70*84e872a0SLloyd Pique * set/reset the timeout in seconds. The timeout starts 71*84e872a0SLloyd Pique * at the point of invoking this function 72*84e872a0SLloyd Pique */ 73*84e872a0SLloyd Pique void 74*84e872a0SLloyd Pique test_set_timeout(unsigned int); 75*84e872a0SLloyd Pique 76*84e872a0SLloyd Pique /* test-runner uses alarm() and SIGALRM, so we can not 77*84e872a0SLloyd Pique * use usleep and sleep functions in tests (see 'man usleep' 78*84e872a0SLloyd Pique * or 'man sleep', respectively). Following functions are safe 79*84e872a0SLloyd Pique * to use in tests */ 80*84e872a0SLloyd Pique void 81*84e872a0SLloyd Pique test_usleep(useconds_t); 82*84e872a0SLloyd Pique 83*84e872a0SLloyd Pique void 84*84e872a0SLloyd Pique test_sleep(unsigned int); 85*84e872a0SLloyd Pique 86*84e872a0SLloyd Pique void 87*84e872a0SLloyd Pique test_disable_coredumps(void); 88*84e872a0SLloyd Pique 89*84e872a0SLloyd Pique #define DISABLE_LEAK_CHECKS \ 90*84e872a0SLloyd Pique do { \ 91*84e872a0SLloyd Pique extern int fd_leak_check_enabled; \ 92*84e872a0SLloyd Pique fd_leak_check_enabled = 0; \ 93*84e872a0SLloyd Pique } while (0); 94*84e872a0SLloyd Pique 95*84e872a0SLloyd Pique #endif 96