From 2d96c65b78f2a0931f411af92ff098f0a103fb36 Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Thu, 4 Dec 2008 16:58:03 -0500 Subject: [PATCH] Basic test for gzip compatibility. I've commented out the test for handling concatenated gzip streams, as it appears I need to do more work on refactoring the read filter framework before this is reasonable to implement. Fortunately, concatenated gzip streams are uncommon. SVN-Revision: 262 --- Makefile.am | 3 + libarchive/test/Makefile | 1 + libarchive/test/test_compat_gzip.c | 94 +++++++++++++++++++++++ libarchive/test/test_compat_gzip_1.tgz.uu | 22 ++++++ libarchive/test/test_compat_gzip_2.tgz.uu | 9 +++ 5 files changed, 129 insertions(+) create mode 100644 libarchive/test/test_compat_gzip.c create mode 100644 libarchive/test/test_compat_gzip_1.tgz.uu create mode 100644 libarchive/test/test_compat_gzip_2.tgz.uu diff --git a/Makefile.am b/Makefile.am index d4bc33d81..546c7ccf4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -183,6 +183,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_bad_fd.c \ libarchive/test/test_compat_bzip2.c \ libarchive/test/test_compat_gtar.c \ + libarchive/test/test_compat_gzip.c \ libarchive/test/test_compat_tar_hardlink.c \ libarchive/test/test_compat_zip.c \ libarchive/test/test_empty_write.c \ @@ -256,6 +257,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_compat_bzip2_1.tbz.uu \ libarchive/test/test_compat_bzip2_2.tbz.uu \ libarchive/test/test_compat_gtar_1.tgz.uu \ + libarchive/test/test_compat_gzip_1.tgz.uu \ + libarchive/test/test_compat_gzip_2.tgz.uu \ libarchive/test/test_compat_tar_hardlink_1.tar.uu \ libarchive/test/test_compat_zip_1.zip.uu \ libarchive/test/test_fuzz_1.iso.uu \ diff --git a/libarchive/test/Makefile b/libarchive/test/Makefile index c2635aa41..46bd623d8 100644 --- a/libarchive/test/Makefile +++ b/libarchive/test/Makefile @@ -15,6 +15,7 @@ TESTS= \ test_bad_fd.c \ test_compat_bzip2.c \ test_compat_gtar.c \ + test_compat_gzip.c \ test_compat_tar_hardlink.c \ test_compat_zip.c \ test_empty_write.c \ diff --git a/libarchive/test/test_compat_gzip.c b/libarchive/test/test_compat_gzip.c new file mode 100644 index 000000000..759af9194 --- /dev/null +++ b/libarchive/test/test_compat_gzip.c @@ -0,0 +1,94 @@ +/*- + * 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$"); + +/* + * Verify our ability to read sample files compatibly with gunzip. + * + * In particular: + * * gunzip will read multiple gzip streams, concatenating the output + * * gunzip 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 +verify(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)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + extract_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 200)); + + /* Read entries, match up names with list above. */ + for (i = 0; i < 6; ++i) { + r = archive_read_next_header(a, &ae); + failure("Could not read file %d (%s) from %s", i, n[i], name); + assertEqualIntA(a, ARCHIVE_OK, r); + if (r != ARCHIVE_OK) { + archive_read_finish(a); + return; + } + 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_GZIP); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +#endif +} + + +DEFINE_TEST(test_compat_gzip) +{ + /* This sample has been 'split', each piece compressed separately, + * then concatenated. Gunzip will emit the concatenated result. */ + /* Not supported in libarchive 2.6 and earlier */ + /* verify("test_compat_gzip_1.tgz"); */ + /* This sample has been compressed as a single stream, but then + * some unrelated garbage text has been appended to the end. */ + verify("test_compat_gzip_2.tgz"); +} + + diff --git a/libarchive/test/test_compat_gzip_1.tgz.uu b/libarchive/test/test_compat_gzip_1.tgz.uu new file mode 100644 index 000000000..c4793a634 --- /dev/null +++ b/libarchive/test/test_compat_gzip_1.tgz.uu @@ -0,0 +1,22 @@ +begin 644 test_compat_gzip_1.tgz +M'XL(")B^(DD``W1EV=QL!06ER26`1T2G9F:EY)54XJ +MN>9`/*(`IX<(2#/D&F@GC`(Z``#S57',@'E&`TT,$I!EQ +M#;031@$5`0`Q!<\4Z`,``!^+"`B8OB))``-T97-T+7-P;&ET+G1A$0!3@\1D&;,-=!.&`5D``#7L]HO +MZ`,``!^+"`B8OB))``-T97-T+7-P;&ET+G1A57',@'E&`TT,$I!ER#;031@$>``"Y*#OBZ`,``!^+"`B8 +MOB))``-T97-T+7-P;&ET+G1A@ALXPP`]CXF=Q&A<:-UX>EN)C5M,AL;P +MO@V[0A=_.E39F2.B'*.?5QX2?Z\?XGE&27)F]L0)V>E_'7YY07\>OZ)Y1W6Q\!-J3!?H^Z_J7TG]%_"QK0?\]4[/>HZS^_^T\! +M_;>@@OY[=N2]6E\!JOH/P])_2OC^-X'YOV]+_]97@*K^A4K_C/Y;P/S?MZ5_ +MZRM`7?]<^L?_OR8P_P,`].D%,XR2*0`<``!4:&ES(&ES('5N