1 /*- 2 * Copyright (c) 2003-2007 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 #include "test.h" 26 __FBSDID("$FreeBSD$"); 27 28 static const char * 29 make_files(void) 30 { 31 FILE *f; 32 33 /* File with 10 bytes content. */ 34 f = fopen("file", "wb"); 35 assert(f != NULL); 36 assertEqualInt(10, fwrite("123456789", 1, 10, f)); 37 fclose(f); 38 39 /* hardlink to above file. */ 40 assertMakeHardlink("linkfile", "file"); 41 assertIsHardlink("file", "linkfile"); 42 43 /* Symlink to above file. */ 44 if (canSymlink()) 45 assertMakeSymlink("symlink", "file"); 46 47 /* Directory. */ 48 assertMakeDir("dir", 0775); 49 50 return canSymlink() 51 ? "file linkfile symlink dir" 52 : "file linkfile dir"; 53 } 54 55 static void 56 verify_files(const char *target) 57 { 58 assertChdir(target); 59 60 /* Regular file with 2 links. */ 61 assertIsReg("file", -1); 62 assertFileSize("file", 10); 63 assertFileContents("123456789", 10, "file"); 64 failure("%s", target); 65 assertFileNLinks("file", 2); 66 67 /* Another name for the same file. */ 68 assertIsReg("linkfile", -1); 69 assertFileSize("linkfile", 10); 70 assertFileContents("123456789", 10, "linkfile"); 71 assertFileNLinks("linkfile", 2); 72 assertIsHardlink("file", "linkfile"); 73 74 /* Symlink */ 75 if (canSymlink()) 76 assertIsSymlink("symlink", "file"); 77 78 /* dir */ 79 assertIsDir("dir", 0775); 80 assertChdir(".."); 81 } 82 83 static void 84 run_tar(const char *target, const char *pack_options, 85 const char *unpack_options, const char *flist) 86 { 87 int r; 88 89 assertMakeDir(target, 0775); 90 91 /* Use the tar program to create an archive. */ 92 r = systemf("%s cf - %s %s >%s/archive 2>%s/pack.err", testprog, pack_options, flist, target, target); 93 failure("Error invoking %s cf -", testprog, pack_options); 94 assertEqualInt(r, 0); 95 96 assertChdir(target); 97 98 /* Verify that nothing went to stderr. */ 99 assertEmptyFile("pack.err"); 100 101 /* 102 * Use tar to unpack the archive into another directory. 103 */ 104 r = systemf("%s xf archive %s >unpack.out 2>unpack.err", 105 testprog, unpack_options); 106 failure("Error invoking %s xf archive %s", testprog, unpack_options); 107 assertEqualInt(r, 0); 108 109 /* Verify that nothing went to stderr. */ 110 assertEmptyFile("unpack.err"); 111 assertChdir(".."); 112 } 113 114 DEFINE_TEST(test_basic) 115 { 116 const char *flist; 117 118 assertUmask(0); 119 flist = make_files(); 120 /* Archive/dearchive with a variety of options. */ 121 run_tar("copy", "", "", flist); 122 verify_files("copy"); 123 124 run_tar("copy_ustar", "--format=ustar", "", flist); 125 verify_files("copy_ustar"); 126 127 /* tar doesn't handle cpio symlinks correctly */ 128 /* run_tar("copy_odc", "--format=odc", ""); */ 129 } 130