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