1248590Smm/*- 2248590Smm * Copyright (c) 2011-2012 Michihiro NAKAJIMA 3248590Smm * All rights reserved. 4248590Smm * 5248590Smm * Redistribution and use in source and binary forms, with or without 6248590Smm * modification, are permitted provided that the following conditions 7248590Smm * are met: 8248590Smm * 1. Redistributions of source code must retain the above copyright 9248590Smm * notice, this list of conditions and the following disclaimer. 10248590Smm * 2. Redistributions in binary form must reproduce the above copyright 11248590Smm * notice, this list of conditions and the following disclaimer in the 12248590Smm * documentation and/or other materials provided with the distribution. 13248590Smm * 14248590Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15248590Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16248590Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17248590Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18248590Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19248590Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20248590Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21248590Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22248590Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23248590Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24248590Smm */ 25248590Smm 26248590Smm 27248590Smm#include "test.h" 28248590Smm__FBSDID("$FreeBSD$"); 29248590Smm 30248590Smm/* 31248590Smm * Test writing an empty archive. 32248590Smm */ 33248590SmmDEFINE_TEST(test_write_format_7zip_empty_archive) 34248590Smm{ 35248590Smm struct archive *a; 36248590Smm size_t buffsize = 1000; 37248590Smm char *buff; 38248590Smm size_t used; 39248590Smm 40248590Smm buff = malloc(buffsize); 41248590Smm 42248590Smm /* Create a new archive in memory. */ 43248590Smm assert((a = archive_write_new()) != NULL); 44248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_7zip(a)); 45248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); 46248590Smm assertEqualIntA(a, ARCHIVE_OK, 47248590Smm archive_write_open_memory(a, buff, buffsize, &used)); 48248590Smm 49248590Smm /* Close out the archive. */ 50248590Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 51248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 52248590Smm 53248590Smm /* Verify the archive file size. */ 54248590Smm assertEqualInt(32, used); 55248590Smm 56248590Smm /* Verify the initial header. */ 57248590Smm assertEqualMem(buff, 58248590Smm "\x37\x7a\xbc\xaf\x27\x1c\x00\x03" 59248590Smm "\x8d\x9b\xd5\x0f\x00\x00\x00\x00" 60248590Smm "\x00\x00\x00\x00\x00\x00\x00\x00" 61248590Smm "\x00\x00\x00\x00\x00\x00\x00\x00", 32); 62248590Smm 63248590Smm free(buff); 64248590Smm} 65248590Smm 66248590Smm/* 67248590Smm * Test writing an empty file. 68248590Smm */ 69248590Smmstatic void 70248590Smmtest_only_empty_file(void) 71248590Smm{ 72248590Smm struct archive *a; 73248590Smm struct archive_entry *ae; 74248590Smm size_t buffsize = 1000; 75248590Smm char *buff; 76248590Smm size_t used; 77248590Smm 78248590Smm buff = malloc(buffsize); 79248590Smm 80248590Smm /* Create a new archive in memory. */ 81248590Smm assert((a = archive_write_new()) != NULL); 82248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_7zip(a)); 83248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); 84248590Smm assertEqualIntA(a, ARCHIVE_OK, 85248590Smm archive_write_open_memory(a, buff, buffsize, &used)); 86248590Smm 87248590Smm /* 88248590Smm * Write an empty file to it. 89248590Smm */ 90248590Smm assert((ae = archive_entry_new()) != NULL); 91248590Smm archive_entry_set_mtime(ae, 1, 10); 92248590Smm assertEqualInt(1, archive_entry_mtime(ae)); 93248590Smm assertEqualInt(10, archive_entry_mtime_nsec(ae)); 94248590Smm archive_entry_set_atime(ae, 2, 20); 95248590Smm assertEqualInt(2, archive_entry_atime(ae)); 96248590Smm assertEqualInt(20, archive_entry_atime_nsec(ae)); 97248590Smm archive_entry_set_ctime(ae, 0, 100); 98248590Smm assertEqualInt(0, archive_entry_ctime(ae)); 99248590Smm assertEqualInt(100, archive_entry_ctime_nsec(ae)); 100248590Smm archive_entry_copy_pathname(ae, "empty"); 101248590Smm assertEqualString("empty", archive_entry_pathname(ae)); 102248590Smm archive_entry_set_mode(ae, AE_IFREG | 0755); 103248590Smm assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); 104248590Smm 105248590Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 106248590Smm archive_entry_free(ae); 107248590Smm 108248590Smm /* Close out the archive. */ 109248590Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 110248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 111248590Smm 112248590Smm /* Verify the archive file size. */ 113248590Smm assertEqualInt(102, used); 114248590Smm 115248590Smm /* Verify the initial header. */ 116248590Smm assertEqualMem(buff, 117248590Smm "\x37\x7a\xbc\xaf\x27\x1c\x00\x03" 118248590Smm "\x00\x5b\x58\x25\x00\x00\x00\x00" 119248590Smm "\x00\x00\x00\x00\x46\x00\x00\x00" 120248590Smm "\x00\x00\x00\x00\x8f\xce\x1d\xf3", 32); 121248590Smm 122248590Smm /* 123248590Smm * Now, read the data back. 124248590Smm */ 125248590Smm /* With the test memory reader -- seeking mode. */ 126248590Smm assert((a = archive_read_new()) != NULL); 127248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 128248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 129248590Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7)); 130248590Smm 131248590Smm /* 132248590Smm * Read and verify an empty file. 133248590Smm */ 134248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 135248590Smm assertEqualInt(1, archive_entry_mtime(ae)); 136248590Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 137248590Smm assertEqualInt(2, archive_entry_atime(ae)); 138248590Smm assertEqualInt(0, archive_entry_atime_nsec(ae)); 139248590Smm assertEqualInt(0, archive_entry_ctime(ae)); 140248590Smm assertEqualInt(100, archive_entry_ctime_nsec(ae)); 141248590Smm assertEqualString("empty", archive_entry_pathname(ae)); 142248590Smm assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 143248590Smm assertEqualInt(0, archive_entry_size(ae)); 144248590Smm 145248590Smm /* Verify the end of the archive. */ 146248590Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 147248590Smm 148248590Smm /* Verify archive format. */ 149248590Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 150248590Smm assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 151248590Smm 152248590Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 153248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 154248590Smm 155248590Smm free(buff); 156248590Smm} 157248590Smm 158248590Smmstatic void 159248590Smmtest_only_empty_files(void) 160248590Smm{ 161248590Smm struct archive *a; 162248590Smm struct archive_entry *ae; 163248590Smm size_t buffsize = 1000; 164248590Smm char *buff; 165248590Smm size_t used; 166248590Smm 167248590Smm buff = malloc(buffsize); 168248590Smm 169248590Smm /* Create a new archive in memory. */ 170248590Smm assert((a = archive_write_new()) != NULL); 171248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_7zip(a)); 172248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); 173248590Smm assertEqualIntA(a, ARCHIVE_OK, 174248590Smm archive_write_open_memory(a, buff, buffsize, &used)); 175248590Smm 176248590Smm /* 177248590Smm * Write an empty file to it. 178248590Smm */ 179248590Smm assert((ae = archive_entry_new()) != NULL); 180248590Smm archive_entry_set_mtime(ae, 1, 10); 181248590Smm assertEqualInt(1, archive_entry_mtime(ae)); 182248590Smm assertEqualInt(10, archive_entry_mtime_nsec(ae)); 183248590Smm archive_entry_set_atime(ae, 2, 20); 184248590Smm assertEqualInt(2, archive_entry_atime(ae)); 185248590Smm assertEqualInt(20, archive_entry_atime_nsec(ae)); 186248590Smm archive_entry_copy_pathname(ae, "empty"); 187248590Smm assertEqualString("empty", archive_entry_pathname(ae)); 188248590Smm archive_entry_set_mode(ae, AE_IFREG | 0755); 189248590Smm assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae)); 190248590Smm 191248590Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 192248590Smm archive_entry_free(ae); 193248590Smm 194248590Smm /* 195248590Smm * Write second empty file to it. 196248590Smm */ 197248590Smm assert((ae = archive_entry_new()) != NULL); 198248590Smm archive_entry_set_mtime(ae, 2, 10); 199248590Smm assertEqualInt(2, archive_entry_mtime(ae)); 200248590Smm assertEqualInt(10, archive_entry_mtime_nsec(ae)); 201248590Smm archive_entry_set_ctime(ae, 2, 10); 202248590Smm assertEqualInt(2, archive_entry_ctime(ae)); 203248590Smm assertEqualInt(10, archive_entry_ctime_nsec(ae)); 204248590Smm archive_entry_copy_pathname(ae, "empty2"); 205248590Smm assertEqualString("empty2", archive_entry_pathname(ae)); 206248590Smm archive_entry_set_mode(ae, AE_IFREG | 0644); 207248590Smm assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 208248590Smm 209248590Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 210248590Smm archive_entry_free(ae); 211248590Smm 212248590Smm /* 213248590Smm * Write third empty file to it. 214248590Smm */ 215248590Smm assert((ae = archive_entry_new()) != NULL); 216248590Smm archive_entry_set_mtime(ae, 3, 10); 217248590Smm assertEqualInt(3, archive_entry_mtime(ae)); 218248590Smm assertEqualInt(10, archive_entry_mtime_nsec(ae)); 219248590Smm archive_entry_copy_pathname(ae, "empty3"); 220248590Smm assertEqualString("empty3", archive_entry_pathname(ae)); 221248590Smm archive_entry_set_mode(ae, AE_IFREG | 0644); 222248590Smm assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 223248590Smm 224248590Smm assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); 225248590Smm archive_entry_free(ae); 226248590Smm 227248590Smm /* Close out the archive. */ 228248590Smm assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 229248590Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 230248590Smm 231248590Smm /* Verify the initial header. */ 232248590Smm assertEqualMem(buff, "\x37\x7a\xbc\xaf\x27\x1c\x00\x03", 8); 233248590Smm 234248590Smm /* 235248590Smm * Now, read the data back. 236248590Smm */ 237248590Smm /* With the test memory reader -- seeking mode. */ 238248590Smm assert((a = archive_read_new()) != NULL); 239248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 240248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 241248590Smm assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7)); 242248590Smm 243248590Smm /* 244248590Smm * Read and verify an empty file. 245248590Smm */ 246248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 247248590Smm assertEqualInt(1, archive_entry_mtime(ae)); 248248590Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 249248590Smm assertEqualInt(2, archive_entry_atime(ae)); 250248590Smm assertEqualInt(0, archive_entry_atime_nsec(ae)); 251248590Smm assertEqualInt(0, archive_entry_ctime(ae)); 252248590Smm assertEqualString("empty", archive_entry_pathname(ae)); 253248590Smm assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 254248590Smm assertEqualInt(0, archive_entry_size(ae)); 255248590Smm 256248590Smm /* 257248590Smm * Read and verify second empty file. 258248590Smm */ 259248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 260248590Smm assertEqualInt(2, archive_entry_mtime(ae)); 261248590Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 262248590Smm assertEqualInt(0, archive_entry_atime(ae)); 263248590Smm assertEqualInt(2, archive_entry_ctime(ae)); 264248590Smm assertEqualInt(0, archive_entry_ctime_nsec(ae)); 265248590Smm assertEqualString("empty2", archive_entry_pathname(ae)); 266248590Smm assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae)); 267248590Smm assertEqualInt(0, archive_entry_size(ae)); 268248590Smm 269248590Smm /* 270248590Smm * Read and verify third empty file. 271248590Smm */ 272248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 273248590Smm assertEqualInt(3, archive_entry_mtime(ae)); 274248590Smm assertEqualInt(0, archive_entry_mtime_nsec(ae)); 275248590Smm assertEqualInt(0, archive_entry_atime(ae)); 276248590Smm assertEqualInt(0, archive_entry_ctime(ae)); 277248590Smm assertEqualString("empty3", archive_entry_pathname(ae)); 278248590Smm assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae)); 279248590Smm assertEqualInt(0, archive_entry_size(ae)); 280248590Smm 281248590Smm /* Verify the end of the archive. */ 282248590Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 283248590Smm 284248590Smm /* Verify archive format. */ 285248590Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 286248590Smm assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 287248590Smm 288248590Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 289248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 290248590Smm 291248590Smm free(buff); 292248590Smm} 293248590Smm 294248590SmmDEFINE_TEST(test_write_format_7zip_empty_files) 295248590Smm{ 296248590Smm /* Test that write an empty file. */ 297248590Smm test_only_empty_file(); 298248590Smm test_only_empty_files(); 299248590Smm} 300