PageRenderTime 37ms CodeModel.GetById 19ms app.highlight 13ms RepoModel.GetById 1ms app.codeStats 0ms

/usr.bin/cpio/test/test.h

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