1 /* 2 * Copyright (c) 2015-2016 Cyril Hrubis <chrubis (at) suse.cz> 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #ifndef TST_TEST_H__ 19 #define TST_TEST_H__ 20 21 #ifdef __TEST_H__ 22 # error Oldlib test.h already included 23 #endif /* __TEST_H__ */ 24 25 #include <unistd.h> 26 #include <limits.h> 27 28 #include "tst_common.h" 29 #include "tst_res_flags.h" 30 #include "tst_checkpoint.h" 31 #include "tst_device.h" 32 #include "tst_mkfs.h" 33 #include "tst_fs.h" 34 #include "tst_pid.h" 35 #include "tst_cmd.h" 36 #include "tst_cpu.h" 37 #include "tst_process_state.h" 38 #include "tst_atomic.h" 39 #include "tst_kvercmp.h" 40 #include "tst_clone.h" 41 #include "tst_kernel.h" 42 #include "tst_minmax.h" 43 44 /* 45 * Reports testcase result. 46 */ 47 void tst_res_(const char *file, const int lineno, int ttype, 48 const char *fmt, ...) 49 __attribute__ ((format (printf, 4, 5))); 50 51 #define tst_res(ttype, arg_fmt, ...) \ 52 tst_res_(__FILE__, __LINE__, (ttype), (arg_fmt), ##__VA_ARGS__) 53 54 void tst_resm_hexd_(const char *file, const int lineno, int ttype, 55 const void *buf, size_t size, const char *arg_fmt, ...) 56 __attribute__ ((format (printf, 6, 7))); 57 58 #define tst_res_hexd(ttype, buf, size, arg_fmt, ...) \ 59 tst_resm_hexd_(__FILE__, __LINE__, (ttype), (buf), (size), \ 60 (arg_fmt), ##__VA_ARGS__) 61 62 /* 63 * Reports result and exits a test. 64 */ 65 void tst_brk_(const char *file, const int lineno, int ttype, 66 const char *fmt, ...) 67 __attribute__ ((format (printf, 4, 5))); 68 69 #define tst_brk(ttype, arg_fmt, ...) \ 70 tst_brk_(__FILE__, __LINE__, (ttype), (arg_fmt), ##__VA_ARGS__) 71 72 pid_t safe_fork(const char *filename, unsigned int lineno); 73 #define SAFE_FORK() \ 74 safe_fork(__FILE__, __LINE__) 75 76 #define TST_TRACE(expr) \ 77 ({int ret = expr; \ 78 ret != 0 ? tst_res(TINFO, #expr " failed"), ret : ret; }) \ 79 80 #include "tst_safe_macros.h" 81 #include "tst_safe_file_ops.h" 82 #include "tst_safe_net.h" 83 84 /* 85 * Wait for all children and exit with TBROK if 86 * any of them returned a non-zero exit status. 87 */ 88 void tst_reap_children(void); 89 90 struct tst_option { 91 char *optstr; 92 char **arg; 93 char *help; 94 }; 95 96 /* 97 * Options parsing helpers. 98 * 99 * If str is NULL these are No-op. 100 * 101 * On failure non-zero (errno) is returned. 102 */ 103 int tst_parse_int(const char *str, int *val, int min, int max); 104 int tst_parse_long(const char *str, long *val, long min, long max); 105 int tst_parse_float(const char *str, float *val, float min, float max); 106 107 struct tst_test { 108 /* number of tests available in test() function */ 109 unsigned int tcnt; 110 111 struct tst_option *options; 112 113 const char *min_kver; 114 115 /* If set the test is compiled out */ 116 const char *tconf_msg; 117 118 int needs_tmpdir:1; 119 int needs_root:1; 120 int forks_child:1; 121 int needs_device:1; 122 int needs_checkpoints:1; 123 int format_device:1; 124 int mount_device:1; 125 int needs_rofs:1; 126 /* 127 * If set the test function will be executed for all available 128 * filesystems and the current filesytem type would be set in the 129 * tst_device->fs_type. 130 * 131 * The test setup and cleanup are executed before/after __EACH__ call 132 * to the test function. 133 */ 134 int all_filesystems:1; 135 136 /* Minimal device size in megabytes */ 137 unsigned int dev_min_size; 138 139 /* Device filesystem type override NULL == default */ 140 const char *dev_fs_type; 141 142 /* Options passed to SAFE_MKFS() when format_device is set */ 143 const char *const *dev_fs_opts; 144 const char *dev_extra_opt; 145 146 /* Device mount options, used if mount_device is set */ 147 const char *mntpoint; 148 unsigned int mnt_flags; 149 void *mnt_data; 150 151 /* override default timeout per test run, disabled == -1 */ 152 int timeout; 153 154 void (*setup)(void); 155 void (*cleanup)(void); 156 157 void (*test)(unsigned int test_nr); 158 void (*test_all)(void); 159 160 /* Syscall name used by the timer measurement library */ 161 const char *scall; 162 163 /* Sampling function for timer measurement testcases */ 164 int (*sample)(int clk_id, long long usec); 165 166 /* NULL terminated array of resource file names */ 167 const char *const *resource_files; 168 }; 169 170 /* 171 * Runs tests. 172 */ 173 void tst_run_tcases(int argc, char *argv[], struct tst_test *self) 174 __attribute__ ((noreturn)); 175 176 /* 177 * Does library initialization for child processes started by exec() 178 * 179 * The LTP_IPC_PATH variable must be passed to the program environment. 180 */ 181 void tst_reinit(void); 182 183 //TODO Clean? 184 #define TEST(SCALL) \ 185 do { \ 186 errno = 0; \ 187 TEST_RETURN = SCALL; \ 188 TEST_ERRNO = errno; \ 189 } while (0) 190 191 extern long TEST_RETURN; 192 extern int TEST_ERRNO; 193 194 /* 195 * Functions to convert ERRNO to its name and SIGNAL to its name. 196 */ 197 const char *tst_strerrno(int err); 198 const char *tst_strsig(int sig); 199 /* 200 * Returns string describing status as returned by wait(). 201 * 202 * BEWARE: Not thread safe. 203 */ 204 const char *tst_strstatus(int status); 205 206 void tst_set_timeout(int timeout); 207 208 #ifndef TST_NO_DEFAULT_MAIN 209 210 static struct tst_test test; 211 212 int main(int argc, char *argv[]) 213 { 214 tst_run_tcases(argc, argv, &test); 215 } 216 217 #endif /* TST_NO_DEFAULT_MAIN */ 218 219 #define TST_TEST_TCONF(message) \ 220 static struct tst_test test = { .tconf_msg = message } \ 221 /* 222 * This is a hack to make the testcases link without defining TCID 223 */ 224 const char *TCID; 225 226 #endif /* TST_TEST_H__ */ 227