Blame libarchive/test/test_write_format_iso9660_empty.c

Packit 08bd4c
/*-
Packit 08bd4c
 * Copyright (c) 2009-2011 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
Packit 08bd4c
/*
Packit 08bd4c
 * Check that an "empty" ISO 9660 image is correctly created.
Packit 08bd4c
 */
Packit 08bd4c
Packit 08bd4c
static const unsigned char primary_id[] = {
Packit 08bd4c
    0x01, 0x43, 0x44, 0x30, 0x30, 0x31, 0x01, 0x00
Packit 08bd4c
};
Packit 08bd4c
static const unsigned char volumesize[] = {
Packit 08bd4c
    0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5
Packit 08bd4c
};
Packit 08bd4c
static const unsigned char volumeidu16[] = {
Packit 08bd4c
    0x00, 0x43, 0x00, 0x44, 0x00, 0x52, 0x00, 0x4f,
Packit 08bd4c
    0x00, 0x4d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
Packit 08bd4c
    0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
Packit 08bd4c
    0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20
Packit 08bd4c
};
Packit 08bd4c
static const unsigned char supplementary_id[] = {
Packit 08bd4c
    0x02, 0x43, 0x44, 0x30, 0x30, 0x31, 0x01, 0x00
Packit 08bd4c
};
Packit 08bd4c
static const unsigned char terminator_id[] = {
Packit 08bd4c
    0xff, 0x43, 0x44, 0x30, 0x30, 0x31, 0x01, 0x00
Packit 08bd4c
};
Packit 08bd4c
Packit 08bd4c
DEFINE_TEST(test_write_format_iso9660_empty)
Packit 08bd4c
{
Packit 08bd4c
	struct archive *a;
Packit 08bd4c
	struct archive_entry *ae;
Packit 08bd4c
	unsigned char *buff;
Packit 08bd4c
	size_t buffsize = 190 * 2048;
Packit 08bd4c
	size_t used;
Packit 08bd4c
	unsigned int i;
Packit 08bd4c
Packit 08bd4c
	buff = malloc(buffsize);
Packit 08bd4c
	assert(buff != NULL);
Packit 08bd4c
	if (buff == NULL)
Packit 08bd4c
		return;
Packit 08bd4c
Packit 08bd4c
	/* ISO9660 format: Create a new archive in memory. */
Packit 08bd4c
	assert((a = archive_write_new()) != NULL);
Packit 08bd4c
	assertA(0 == archive_write_set_format_iso9660(a));
Packit 08bd4c
	assertA(0 == archive_write_add_filter_none(a));
Packit 08bd4c
	assertA(0 == archive_write_set_bytes_per_block(a, 1));
Packit 08bd4c
	assertA(0 == archive_write_set_bytes_in_last_block(a, 1));
Packit 08bd4c
	assertA(0 == archive_write_open_memory(a, buff, buffsize, &used));
Packit 08bd4c
Packit 08bd4c
	/* Add "." entry which must be ignored. */ 
Packit 08bd4c
	assert((ae = archive_entry_new()) != NULL);
Packit 08bd4c
	archive_entry_set_atime(ae, 2, 0);
Packit 08bd4c
	archive_entry_set_ctime(ae, 4, 0);
Packit 08bd4c
	archive_entry_set_mtime(ae, 5, 0);
Packit 08bd4c
	archive_entry_copy_pathname(ae, ".");
Packit 08bd4c
	archive_entry_set_mode(ae, S_IFDIR | 0755);
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit 08bd4c
	archive_entry_free(ae);
Packit 08bd4c
Packit 08bd4c
	/* Add ".." entry which must be ignored. */ 
Packit 08bd4c
	assert((ae = archive_entry_new()) != NULL);
Packit 08bd4c
	archive_entry_set_atime(ae, 2, 0);
Packit 08bd4c
	archive_entry_set_ctime(ae, 4, 0);
Packit 08bd4c
	archive_entry_set_mtime(ae, 5, 0);
Packit 08bd4c
	archive_entry_copy_pathname(ae, "..");
Packit 08bd4c
	archive_entry_set_mode(ae, S_IFDIR | 0755);
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit 08bd4c
	archive_entry_free(ae);
Packit 08bd4c
Packit 08bd4c
	/* Add "/" entry which must be ignored. */ 
Packit 08bd4c
	assert((ae = archive_entry_new()) != NULL);
Packit 08bd4c
	archive_entry_set_atime(ae, 2, 0);
Packit 08bd4c
	archive_entry_set_ctime(ae, 4, 0);
Packit 08bd4c
	archive_entry_set_mtime(ae, 5, 0);
Packit 08bd4c
	archive_entry_copy_pathname(ae, "/");
Packit 08bd4c
	archive_entry_set_mode(ae, S_IFDIR | 0755);
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit 08bd4c
	archive_entry_free(ae);
Packit 08bd4c
Packit 08bd4c
	/* Add "../" entry which must be ignored. */ 
Packit 08bd4c
	assert((ae = archive_entry_new()) != NULL);
Packit 08bd4c
	archive_entry_set_atime(ae, 2, 0);
Packit 08bd4c
	archive_entry_set_ctime(ae, 4, 0);
Packit 08bd4c
	archive_entry_set_mtime(ae, 5, 0);
Packit 08bd4c
	archive_entry_copy_pathname(ae, "../");
Packit 08bd4c
	archive_entry_set_mode(ae, S_IFDIR | 0755);
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit 08bd4c
	archive_entry_free(ae);
Packit 08bd4c
Packit 08bd4c
	/* Add "../../." entry which must be ignored. */ 
Packit 08bd4c
	assert((ae = archive_entry_new()) != NULL);
Packit 08bd4c
	archive_entry_set_atime(ae, 2, 0);
Packit 08bd4c
	archive_entry_set_ctime(ae, 4, 0);
Packit 08bd4c
	archive_entry_set_mtime(ae, 5, 0);
Packit 08bd4c
	archive_entry_copy_pathname(ae, "../../.");
Packit 08bd4c
	archive_entry_set_mode(ae, S_IFDIR | 0755);
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit 08bd4c
	archive_entry_free(ae);
Packit 08bd4c
Packit 08bd4c
	/* Add "..//.././" entry which must be ignored. */ 
Packit 08bd4c
	assert((ae = archive_entry_new()) != NULL);
Packit 08bd4c
	archive_entry_set_atime(ae, 2, 0);
Packit 08bd4c
	archive_entry_set_ctime(ae, 4, 0);
Packit 08bd4c
	archive_entry_set_mtime(ae, 5, 0);
Packit 08bd4c
	archive_entry_copy_pathname(ae, "..//.././");
Packit 08bd4c
	archive_entry_set_mode(ae, S_IFDIR | 0755);
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit 08bd4c
	archive_entry_free(ae);
Packit 08bd4c
Packit 08bd4c
	/* Close out the archive. */
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a));
Packit 08bd4c
Packit 08bd4c
	assert(used == 2048 * 181);
