xref: /minix/external/bsd/libarchive/dist/cpio/test/test.h (revision 543adbed)
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/cpio/test/test.h,v 1.2 2008/06/21 02:17:18 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 "../cpio_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 assertIsDir(pathname, mode)		\
188*543adbedSBen Gras   assertion_is_dir(__FILE__, __LINE__, pathname, mode)
189*543adbedSBen Gras #define assertIsHardlink(path1, path2)	\
190*543adbedSBen Gras   assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
191*543adbedSBen Gras #define assertIsNotHardlink(path1, path2)	\
192*543adbedSBen Gras   assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
193*543adbedSBen Gras #define assertIsReg(pathname, mode)		\
194*543adbedSBen Gras   assertion_is_reg(__FILE__, __LINE__, pathname, mode)
195*543adbedSBen Gras #define assertIsSymlink(pathname, contents)	\
196*543adbedSBen Gras   assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
197*543adbedSBen Gras /* Create a directory, report error if it fails. */
198*543adbedSBen Gras #define assertMakeDir(dirname, mode)	\
199*543adbedSBen Gras   assertion_make_dir(__FILE__, __LINE__, dirname, mode)
200*543adbedSBen Gras #define assertMakeFile(path, mode, contents) \
201*543adbedSBen Gras   assertion_make_file(__FILE__, __LINE__, path, mode, contents)
202*543adbedSBen Gras #define assertMakeHardlink(newfile, oldfile)	\
203*543adbedSBen Gras   assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
204*543adbedSBen Gras #define assertMakeSymlink(newfile, linkto)	\
205*543adbedSBen Gras   assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
206*543adbedSBen Gras #define assertUmask(mask)	\
207*543adbedSBen Gras   assertion_umask(__FILE__, __LINE__, mask)
208*543adbedSBen Gras 
209*543adbedSBen Gras /*
210*543adbedSBen Gras  * This would be simple with C99 variadic macros, but I don't want to
211*543adbedSBen Gras  * require that.  Instead, I insert a function call before each
212*543adbedSBen Gras  * skipping() call to pass the file and line information down.  Crude,
213*543adbedSBen Gras  * but effective.
214*543adbedSBen Gras  */
215*543adbedSBen Gras #define skipping	\
216*543adbedSBen Gras   assertion_setup(__FILE__, __LINE__);test_skipping
217*543adbedSBen Gras 
218*543adbedSBen Gras /* Function declarations.  These are defined in test_utility.c. */
219*543adbedSBen Gras void failure(const char *fmt, ...);
220*543adbedSBen Gras int assertion_assert(const char *, int, int, const char *, void *);
221*543adbedSBen Gras int assertion_chdir(const char *, int, const char *);
222*543adbedSBen Gras int assertion_empty_file(const char *, ...);
223*543adbedSBen Gras int assertion_equal_file(const char *, const char *, ...);
224*543adbedSBen Gras int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
225*543adbedSBen Gras int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
226*543adbedSBen Gras int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
227*543adbedSBen Gras int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
228*543adbedSBen Gras int assertion_file_atime(const char *, int, const char *, long, long);
229*543adbedSBen Gras int assertion_file_atime_recent(const char *, int, const char *);
230*543adbedSBen Gras int assertion_file_birthtime(const char *, int, const char *, long, long);
231*543adbedSBen Gras int assertion_file_birthtime_recent(const char *, int, const char *);
232*543adbedSBen Gras int assertion_file_contents(const void *, int, const char *, ...);
233*543adbedSBen Gras int assertion_file_exists(const char *, ...);
234*543adbedSBen Gras int assertion_file_mtime(const char *, int, const char *, long, long);
235*543adbedSBen Gras int assertion_file_mtime_recent(const char *, int, const char *);
236*543adbedSBen Gras int assertion_file_nlinks(const char *, int, const char *, int);
237*543adbedSBen Gras int assertion_file_not_exists(const char *, ...);
238*543adbedSBen Gras int assertion_file_size(const char *, int, const char *, long);
239*543adbedSBen Gras int assertion_is_dir(const char *, int, const char *, int);
240*543adbedSBen Gras int assertion_is_hardlink(const char *, int, const char *, const char *);
241*543adbedSBen Gras int assertion_is_not_hardlink(const char *, int, const char *, const char *);
242*543adbedSBen Gras int assertion_is_reg(const char *, int, const char *, int);
243*543adbedSBen Gras int assertion_is_symlink(const char *, int, const char *, const char *);
244*543adbedSBen Gras int assertion_make_dir(const char *, int, const char *, int);
245*543adbedSBen Gras int assertion_make_file(const char *, int, const char *, int, const char *);
246*543adbedSBen Gras int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
247*543adbedSBen Gras int assertion_make_symlink(const char *, int, const char *newpath, const char *);
248*543adbedSBen Gras int assertion_non_empty_file(const char *, ...);
249*543adbedSBen Gras int assertion_text_file_contents(const char *buff, const char *f);
250*543adbedSBen Gras int assertion_umask(const char *, int, int);
251*543adbedSBen Gras void assertion_setup(const char *, int);
252*543adbedSBen Gras 
253*543adbedSBen Gras void test_skipping(const char *fmt, ...);
254*543adbedSBen Gras 
255*543adbedSBen Gras /* Like sprintf, then system() */
256*543adbedSBen Gras int systemf(const char * fmt, ...);
257*543adbedSBen Gras 
258*543adbedSBen Gras /* Delay until time() returns a value after this. */
259*543adbedSBen Gras void sleepUntilAfter(time_t);
260*543adbedSBen Gras 
261*543adbedSBen Gras /* Return true if this platform can create symlinks. */
262*543adbedSBen Gras int canSymlink(void);
263*543adbedSBen Gras 
264*543adbedSBen Gras /* Return true if this platform can run the "gzip" program. */
265*543adbedSBen Gras int canGzip(void);
266*543adbedSBen Gras 
267*543adbedSBen Gras /* Return true if this platform can run the "gunzip" program. */
268*543adbedSBen Gras int canGunzip(void);
269*543adbedSBen Gras 
270*543adbedSBen Gras /* Suck file into string allocated via malloc(). Call free() when done. */
271*543adbedSBen Gras /* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
272*543adbedSBen Gras char *slurpfile(size_t *, const char *fmt, ...);
273*543adbedSBen Gras 
274*543adbedSBen Gras /* Extracts named reference file to the current directory. */
275*543adbedSBen Gras void extract_reference_file(const char *);
276*543adbedSBen Gras 
277*543adbedSBen Gras /*
278*543adbedSBen Gras  * Special interfaces for program test harness.
279*543adbedSBen Gras  */
280*543adbedSBen Gras 
281*543adbedSBen Gras /* Pathname of exe to be tested. */
282*543adbedSBen Gras const char *testprogfile;
283*543adbedSBen Gras /* Name of exe to use in printf-formatted command strings. */
284*543adbedSBen Gras /* On Windows, this includes leading/trailing quotes. */
285*543adbedSBen Gras const char *testprog;
286