]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix the zip tests that were inadvertently disabled (and hence broken).
authorTim Kientzle <kientzle@gmail.com>
Fri, 17 Jan 2014 04:02:05 +0000 (20:02 -0800)
committerTim Kientzle <kientzle@gmail.com>
Fri, 17 Jan 2014 04:02:05 +0000 (20:02 -0800)
Extend them to verify with/without forcing zip64 and with/without 'el' extension.

libarchive/test/test_write_read_format_zip.c

index 3fa4d81701ca27d7da5877d34fca894bdc6546d6..4f39489b5b533880cc5f02be42a088a88342c4ce 100644 (file)
@@ -268,7 +268,7 @@ write_contents(struct archive *a)
  * Read back all of the entries and verify their values.
  */
 static void
-verify_contents(struct archive *a, int seeking)
+verify_contents(struct archive *a, int seeking, int improved_streaming)
 {
        char filedata[64];
        struct archive_entry *ae;
@@ -285,12 +285,11 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("file", archive_entry_pathname(ae));
-       if (seeking) {
+       if (seeking || improved_streaming) {
                assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
-               assertEqualInt(8, archive_entry_size(ae));
-       } else {
-               assertEqualInt(0, archive_entry_size_is_set(ae));
        }
+       assertEqualInt(8, archive_entry_size(ae));
+       assert(archive_entry_size_is_set(ae));
        assertEqualIntA(a, 8,
            archive_read_data(a, filedata, sizeof(filedata)));
        assertEqualMem(filedata, "12345678", 8);
@@ -303,12 +302,11 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("file2", archive_entry_pathname(ae));
-       if (seeking) {
+       if (seeking || improved_streaming) {
                assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
-               assertEqualInt(4, archive_entry_size(ae));
-       } else {
-               assertEqualInt(0, archive_entry_size_is_set(ae));
        }
+       assertEqualInt(4, archive_entry_size(ae));
+       assert(archive_entry_size_is_set(ae));
        assertEqualIntA(a, 4,
            archive_read_data(a, filedata, sizeof(filedata)));
        assertEqualMem(filedata, "1234", 4);
@@ -320,9 +318,11 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("file3", archive_entry_pathname(ae));
+       if (seeking || improved_streaming) {
+               assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
+       }
        if (seeking) {
                assertEqualInt(5, archive_entry_size(ae));
-               assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
        } else {
                assertEqualInt(0, archive_entry_size_is_set(ae));
        }
@@ -337,7 +337,7 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("symlink", archive_entry_pathname(ae));
-       if (seeking) {
+       if (seeking || improved_streaming) {
                assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
                assertEqualInt(0, archive_entry_size(ae));
                assertEqualString("file1", archive_entry_symlink(ae));
@@ -346,6 +346,7 @@ verify_contents(struct archive *a, int seeking)
                 * symlink body shows as regular file contents. */
                assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae));
                assertEqualInt(5, archive_entry_size(ae));
+               assert(archive_entry_size_is_set(ae));
        }
 
        /* Read the dir entry back. */
@@ -355,9 +356,10 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("dir/", archive_entry_pathname(ae));
-       if (seeking)
+       if (seeking || improved_streaming)
                assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
        assertEqualInt(0, archive_entry_size(ae));
+       assert(archive_entry_size_is_set(ae));
        assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
 
 #ifdef HAVE_ZLIB_H
@@ -373,12 +375,11 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("file_deflate", archive_entry_pathname(ae));
-       if (seeking) {
+       if (seeking || improved_streaming) {
                assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
-               assertEqualInt(8, archive_entry_size(ae));
-       } else {
-               assertEqualInt(0, archive_entry_size(ae));
        }
+       assertEqualInt(8, archive_entry_size(ae));
+       assert(archive_entry_size_is_set(ae));
        assertEqualIntA(a, 8,
            archive_read_data(a, filedata, sizeof(filedata)));
        assertEqualMem(filedata, "12345678", 8);
@@ -391,12 +392,11 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("file2_deflate", archive_entry_pathname(ae));
-       if (seeking) {
+       if (seeking || improved_streaming) {
                assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
-               assertEqualInt(4, archive_entry_size(ae));
-       } else {
-               assertEqualInt(0, archive_entry_size(ae));
        }
+       assertEqualInt(4, archive_entry_size(ae));
+       assert(archive_entry_size_is_set(ae));
        assertEqualIntA(a, 4,
            archive_read_data(a, filedata, sizeof(filedata)));
        assertEqualMem(filedata, "1234", 4);
@@ -408,9 +408,11 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("file3_deflate", archive_entry_pathname(ae));
+       if (seeking || improved_streaming) {
+               assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
+       }
        if (seeking) {
                assertEqualInt(5, archive_entry_size(ae));
-               assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
        } else {
                assertEqualInt(0, archive_entry_size_is_set(ae));
        }
@@ -425,7 +427,7 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("symlink_deflate", archive_entry_pathname(ae));
-       if (seeking) {
+       if (seeking || improved_streaming) {
                assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
                assertEqualInt(0, archive_entry_size(ae));
                assertEqualString("file1", archive_entry_symlink(ae));
@@ -447,6 +449,7 @@ verify_contents(struct archive *a, int seeking)
                assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
        }
        assertEqualInt(0, archive_entry_size(ae));
+       assert(archive_entry_size_is_set(ae));
        assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
 #endif
 
@@ -462,13 +465,12 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("file_stored", archive_entry_pathname(ae));
-       if (seeking) {
+       if (seeking || improved_streaming) {
                assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
-               assert(archive_entry_size_is_set(ae));
-               assertEqualInt(8, archive_entry_size(ae));
-       } else {
-               assertEqualInt(0, archive_entry_size_is_set(ae));
        }
+       assert(archive_entry_size_is_set(ae));
+       assert(archive_entry_size_is_set(ae));
+       assertEqualInt(8, archive_entry_size(ae));
        assertEqualIntA(a, 8,
            archive_read_data(a, filedata, sizeof(filedata)));
        assertEqualMem(filedata, "12345678", 8);
@@ -481,12 +483,11 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("file2_stored", archive_entry_pathname(ae));
-       if (seeking) {
-               assertEqualInt(4, archive_entry_size(ae));
+       if (seeking || improved_streaming) {
                assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
-       } else {
-               assertEqualInt(0, archive_entry_size_is_set(ae));
        }
+       assertEqualInt(4, archive_entry_size(ae));
+       assert(archive_entry_size_is_set(ae));
        assertEqualIntA(a, 4,
            archive_read_data(a, filedata, sizeof(filedata)));
        assertEqualMem(filedata, "ACEG", 4);
@@ -498,9 +499,10 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("file3_stored", archive_entry_pathname(ae));
+       if (seeking || improved_streaming)
+               assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
        if (seeking) {
                assertEqualInt(5, archive_entry_size(ae));
-               assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
        } else {
                assertEqualInt(0, archive_entry_size_is_set(ae));
        }
@@ -515,7 +517,7 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("symlink_stored", archive_entry_pathname(ae));
-       if (seeking) {
+       if (seeking || improved_streaming) {
                assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
                assertEqualInt(0, archive_entry_size(ae));
                assertEqualString("file1", archive_entry_symlink(ae));
@@ -533,7 +535,7 @@ verify_contents(struct archive *a, int seeking)
        assertEqualInt(0, archive_entry_atime(ae));
        assertEqualInt(0, archive_entry_ctime(ae));
        assertEqualString("dir_stored/", archive_entry_pathname(ae));
-       if (seeking)
+       if (seeking || improved_streaming)
                assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
        assertEqualInt(0, archive_entry_size(ae));
        assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
@@ -573,7 +575,57 @@ DEFINE_TEST(test_write_read_format_zip)
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
        assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
-       verify_contents(a, 1);
+       verify_contents(a, 1, 0);
+
+       /* With the test memory reader -- streaming mode. */
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
+       /* Streaming reader doesn't see mode information from Central Directory. */
+       verify_contents(a, 0, 0);
+
+       /* With the test memory reader -- seeking mode. */
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
+       verify_contents(a, 1, 0);
+
+       free(buff);
+}
+
+/*
+ * Do a write-then-read roundtrip with 'el' extension enabled.
+ */
+DEFINE_TEST(test_write_read_format_zip_improved_streaming)
+{
+       struct archive *a;
+       size_t used;
+       size_t buffsize = 1000000;
+       char *buff;
+
+       buff = malloc(buffsize);
+
+       /* Create a new archive in memory. */
+       assert((a = archive_write_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:experimental"));
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_write_open_memory(a, buff, buffsize, &used));
+       write_contents(a);
+       dumpfile("constructed.zip", buff, used);
+
+       /*
+        * Now, read the data back.
+        */
+       /* With the standard memory reader. */
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
+       verify_contents(a, 1, 1);
 
        /* With the test memory reader -- streaming mode. */
        assert((a = archive_read_new()) != NULL);
@@ -581,14 +633,14 @@ DEFINE_TEST(test_write_read_format_zip)
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
        assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
        /* Streaming reader doesn't see mode information from Central Directory. */
-       verify_contents(a, 0);
+       verify_contents(a, 0, 1);
 
        /* With the test memory reader -- seeking mode. */
        assert((a = archive_read_new()) != NULL);
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
        assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
-       verify_contents(a, 1);
+       verify_contents(a, 1, 1);
 
        free(buff);
 }
@@ -610,6 +662,61 @@ DEFINE_TEST(test_write_read_format_zip64)
        assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
        assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
        assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:zip64"));
+#if ZIP_IMPROVED_STREAMING
+       assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:experimental"));
+#endif
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_write_open_memory(a, buff, buffsize, &used));
+       write_contents(a);
+       dumpfile("constructed64.zip", buff, used);
+
+       /*
+        * Now, read the data back.
+        */
+       /* With the standard memory reader. */
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
+       verify_contents(a, 1, 0);
+
+       /* With the test memory reader -- streaming mode. */
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
+       /* Streaming reader doesn't see mode information from Central Directory. */
+       verify_contents(a, 0, 0);
+
+       /* With the test memory reader -- seeking mode. */
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
+       verify_contents(a, 1, 0);
+
+       free(buff);
+}
+
+
+/*
+ * Do a write-then-read roundtrip with Zip64 enabled and 'el' extension enabled.
+ */
+DEFINE_TEST(test_write_read_format_zip64_improved_streaming)
+{
+       struct archive *a;
+       size_t used;
+       size_t buffsize = 1000000;
+       char *buff;
+
+       buff = malloc(buffsize);
+
+       /* Create a new archive in memory. */
+       assert((a = archive_write_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:zip64"));
+       assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:experimental"));
        assertEqualIntA(a, ARCHIVE_OK,
            archive_write_open_memory(a, buff, buffsize, &used));
        write_contents(a);
@@ -623,7 +730,7 @@ DEFINE_TEST(test_write_read_format_zip64)
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
        assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
-       verify_contents(a, 1);
+       verify_contents(a, 1, 1);
 
        /* With the test memory reader -- streaming mode. */
        assert((a = archive_read_new()) != NULL);
@@ -631,14 +738,14 @@ DEFINE_TEST(test_write_read_format_zip64)
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
        assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
        /* Streaming reader doesn't see mode information from Central Directory. */
-       verify_contents(a, 0);
+       verify_contents(a, 0, 1);
 
        /* With the test memory reader -- seeking mode. */
        assert((a = archive_read_new()) != NULL);
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
        assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
-       verify_contents(a, 1);
+       verify_contents(a, 1, 1);
 
        free(buff);
 }