Blame libarchive/test/test_compat_zip.c

Packit Service 1d0348
/*-
Packit Service 1d0348
 * Copyright (c) 2003-2007 Tim Kientzle
Packit Service 1d0348
 * All rights reserved.
Packit Service 1d0348
 *
Packit Service 1d0348
 * Redistribution and use in source and binary forms, with or without
Packit Service 1d0348
 * modification, are permitted provided that the following conditions
Packit Service 1d0348
 * are met:
Packit Service 1d0348
 * 1. Redistributions of source code must retain the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer.
Packit Service 1d0348
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 1d0348
 *    documentation and/or other materials provided with the distribution.
Packit Service 1d0348
 *
Packit Service 1d0348
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
Packit Service 1d0348
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Packit Service 1d0348
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Packit Service 1d0348
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 1d0348
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Packit Service 1d0348
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 1d0348
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 1d0348
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 1d0348
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Packit Service 1d0348
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 1d0348
 */
Packit Service 1d0348
#include "test.h"
Packit Service 1d0348
__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_zip.c 196962 2009-09-08 05:02:41Z kientzle $");
Packit Service 1d0348
Packit Service 1d0348
/* Copy this function for each test file and adjust it accordingly. */
Packit Service 1d0348
DEFINE_TEST(test_compat_zip_1)
Packit Service 1d0348
{
Packit Service 1d0348
	char name[] = "test_compat_zip_1.zip";
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	int r;
Packit Service 1d0348
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
Packit Service 1d0348
	extract_reference_file(name);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
Packit Service 1d0348
Packit Service 1d0348
	/* Read first entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("META-INF/MANIFEST.MF", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Read second entry. */
Packit Service 1d0348
	r = archive_read_next_header(a, &ae);
Packit Service 1d0348
	if (r == ARCHIVE_FATAL && archive_zlib_version() == NULL) {
Packit Service 1d0348
		skipping("Skipping ZIP compression check: %s",
Packit Service 1d0348
			archive_error_string(a));
Packit Service 1d0348
		goto finish;
Packit Service 1d0348
	}
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, r);
Packit Service 1d0348
	assertEqualString("tmp.class", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
Packit Service 1d0348
	assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_NONE);
Packit Service 1d0348
	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ZIP);
Packit Service 1d0348
Packit Service 1d0348
finish:
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Verify that we skip junk between entries.  The compat_zip_2.zip file
Packit Service 1d0348
 * has several bytes of junk between 'file1' and 'file2'.  Such
Packit Service 1d0348
 * junk is routinely introduced by some Zip writers when they manipulate
Packit Service 1d0348
 * existing zip archives.
Packit Service 1d0348
 */
Packit Service 1d0348
DEFINE_TEST(test_compat_zip_2)
Packit Service 1d0348
{
Packit Service 1d0348
	char name[] = "test_compat_zip_2.zip";
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
Packit Service 1d0348
	extract_reference_file(name);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
Packit Service 1d0348
Packit Service 1d0348
	/* Read first entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("file1", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Read first entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("file2", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Issue 185:  Test a regression that got in between 2.6 and 2.7 that
Packit Service 1d0348
 * broke extraction of Zip entries with length-at-end.
Packit Service 1d0348
 */
Packit Service 1d0348
DEFINE_TEST(test_compat_zip_3)
Packit Service 1d0348
{
Packit Service 1d0348
	const char *refname = "test_compat_zip_3.zip";
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
Packit Service 1d0348
	extract_reference_file(refname);
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240));
Packit Service 1d0348
Packit Service 1d0348
	/* First entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("soapui-4.0.0/", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_size(ae));
Packit Service 1d0348
	assert(archive_entry_size_is_set(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Second entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("soapui-4.0.0/soapui-settings.xml", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(1030, archive_entry_size(ae));
Packit Service 1d0348
	assert(archive_entry_size_is_set(ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Extract under a different name. */
Packit Service 1d0348
	archive_entry_set_pathname(ae, "test_3.txt");
Packit Service 1d0348
	if(archive_zlib_version() != NULL) {
Packit Service 1d0348
		char *p;
Packit Service 1d0348
		size_t s;
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_extract(a, ae, 0));
Packit Service 1d0348
		/* Verify the first 12 bytes actually got written to disk correctly. */
