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/cpio/test/test_gcpio_compat.c,v 1.2 2008/08/22 02:27:06 kientzle Exp $"); 27*caf54c4fSMartin Matuska 28*caf54c4fSMartin Matuska static void 29*caf54c4fSMartin Matuska unpack_test(const char *from, const char *options, const char *se) 30*caf54c4fSMartin Matuska { 31*caf54c4fSMartin Matuska int r; 32*caf54c4fSMartin Matuska 33*caf54c4fSMartin Matuska /* Create a work dir named after the file we're unpacking. */ 34*caf54c4fSMartin Matuska assertMakeDir(from, 0775); 35*caf54c4fSMartin Matuska assertChdir(from); 36*caf54c4fSMartin Matuska 37*caf54c4fSMartin Matuska /* 38*caf54c4fSMartin Matuska * Use cpio to unpack the sample archive 39*caf54c4fSMartin Matuska */ 40*caf54c4fSMartin Matuska extract_reference_file(from); 41*caf54c4fSMartin Matuska r = systemf("%s -i %s < %s >unpack.out 2>unpack.err", 42*caf54c4fSMartin Matuska testprog, options, from); 43*caf54c4fSMartin Matuska failure("Error invoking %s -i %s < %s", 44*caf54c4fSMartin Matuska testprog, options, from); 45*caf54c4fSMartin Matuska assertEqualInt(r, 0); 46*caf54c4fSMartin Matuska 47*caf54c4fSMartin Matuska /* Verify that nothing went to stderr. */ 48*caf54c4fSMartin Matuska if (canSymlink()) { 49*caf54c4fSMartin Matuska failure("Error invoking %s -i %s < %s", 50*caf54c4fSMartin Matuska testprog, options, from); 51*caf54c4fSMartin Matuska assertTextFileContents(se, "unpack.err"); 52*caf54c4fSMartin Matuska } 53*caf54c4fSMartin Matuska 54*caf54c4fSMartin Matuska /* 55*caf54c4fSMartin Matuska * Verify unpacked files. 56*caf54c4fSMartin Matuska */ 57*caf54c4fSMartin Matuska 58*caf54c4fSMartin Matuska /* Regular file with 2 links. */ 59*caf54c4fSMartin Matuska assertIsReg("file", 0644); 60*caf54c4fSMartin Matuska failure("%s", from); 61*caf54c4fSMartin Matuska assertFileSize("file", 10); 62*caf54c4fSMartin Matuska assertFileSize("linkfile", 10); 63*caf54c4fSMartin Matuska failure("%s", from); 64*caf54c4fSMartin Matuska assertFileNLinks("file", 2); 65*caf54c4fSMartin Matuska 66*caf54c4fSMartin Matuska /* Another name for the same file. */ 67*caf54c4fSMartin Matuska failure("%s", from); 68*caf54c4fSMartin Matuska assertIsHardlink("linkfile", "file"); 69*caf54c4fSMartin Matuska assertFileSize("file", 10); 70*caf54c4fSMartin Matuska assertFileSize("linkfile", 10); 71*caf54c4fSMartin Matuska 72*caf54c4fSMartin Matuska /* Symlink */ 73*caf54c4fSMartin Matuska if (canSymlink()) 74*caf54c4fSMartin Matuska assertIsSymlink("symlink", "file"); 75*caf54c4fSMartin Matuska 76*caf54c4fSMartin Matuska /* dir */ 77*caf54c4fSMartin Matuska assertIsDir("dir", 0775); 78*caf54c4fSMartin Matuska 79*caf54c4fSMartin Matuska assertChdir(".."); 80*caf54c4fSMartin Matuska } 81*caf54c4fSMartin Matuska 82*caf54c4fSMartin Matuska DEFINE_TEST(test_gcpio_compat) 83*caf54c4fSMartin Matuska { 84*caf54c4fSMartin Matuska assertUmask(0); 85*caf54c4fSMartin Matuska 86*caf54c4fSMartin Matuska /* Dearchive sample files with a variety of options. */ 87*caf54c4fSMartin Matuska if (canSymlink()) { 88*caf54c4fSMartin Matuska unpack_test("test_gcpio_compat_ref.bin", 89*caf54c4fSMartin Matuska "--no-preserve-owner", "1 block\n"); 90*caf54c4fSMartin Matuska unpack_test("test_gcpio_compat_ref.crc", 91*caf54c4fSMartin Matuska "--no-preserve-owner", "2 blocks\n"); 92*caf54c4fSMartin Matuska unpack_test("test_gcpio_compat_ref.newc", 93*caf54c4fSMartin Matuska "--no-preserve-owner", "2 blocks\n"); 94*caf54c4fSMartin Matuska /* gcpio-2.9 only reads 6 blocks here */ 95*caf54c4fSMartin Matuska unpack_test("test_gcpio_compat_ref.ustar", 96*caf54c4fSMartin Matuska "--no-preserve-owner", "7 blocks\n"); 97*caf54c4fSMartin Matuska } else { 98*caf54c4fSMartin Matuska unpack_test("test_gcpio_compat_ref_nosym.bin", 99*caf54c4fSMartin Matuska "--no-preserve-owner", "1 block\n"); 100*caf54c4fSMartin Matuska unpack_test("test_gcpio_compat_ref_nosym.crc", 101*caf54c4fSMartin Matuska "--no-preserve-owner", "2 blocks\n"); 102*caf54c4fSMartin Matuska unpack_test("test_gcpio_compat_ref_nosym.newc", 103*caf54c4fSMartin Matuska "--no-preserve-owner", "2 blocks\n"); 104*caf54c4fSMartin Matuska /* gcpio-2.9 only reads 6 blocks here */ 105*caf54c4fSMartin Matuska unpack_test("test_gcpio_compat_ref_nosym.ustar", 106*caf54c4fSMartin Matuska "--no-preserve-owner", "7 blocks\n"); 107*caf54c4fSMartin Matuska } 108*caf54c4fSMartin Matuska } 109