Blame libarchive/test/test_read_format_lha.c

Packit Service 1d0348
/*-
Packit Service 1d0348
 * Copyright (c) 2008, 2010 Michihiro NAKAJIMA
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");
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
Execute the following command to rebuild the data for this program:
Packit Service 1d0348
   tail -n +32 test_read_format_lha.c | /bin/sh
Packit Service 1d0348
Packit Service 1d0348
#/bin/sh
Packit Service 1d0348
#
Packit Service 1d0348
# How to make test data.
Packit Service 1d0348
#
Packit Service 1d0348
# Temporary directory.
Packit Service 1d0348
base=/tmp/lha
Packit Service 1d0348
# Owner id
Packit Service 1d0348
owner=1001
Packit Service 1d0348
# Group id
Packit Service 1d0348
group=1001
Packit Service 1d0348
#
Packit Service 1d0348
# Make contents of a lha archive.
Packit Service 1d0348
#
Packit Service 1d0348
rm -rf ${base}
Packit Service 1d0348
mkdir ${base}
Packit Service 1d0348
mkdir ${base}/dir
Packit Service 1d0348
cat > ${base}/file1 << END
Packit Service 1d0348
                          file 1 contents
Packit Service 1d0348
hello
Packit Service 1d0348
hello
Packit Service 1d0348
hello
Packit Service 1d0348
END
Packit Service 1d0348
cat > ${base}/file2 << END
Packit Service 1d0348
                          file 2 contents
Packit Service 1d0348
hello
Packit Service 1d0348
hello
Packit Service 1d0348
hello
Packit Service 1d0348
hello
Packit Service 1d0348
hello
Packit Service 1d0348
hello
Packit Service 1d0348
END
Packit Service 1d0348
mkdir ${base}/dir2
Packit Service 1d0348
#
Packit Service 1d0348
# Set up a file mode, owner and group.
Packit Service 1d0348
#
Packit Service 1d0348
(cd ${base}/dir2; ln -s ../file1 symlink1)
Packit Service 1d0348
(cd ${base}/dir2; ln -s ../file2 symlink2)
Packit Service 1d0348
(cd ${base}; chown ${owner}:${group} dir file1 file2)
Packit Service 1d0348
(cd ${base}; chown -h ${owner}:${group} dir2 dir2/symlink1 dir2/symlink2)
Packit Service 1d0348
(cd ${base}; chmod 0750 dir)
Packit Service 1d0348
(cd ${base}; chmod 0755 dir2)
Packit Service 1d0348
(cd ${base}; chmod 0755 dir2/symlink1 dir2/symlink2)
Packit Service 1d0348
(cd ${base}; chmod 0644 file1)
Packit Service 1d0348
(cd ${base}; chmod 0666 file2)
Packit Service 1d0348
TZ=utc touch -afhm -t 197001030000.02 ${base}/dir2/symlink1 ${base}/dir2/symlink2
Packit Service 1d0348
TZ=utc touch -afhm -t 197001020000.01 ${base}/dir ${base}/dir2
Packit Service 1d0348
TZ=utc touch -afhm -t 197001020000.01 ${base}/file1 ${base}/file2
Packit Service 1d0348
#
Packit Service 1d0348
# Make several lha archives.
Packit Service 1d0348
#
Packit Service 1d0348
# Make a lha archive with header level 0
Packit Service 1d0348
lha0=test_read_format_lha_header0.lzh
Packit Service 1d0348
(cd ${base}; lha c0q ${lha0} dir file1 file2 dir2) 
Packit Service 1d0348
# Make a lha archive with header level 1
Packit Service 1d0348
lha1=test_read_format_lha_header1.lzh
Packit Service 1d0348
(cd ${base}; lha c1q ${lha1} dir file1 file2 dir2) 
Packit Service 1d0348
# Make a lha archive with header level 2
Packit Service 1d0348
lha2=test_read_format_lha_header2.lzh
Packit Service 1d0348
(cd ${base}; lha c2q ${lha2} dir file1 file2 dir2) 
Packit Service 1d0348
# Make a lha archive with -lh6- compression mode
Packit Service 1d0348
lha3=test_read_format_lha_lh6.lzh
Packit Service 1d0348
(cd ${base}; lha co6q ${lha3} dir file1 file2 dir2) 
Packit Service 1d0348
# Make a lha archive with -lh7- compression mode
Packit Service 1d0348
lha4=test_read_format_lha_lh7.lzh
Packit Service 1d0348
(cd ${base}; lha co7q ${lha4} dir file1 file2 dir2) 
Packit Service 1d0348
# Make a lha archive with -lh0- no compression
Packit Service 1d0348
lha5=test_read_format_lha_lh0.lzh
Packit Service 1d0348
(cd ${base}; lha czq ${lha5} dir file1 file2 dir2) 
Packit Service 1d0348
# make a lha archive with junk data
Packit Service 1d0348
lha6=test_read_format_lha_withjunk.lzh
Packit Service 1d0348
(cd ${base}; cp ${lha2} ${lha6}; echo "junk data!!!!" >> ${lha6})
Packit Service 1d0348
#
Packit Service 1d0348
uuencode ${base}/${lha0} ${lha0} > ${lha0}.uu
Packit Service 1d0348
uuencode ${base}/${lha1} ${lha1} > ${lha1}.uu
Packit Service 1d0348
uuencode ${base}/${lha2} ${lha2} > ${lha2}.uu
Packit Service 1d0348
uuencode ${base}/${lha3} ${lha3} > ${lha3}.uu
Packit Service 1d0348
uuencode ${base}/${lha4} ${lha4} > ${lha4}.uu
Packit Service 1d0348
uuencode ${base}/${lha5} ${lha5} > ${lha5}.uu
Packit Service 1d0348
uuencode ${base}/${lha6} ${lha5} > ${lha5}.uu
Packit Service 1d0348
uuencode ${base}/${lha6} ${lha6} > ${lha6}.uu
Packit Service 1d0348
#
Packit Service 1d0348
# Finish making test data.
Packit Service 1d0348
exit 1
Packit Service 1d0348
*/
Packit Service 1d0348
Packit Service 1d0348
static const char file1[] = {
Packit Service 1d0348
"                          file 1 contents\n"
Packit Service 1d0348
"hello\n"
Packit Service 1d0348
"hello\n"
Packit Service 1d0348
"hello\n"
Packit Service 1d0348
};
Packit Service 1d0348
#define file1_size (sizeof(file1)-1)
Packit Service 1d0348
static const char file2[] = {
Packit Service 1d0348
"                          file 2 contents\n"
Packit Service 1d0348
"hello\n"
Packit Service 1d0348
"hello\n"
Packit Service 1d0348
"hello\n"
Packit Service 1d0348
"hello\n"
Packit Service 1d0348
"hello\n"
Packit Service 1d0348
"hello\n"
Packit Service 1d0348
};
Packit Service 1d0348
#define file2_size (sizeof(file2)-1)
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
verify(const char *refname, int posix)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	char buff[128];
Packit Service 1d0348
	const void *pv;
