diff options
Diffstat (limited to 'libarchive/test/test_write_disk_appledouble.c')
-rw-r--r-- | libarchive/test/test_write_disk_appledouble.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/libarchive/test/test_write_disk_appledouble.c b/libarchive/test/test_write_disk_appledouble.c index 3265a94d2fed..8de6c8b50413 100644 --- a/libarchive/test/test_write_disk_appledouble.c +++ b/libarchive/test/test_write_disk_appledouble.c @@ -236,3 +236,87 @@ DEFINE_TEST(test_write_disk_appledouble) assertEqualFile("hfscmp/file3", "nocmp/file3"); #endif } + +/* Test writing apple doubles to disk from zip format */ +DEFINE_TEST(test_write_disk_appledouble_zip) +{ +#if !defined(__APPLE__) || !defined(UF_COMPRESSED) || !defined(HAVE_SYS_XATTR_H)\ + || !defined(HAVE_ZLIB_H) + skipping("MacOS-specific AppleDouble test"); +#else + const char *refname = "test_write_disk_appledouble_zip.zip"; + struct archive *ad, *a; + struct archive_entry *ae; + struct stat st; + + extract_reference_file(refname); + + /* + * Extract an archive to disk. + */ + assert((ad = archive_write_disk_new()) != NULL); + assertEqualIntA(ad, ARCHIVE_OK, + archive_write_disk_set_standard_lookup(ad)); + assertEqualIntA(ad, ARCHIVE_OK, + archive_write_disk_set_options(ad, + ARCHIVE_EXTRACT_TIME | + ARCHIVE_EXTRACT_SECURE_SYMLINKS | + ARCHIVE_EXTRACT_SECURE_NODOTDOT)); + + 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, 512 * 20)); + + /* Skip The top level directory */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("apple_double_dir/", archive_entry_pathname(ae)); + + /* Extract apple_double_test */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("apple_double_dir/apple_double_dir_test/", archive_entry_pathname(ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad)); + + /* Extract ._apple_double_dir_test which will be merged into apple_double_dir_test as metadata. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("apple_double_dir/._apple_double_dir_test", archive_entry_pathname(ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad)); + + /* Extract test_file */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("apple_double_dir/test_file", archive_entry_pathname(ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad)); + + /* Extract ._test_file which will be merged into test_file as metadata. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("apple_double_dir/._test_file", archive_entry_pathname(ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad)); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + assertEqualIntA(ad, ARCHIVE_OK, archive_write_free(ad)); + + /* Test test_file */ + assertEqualInt(0, stat("apple_double_dir/test_file", &st)); + assertFileSize("apple_double_dir/test_file", 5); + failure("'%s' should have Resource Fork", "test_file"); + assertEqualInt(1, has_xattr("apple_double_dir/test_file", "com.apple.ResourceFork")); + + /* Test apple_double_dir_test */ + failure("'%s' should have quarantine xattr", "apple_double_dir_test"); + assertEqualInt(1, has_xattr("apple_double_dir/apple_double_dir_test", "com.apple.quarantine")); + + /* Test ._test_file. */ + failure("'apple_double_dir/._test_file' should be merged and removed"); + assertFileNotExists("apple_double_dir/._test_file"); + + /* Test ._apple_double_dir_test */ + failure("'apple_double_dir/._._apple_double_dir_test' should be merged and removed"); + assertFileNotExists("apple_double_dir/._apple_double_dir_test"); + + assertChdir(".."); + +#endif +} |