1 /*- 2 * Copyright (c) 2012 Michihiro NAKAJIMA 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer 10 * in this position and unchanged. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #include "test.h" 28 29 /* 30 * A basic exercise of uuencode reading and writing. 31 */ 32 33 DEFINE_TEST(test_write_filter_uuencode) 34 { 35 struct archive_entry *ae; 36 struct archive* a; 37 char *buff, *data; 38 size_t buffsize, datasize; 39 char path[16]; 40 size_t used1, used2; 41 int i; 42 43 buffsize = 2000000; 44 assert(NULL != (buff = (char *)malloc(buffsize))); 45 46 datasize = 10000; 47 assert(NULL != (data = (char *)malloc(datasize))); 48 memset(data, 0, datasize); 49 50 /* 51 * Write a 100 files and read them all back. 52 */ 53 assert((a = archive_write_new()) != NULL); 54 assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 55 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 56 assertEqualIntA(a, ARCHIVE_OK, 57 archive_write_set_bytes_per_block(a, 10)); 58 assertEqualInt(ARCHIVE_FILTER_UU, archive_filter_code(a, 0)); 59 assertEqualString("uuencode", archive_filter_name(a, 0)); 60 assertEqualIntA(a, ARCHIVE_OK, 61 archive_write_open_memory(a, buff, buffsize, &used1)); 62 for (i = 0; i < 99; i++) { 63 assert((ae = archive_entry_new()) != NULL); 64 archive_entry_set_filetype(ae, AE_IFREG); 65 archive_entry_set_size(ae, datasize); 66 snprintf(path, sizeof(path), "file%03d", i); 67 archive_entry_copy_pathname(ae, path); 68 assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 69 assertA(datasize 70 == (size_t)archive_write_data(a, data, datasize)); 71 archive_entry_free(ae); 72 } 73 assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 74 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 75 76 assert((a = archive_read_new()) != NULL); 77 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 78 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 79 assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); 80 for (i = 0; i < 99; i++) { 81 snprintf(path, sizeof(path), "file%03d", i); 82 if (!assertEqualIntA(a, 0, archive_read_next_header(a, &ae))) 83 break; 84 assertEqualString(path, archive_entry_pathname(ae)); 85 assertEqualInt((int)datasize, archive_entry_size(ae)); 86 } 87 assertEqualInt(ARCHIVE_FILTER_UU, archive_filter_code(a, 0)); 88 assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 89 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 90 91 /* 92 * Repeat the cycle again, this time setting name and mode 93 * options. 94 */ 95 assert((a = archive_write_new()) != NULL); 96 assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 97 assertEqualIntA(a, ARCHIVE_OK, 98 archive_write_set_bytes_per_block(a, 10)); 99 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 100 assertEqualIntA(a, ARCHIVE_FAILED, 101 archive_write_set_filter_option(a, NULL, "nonexistent-option", "0")); 102 assertEqualIntA(a, ARCHIVE_FAILED, 103 archive_write_set_filter_option(a, NULL, "compression-level", "abc")); 104 assertEqualIntA(a, ARCHIVE_FAILED, 105 archive_write_set_filter_option(a, NULL, "compression-level", "99")); 106 assertEqualIntA(a, ARCHIVE_OK, 107 archive_write_set_filter_option(a, NULL, "name", "test.tar")); 108 assertEqualIntA(a, ARCHIVE_OK, 109 archive_write_set_filter_option(a, NULL, "mode", "0640")); 110 assertEqualIntA(a, ARCHIVE_OK, 111 archive_write_open_memory(a, buff, buffsize, &used2)); 112 for (i = 0; i < 99; i++) { 113 snprintf(path, sizeof(path), "file%03d", i); 114 assert((ae = archive_entry_new()) != NULL); 115 archive_entry_copy_pathname(ae, path); 116 archive_entry_set_size(ae, datasize); 117 archive_entry_set_filetype(ae, AE_IFREG); 118 assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 119 assertA(datasize == (size_t)archive_write_data(a, data, datasize)); 120 archive_entry_free(ae); 121 } 122 assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 123 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 124 125 assert((a = archive_read_new()) != NULL); 126 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 127 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 128 assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); 129 for (i = 0; i < 99; i++) { 130 snprintf(path, sizeof(path), "file%03d", i); 131 if (!assertEqualInt(0, archive_read_next_header(a, &ae))) 132 break; 133 assertEqualString(path, archive_entry_pathname(ae)); 134 assertEqualInt((int)datasize, archive_entry_size(ae)); 135 } 136 assertEqualInt(ARCHIVE_FILTER_UU, archive_filter_code(a, 0)); 137 assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 138 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 139 140 /* 141 * Test various premature shutdown scenarios to make sure we 142 * don't crash or leak memory. 143 */ 144 assert((a = archive_write_new()) != NULL); 145 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 146 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 147 148 assert((a = archive_write_new()) != NULL); 149 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 150 assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 151 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 152 153 assert((a = archive_write_new()) != NULL); 154 assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 155 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 156 assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 157 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 158 159 assert((a = archive_write_new()) != NULL); 160 assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 161 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_uuencode(a)); 162 assertEqualIntA(a, ARCHIVE_OK, 163 archive_write_open_memory(a, buff, buffsize, &used2)); 164 assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 165 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 166 167 /* 168 * Clean up. 169 */ 170 free(data); 171 free(buff); 172 } 173