test_read_format_zip_mac_metadata.c revision 313571
112657Skvn/*- 212657Skvn * Copyright (c) 2012 Michihiro NAKAJIMA 312657Skvn * All rights reserved. 412657Skvn * 512657Skvn * Redistribution and use in source and binary forms, with or without 612657Skvn * modification, are permitted provided that the following conditions 712657Skvn * are met: 812657Skvn * 1. Redistributions of source code must retain the above copyright 912657Skvn * notice, this list of conditions and the following disclaimer. 1012657Skvn * 2. Redistributions in binary form must reproduce the above copyright 1112657Skvn * notice, this list of conditions and the following disclaimer in the 1212657Skvn * documentation and/or other materials provided with the distribution. 1312657Skvn * 1412657Skvn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 1512657Skvn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1612657Skvn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1712657Skvn * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 1812657Skvn * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 1912657Skvn * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2012657Skvn * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2112657Skvn * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2212657Skvn * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2312657Skvn * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2412657Skvn */ 2512657Skvn#include "test.h" 2612657Skvn__FBSDID("$FreeBSD$"); 2712657Skvn 2812657Skvn/* 2912657Skvn * Read a zip file that has a zip comment in the end of the central 3012657Skvn * directory record. 3112657Skvn */ 3212657SkvnDEFINE_TEST(test_read_format_zip_mac_metadata) 3312657Skvn{ 3412657Skvn const char *refname = "test_read_format_zip_mac_metadata.zip"; 3512657Skvn char *p; 3612657Skvn size_t s; 3712657Skvn struct archive *a; 3812657Skvn struct archive_entry *ae; 3912657Skvn const unsigned char appledouble[] = { 4012657Skvn 0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00, 4112657Skvn 0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58, 4212968Siveresov 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 4312657Skvn 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 4412657Skvn 0x00, 0x32, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 4512657Skvn 0x00, 0x02, 0x00, 0x00, 0x01, 0x1f, 0x00, 0x00, 4613264Siveresov 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4712657Skvn 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4812657Skvn 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4912657Skvn 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5012657Skvn 0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x54, 0x52, 5112657Skvn 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 5212657Skvn 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x87, 5312657Skvn 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5412968Siveresov 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 5512657Skvn 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x87, 5612657Skvn 0x00, 0x00, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 5712657Skvn 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x61, 0x63, 0x6c, 5812657Skvn 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 5912657Skvn 0x21, 0x23, 0x61, 0x63, 0x6c, 0x20, 0x31, 0x0a, 6012657Skvn 0x75, 0x73, 0x65, 0x72, 0x3a, 0x46, 0x46, 0x46, 6112657Skvn 0x46, 0x45, 0x45, 0x45, 0x45, 0x2d, 0x44, 0x44, 6212657Skvn 0x44, 0x44, 0x2d, 0x43, 0x43, 0x43, 0x43, 0x2d, 6312657Skvn 0x42, 0x42, 0x42, 0x42, 0x2d, 0x41, 0x41, 0x41, 6412657Skvn 0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x43, 6512657Skvn 0x39, 0x3a, 0x47, 0x75, 0x65, 0x73, 0x74, 0x3a, 6612657Skvn 0x32, 0x30, 0x31, 0x3a, 0x64, 0x65, 0x6e, 0x79, 6712657Skvn 0x3a, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x67, 0x72, 6812657Skvn 0x6f, 0x75, 0x70, 0x3a, 0x41, 0x42, 0x43, 0x44, 6912657Skvn 0x45, 0x46, 0x41, 0x42, 0x2d, 0x43, 0x44, 0x45, 7012657Skvn 0x46, 0x2d, 0x41, 0x42, 0x43, 0x44, 0x2d, 0x45, 7112657Skvn 0x46, 0x41, 0x42, 0x2d, 0x43, 0x44, 0x45, 0x46, 7212968Siveresov 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x30, 7312968Siveresov 0x3a, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x3a, 0x38, 7412657Skvn 0x30, 0x3a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x3a, 7512968Siveresov 0x77, 0x72, 0x69, 0x74, 0x65, 0x0a, 0x00 7612657Skvn }; 7712657Skvn 7812657Skvn extract_reference_file(refname); 7912657Skvn p = slurpfile(&s, refname); 8012968Siveresov 8112657Skvn /* Mac metadata can only be extracted with the seeking reader. */ 8212657Skvn assert((a = archive_read_new()) != NULL); 8312657Skvn assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 8412657Skvn assertEqualIntA(a, ARCHIVE_OK, archive_read_set_option(a, "zip", "mac-ext", "1")); 8512657Skvn assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 1)); 8612657Skvn 8712968Siveresov if (archive_zlib_version() != NULL) { 8812657Skvn assertEqualIntA(a, ARCHIVE_OK, 8912657Skvn archive_read_next_header(a, &ae)); 9012657Skvn } else { 9112657Skvn assertEqualIntA(a, ARCHIVE_WARN, 9212657Skvn archive_read_next_header(a, &ae)); 9312657Skvn assertEqualString(archive_error_string(a), 9412657Skvn "Unsupported ZIP compression method (deflation)"); 9512657Skvn assert(archive_errno(a) != 0); 9612657Skvn } 9712657Skvn assertEqualInt(archive_entry_is_encrypted(ae), 0); 9812657Skvn assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); 9912657Skvn assertEqualString("file3", archive_entry_pathname(ae)); 10012657Skvn assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae)); 10112657Skvn failure("Mac metadata should be set"); 10212968Siveresov if (archive_zlib_version() != NULL) { 10312968Siveresov const void *metadata; 10412657Skvn if (assert((metadata = archive_entry_mac_metadata(ae, &s)) 10512657Skvn != NULL)) { 10612968Siveresov assertEqualMem(metadata, appledouble, 10712968Siveresov sizeof(appledouble)); 10812968Siveresov } 10912968Siveresov } else { 11012968Siveresov assert(archive_entry_mac_metadata(ae, &s) == NULL); 11112657Skvn } 11212657Skvn assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 11312657Skvn assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 11412657Skvn assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 11512657Skvn 11612657Skvn free(p); 11712657Skvn} 11812657Skvn