Blame libarchive/test/test_read_format_zip_mac_metadata.c

Packit 08bd4c
/*-
Packit 08bd4c
 * Copyright (c) 2012 Michihiro NAKAJIMA
Packit 08bd4c
 * All rights reserved.
Packit 08bd4c
 *
Packit 08bd4c
 * Redistribution and use in source and binary forms, with or without
Packit 08bd4c
 * modification, are permitted provided that the following conditions
Packit 08bd4c
 * are met:
Packit 08bd4c
 * 1. Redistributions of source code must retain the above copyright
Packit 08bd4c
 *    notice, this list of conditions and the following disclaimer.
Packit 08bd4c
 * 2. Redistributions in binary form must reproduce the above copyright
Packit 08bd4c
 *    notice, this list of conditions and the following disclaimer in the
Packit 08bd4c
 *    documentation and/or other materials provided with the distribution.
Packit 08bd4c
 *
Packit 08bd4c
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
Packit 08bd4c
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Packit 08bd4c
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Packit 08bd4c
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit 08bd4c
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Packit 08bd4c
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 08bd4c
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 08bd4c
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 08bd4c
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Packit 08bd4c
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 08bd4c
 */
Packit 08bd4c
#include "test.h"
Packit 08bd4c
__FBSDID("$FreeBSD$");
Packit 08bd4c
Packit 08bd4c
/*
Packit 08bd4c
 * Read a zip file that has a zip comment in the end of the central
Packit 08bd4c
 * directory record.
Packit 08bd4c
 */
Packit 08bd4c
DEFINE_TEST(test_read_format_zip_mac_metadata)
Packit 08bd4c
{
Packit 08bd4c
	const char *refname = "test_read_format_zip_mac_metadata.zip";
Packit 08bd4c
	char *p;
Packit 08bd4c
	size_t s;
Packit 08bd4c
	struct archive *a;
Packit 08bd4c
	struct archive_entry *ae;
Packit 08bd4c
	const unsigned char appledouble[] = {
Packit 08bd4c
		0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00,
Packit 08bd4c
		0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58,
Packit 08bd4c
		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
Packit 08bd4c
		0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
Packit 08bd4c
		0x00, 0x32, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00,
Packit 08bd4c
		0x00, 0x02, 0x00, 0x00, 0x01, 0x1f, 0x00, 0x00,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x54, 0x52,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x87,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
Packit 08bd4c
		0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x87,
Packit 08bd4c
		0x00, 0x00, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x61,
Packit 08bd4c
		0x70, 0x70, 0x6c, 0x65, 0x2e, 0x61, 0x63, 0x6c,
Packit 08bd4c
		0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00,
Packit 08bd4c
		0x21, 0x23, 0x61, 0x63, 0x6c, 0x20, 0x31, 0x0a,
Packit 08bd4c
		0x75, 0x73, 0x65, 0x72, 0x3a, 0x46, 0x46, 0x46,
Packit 08bd4c
		0x46, 0x45, 0x45, 0x45, 0x45, 0x2d, 0x44, 0x44,
Packit 08bd4c
		0x44, 0x44, 0x2d, 0x43, 0x43, 0x43, 0x43, 0x2d,
Packit 08bd4c
		0x42, 0x42, 0x42, 0x42, 0x2d, 0x41, 0x41, 0x41,
Packit 08bd4c
		0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x43,
Packit 08bd4c
		0x39, 0x3a, 0x47, 0x75, 0x65, 0x73, 0x74, 0x3a,
Packit 08bd4c
		0x32, 0x30, 0x31, 0x3a, 0x64, 0x65, 0x6e, 0x79,
Packit 08bd4c
		0x3a, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x67, 0x72,
Packit 08bd4c
		0x6f, 0x75, 0x70, 0x3a, 0x41, 0x42, 0x43, 0x44,
Packit 08bd4c
		0x45, 0x46, 0x41, 0x42, 0x2d, 0x43, 0x44, 0x45,
Packit 08bd4c
		0x46, 0x2d, 0x41, 0x42, 0x43, 0x44, 0x2d, 0x45,
Packit 08bd4c
		0x46, 0x41, 0x42, 0x2d, 0x43, 0x44, 0x45, 0x46,
Packit 08bd4c
		0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x30,
Packit 08bd4c
		0x3a, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x3a, 0x38,
Packit 08bd4c
		0x30, 0x3a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x3a,
Packit 08bd4c
		0x77, 0x72, 0x69, 0x74, 0x65, 0x0a, 0x00
Packit 08bd4c
	};
Packit 08bd4c
Packit 08bd4c
	extract_reference_file(refname);
Packit 08bd4c
	p = slurpfile(&s, refname);
Packit 08bd4c
Packit 08bd4c
	/* Mac metadata can only be extracted with the seeking reader. */
Packit 08bd4c
	assert((a = archive_read_new()) != NULL);
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_read_set_option(a, "zip", "mac-ext", "1"));
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 1));
Packit 08bd4c
Packit 08bd4c
	if (archive_zlib_version() != NULL) {
Packit 08bd4c
		assertEqualIntA(a, ARCHIVE_OK,
Packit 08bd4c
		    archive_read_next_header(a, &ae);;
Packit 08bd4c
	} else {
Packit 08bd4c
		assertEqualIntA(a, ARCHIVE_WARN,
Packit 08bd4c
		    archive_read_next_header(a, &ae);;
Packit 08bd4c
		assertEqualString(archive_error_string(a),
Packit 08bd4c
		    "Unsupported ZIP compression method (deflation)");
Packit 08bd4c
		assert(archive_errno(a) != 0);
Packit 08bd4c
	}
Packit 08bd4c
	assertEqualInt(archive_entry_is_encrypted(ae), 0);
Packit 08bd4c
	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
Packit 08bd4c
	assertEqualString("file3", archive_entry_pathname(ae));
Packit 08bd4c
	assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae));
Packit 08bd4c
	failure("Mac metadata should be set");
Packit 08bd4c
	if (archive_zlib_version() != NULL) {
Packit 08bd4c
		const void *metadata;
Packit 08bd4c
		if (assert((metadata = archive_entry_mac_metadata(ae, &s))
Packit 08bd4c
		    != NULL)) {
Packit 08bd4c
			assertEqualMem(metadata, appledouble,
Packit 08bd4c
			    sizeof(appledouble));
Packit 08bd4c
		}
Packit 08bd4c
	} else {
Packit 08bd4c
		assert(archive_entry_mac_metadata(ae, &s) == NULL);
Packit 08bd4c
	}
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit 08bd4c
Packit 08bd4c
	free(p);
Packit 08bd4c
}