Packit Service 1d0348
		p = slurpfile(&s, "test_3.txt");
Packit Service 1d0348
		assertEqualInt(s, 1030);
Packit Service 1d0348
		assertEqualMem(p, "
Packit Service 1d0348
		free(p);
Packit Service 1d0348
	} else {
Packit Service 1d0348
		skipping("Skipping ZIP compression check, no libz support");
Packit Service 1d0348
	}
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/**
Packit Service 1d0348
 * A file with leading garbage (similar to an SFX file).
Packit Service 1d0348
 */
Packit Service 1d0348
DEFINE_TEST(test_compat_zip_4)
Packit Service 1d0348
{
Packit Service 1d0348
	const char *refname = "test_compat_zip_4.zip";
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	void *p;
Packit Service 1d0348
	size_t s;
Packit Service 1d0348
Packit Service 1d0348
	extract_reference_file(refname);
Packit Service 1d0348
	p = slurpfile(&s, refname);
Packit Service 1d0348
Packit Service 1d0348
	/* SFX files require seek support. */
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 18));
Packit Service 1d0348
Packit Service 1d0348
	/* First entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("foo", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_size(ae));
Packit Service 1d0348
	assert(archive_entry_size_is_set(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(0412, archive_entry_perm(ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Second entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("bar", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_size(ae));
Packit Service 1d0348
	assert(archive_entry_size_is_set(ae));
Packit Service 1d0348
	assertEqualInt(0567, archive_entry_perm(ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Third entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("baz", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_size(ae));
Packit Service 1d0348
	assert(archive_entry_size_is_set(ae));
Packit Service 1d0348
	assertEqualInt(0644, archive_entry_perm(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
	/* Try reading without seek support and watch it fail. */
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_FATAL, read_open_memory(a, p, s, 3));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	free(p);
Packit Service 1d0348
}
Packit Service 1d0348
/**
Packit Service 1d0348
 * Issue 152: A file generated by a tool that doesn't really
Packit Service 1d0348
 * believe in populating local file headers at all.  This
Packit Service 1d0348
 * is only readable with the seeking reader.
Packit Service 1d0348
 */