Packit 08bd4c
	/* Check System Area. */
Packit 08bd4c
	for (i = 0; i < 2048 * 16; i++) {
Packit 08bd4c
		failure("System Area should be all nulls.");
Packit 08bd4c
		assert(buff[i] == 0);
Packit 08bd4c
	}
Packit 08bd4c
Packit 08bd4c
	/* Primary Volume. */
Packit 08bd4c
	failure("Primary Volume Descriptor should be in 16 Logical Sector.");
Packit 08bd4c
	assertEqualMem(buff+2048*16, primary_id, 8);
Packit 08bd4c
	assertEqualMem(buff+2048*16+0x28,
Packit 08bd4c
	    "CDROM                           ", 32);
Packit 08bd4c
	assertEqualMem(buff+2048*16+0x50, volumesize, 8);
Packit 08bd4c
Packit 08bd4c
	/* Supplementary Volume. */
Packit 08bd4c
	failure("Supplementary Volume(Joliet) Descriptor "
Packit 08bd4c
	    "should be in 17 Logical Sector.");
Packit 08bd4c
	assertEqualMem(buff+2048*17, supplementary_id, 8);
Packit 08bd4c
	assertEqualMem(buff+2048*17+0x28, volumeidu16, 32);
Packit 08bd4c
	assertEqualMem(buff+2048*17+0x50, volumesize, 8);
Packit 08bd4c
	failure("Date and Time of Primary Volume and "
Packit 08bd4c
	    "Date and Time of Supplementary Volume "
Packit 08bd4c
	    "must be the same.");
Packit 08bd4c
	assertEqualMem(buff+2048*16+0x32d, buff+2048*17+0x32d, 0x44);
Packit 08bd4c
Packit 08bd4c
	/* Terminator. */
Packit 08bd4c
	failure("Volume Descriptor Set Terminator "
Packit 08bd4c
	    "should be in 18 Logical Sector.");
Packit 08bd4c
	assertEqualMem(buff+2048*18, terminator_id, 8);
Packit 08bd4c
	for (i = 8; i < 2048; i++) {
Packit 08bd4c
		failure("Body of Volume Descriptor Set Terminator "
Packit 08bd4c
		    "should be all nulls.");
Packit 08bd4c
		assert(buff[2048*18+i] == 0);
Packit 08bd4c
	}
Packit 08bd4c
Packit 08bd4c
	/* Padding data. */
Packit 08bd4c
	for (i = 0; i < 2048*150; i++) {
Packit 08bd4c
		failure("Padding data should be all nulls.");
Packit 08bd4c
		assert(buff[2048*31+i] == 0);
Packit 08bd4c
	}
Packit 08bd4c
Packit 08bd4c
	/*
Packit 08bd4c
	 * Read ISO image.
Packit 08bd4c
	 */
Packit 08bd4c
	assert((a = archive_read_new()) != NULL);
Packit 08bd4c
	assertEqualIntA(a, 0, archive_read_support_format_all(a));
Packit 08bd4c
	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
Packit 08bd4c
	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
Packit 08bd4c
Packit 08bd4c
	/*
Packit 08bd4c
	 * Read Root Directory
Packit 08bd4c
	 * Root Directory entry must be in ISO image.
Packit 08bd4c
	 */
Packit 08bd4c
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit 08bd4c
	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
Packit 08bd4c
	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
Packit 08bd4c
	assertEqualString(".", archive_entry_pathname(ae));
Packit 08bd4c
	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
Packit 08bd4c
	assertEqualInt(2048, archive_entry_size(ae));
Packit 08bd4c
Packit 08bd4c
	/*
Packit 08bd4c
	 * Verify the end of the archive.
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(buff);
Packit 08bd4c
}