From 0c10c0841225d331e03adfa4bd9cf975e20cd2ee Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Thu, 16 Jan 2014 20:02:05 -0800 Subject: [PATCH] Fix the zip tests that were inadvertently disabled (and hence broken). Extend them to verify with/without forcing zip64 and with/without 'el' extension. --- libarchive/test/test_write_read_format_zip.c | 187 +++++++++++++++---- 1 file changed, 147 insertions(+), 40 deletions(-) diff --git a/libarchive/test/test_write_read_format_zip.c b/libarchive/test/test_write_read_format_zip.c index 3fa4d8170..4f39489b5 100644 --- a/libarchive/test/test_write_read_format_zip.c +++ b/libarchive/test/test_write_read_format_zip.c @@ -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); } -- 2.47.2