Packit Service 1d0348
DEFINE_TEST(test_compat_zip_5)
Packit Service 1d0348
{
Packit Service 1d0348
	const char *refname = "test_compat_zip_5.zip";
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	void *p;
Packit Service 1d0348
	size_t s;
Packit Service 1d0348
Packit Service 1d0348
	extract_reference_file(refname);
Packit Service 1d0348
	p = slurpfile(&s, refname);
Packit Service 1d0348
Packit Service 1d0348
	/* Verify with seek support.
Packit Service 1d0348
	 * Everything works correctly here. */
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 18));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Metadata/Job_PT.xml", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(3559, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(0664, archive_entry_perm(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Metadata/MXDC_Empty_PT.xml", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(456, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(0664, archive_entry_perm(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/Metadata/Page1_Thumbnail.JPG", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(1495, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(0664, archive_entry_perm(ae));
Packit Service 1d0348
	/* TODO: Read some of the file data and verify it.
Packit Service 1d0348
	   The code to read uncompressed Zip entries with "file at end" semantics
Packit Service 1d0348
	   is tricky and should be verified more carefully. */
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/Pages/_rels/1.fpage.rels", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/Pages/1.fpage", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/Resources/Fonts/3DFDBC8B-4514-41F1-A808-DEA1C79BAC2B.odttf", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/_rels/FixedDocument.fdoc.rels", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/FixedDocument.fdoc", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("_rels/FixedDocumentSequence.fdseq.rels", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("FixedDocumentSequence.fdseq", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("_rels/.rels", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("[Content_Types].xml", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
	/* Try reading without seek support. */
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 3));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Metadata/Job_PT.xml", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_size(ae));
Packit Service 1d0348
	assert(!archive_entry_size_is_set(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(0664, archive_entry_perm(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Metadata/MXDC_Empty_PT.xml", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_size(ae));
Packit Service 1d0348
	assert(!archive_entry_size_is_set(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(0664, archive_entry_perm(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/Metadata/Page1_Thumbnail.JPG", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_size(ae));
Packit Service 1d0348
	assert(!archive_entry_size_is_set(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	assertEqualInt(0664, archive_entry_perm(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/Pages/_rels/1.fpage.rels", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/Pages/1.fpage", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/Resources/Fonts/3DFDBC8B-4514-41F1-A808-DEA1C79BAC2B.odttf", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/_rels/FixedDocument.fdoc.rels", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("Documents/1/FixedDocument.fdoc", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("_rels/FixedDocumentSequence.fdseq.rels", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("FixedDocumentSequence.fdseq", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("_rels/.rels", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("[Content_Types].xml", archive_entry_pathname(ae));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	free(p);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Issue 225: Errors extracting MSDOS Zip archives with directories.
Packit Service 1d0348
 */
Packit Service 1d0348
static void
Packit Service 1d0348
compat_zip_6_verify(struct archive *a)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("New Folder/New Folder/", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
Packit Service 1d0348
	/* Zip timestamps are local time, so vary by time zone. */
Packit Service 1d0348
	/* TODO: A more complex assert would work here; we could
Packit Service 1d0348
	   verify that it's within +/- 24 hours of a particular value. */
Packit Service 1d0348
	/* assertEqualInt(1327314468, archive_entry_mtime(ae)); */
Packit Service 1d0348
	assertEqualInt(0, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("New Folder/New Folder/New Text Document.txt", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit Service 1d0348
	/* Zip timestamps are local time, so vary by time zone. */
Packit Service 1d0348
	/* assertEqualInt(1327314476, archive_entry_mtime(ae)); */
Packit Service 1d0348
	assertEqualInt(11, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
DEFINE_TEST(test_compat_zip_6)
Packit Service 1d0348
{
Packit Service 1d0348
	const char *refname = "test_compat_zip_6.zip";
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	void *p;
Packit Service 1d0348
	size_t s;
Packit Service 1d0348
Packit Service 1d0348
	extract_reference_file(refname);
Packit Service 1d0348
	p = slurpfile(&s, refname);
Packit Service 1d0348
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 7));
Packit Service 1d0348
	compat_zip_6_verify(a);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 7));
Packit Service 1d0348
	compat_zip_6_verify(a);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	free(p);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Issue 226: Try to reproduce hang when reading archives where the
Packit Service 1d0348
 * length-at-end marker ends exactly on a block boundary.
Packit Service 1d0348
 */
Packit Service 1d0348
DEFINE_TEST(test_compat_zip_7)
Packit Service 1d0348
{
Packit Service 1d0348
	const char *refname = "test_compat_zip_7.xps";
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	void *p;
Packit Service 1d0348
	size_t s;
Packit Service 1d0348
	int i;
Packit Service 1d0348
Packit Service 1d0348
	extract_reference_file(refname);
Packit Service 1d0348
	p = slurpfile(&s, refname);
Packit Service 1d0348
Packit Service 1d0348
	for (i = 1; i < 1000; ++i) {
Packit Service 1d0348
		assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, read_open_memory_minimal(a, p, s, i));
Packit Service 1d0348
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a));
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a));
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a));
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a));
Packit Service 1d0348
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	}
Packit Service 1d0348
	free(p);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/**
Packit Service 1d0348
 * A file with backslash path separators instead of slashes.
Packit Service 1d0348
 * PowerShell's Compress-Archive cmdlet produces such archives.
Packit Service 1d0348
 */
Packit Service 1d0348
DEFINE_TEST(test_compat_zip_8)
Packit Service 1d0348
{
Packit Service 1d0348
	const char *refname = "test_compat_zip_8.zip";
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	void *p;
Packit Service 1d0348
	size_t s;
Packit Service 1d0348
Packit Service 1d0348
	extract_reference_file(refname);
Packit Service 1d0348
	p = slurpfile(&s, refname);
Packit Service 1d0348
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_minimal(a, p, s, 7));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	/* This file is in the archive as arc\test */
Packit Service 1d0348
	assertEqualString("arc/test", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	free(p);
Packit Service 1d0348
}