1*543adbedSBen Gras /* 2*543adbedSBen Gras * Copyright (c) 2003-2006 Tim Kientzle 3*543adbedSBen Gras * All rights reserved. 4*543adbedSBen Gras * 5*543adbedSBen Gras * Redistribution and use in source and binary forms, with or without 6*543adbedSBen Gras * modification, are permitted provided that the following conditions 7*543adbedSBen Gras * are met: 8*543adbedSBen Gras * 1. Redistributions of source code must retain the above copyright 9*543adbedSBen Gras * notice, this list of conditions and the following disclaimer. 10*543adbedSBen Gras * 2. Redistributions in binary form must reproduce the above copyright 11*543adbedSBen Gras * notice, this list of conditions and the following disclaimer in the 12*543adbedSBen Gras * documentation and/or other materials provided with the distribution. 13*543adbedSBen Gras * 14*543adbedSBen Gras * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15*543adbedSBen Gras * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16*543adbedSBen Gras * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17*543adbedSBen Gras * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18*543adbedSBen Gras * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19*543adbedSBen Gras * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20*543adbedSBen Gras * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21*543adbedSBen Gras * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22*543adbedSBen Gras * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23*543adbedSBen Gras * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24*543adbedSBen Gras * 25*543adbedSBen Gras * $FreeBSD: src/usr.bin/tar/test/test.h,v 1.4 2008/08/21 07:04:57 kientzle Exp $ 26*543adbedSBen Gras */ 27*543adbedSBen Gras 28*543adbedSBen Gras /* Every test program should #include "test.h" as the first thing. */ 29*543adbedSBen Gras 30*543adbedSBen Gras /* 31*543adbedSBen Gras * The goal of this file (and the matching test.c) is to 32*543adbedSBen Gras * simplify the very repetitive test-*.c test programs. 33*543adbedSBen Gras */ 34*543adbedSBen Gras #if defined(HAVE_CONFIG_H) 35*543adbedSBen Gras /* Most POSIX platforms use the 'configure' script to build config.h */ 36*543adbedSBen Gras #include "config.h" 37*543adbedSBen Gras #elif defined(__FreeBSD__) 38*543adbedSBen Gras /* Building as part of FreeBSD system requires a pre-built config.h. */ 39*543adbedSBen Gras #include "config_freebsd.h" 40*543adbedSBen Gras #elif defined(_WIN32) && !defined(__CYGWIN__) 41*543adbedSBen Gras /* Win32 can't run the 'configure' script. */ 42*543adbedSBen Gras #include "config_windows.h" 43*543adbedSBen Gras #else 44*543adbedSBen Gras /* Warn if the library hasn't been (automatically or manually) configured. */ 45*543adbedSBen Gras #error Oops: No config.h and no pre-built configuration in test.h. 46*543adbedSBen Gras #endif 47*543adbedSBen Gras 48*543adbedSBen Gras #include <sys/types.h> /* Windows requires this before sys/stat.h */ 49*543adbedSBen Gras #include <sys/stat.h> 50*543adbedSBen Gras 51*543adbedSBen Gras #ifdef USE_DMALLOC 52*543adbedSBen Gras #include <dmalloc.h> 53*543adbedSBen Gras #endif 54*543adbedSBen Gras #if HAVE_DIRENT_H 55*543adbedSBen Gras #include <dirent.h> 56*543adbedSBen Gras #endif 57*543adbedSBen Gras #ifdef HAVE_DIRECT_H 58*543adbedSBen Gras #include <direct.h> 59*543adbedSBen Gras #define dirent direct 60*543adbedSBen Gras #endif 61*543adbedSBen Gras #include <errno.h> 62*543adbedSBen Gras #include <fcntl.h> 63*543adbedSBen Gras #ifdef HAVE_IO_H 64*543adbedSBen Gras #include <io.h> 65*543adbedSBen Gras #endif 66*543adbedSBen Gras #include <stdio.h> 67*543adbedSBen Gras #include <stdlib.h> 68*543adbedSBen Gras #include <string.h> 69*543adbedSBen Gras #include <time.h> 70*543adbedSBen Gras #ifdef HAVE_UNISTD_H 71*543adbedSBen Gras #include <unistd.h> 72*543adbedSBen Gras #endif 73*543adbedSBen Gras #include <wchar.h> 74*543adbedSBen Gras #ifdef HAVE_WINDOWS_H 75*543adbedSBen Gras #include <windows.h> 76*543adbedSBen Gras #endif 77*543adbedSBen Gras 78*543adbedSBen Gras /* 79*543adbedSBen Gras * System-specific tweaks. We really want to minimize these 80*543adbedSBen Gras * as much as possible, since they make it harder to understand 81*543adbedSBen Gras * the mainline code. 82*543adbedSBen Gras */ 83*543adbedSBen Gras 84*543adbedSBen Gras /* Windows (including Visual Studio and MinGW but not Cygwin) */ 85*543adbedSBen Gras #if defined(_WIN32) && !defined(__CYGWIN__) 86*543adbedSBen Gras #include "../bsdtar_windows.h" 87*543adbedSBen Gras #if !defined(__BORLANDC__) 88*543adbedSBen Gras #define strdup _strdup 89*543adbedSBen Gras #endif 90*543adbedSBen Gras #define LOCALE_DE "deu" 91*543adbedSBen Gras #else 92*543adbedSBen Gras #define LOCALE_DE "de_DE.UTF-8" 93*543adbedSBen Gras #endif 94*543adbedSBen Gras 95*543adbedSBen Gras /* Visual Studio */ 96*543adbedSBen Gras #ifdef _MSC_VER 97*543adbedSBen Gras #define snprintf sprintf_s 98*543adbedSBen Gras #endif 99*543adbedSBen Gras 100*543adbedSBen Gras /* Cygwin */ 101*543adbedSBen Gras #if defined(__CYGWIN__) 102*543adbedSBen Gras /* Cygwin-1.7.x is lazy about populating nlinks, so don't 103*543adbedSBen Gras * expect it to be accurate. */ 104*543adbedSBen Gras # define NLINKS_INACCURATE_FOR_DIRS 105*543adbedSBen Gras #endif 106*543adbedSBen Gras 107*543adbedSBen Gras #if defined(__HAIKU__) || defined(__QNXNTO__) 108*543adbedSBen Gras /* Haiku and QNX have typedefs in stdint.h (needed for int64_t) */ 109*543adbedSBen Gras #include <stdint.h> 110*543adbedSBen Gras #endif 111*543adbedSBen Gras 112*543adbedSBen Gras /* Get a real definition for __FBSDID if we can */ 113*543adbedSBen Gras #if HAVE_SYS_CDEFS_H 114*543adbedSBen Gras #include <sys/cdefs.h> 115*543adbedSBen Gras #endif 116*543adbedSBen Gras 117*543adbedSBen Gras /* If not, define it so as to avoid dangling semicolons. */ 118*543adbedSBen Gras #ifndef __FBSDID 119*543adbedSBen Gras #define __FBSDID(a) struct _undefined_hack 120*543adbedSBen Gras #endif 121*543adbedSBen Gras 122*543adbedSBen Gras #ifndef O_BINARY 123*543adbedSBen Gras #define O_BINARY 0 124*543adbedSBen Gras #endif 125*543adbedSBen Gras 126*543adbedSBen Gras /* 127*543adbedSBen Gras * Redefine DEFINE_TEST for use in defining the test functions. 128*543adbedSBen Gras */ 129*543adbedSBen Gras #undef DEFINE_TEST 130*543adbedSBen Gras #define DEFINE_TEST(name) void name(void); void name(void) 131*543adbedSBen Gras 132*543adbedSBen Gras /* An implementation of the standard assert() macro */ 133*543adbedSBen Gras #define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL) 134*543adbedSBen Gras /* chdir() and error if it fails */ 135*543adbedSBen Gras #define assertChdir(path) \ 136*543adbedSBen Gras assertion_chdir(__FILE__, __LINE__, path) 137*543adbedSBen Gras /* Assert two integers are the same. Reports value of each one if not. */ 138*543adbedSBen Gras #define assertEqualInt(v1,v2) \ 139*543adbedSBen Gras assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) 140*543adbedSBen Gras /* Assert two strings are the same. Reports value of each one if not. */ 141*543adbedSBen Gras #define assertEqualString(v1,v2) \ 142*543adbedSBen Gras assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) 143*543adbedSBen Gras /* As above, but v1 and v2 are wchar_t * */ 144*543adbedSBen Gras #define assertEqualWString(v1,v2) \ 145*543adbedSBen Gras assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) 146*543adbedSBen Gras /* As above, but raw blocks of bytes. */ 147*543adbedSBen Gras #define assertEqualMem(v1, v2, l) \ 148*543adbedSBen Gras assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL) 149*543adbedSBen Gras /* Assert two files are the same; allow printf-style expansion of second name. 150*543adbedSBen Gras * See below for comments about variable arguments here... 151*543adbedSBen Gras */ 152*543adbedSBen Gras #define assertEqualFile \ 153*543adbedSBen Gras assertion_setup(__FILE__, __LINE__);assertion_equal_file 154*543adbedSBen Gras /* Assert that a file is empty; supports printf-style arguments. */ 155*543adbedSBen Gras #define assertEmptyFile \ 156*543adbedSBen Gras assertion_setup(__FILE__, __LINE__);assertion_empty_file 157*543adbedSBen Gras /* Assert that a file is not empty; supports printf-style arguments. */ 158*543adbedSBen Gras #define assertNonEmptyFile \ 159*543adbedSBen Gras assertion_setup(__FILE__, __LINE__);assertion_non_empty_file 160*543adbedSBen Gras #define assertFileAtime(pathname, sec, nsec) \ 161*543adbedSBen Gras assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec) 162*543adbedSBen Gras #define assertFileAtimeRecent(pathname) \ 163*543adbedSBen Gras assertion_file_atime_recent(__FILE__, __LINE__, pathname) 164*543adbedSBen Gras #define assertFileBirthtime(pathname, sec, nsec) \ 165*543adbedSBen Gras assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec) 166*543adbedSBen Gras #define assertFileBirthtimeRecent(pathname) \ 167*543adbedSBen Gras assertion_file_birthtime_recent(__FILE__, __LINE__, pathname) 168*543adbedSBen Gras /* Assert that a file exists; supports printf-style arguments. */ 169*543adbedSBen Gras #define assertFileExists \ 170*543adbedSBen Gras assertion_setup(__FILE__, __LINE__);assertion_file_exists 171*543adbedSBen Gras /* Assert that a file exists; supports printf-style arguments. */ 172*543adbedSBen Gras #define assertFileNotExists \ 173*543adbedSBen Gras assertion_setup(__FILE__, __LINE__);assertion_file_not_exists 174*543adbedSBen Gras /* Assert that file contents match a string; supports printf-style arguments. */ 175*543adbedSBen Gras #define assertFileContents \ 176*543adbedSBen Gras assertion_setup(__FILE__, __LINE__);assertion_file_contents 177*543adbedSBen Gras #define assertFileMtime(pathname, sec, nsec) \ 178*543adbedSBen Gras assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec) 179*543adbedSBen Gras #define assertFileMtimeRecent(pathname) \ 180*543adbedSBen Gras assertion_file_mtime_recent(__FILE__, __LINE__, pathname) 181*543adbedSBen Gras #define assertFileNLinks(pathname, nlinks) \ 182*543adbedSBen Gras assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks) 183*543adbedSBen Gras #define assertFileSize(pathname, size) \ 184*543adbedSBen Gras assertion_file_size(__FILE__, __LINE__, pathname, size) 185*543adbedSBen Gras #define assertTextFileContents \ 186*543adbedSBen Gras assertion_setup(__FILE__, __LINE__);assertion_text_file_contents 187*543adbedSBen Gras #define assertFileContainsLinesAnyOrder(pathname, lines) \ 188*543adbedSBen Gras assertion_file_contains_lines_any_order(__FILE__, __LINE__, pathname, lines) 189*543adbedSBen Gras #define assertIsDir(pathname, mode) \ 190*543adbedSBen Gras assertion_is_dir(__FILE__, __LINE__, pathname, mode) 191*543adbedSBen Gras #define assertIsHardlink(path1, path2) \ 192*543adbedSBen Gras assertion_is_hardlink(__FILE__, __LINE__, path1, path2) 193*543adbedSBen Gras #define assertIsNotHardlink(path1, path2) \ 194*543adbedSBen Gras assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2) 195*543adbedSBen Gras #define assertIsReg(pathname, mode) \ 196*543adbedSBen Gras assertion_is_reg(__FILE__, __LINE__, pathname, mode) 197*543adbedSBen Gras #define assertIsSymlink(pathname, contents) \ 198*543adbedSBen Gras assertion_is_symlink(__FILE__, __LINE__, pathname, contents) 199*543adbedSBen Gras /* Create a directory, report error if it fails. */ 200*543adbedSBen Gras #define assertMakeDir(dirname, mode) \ 201*543adbedSBen Gras assertion_make_dir(__FILE__, __LINE__, dirname, mode) 202*543adbedSBen Gras #define assertMakeFile(path, mode, contents) \ 203*543adbedSBen Gras assertion_make_file(__FILE__, __LINE__, path, mode, contents) 204*543adbedSBen Gras #define assertMakeHardlink(newfile, oldfile) \ 205*543adbedSBen Gras assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile) 206*543adbedSBen Gras #define assertMakeSymlink(newfile, linkto) \ 207*543adbedSBen Gras assertion_make_symlink(__FILE__, __LINE__, newfile, linkto) 208*543adbedSBen Gras #define assertUmask(mask) \ 209*543adbedSBen Gras assertion_umask(__FILE__, __LINE__, mask) 210*543adbedSBen Gras 211*543adbedSBen Gras /* 212*543adbedSBen Gras * This would be simple with C99 variadic macros, but I don't want to 213*543adbedSBen Gras * require that. Instead, I insert a function call before each 214*543adbedSBen Gras * skipping() call to pass the file and line information down. Crude, 215*543adbedSBen Gras * but effective. 216*543adbedSBen Gras */ 217*543adbedSBen Gras #define skipping \ 218*543adbedSBen Gras assertion_setup(__FILE__, __LINE__);test_skipping 219*543adbedSBen Gras 220*543adbedSBen Gras /* Function declarations. These are defined in test_utility.c. */ 221*543adbedSBen Gras void failure(const char *fmt, ...); 222*543adbedSBen Gras int assertion_assert(const char *, int, int, const char *, void *); 223*543adbedSBen Gras int assertion_chdir(const char *, int, const char *); 224*543adbedSBen Gras int assertion_empty_file(const char *, ...); 225*543adbedSBen Gras int assertion_equal_file(const char *, const char *, ...); 226*543adbedSBen Gras int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *); 227*543adbedSBen Gras int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *); 228*543adbedSBen Gras int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *); 229*543adbedSBen Gras int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *); 230*543adbedSBen Gras int assertion_file_atime(const char *, int, const char *, long, long); 231*543adbedSBen Gras int assertion_file_atime_recent(const char *, int, const char *); 232*543adbedSBen Gras int assertion_file_birthtime(const char *, int, const char *, long, long); 233*543adbedSBen Gras int assertion_file_birthtime_recent(const char *, int, const char *); 234*543adbedSBen Gras int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **); 235*543adbedSBen Gras int assertion_file_contents(const void *, int, const char *, ...); 236*543adbedSBen Gras int assertion_file_exists(const char *, ...); 237*543adbedSBen Gras int assertion_file_mtime(const char *, int, const char *, long, long); 238*543adbedSBen Gras int assertion_file_mtime_recent(const char *, int, const char *); 239*543adbedSBen Gras int assertion_file_nlinks(const char *, int, const char *, int); 240*543adbedSBen Gras int assertion_file_not_exists(const char *, ...); 241*543adbedSBen Gras int assertion_file_size(const char *, int, const char *, long); 242*543adbedSBen Gras int assertion_is_dir(const char *, int, const char *, int); 243*543adbedSBen Gras int assertion_is_hardlink(const char *, int, const char *, const char *); 244*543adbedSBen Gras int assertion_is_not_hardlink(const char *, int, const char *, const char *); 245*543adbedSBen Gras int assertion_is_reg(const char *, int, const char *, int); 246*543adbedSBen Gras int assertion_is_symlink(const char *, int, const char *, const char *); 247*543adbedSBen Gras int assertion_make_dir(const char *, int, const char *, int); 248*543adbedSBen Gras int assertion_make_file(const char *, int, const char *, int, const char *); 249*543adbedSBen Gras int assertion_make_hardlink(const char *, int, const char *newpath, const char *); 250*543adbedSBen Gras int assertion_make_symlink(const char *, int, const char *newpath, const char *); 251*543adbedSBen Gras int assertion_non_empty_file(const char *, ...); 252*543adbedSBen Gras int assertion_text_file_contents(const char *buff, const char *f); 253*543adbedSBen Gras int assertion_umask(const char *, int, int); 254*543adbedSBen Gras void assertion_setup(const char *, int); 255*543adbedSBen Gras 256*543adbedSBen Gras void test_skipping(const char *fmt, ...); 257*543adbedSBen Gras 258*543adbedSBen Gras /* Like sprintf, then system() */ 259*543adbedSBen Gras int systemf(const char * fmt, ...); 260*543adbedSBen Gras 261*543adbedSBen Gras /* Delay until time() returns a value after this. */ 262*543adbedSBen Gras void sleepUntilAfter(time_t); 263*543adbedSBen Gras 264*543adbedSBen Gras /* Return true if this platform can create symlinks. */ 265*543adbedSBen Gras int canSymlink(void); 266*543adbedSBen Gras 267*543adbedSBen Gras /* Return true if this platform can run the "gzip" program. */ 268*543adbedSBen Gras int canGzip(void); 269*543adbedSBen Gras 270*543adbedSBen Gras /* Return true if this platform can run the "gunzip" program. */ 271*543adbedSBen Gras int canGunzip(void); 272*543adbedSBen Gras 273*543adbedSBen Gras /* Suck file into string allocated via malloc(). Call free() when done. */ 274*543adbedSBen Gras /* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */ 275*543adbedSBen Gras char *slurpfile(size_t *, const char *fmt, ...); 276*543adbedSBen Gras 277*543adbedSBen Gras /* Extracts named reference file to the current directory. */ 278*543adbedSBen Gras void extract_reference_file(const char *); 279*543adbedSBen Gras 280*543adbedSBen Gras /* 281*543adbedSBen Gras * Special interfaces for program test harness. 282*543adbedSBen Gras */ 283*543adbedSBen Gras 284*543adbedSBen Gras /* Pathname of exe to be tested. */ 285*543adbedSBen Gras const char *testprogfile; 286*543adbedSBen Gras /* Name of exe to use in printf-formatted command strings. */ 287*543adbedSBen Gras /* On Windows, this includes leading/trailing quotes. */ 288*543adbedSBen Gras const char *testprog; 289