1*caf54c4fSMartin Matuska /*- 2*caf54c4fSMartin Matuska * Copyright (c) 2003-2007 Tim Kientzle 3*caf54c4fSMartin Matuska * All rights reserved. 4*caf54c4fSMartin Matuska * 5*caf54c4fSMartin Matuska * Redistribution and use in source and binary forms, with or without 6*caf54c4fSMartin Matuska * modification, are permitted provided that the following conditions 7*caf54c4fSMartin Matuska * are met: 8*caf54c4fSMartin Matuska * 1. Redistributions of source code must retain the above copyright 9*caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer. 10*caf54c4fSMartin Matuska * 2. Redistributions in binary form must reproduce the above copyright 11*caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer in the 12*caf54c4fSMartin Matuska * documentation and/or other materials provided with the distribution. 13*caf54c4fSMartin Matuska * 14*caf54c4fSMartin Matuska * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15*caf54c4fSMartin Matuska * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16*caf54c4fSMartin Matuska * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17*caf54c4fSMartin Matuska * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18*caf54c4fSMartin Matuska * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19*caf54c4fSMartin Matuska * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20*caf54c4fSMartin Matuska * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21*caf54c4fSMartin Matuska * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22*caf54c4fSMartin Matuska * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23*caf54c4fSMartin Matuska * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24*caf54c4fSMartin Matuska */ 25*caf54c4fSMartin Matuska #include "test.h" 26*caf54c4fSMartin Matuska __FBSDID("$FreeBSD: src/usr.bin/tar/test/test_basic.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); 27*caf54c4fSMartin Matuska 28*caf54c4fSMartin Matuska 29*caf54c4fSMartin Matuska static void 30*caf54c4fSMartin Matuska basic_tar(const char *target, const char *pack_options, 31*caf54c4fSMartin Matuska const char *unpack_options, const char *flist) 32*caf54c4fSMartin Matuska { 33*caf54c4fSMartin Matuska int r; 34*caf54c4fSMartin Matuska 35*caf54c4fSMartin Matuska assertMakeDir(target, 0775); 36*caf54c4fSMartin Matuska 37*caf54c4fSMartin Matuska /* Use the tar program to create an archive. */ 38*caf54c4fSMartin Matuska r = systemf("%s cf - %s %s >%s/archive 2>%s/pack.err", testprog, pack_options, flist, target, target); 39*caf54c4fSMartin Matuska failure("Error invoking %s cf -", testprog, pack_options); 40*caf54c4fSMartin Matuska assertEqualInt(r, 0); 41*caf54c4fSMartin Matuska 42*caf54c4fSMartin Matuska assertChdir(target); 43*caf54c4fSMartin Matuska 44*caf54c4fSMartin Matuska /* Verify that nothing went to stderr. */ 45*caf54c4fSMartin Matuska assertEmptyFile("pack.err"); 46*caf54c4fSMartin Matuska 47*caf54c4fSMartin Matuska /* 48*caf54c4fSMartin Matuska * Use tar to unpack the archive into another directory. 49*caf54c4fSMartin Matuska */ 50*caf54c4fSMartin Matuska r = systemf("%s xf archive %s >unpack.out 2>unpack.err", testprog, unpack_options); 51*caf54c4fSMartin Matuska failure("Error invoking %s xf archive %s", testprog, unpack_options); 52*caf54c4fSMartin Matuska assertEqualInt(r, 0); 53*caf54c4fSMartin Matuska 54*caf54c4fSMartin Matuska /* Verify that nothing went to stderr. */ 55*caf54c4fSMartin Matuska assertEmptyFile("unpack.err"); 56*caf54c4fSMartin Matuska 57*caf54c4fSMartin Matuska /* 58*caf54c4fSMartin Matuska * Verify unpacked files. 59*caf54c4fSMartin Matuska */ 60*caf54c4fSMartin Matuska 61*caf54c4fSMartin Matuska /* Regular file with 2 links. */ 62*caf54c4fSMartin Matuska assertIsReg("file", -1); 63*caf54c4fSMartin Matuska assertFileSize("file", 10); 64*caf54c4fSMartin Matuska failure("%s", target); 65*caf54c4fSMartin Matuska assertFileNLinks("file", 2); 66*caf54c4fSMartin Matuska 67*caf54c4fSMartin Matuska /* Another name for the same file. */ 68*caf54c4fSMartin Matuska assertIsReg("linkfile", -1); 69*caf54c4fSMartin Matuska assertFileSize("linkfile", 10); 70*caf54c4fSMartin Matuska assertFileNLinks("linkfile", 2); 71*caf54c4fSMartin Matuska assertIsHardlink("file", "linkfile"); 72*caf54c4fSMartin Matuska 73*caf54c4fSMartin Matuska /* Symlink */ 74*caf54c4fSMartin Matuska if (canSymlink()) 75*caf54c4fSMartin Matuska assertIsSymlink("symlink", "file"); 76*caf54c4fSMartin Matuska 77*caf54c4fSMartin Matuska /* dir */ 78*caf54c4fSMartin Matuska assertIsDir("dir", 0775); 79*caf54c4fSMartin Matuska assertChdir(".."); 80*caf54c4fSMartin Matuska } 81*caf54c4fSMartin Matuska 82*caf54c4fSMartin Matuska DEFINE_TEST(test_basic) 83*caf54c4fSMartin Matuska { 84*caf54c4fSMartin Matuska FILE *f; 85*caf54c4fSMartin Matuska const char *flist; 86*caf54c4fSMartin Matuska 87*caf54c4fSMartin Matuska assertUmask(0); 88*caf54c4fSMartin Matuska 89*caf54c4fSMartin Matuska /* File with 10 bytes content. */ 90*caf54c4fSMartin Matuska f = fopen("file", "wb"); 91*caf54c4fSMartin Matuska assert(f != NULL); 92*caf54c4fSMartin Matuska assertEqualInt(10, fwrite("123456789", 1, 10, f)); 93*caf54c4fSMartin Matuska fclose(f); 94*caf54c4fSMartin Matuska 95*caf54c4fSMartin Matuska /* hardlink to above file. */ 96*caf54c4fSMartin Matuska assertMakeHardlink("linkfile", "file"); 97*caf54c4fSMartin Matuska assertIsHardlink("file", "linkfile"); 98*caf54c4fSMartin Matuska 99*caf54c4fSMartin Matuska /* Symlink to above file. */ 100*caf54c4fSMartin Matuska if (canSymlink()) 101*caf54c4fSMartin Matuska assertMakeSymlink("symlink", "file"); 102*caf54c4fSMartin Matuska 103*caf54c4fSMartin Matuska /* Directory. */ 104*caf54c4fSMartin Matuska assertMakeDir("dir", 0775); 105*caf54c4fSMartin Matuska 106*caf54c4fSMartin Matuska if (canSymlink()) 107*caf54c4fSMartin Matuska flist = "file linkfile symlink dir"; 108*caf54c4fSMartin Matuska else 109*caf54c4fSMartin Matuska flist = "file linkfile dir"; 110*caf54c4fSMartin Matuska /* Archive/dearchive with a variety of options. */ 111*caf54c4fSMartin Matuska basic_tar("copy", "", "", flist); 112*caf54c4fSMartin Matuska /* tar doesn't handle cpio symlinks correctly */ 113*caf54c4fSMartin Matuska /* basic_tar("copy_odc", "--format=odc", ""); */ 114*caf54c4fSMartin Matuska basic_tar("copy_ustar", "--format=ustar", "", flist); 115*caf54c4fSMartin Matuska } 116