summaryrefslogtreecommitdiffstats
path: root/contrib/libarchive/libarchive/test/test_read_format_cab.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libarchive/libarchive/test/test_read_format_cab.c')
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cab.c281
1 files changed, 281 insertions, 0 deletions
diff --git a/contrib/libarchive/libarchive/test/test_read_format_cab.c b/contrib/libarchive/libarchive/test/test_read_format_cab.c
new file mode 100644
index 0000000..4e8607e
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_read_format_cab.c
@@ -0,0 +1,281 @@
+/*-
+ * Copyright (c) 2010 Michihiro NAKAJIMA
+ * 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");
+
+#ifdef HAVE_LIBZ
+static const int libz_enabled = 1;
+#else
+static const int libz_enabled = 0;
+#endif
+
+/*
+Execute the following command to rebuild the data for this program:
+ tail -n +44 test_read_format_cab.c | /bin/sh
+And following works are:
+1. Move /tmp/cab/cab.zip to Windows PC
+2. Extract cab.zip
+3. Open command prompt and change current directory where you extracted cab.zip
+4. Execute cab.bat
+5. Then you will see that there is a cabinet file, test.cab
+6. Move test.cab to posix platform
+7. Extract test.cab with this version of bsdtar
+8. Execute the following command to make uuencoded files.
+ uuencode test_read_format_cab_1.cab test_read_format_cab_1.cab > test_read_format_cab_1.cab.uu
+ uuencode test_read_format_cab_2.cab test_read_format_cab_2.cab > test_read_format_cab_2.cab.uu
+ uuencode test_read_format_cab_3.cab test_read_format_cab_3.cab > test_read_format_cab_3.cab.uu
+
+#!/bin/sh
+#
+# How to make test data.
+#
+# Temporary directory.
+base=/tmp/cab
+# Owner id
+owner=1001
+# Group id
+group=1001
+#
+# Make contents of a cabinet file.
+#
+rm -rf ${base}
+mkdir ${base}
+mkdir ${base}/dir1
+mkdir ${base}/dir2
+#
+touch ${base}/empty
+cat > ${base}/dir1/file1 << END
+ file 1 contents
+hello
+hello
+hello
+END
+#
+cat > ${base}/dir2/file2 << END
+ file 2 contents
+hello
+hello
+hello
+hello
+hello
+hello
+END
+#
+dd if=/dev/zero of=${base}/zero bs=1 count=33000 > /dev/null 2>&1
+#
+cab1=test_read_format_cab_1.cab
+cab2=test_read_format_cab_2.cab
+cab3=test_read_format_cab_3.cab
+#
+#
+cat > ${base}/mkcab1 << END
+.Set Compress=OFF
+.Set DiskDirectory1=.
+.Set InfDate=1980-01-02
+.Set InfTime=00:00:00
+.Set CabinetName1=${cab1}
+empty
+.Set DestinationDir=dir1
+dir1/file1
+.Set DestinationDir=dir2
+dir2/file2
+END
+#
+cat > ${base}/mkcab2 << END
+.Set CompressionType=MSZIP
+.Set DiskDirectory1=.
+.Set InfDate=1980-01-02
+.Set InfTime=00:00:00
+.Set CabinetName1=${cab2}
+empty
+zero
+.Set DestinationDir=dir1
+dir1/file1
+.Set DestinationDir=dir2
+dir2/file2
+END
+#
+cat > ${base}/mkcab3 << END
+.Set CompressionType=LZX
+.Set DiskDirectory1=.
+.Set InfDate=1980-01-02
+.Set InfTime=00:00:00
+.Set CabinetName1=${cab3}
+empty
+zero
+.Set DestinationDir=dir1
+dir1/file1
+.Set DestinationDir=dir2
+dir2/file2
+END
+#
+cat > ${base}/mkcab4 << END
+.Set CompressionType=MSZIP
+.Set DiskDirectory1=.
+.Set CabinetName1=test.cab
+${cab1}
+${cab2}
+${cab3}
+END
+#
+cat > ${base}/cab.bat << END
+makecab.exe /F mkcab1
+makecab.exe /F mkcab2
+makecab.exe /F mkcab3
+makecab.exe /F mkcab4
+del setup.inf setup.rpt
+del empty zero dir1\file1 dir2\file2 mkcab1 mkcab2 mkcab3 mkcab4
+del ${cab1} ${cab2} ${cab3}
+rmdir dir1 dir2
+END
+#
+f=cab.zip
+(cd ${base}; zip -q -c $f empty zero dir1/file1 dir2/file2 mkcab1 mkcab2 mkcab3 mkcab4 cab.bat)
+#
+exit 1
+*/
+
+static const char file1[] = {
+" file 1 contents\n"
+"hello\n"
+"hello\n"
+"hello\n"
+};
+#define file1_size (sizeof(file1)-1)
+static const char file2[] = {
+" file 2 contents\n"
+"hello\n"
+"hello\n"
+"hello\n"
+"hello\n"
+"hello\n"
+"hello\n"
+};
+#define file2_size (sizeof(file2)-1)
+
+enum comp_type {
+ STORE = 0,
+ MSZIP,
+ LZX
+};
+static void
+verify(const char *refname, enum comp_type comp)
+{
+ struct archive_entry *ae;
+ struct archive *a;
+ char buff[128];
+ char zero[128];
+ size_t s;
+
+ memset(zero, 0, sizeof(zero));
+ extract_reference_file(refname);
+ assert((a = archive_read_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_open_filename(a, refname, 10240));
+
+ /* Verify regular empty. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualInt((AE_IFREG | 0777), archive_entry_mode(ae));
+ assertEqualString("empty", archive_entry_pathname(ae));
+ assertEqualInt(0, archive_entry_uid(ae));
+ assertEqualInt(0, archive_entry_gid(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+
+ if (comp != STORE) {
+ /* Verify regular zero.
+ * Maximum CFDATA size is 32768, so we need over 32768 bytes
+ * file to check if we properly handle multiple CFDATA.
+ */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualInt((AE_IFREG | 0777), archive_entry_mode(ae));
+ assertEqualString("zero", archive_entry_pathname(ae));
+ assertEqualInt(0, archive_entry_uid(ae));
+ assertEqualInt(0, archive_entry_gid(ae));
+ assertEqualInt(33000, archive_entry_size(ae));
+ for (s = 0; s + sizeof(buff) < 33000; s+= sizeof(buff)) {
+ ssize_t rsize = archive_read_data(a, buff, sizeof(buff));
+ if (comp == MSZIP && rsize == ARCHIVE_FATAL && !libz_enabled) {
+ skipping("Skipping CAB format(MSZIP) check: %s",
+ archive_error_string(a));
+ goto finish;
+ }
+ assertEqualInt(sizeof(buff), rsize);
+ assertEqualMem(buff, zero, sizeof(buff));
+ }
+ assertEqualInt(33000 - s, archive_read_data(a, buff, 33000 - s));
+ assertEqualMem(buff, zero, 33000 - s);
+ }
+
+ /* Verify regular file1. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualInt((AE_IFREG | 0777), archive_entry_mode(ae));
+ assertEqualString("dir1/file1", archive_entry_pathname(ae));
+ assertEqualInt(0, archive_entry_uid(ae));
+ assertEqualInt(0, archive_entry_gid(ae));
+ assertEqualInt(file1_size, archive_entry_size(ae));
+ assertEqualInt(file1_size, archive_read_data(a, buff, file1_size));
+ assertEqualMem(buff, file1, file1_size);
+
+ /* Verify regular file2. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualInt((AE_IFREG | 0777), archive_entry_mode(ae));
+ assertEqualString("dir2/file2", archive_entry_pathname(ae));
+ assertEqualInt(0, archive_entry_uid(ae));
+ assertEqualInt(0, archive_entry_gid(ae));
+ assertEqualInt(file2_size, archive_entry_size(ae));
+ assertEqualInt(file2_size, archive_read_data(a, buff, file2_size));
+ assertEqualMem(buff, file2, file2_size);
+
+ /* End of archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ if (comp != STORE) {
+ assertEqualInt(4, archive_file_count(a));
+ } else {
+ assertEqualInt(3, archive_file_count(a));
+ }
+
+ /* Verify archive format. */
+ assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a));
+ assertEqualIntA(a, ARCHIVE_FORMAT_CAB, archive_format(a));
+
+ /* Close the archive. */
+finish:
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+DEFINE_TEST(test_read_format_cab)
+{
+ /* Verify Cabinet file in no compression. */
+ verify("test_read_format_cab_1.cab", STORE);
+ /* Verify Cabinet file in MSZIP. */
+ verify("test_read_format_cab_2.cab", MSZIP);
+ /* Verify Cabinet file in LZX. */
+ verify("test_read_format_cab_3.cab", LZX);
+}
+
OpenPOWER on IntegriCloud