]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Add a compatibity test for lzip.
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Wed, 5 May 2010 06:40:07 +0000 (02:40 -0400)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Wed, 5 May 2010 06:40:07 +0000 (02:40 -0400)
SVN-Revision: 2371

Makefile.am
libarchive/test/CMakeLists.txt
libarchive/test/test_compat_lzip.c [new file with mode: 0644]
libarchive/test/test_compat_lzip_1.tlz.uu [new file with mode: 0644]
libarchive/test/test_compat_lzip_2.tlz.uu [new file with mode: 0644]

index b4346af472479810ca0358fe9d805d4da5ec9bfb..0cddba7b23d79695d6351986eac3439cab6f43bc 100644 (file)
@@ -242,6 +242,7 @@ libarchive_test_SOURCES=                                    \
        libarchive/test/test_compat_cpio.c                      \
        libarchive/test/test_compat_gtar.c                      \
        libarchive/test/test_compat_gzip.c                      \
+       libarchive/test/test_compat_lzip.c                      \
        libarchive/test/test_compat_lzma.c                      \
        libarchive/test/test_compat_solaris_tar_acl.c           \
        libarchive/test/test_compat_tar_hardlink.c              \
index e6282a90e723b3223a7934577046d18d9733c9b0..7e948140a49bcc1a5159e5ca674da876ef10491b 100644 (file)
@@ -17,6 +17,7 @@ IF(ENABLE_TEST)
     test_compat_cpio.c
     test_compat_gtar.c
     test_compat_gzip.c
+    test_compat_lzip.c
     test_compat_lzma.c
     test_compat_solaris_tar_acl.c
     test_compat_tar_hardlink.c
