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