/*-
 * Copyright (c) 2003-2009 Tim Kientzle
 * 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: head/lib/libarchive/test/test_compat_solaris_tar_acl.c 201247 2009-12-30 05:59:21Z kientzle $");

/*
 * Exercise support for reading Solaris-style ACL data
 * from tar archives.
 *
 * This should work on all systems, regardless of whether local
 * filesystems support ACLs or not.
 */

DEFINE_TEST(test_compat_solaris_tar_acl)
{
	struct archive *a;
	struct archive_entry *ae;
	const char *reference1 = "test_compat_solaris_tar_acl.tar";
	int type, permset, tag, qual;
	const char *name;

	/* Sample file generated on Solaris 10 */
	extract_reference_file(reference1);
	assert(NULL != (a = archive_read_new()));
	assertA(0 == archive_read_support_format_all(a));
	assertA(0 == archive_read_support_filter_all(a));
	assertA(0 == archive_read_open_filename(a, reference1, 512));

	/* Archive has 1 entry with some ACLs set on it. */
	assertA(0 == archive_read_next_header(a, &ae));
	failure("Basic ACLs should set mode to 0644, not %04o",
	    archive_entry_mode(ae)&0777);
	assertEqualInt((archive_entry_mode(ae) & 0777), 0644);
	assertEqualInt(7, archive_entry_acl_reset(ae,
		ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
	assertEqualInt(ARCHIVE_OK, archive_entry_acl_next(ae,
		ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
		&type, &permset, &tag, &qual, &name));
	assertEqualInt(ARCHIVE_ENTRY_ACL_TYPE_ACCESS, type);
	assertEqualInt(006, permset);
	assertEqualInt(ARCHIVE_ENTRY_ACL_USER_OBJ, tag);
	assertEqualInt(-1, qual);
	assert(name == NULL);

	assertEqualInt(ARCHIVE_OK, archive_entry_acl_next(ae,
		ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
		&type, &permset, &tag, &qual, &name));
	assertEqualInt(ARCHIVE_ENTRY_ACL_TYPE_ACCESS, type);
	assertEqualInt(004, permset);
	assertEqualInt(ARCHIVE_ENTRY_ACL_GROUP_OBJ, tag);
	assertEqualInt(-1, qual);
	assert(name == NULL);

	assertEqualInt(ARCHIVE_OK, archive_entry_acl_next(ae,
		ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
		&type, &permset, &tag, &qual, &name));
	assertEqualInt(ARCHIVE_ENTRY_ACL_TYPE_ACCESS, type);
	assertEqualInt(004, permset);
	assertEqualInt(ARCHIVE_ENTRY_ACL_OTHER, tag);
	assertEqualInt(-1, qual);
	assert(name == NULL);

	assertEqualInt(ARCHIVE_OK, archive_entry_acl_next(ae,
		ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
		&type, &permset, &tag, &qual, &name));
	assertEqualInt(ARCHIVE_ENTRY_ACL_TYPE_ACCESS, type);
	assertEqualInt(001, permset);
	assertEqualInt(ARCHIVE_ENTRY_ACL_USER, tag);
	assertEqualInt(71, qual);
	assertEqualString(name, "lp");

	assertEqualInt(ARCHIVE_OK, archive_entry_acl_next(ae,
		ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
		&type, &permset, &tag, &qual, &name));
	assertEqualInt(ARCHIVE_ENTRY_ACL_TYPE_ACCESS, type);
	assertEqualInt(004, permset);
	assertEqualInt(ARCHIVE_ENTRY_ACL_USER, tag);
	assertEqualInt(666, qual);
	assertEqualString(name, "666");

	assertEqualInt(ARCHIVE_OK, archive_entry_acl_next(ae,
		ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
		&type, &permset, &tag, &qual, &name));
	assertEqualInt(ARCHIVE_ENTRY_ACL_TYPE_ACCESS, type);
	assertEqualInt(007, permset);
	assertEqualInt(ARCHIVE_ENTRY_ACL_USER, tag);
	assertEqualInt(1000, qual);
	assertEqualString(name, "trasz");

	assertEqualInt(ARCHIVE_OK, archive_entry_acl_next(ae,
		ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
		&type, &permset, &tag, &qual, &name));
	assertEqualInt(ARCHIVE_ENTRY_ACL_TYPE_ACCESS, type);
	assertEqualInt(004, permset);
	assertEqualInt(ARCHIVE_ENTRY_ACL_MASK, tag);
	assertEqualInt(-1, qual);
	assertEqualString(name, NULL);

	assertEqualInt(ARCHIVE_EOF, archive_entry_acl_next(ae,
		ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
		&type, &permset, &tag, &qual, &name));

	/* Close the archive. */
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