diff --git a/libarchive/test/test_compat_lzip.c b/libarchive/test/test_compat_lzip.c
new file mode 100644 (file)
index 0000000..0b414e0
--- /dev/null
@@ -0,0 +1,141 @@
+/*-
+ * Copyright (c) 2010 Michihiro NAKAJIMA
+ * Copyright (c) 2003-2008 Tim Kientzle
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/*
+Execute the following to rebuild the data for this program:
+   tail -n +33 test_compat_lzip.c | /bin/sh
+
+# Use lzip command.
+zcmd=lzip
+zsuffix=lz
+ztar_suffix=tlz
+mktarfile()
+{
+mkdir $dir
+echo "f1" > $dir/f1
+echo "f2" > $dir/f2
+echo "f3" > $dir/f3
+mkdir $dir/d1
+echo "f1" > $dir/d1/f1
+echo "f2" > $dir/d1/f2
+echo "f3" > $dir/d1/f3
+(cd $dir; tar cf ../$name.tar f1 f2 f3 d1/f1 d1/f2 d1/f3)
+rm -r $dir
+}
+#
+# Make a lzip file from splitted tar file.
+#
+name=test_compat_lzip_1
+dir="$name`date +%Y%m%d%H%M%S`.$USER"
+mktarfile
+split -b 3600 $name.tar $name.tar.
+rm $name.tar
+$zcmd $name.tar.*
+cat $name.tar.*.$zsuffix > $name.$ztar_suffix
+rm $name.tar.*.$zsuffix
+uuencode $name.$ztar_suffix $name.$ztar_suffix > $name.$ztar_suffix.uu
+rm -f $name.$ztar_suffix
+#
+# Make a lzip file with junk data at the end of the file.
+#
+name=test_compat_lzip_2
+dir="$name`date +%Y%m%d%H%M%S`.$USER"
+mktarfile
+$zcmd $name.tar
+mv $name.tar.$zsuffix $name.$ztar_suffix
+echo "This is unrelated junk data at the end of the file" >> $name.$ztar_suffix
+uuencode $name.$ztar_suffix $name.$ztar_suffix > $name.$ztar_suffix.uu
+rm -f $name.$ztar_suffix
+
+exit 0
+*/
+
+/*
+ * Verify our ability to read sample files compatibly with lzip.
+ *
+ * In particular:
+ *  * lzip will read multiple lzip streams, concatenating the output
+ *  * lzip will stop at the end of a stream if the following data
+ *    doesn't start with a gzip signature.
+ *
+ */
+
+/*
+ * All of the sample files have the same contents; they're just
+ * compressed in different ways.
+ */
+static void
+compat_lzip(const char *name)
+{
+       const char *n[7] = { "f1", "f2", "f3", "d1/f1", "d1/f2", "d1/f3", NULL };
+       struct archive_entry *ae;
+       struct archive *a;
+       int i, r;
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+       r = archive_read_support_compression_lzip(a);
+       if (r == ARCHIVE_WARN) {
+               skipping("lzip reading not fully supported on this platform");
+               assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+               return;
+       }
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       extract_reference_file(name);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2));
+
+       /* Read entries, match up names with list above. */
+       for (i = 0; i < 6; ++i) {
+               failure("Could not read file %d (%s) from %s", i, n[i], name);
+               assertEqualIntA(a, ARCHIVE_OK,
+                   archive_read_next_header(a, &ae));
+               assertEqualString(n[i], archive_entry_pathname(ae));
+       }
+
+       /* Verify the end-of-archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify that the format detection worked. */
+       assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_LZIP);
+       assertEqualString(archive_compression_name(a), "lzip");
+       assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
+
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+
+DEFINE_TEST(test_compat_lzip)
+{
+        /* This sample has been 'split', each piece compressed separately,
+         * then concatenated.  lzip will emit the concatenated result. */
+        compat_lzip("test_compat_lzip_1.tlz");
+        /* This sample has been compressed as a single stream, but then
+         * some unrelated garbage text has been appended to the end. */
+        compat_lzip("test_compat_lzip_2.tlz");
+}
diff --git a/libarchive/test/test_compat_lzip_1.tlz.uu b/libarchive/test/test_compat_lzip_1.tlz.uu
new file mode 100644 (file)
index 0000000..01e5e3b
--- /dev/null
@@ -0,0 +1,10 @@
+begin 644 test_compat_lzip_1.tlz
+M3%I)4`$,`#,,/!NGC#0&C6L"2_R2/O9*^":#5/GP,U"QL$1\Q:(3S>V*OTP*
+M1&9J-1:S\^>DEIOT;'&#"`B6#7ZO7%">,>LZ=:BU,Z7*^>M<3FV:GKO_?W;`
+M,N31CE_$<-$(3$J*AB5TTG2\;X[CSPOI6IIPV8\]86+J37::!/_LA^/@O"(1
+MAA`.````````F`````````!,6DE0`0P``&_]_BC86HZ6L8?*M6SC8*JJ7,GS
+M0IZA9CQ/^VS2N26K[BXKGC_1Z&JR]S2)5Q",)*$1RS"):7X:?OBQDJXU`>8K
+M\2*:_6!:)ZD5FBGJ?II6>-<K71*E]Z%2+8"G-.(X-N74SK.)7_YTN3Z\/1D0
+0\`T```````"&````````````
+`
+end
diff --git a/libarchive/test/test_compat_lzip_2.tlz.uu b/libarchive/test/test_compat_lzip_2.tlz.uu
new file mode 100644 (file)
index 0000000..bf954f2
--- /dev/null
@@ -0,0 +1,9 @@
+begin 644 test_compat_lzip_2.tlz
+M3%I)4`%-`#,,/!NGC#0&C6L"2_R2/O9*^":#5/GP,U"QL$1\Q:(3S>V*OTP*
+M1&9J-1:S\^>DEIOT;'&#"`B6#7ZO7%">,>LZ=:BU,Z7*^>M<3FV:GKO_?W;`
+M,N31CE_$<-$(3$J*AB5TTG2\;X[CSPOI6IIPV8\]9>BP>V?/L._78%+F2N-;
+M6V[`1"7)=_,5LD9U%73FQV-?_X5OKW0_.'N"`!P```````"R`````````%1H
+M:7,@:7,@=6YR96QA=&5D(&IU;FL@9&%T82!A="!T:&4@96YD(&]F('1H92!F
+$:6QE"@``
+`
+end