Packit Service 1d0348
	size_t s;
Packit Service 1d0348
	int64_t o;
Packit Service 1d0348
	int uid, gid;
Packit Service 1d0348
Packit Service 1d0348
	if (posix)
Packit Service 1d0348
		uid = gid = 1001;
Packit Service 1d0348
	else
Packit Service 1d0348
		uid = gid = 0;
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,
Packit Service 1d0348
	    archive_read_open_filename(a, refname, 10240));
Packit Service 1d0348
Packit Service 1d0348
	/* Verify directory1.  */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	if (posix)
Packit Service 1d0348
		assertEqualInt((AE_IFDIR | 0750), archive_entry_mode(ae));
Packit Service 1d0348
	else
Packit Service 1d0348
		assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualString("dir/", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(86401, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualInt(uid, archive_entry_uid(ae));
Packit Service 1d0348
	assertEqualInt(gid, archive_entry_gid(ae));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF,
Packit Service 1d0348
	    archive_read_data_block(a, &pv, &s, &o);;
Packit Service 1d0348
	assertEqualInt(s, 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_is_encrypted(ae), 0);
Packit Service 1d0348
	assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
Packit Service 1d0348
Packit Service 1d0348
	/* Verify directory2.  */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualString("dir2/", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(86401, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualInt(uid, archive_entry_uid(ae));
Packit Service 1d0348
	assertEqualInt(gid, archive_entry_gid(ae));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF,
Packit Service 1d0348
	    archive_read_data_block(a, &pv, &s, &o);;
Packit Service 1d0348
	assertEqualInt(s, 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_is_encrypted(ae), 0);
Packit Service 1d0348
	assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
Packit Service 1d0348
Packit Service 1d0348
	if (posix) {
Packit Service 1d0348
		/* Verify symbolic link file1. */
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
		assertEqualInt((AE_IFLNK | 0755), archive_entry_mode(ae));
Packit Service 1d0348
		assertEqualString("dir2/symlink1", archive_entry_pathname(ae));
Packit Service 1d0348
		assertEqualString("../file1", archive_entry_symlink(ae));
Packit Service 1d0348
		assertEqualInt(172802, archive_entry_mtime(ae));
Packit Service 1d0348
		assertEqualInt(uid, archive_entry_uid(ae));
Packit Service 1d0348
		assertEqualInt(gid, archive_entry_gid(ae));
Packit Service 1d0348
		assertEqualInt(0, archive_entry_size(ae));
Packit Service 1d0348
		assertEqualInt(archive_entry_is_encrypted(ae), 0);
Packit Service 1d0348
		assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
Packit Service 1d0348
Packit Service 1d0348
		/* Verify symbolic link file2. */
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
		assertEqualInt((AE_IFLNK | 0755), archive_entry_mode(ae));
Packit Service 1d0348
		assertEqualString("dir2/symlink2", archive_entry_pathname(ae));
Packit Service 1d0348
		assertEqualString("../file2", archive_entry_symlink(ae));
Packit Service 1d0348
		assertEqualInt(172802, archive_entry_mtime(ae));
Packit Service 1d0348
		assertEqualInt(uid, archive_entry_uid(ae));
Packit Service 1d0348
		assertEqualInt(gid, archive_entry_gid(ae));
Packit Service 1d0348
		assertEqualInt(0, archive_entry_size(ae));
Packit Service 1d0348
		assertEqualInt(archive_entry_is_encrypted(ae), 0);
Packit Service 1d0348
		assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Verify regular file1. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualString("file1", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(86401, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualInt(uid, archive_entry_uid(ae));
Packit Service 1d0348
	assertEqualInt(gid, archive_entry_gid(ae));
Packit Service 1d0348
	assertEqualInt(file1_size, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualInt(file1_size, archive_read_data(a, buff, file1_size));
Packit Service 1d0348
	assertEqualMem(buff, file1, file1_size);
Packit Service 1d0348
	assertEqualInt(archive_entry_is_encrypted(ae), 0);
Packit Service 1d0348
	assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
Packit Service 1d0348
Packit Service 1d0348
	/* Verify regular file2. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	if (posix)
Packit Service 1d0348
		assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae));
Packit Service 1d0348
	else
Packit Service 1d0348
		assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualString("file2", archive_entry_pathname(ae));
Packit Service 1d0348
	assertEqualInt(86401, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualInt(uid, archive_entry_uid(ae));
Packit Service 1d0348
	assertEqualInt(gid, archive_entry_gid(ae));
Packit Service 1d0348
	assertEqualInt(file2_size, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualInt(file2_size, archive_read_data(a, buff, file2_size));
Packit Service 1d0348
	assertEqualMem(buff, file2, file2_size);
Packit Service 1d0348
	assertEqualInt(archive_entry_is_encrypted(ae), 0);
Packit Service 1d0348
	assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
Packit Service 1d0348
Packit Service 1d0348
	/* Verify the number of files read. */
Packit Service 1d0348
	if (posix) {
Packit Service 1d0348
		assertEqualInt(6, archive_file_count(a));
Packit Service 1d0348
	} else {
Packit Service 1d0348
		assertEqualInt(4, archive_file_count(a));
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* End of archive. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
Packit Service 1d0348
	/* Verify the number of files read. */
Packit Service 1d0348
	if (posix) {
Packit Service 1d0348
		assertEqualInt(6, archive_file_count(a));
Packit Service 1d0348
	} else {
Packit Service 1d0348
		assertEqualInt(4, archive_file_count(a));
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Verify encryption status */
Packit Service 1d0348
	assertEqualInt(archive_entry_is_encrypted(ae), 0);
Packit Service 1d0348
	assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
Packit Service 1d0348
Packit Service 1d0348
	/* Verify archive format. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_FORMAT_LHA, archive_format(a));
Packit Service 1d0348
Packit Service 1d0348
	/* Close the archive. */
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
DEFINE_TEST(test_read_format_lha)
Packit Service 1d0348
{
Packit Service 1d0348
	/* Verify Header level 0 */
Packit Service 1d0348
	verify("test_read_format_lha_header0.lzh", 1);
Packit Service 1d0348
	/* Verify Header level 1 */
Packit Service 1d0348
	verify("test_read_format_lha_header1.lzh", 1);
Packit Service 1d0348
	/* Verify Header level 2 */
Packit Service 1d0348
	verify("test_read_format_lha_header2.lzh", 1);
Packit Service 1d0348
	/* Verify Header level 3
Packit Service 1d0348
	 * This test data can be made in Windows only. */
Packit Service 1d0348
	verify("test_read_format_lha_header3.lzh", 0);
Packit Service 1d0348
	/* Verify compression mode -lh6- */
Packit Service 1d0348
	verify("test_read_format_lha_lh6.lzh", 1);
Packit Service 1d0348
	/* Verify compression mode -lh7- */
Packit Service 1d0348
	verify("test_read_format_lha_lh7.lzh", 1);
Packit Service 1d0348
	/* Verify no compression -lh0- */
Packit Service 1d0348
	verify("test_read_format_lha_lh0.lzh", 1);
Packit Service 1d0348
	/* Verify an lha file with junk data. */
Packit Service 1d0348
	verify("test_read_format_lha_withjunk.lzh", 1);
Packit Service 1d0348
}
Packit Service 1d0348