1228753Smm/*- 2228753Smm * Copyright (c) 2003-2008 Tim Kientzle 3228753Smm * Copyright (c) 2008 Anselm Strauss 4228753Smm * All rights reserved. 5228753Smm * 6228753Smm * Redistribution and use in source and binary forms, with or without 7228753Smm * modification, are permitted provided that the following conditions 8228753Smm * are met: 9228753Smm * 1. Redistributions of source code must retain the above copyright 10228753Smm * notice, this list of conditions and the following disclaimer. 11228753Smm * 2. Redistributions in binary form must reproduce the above copyright 12228753Smm * notice, this list of conditions and the following disclaimer in the 13228753Smm * documentation and/or other materials provided with the distribution. 14228753Smm * 15228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 16228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 19228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25228753Smm */ 26228753Smm 27228753Smm/* 28228753Smm * Development supported by Google Summer of Code 2008. 29228753Smm */ 30228753Smm 31228753Smm/* TODO: reader does not yet restore permissions. */ 32228753Smm 33228753Smm#include "test.h" 34229592Smm__FBSDID("$FreeBSD$"); 35228753Smm 36228753SmmDEFINE_TEST(test_write_format_zip) 37228753Smm{ 38228753Smm char filedata[64]; 39228753Smm struct archive_entry *ae; 40228753Smm struct archive *a; 41228753Smm size_t used; 42228753Smm size_t buffsize = 1000000; 43228753Smm char *buff; 44228753Smm const char *compression_type; 45228753Smm 46228753Smm buff = malloc(buffsize); 47228753Smm 48228753Smm /* Create a new archive in memory. */ 49228753Smm assert((a = archive_write_new()) != NULL); 50228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); 51228753Smm#ifdef HAVE_ZLIB_H 52228753Smm compression_type = "zip:compression=deflate"; 53228753Smm#else 54228753Smm compression_type = "zip:compression=store"; 55228753Smm#endif 56228753Smm assertEqualIntA(a, ARCHIVE_OK, 57228753Smm archive_write_set_format_options(a, compression_type)); 58228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_none(a)); 59228753Smm assertEqualIntA(a, ARCHIVE_OK, 60228753Smm archive_write_open_memory(a, buff, buffsize, &used)); 61228753Smm 62228753Smm /* 63228753Smm * Write a file to it. 64228753Smm */ 65228753Smm assert((ae = archive_entry_new()) != NULL); 66228753Smm archive_entry_set_mtime(ae, 1, 10); 67228753Smm assertEqualInt(1, archive_entry_mtime(ae)); 68228753Smm assertEqualInt(10, archive_entry_mtime_nsec(ae)); 69228753Smm archive_entry_copy_pathname(ae, "file"); 70228753Smm assertEqualString("file", archive_entry_pathname(ae)); 71228753Smm archive_entry_set_mode(ae, S_IFREG | 0755); 72228753Smm assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); 73228753Smm archive_entry_set_size(ae, 8); 74228753Smm 75228753Smm assertEqualInt(0, archive_write_header(a, ae)); 76228753Smm archive_entry_free(ae); 77228753Smm assertEqualInt(8, archive_write_data(a, "12345678", 9)); 78228753Smm assertEqualInt(0, archive_write_data(a, "1", 1)); 79228753Smm 80228753Smm /* 81228753Smm * Write another file to it. 82228753Smm */ 83228753Smm assert((ae = archive_entry_new()) != NULL); 84228753Smm archive_entry_set_mtime(ae, 1, 10); 85228753Smm assertEqualInt(1, archive_entry_mtime(ae)); 86228753Smm assertEqualInt(10, archive_entry_mtime_nsec(ae)); 87228753Smm archive_entry_copy_pathname(ae, "file2"); 88228753Smm assertEqualString("file2", archive_entry_pathname(ae)); 89228753Smm archive_entry_set_mode(ae, S_IFREG | 0755); 90228753Smm assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); 91228753Smm archive_entry_set_size(ae, 4); 92228753Smm 93228753Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 94228753Smm archive_entry_free(ae); 95228753Smm assertEqualInt(4, archive_write_data(a, "1234", 5)); 96228753Smm 97228753Smm /* 98228753Smm * Write a directory to it. 99228753Smm */ 100228753Smm assert((ae = archive_entry_new()) != NULL); 101228753Smm archive_entry_set_mtime(ae, 11, 110); 102228753Smm archive_entry_copy_pathname(ae, "dir"); 103228753Smm archive_entry_set_mode(ae, S_IFDIR | 0755); 104228753Smm archive_entry_set_size(ae, 512); 105228753Smm 106228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 107228753Smm failure("size should be zero so that applications know not to write"); 108228753Smm assertEqualInt(0, archive_entry_size(ae)); 109228753Smm archive_entry_free(ae); 110228753Smm assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9)); 111228753Smm 112228753Smm /* Close out the archive. */ 113228753Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 114228753Smm assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); 115228753Smm 116228753Smm /* 117228753Smm * Now, read the data back. 118228753Smm */ 119228753Smm ae = NULL; 120228753Smm assert((a = archive_read_new()) != NULL); 121228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 122228753Smm assertEqualIntA(a, ARCHIVE_OK, 123228753Smm archive_read_support_compression_all(a)); 124228753Smm assertEqualIntA(a, ARCHIVE_OK, 125228753Smm archive_read_open_memory(a, buff, used)); 126228753Smm 127228753Smm /* 128228753Smm * Read and verify first file. 129228753Smm */ 130228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 131228753Smm assertEqualInt(1, archive_entry_mtime(ae)); 132228753Smm /* Zip doesn't store high-resolution mtime. */ 133228753Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 134228753Smm assertEqualInt(0, archive_entry_atime(ae)); 135228753Smm assertEqualInt(0, archive_entry_ctime(ae)); 136228753Smm assertEqualString("file", archive_entry_pathname(ae)); 137228753Smm //assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); 138228753Smm assertEqualInt(0, archive_entry_size(ae)); 139228753Smm assertEqualIntA(a, 8, 140228753Smm archive_read_data(a, filedata, sizeof(filedata))); 141228753Smm assertEqualMem(filedata, "12345678", 8); 142228753Smm 143228753Smm 144228753Smm /* 145228753Smm * Read the second file back. 146228753Smm */ 147228753Smm if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))){ 148228753Smm free(buff); 149228753Smm return; 150228753Smm } 151228753Smm assertEqualInt(1, archive_entry_mtime(ae)); 152228753Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 153228753Smm assertEqualInt(0, archive_entry_atime(ae)); 154228753Smm assertEqualInt(0, archive_entry_ctime(ae)); 155228753Smm assertEqualString("file2", archive_entry_pathname(ae)); 156228753Smm //assert((S_IFREG | 0755) == archive_entry_mode(ae)); 157228753Smm assertEqualInt(0, archive_entry_size(ae)); 158228753Smm assertEqualIntA(a, 4, 159228753Smm archive_read_data(a, filedata, sizeof(filedata))); 160228753Smm assertEqualMem(filedata, "1234", 4); 161228753Smm 162228753Smm /* 163228753Smm * Read the dir entry back. 164228753Smm */ 165228753Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 166228753Smm assertEqualInt(11, archive_entry_mtime(ae)); 167228753Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 168228753Smm assertEqualInt(0, archive_entry_atime(ae)); 169228753Smm assertEqualInt(0, archive_entry_ctime(ae)); 170228753Smm assertEqualString("dir/", archive_entry_pathname(ae)); 171228753Smm //assertEqualInt((S_IFDIR | 0755), archive_entry_mode(ae)); 172228753Smm assertEqualInt(0, archive_entry_size(ae)); 173228753Smm assertEqualIntA(a, 0, archive_read_data(a, filedata, 10)); 174228753Smm 175228753Smm /* Verify the end of the archive. */ 176228753Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 177228753Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 178228753Smm assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); 179228753Smm free(buff); 180228753Smm} 181