mirror of
https://github.com/cmclark00/retro-imager.git
synced 2025-05-19 16:35:20 +01:00
- Update bunlded libarchive version used on Windows/Mac - Enable requested zstd support while we are at it. Closes #211
838 lines
30 KiB
C
838 lines
30 KiB
C
/*-
|
|
* Copyright (c) 2011 Michihiro NAKAJIMA
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
#include "test.h"
|
|
__FBSDID("$FreeBSD");
|
|
|
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
|
#define close _close
|
|
#define open _open
|
|
#endif
|
|
|
|
/*
|
|
* Extract a non-encoded file.
|
|
* The header of the 7z archive files is not encoded.
|
|
*/
|
|
static void
|
|
test_copy(int use_open_fd)
|
|
{
|
|
const char *refname = "test_read_format_7zip_copy.7z";
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
char buff[128];
|
|
int fd = -1;
|
|
|
|
extract_reference_file(refname);
|
|
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));
|
|
if (use_open_fd) {
|
|
fd = open(refname, O_RDONLY | O_BINARY);
|
|
assertEqualIntA(a, ARCHIVE_OK,
|
|
archive_read_open_fd(a, fd, 10240));
|
|
} else {
|
|
assertEqualIntA(a, ARCHIVE_OK,
|
|
archive_read_open_filename(a, refname, 10240));
|
|
}
|
|
|
|
/* Verify regular file1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae));
|
|
assertEqualString("file1", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(60, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assert(archive_read_has_encrypted_entries(a) > ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
|
|
assertEqualInt(60, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, " ", 4);
|
|
|
|
assertEqualInt(1, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
if (fd != -1)
|
|
close(fd);
|
|
}
|
|
|
|
/*
|
|
* An archive file has no entry.
|
|
*/
|
|
static void
|
|
test_empty_archive(void)
|
|
{
|
|
const char *refname = "test_read_format_7zip_empty_archive.7z";
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
assertEqualInt(0, archive_file_count(a));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
/*
|
|
* An archive file has one empty file. It means there is no content
|
|
* in the archive file except for a header.
|
|
*/
|
|
static void
|
|
test_empty_file(void)
|
|
{
|
|
const char *refname = "test_read_format_7zip_empty_file.7z";
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* Verify regular empty. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("empty", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(0, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
|
|
assertEqualInt(1, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
/*
|
|
* Extract an encoded file.
|
|
* The header of the 7z archive files is not encoded.
|
|
*/
|
|
static void
|
|
test_plain_header(const char *refname)
|
|
{
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
char buff[128];
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* Verify regular file1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file1", archive_entry_pathname(ae));
|
|
assertEqualInt(1322058763, archive_entry_mtime(ae));
|
|
assertEqualInt(2844, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(sizeof(buff), archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "The libarchive distribution ", 28);
|
|
|
|
assertEqualInt(1, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
/*
|
|
* Extract multi files.
|
|
* The header of the 7z archive files is encoded with LZMA.
|
|
*/
|
|
static void
|
|
test_extract_all_files(const char *refname)
|
|
{
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
char buff[128];
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* Verify regular file1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("dir1/file1", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(13, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(13, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "aaaaaaaaaaaa\n", 13);
|
|
|
|
/* Verify regular file2. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file2", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(26, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(26, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26);
|
|
|
|
/* Verify regular file3. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file3", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(39, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(39, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39);
|
|
|
|
/* Verify regular file4. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file4", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(52, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(52, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff,
|
|
"aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52);
|
|
|
|
/* Verify directory dir1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae));
|
|
assertEqualString("dir1/", archive_entry_pathname(ae));
|
|
assertEqualInt(2764801, archive_entry_mtime(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
|
|
assertEqualInt(5, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
/*
|
|
* Extract last file.
|
|
* The header of the 7z archive files is encoded with LZMA.
|
|
*/
|
|
static void
|
|
test_extract_last_file(const char *refname)
|
|
{
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
char buff[128];
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* Verify regular file1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("dir1/file1", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(13, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
|
|
/* Verify regular file2. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file2", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(26, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
|
|
/* Verify regular file3. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file3", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(39, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
|
|
/* Verify regular file4. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file4", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(52, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(52, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff,
|
|
"aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52);
|
|
|
|
/* Verify directory dir1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae));
|
|
assertEqualString("dir1/", archive_entry_pathname(ae));
|
|
assertEqualInt(2764801, archive_entry_mtime(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
|
|
assertEqualInt(5, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
/*
|
|
* Extract a mixed archive file which has both LZMA and LZMA2 encoded files.
|
|
* LZMA: file1, file2, file3, file4
|
|
* LZMA2: zfile1, zfile2, zfile3, zfile4
|
|
*/
|
|
static void
|
|
test_extract_all_files2(const char *refname)
|
|
{
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
char buff[128];
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* Verify regular file1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("dir1/file1", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(13, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(13, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "aaaaaaaaaaaa\n", 13);
|
|
|
|
/* Verify regular file2. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file2", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(26, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(26, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26);
|
|
|
|
/* Verify regular file3. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file3", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(39, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(39, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39);
|
|
|
|
/* Verify regular file4. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file4", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(52, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(52, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff,
|
|
"aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52);
|
|
|
|
/* Verify regular zfile1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("dir1/zfile1", archive_entry_pathname(ae));
|
|
assertEqualInt(5184001, archive_entry_mtime(ae));
|
|
assertEqualInt(13, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(13, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "aaaaaaaaaaaa\n", 13);
|
|
|
|
/* Verify regular zfile2. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("zfile2", archive_entry_pathname(ae));
|
|
assertEqualInt(5184001, archive_entry_mtime(ae));
|
|
assertEqualInt(26, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(26, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26);
|
|
|
|
/* Verify regular zfile3. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("zfile3", archive_entry_pathname(ae));
|
|
assertEqualInt(5184001, archive_entry_mtime(ae));
|
|
assertEqualInt(39, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(39, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39);
|
|
|
|
/* Verify regular zfile4. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("zfile4", archive_entry_pathname(ae));
|
|
assertEqualInt(5184001, archive_entry_mtime(ae));
|
|
assertEqualInt(52, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(52, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff,
|
|
"aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52);
|
|
|
|
/* Verify directory dir1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae));
|
|
assertEqualString("dir1/", archive_entry_pathname(ae));
|
|
assertEqualInt(2764801, archive_entry_mtime(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
|
|
assertEqualInt(9, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
/*
|
|
* Extract a file compressed with DELTA + LZMA[12].
|
|
*/
|
|
static void
|
|
test_delta_lzma(const char *refname)
|
|
{
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
size_t remaining;
|
|
ssize_t bytes;
|
|
char buff[1024];
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* Verify regular file1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file1", archive_entry_pathname(ae));
|
|
assertEqualInt(172802, archive_entry_mtime(ae));
|
|
assertEqualInt(27627, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
remaining = (size_t)archive_entry_size(ae);
|
|
while (remaining) {
|
|
if (remaining < sizeof(buff))
|
|
assertEqualInt(remaining,
|
|
bytes = archive_read_data(a, buff, sizeof(buff)));
|
|
else
|
|
assertEqualInt(sizeof(buff),
|
|
bytes = archive_read_data(a, buff, sizeof(buff)));
|
|
if (bytes > 0)
|
|
remaining -= bytes;
|
|
else
|
|
break;
|
|
}
|
|
assertEqualInt(0, remaining);
|
|
|
|
assertEqualInt(1, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
/*
|
|
* Extract a file compressed with BCJ + LZMA2.
|
|
*/
|
|
static void
|
|
test_bcj(const char *refname)
|
|
{
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
size_t remaining;
|
|
ssize_t bytes;
|
|
char buff[1024];
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* Verify regular x86exe. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0444), archive_entry_mode(ae) & ~0111);
|
|
assertEqualString("x86exe", archive_entry_pathname(ae));
|
|
assertEqualInt(172802, archive_entry_mtime(ae));
|
|
assertEqualInt(27328, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
remaining = (size_t)archive_entry_size(ae);
|
|
while (remaining) {
|
|
if (remaining < sizeof(buff))
|
|
assertEqualInt(remaining,
|
|
bytes = archive_read_data(a, buff, sizeof(buff)));
|
|
else
|
|
assertEqualInt(sizeof(buff),
|
|
bytes = archive_read_data(a, buff, sizeof(buff)));
|
|
if (bytes > 0)
|
|
remaining -= bytes;
|
|
else
|
|
break;
|
|
}
|
|
assertEqualInt(0, remaining);
|
|
|
|
assertEqualInt(1, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
/*
|
|
* Extract a file compressed with PPMd.
|
|
*/
|
|
static void
|
|
test_ppmd(void)
|
|
{
|
|
const char *refname = "test_read_format_7zip_ppmd.7z";
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
size_t remaining;
|
|
ssize_t bytes;
|
|
char buff[1024];
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* Verify regular file1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae));
|
|
assertEqualString("ppmd_test.txt", archive_entry_pathname(ae));
|
|
assertEqualInt(1322464589, archive_entry_mtime(ae));
|
|
assertEqualInt(102400, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
remaining = (size_t)archive_entry_size(ae);
|
|
while (remaining) {
|
|
if (remaining < sizeof(buff))
|
|
assertEqualInt(remaining,
|
|
bytes = archive_read_data(a, buff, sizeof(buff)));
|
|
else
|
|
assertEqualInt(sizeof(buff),
|
|
bytes = archive_read_data(a, buff, sizeof(buff)));
|
|
if (bytes > 0)
|
|
remaining -= bytes;
|
|
else
|
|
break;
|
|
}
|
|
assertEqualInt(0, remaining);
|
|
|
|
assertEqualInt(1, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
static void
|
|
test_symname(void)
|
|
{
|
|
const char *refname = "test_read_format_7zip_symbolic_name.7z";
|
|
struct archive_entry *ae;
|
|
struct archive *a;
|
|
char buff[128];
|
|
|
|
extract_reference_file(refname);
|
|
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, 10240));
|
|
|
|
/* Verify regular file1. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
|
|
assertEqualString("file1", archive_entry_pathname(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(32, archive_entry_size(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
assertEqualInt(32, archive_read_data(a, buff, sizeof(buff)));
|
|
assertEqualMem(buff, "hellohellohello\nhellohellohello\n", 32);
|
|
|
|
/* Verify symbolic-link symlinkfile. */
|
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
assertEqualInt((AE_IFLNK | 0755), archive_entry_mode(ae));
|
|
assertEqualString("symlinkfile", archive_entry_pathname(ae));
|
|
assertEqualString("file1", archive_entry_symlink(ae));
|
|
assertEqualInt(86401, archive_entry_mtime(ae));
|
|
assertEqualInt(archive_entry_is_encrypted(ae), 0);
|
|
assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
|
|
|
|
assertEqualInt(2, archive_file_count(a));
|
|
|
|
/* End of archive. */
|
|
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
|
|
/* Verify archive format. */
|
|
assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
|
|
assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
|
|
|
|
/* Close the archive. */
|
|
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
|
|
DEFINE_TEST(test_read_format_7zip)
|
|
{
|
|
struct archive *a;
|
|
|
|
assert((a = archive_read_new()) != NULL);
|
|
|
|
/* Extracting with liblzma */
|
|
if (ARCHIVE_OK != archive_read_support_filter_xz(a)) {
|
|
skipping("7zip:lzma decoding is not supported on this "
|
|
"platform");
|
|
} else {
|
|
test_symname();
|
|
test_extract_all_files("test_read_format_7zip_copy_2.7z");
|
|
test_extract_last_file("test_read_format_7zip_copy_2.7z");
|
|
test_extract_all_files2("test_read_format_7zip_lzma1_lzma2.7z");
|
|
test_bcj("test_read_format_7zip_bcj2_copy_lzma.7z");
|
|
}
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
DEFINE_TEST(test_read_format_7zip_bzip2)
|
|
{
|
|
struct archive *a;
|
|
|
|
assert((a = archive_read_new()) != NULL);
|
|
|
|
/* Extracting with libbzip2 */
|
|
if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) {
|
|
skipping("7zip:bzip2 decoding is not supported on this platform");
|
|
} else {
|
|
test_plain_header("test_read_format_7zip_bzip2.7z");
|
|
test_bcj("test_read_format_7zip_bcj_bzip2.7z");
|
|
test_bcj("test_read_format_7zip_bcj2_bzip2.7z");
|
|
}
|
|
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
DEFINE_TEST(test_read_format_7zip_from_fd)
|
|
{
|
|
test_copy(1);/* read a 7zip file from a file descriptor. */
|
|
}
|
|
|
|
DEFINE_TEST(test_read_format_7zip_copy)
|
|
{
|
|
test_copy(0);
|
|
test_bcj("test_read_format_7zip_bcj_copy.7z");
|
|
test_bcj("test_read_format_7zip_bcj2_copy_1.7z");
|
|
test_bcj("test_read_format_7zip_bcj2_copy_2.7z");
|
|
}
|
|
|
|
DEFINE_TEST(test_read_format_7zip_deflate)
|
|
{
|
|
struct archive *a;
|
|
|
|
assert((a = archive_read_new()) != NULL);
|
|
|
|
/* Extracting with libz */
|
|
if (ARCHIVE_OK != archive_read_support_filter_gzip(a)) {
|
|
skipping(
|
|
"7zip:deflate decoding is not supported on this platform");
|
|
} else {
|
|
test_plain_header("test_read_format_7zip_deflate.7z");
|
|
test_bcj("test_read_format_7zip_bcj_deflate.7z");
|
|
test_bcj("test_read_format_7zip_bcj2_deflate.7z");
|
|
}
|
|
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
DEFINE_TEST(test_read_format_7zip_empty)
|
|
{
|
|
test_empty_archive();
|
|
test_empty_file();
|
|
}
|
|
|
|
DEFINE_TEST(test_read_format_7zip_lzma1)
|
|
{
|
|
struct archive *a;
|
|
|
|
assert((a = archive_read_new()) != NULL);
|
|
|
|
/* Extracting with liblzma */
|
|
if (ARCHIVE_OK != archive_read_support_filter_xz(a)) {
|
|
skipping("7zip:lzma decoding is not supported on this "
|
|
"platform");
|
|
} else {
|
|
test_plain_header("test_read_format_7zip_lzma1.7z");
|
|
test_extract_all_files("test_read_format_7zip_lzma1_2.7z");
|
|
test_extract_last_file("test_read_format_7zip_lzma1_2.7z");
|
|
test_bcj("test_read_format_7zip_bcj_lzma1.7z");
|
|
test_bcj("test_read_format_7zip_bcj2_lzma1_1.7z");
|
|
test_bcj("test_read_format_7zip_bcj2_lzma1_2.7z");
|
|
test_delta_lzma("test_read_format_7zip_delta_lzma1.7z");
|
|
test_delta_lzma("test_read_format_7zip_delta4_lzma1.7z");
|
|
}
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
DEFINE_TEST(test_read_format_7zip_lzma2)
|
|
{
|
|
struct archive *a;
|
|
|
|
assert((a = archive_read_new()) != NULL);
|
|
|
|
/* Extracting with liblzma */
|
|
if (ARCHIVE_OK != archive_read_support_filter_xz(a)) {
|
|
skipping("7zip:lzma decoding is not supported on this "
|
|
"platform");
|
|
} else {
|
|
test_plain_header("test_read_format_7zip_lzma2.7z");
|
|
test_bcj("test_read_format_7zip_bcj_lzma2.7z");
|
|
test_bcj("test_read_format_7zip_bcj2_lzma2_1.7z");
|
|
test_bcj("test_read_format_7zip_bcj2_lzma2_2.7z");
|
|
test_delta_lzma("test_read_format_7zip_delta_lzma2.7z");
|
|
test_delta_lzma("test_read_format_7zip_delta4_lzma2.7z");
|
|
}
|
|
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
|
}
|
|
|
|
DEFINE_TEST(test_read_format_7zip_ppmd)
|
|
{
|
|
test_ppmd();
|
|
}
|