1 /*- 2 * Copyright (c) 2010 Michihiro NAKAJIMA 3 * Copyright (c) 2007-2009 Tim Kientzle 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer 11 * in this position and unchanged. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #include "test.h" 29 __FBSDID("$FreeBSD$"); 30 31 /* 32 * A basic exercise of lzip reading and writing. 33 * 34 */ 35 36 DEFINE_TEST(test_write_filter_lzip) 37 { 38 struct archive_entry *ae; 39 struct archive* a; 40 char *buff, *data; 41 size_t buffsize, datasize; 42 char path[16]; 43 size_t used1, used2; 44 int i, r; 45 46 buffsize = 2000000; 47 assert(NULL != (buff = (char *)malloc(buffsize))); 48 if (buff == NULL) 49 return; 50 51 datasize = 10000; 52 assert(NULL != (data = (char *)malloc(datasize))); 53 if (data == NULL) { 54 free(buff); 55 return; 56 } 57 memset(data, 0, datasize); 58 59 /* 60 * Write a 100 files and read them all back. 61 */ 62 assert((a = archive_write_new()) != NULL); 63 assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 64 r = archive_write_add_filter_lzip(a); 65 if (r == ARCHIVE_FATAL) { 66 skipping("lzip writing not supported on this platform"); 67 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 68 free(buff); 69 free(data); 70 return; 71 } 72 assertEqualIntA(a, ARCHIVE_OK, 73 archive_write_set_bytes_per_block(a, 10)); 74 assertEqualInt(ARCHIVE_FILTER_LZIP, archive_filter_code(a, 0)); 75 assertEqualString("lzip", archive_filter_name(a, 0)); 76 assertEqualIntA(a, ARCHIVE_OK, 77 archive_write_open_memory(a, buff, buffsize, &used1)); 78 assertEqualInt(ARCHIVE_FILTER_LZIP, archive_filter_code(a, 0)); 79 assertEqualString("lzip", archive_filter_name(a, 0)); 80 assert((ae = archive_entry_new()) != NULL); 81 archive_entry_set_filetype(ae, AE_IFREG); 82 archive_entry_set_size(ae, datasize); 83 for (i = 0; i < 100; i++) { 84 snprintf(path, sizeof(path), "file%03d", i); 85 archive_entry_copy_pathname(ae, path); 86 assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 87 assertA(datasize 88 == (size_t)archive_write_data(a, data, datasize)); 89 } 90 archive_entry_free(ae); 91 assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 92 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 93 94 assert((a = archive_read_new()) != NULL); 95 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 96 r = archive_read_support_filter_lzip(a); 97 if (r == ARCHIVE_WARN) { 98 skipping("Can't verify lzip writing by reading back;" 99 " lzip reading not fully supported on this platform"); 100 } else { 101 assertEqualIntA(a, ARCHIVE_OK, 102 archive_read_support_filter_all(a)); 103 assertEqualIntA(a, ARCHIVE_OK, 104 archive_read_open_memory(a, buff, used1)); 105 for (i = 0; i < 100; i++) { 106 snprintf(path, sizeof(path), "file%03d", i); 107 if (!assertEqualInt(ARCHIVE_OK, 108 archive_read_next_header(a, &ae))) 109 break; 110 assertEqualString(path, archive_entry_pathname(ae)); 111 assertEqualInt((int)datasize, archive_entry_size(ae)); 112 } 113 assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 114 } 115 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 116 117 /* 118 * Repeat the cycle again, this time setting some compression 119 * options. 120 */ 121 assert((a = archive_write_new()) != NULL); 122 assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 123 assertEqualIntA(a, ARCHIVE_OK, 124 archive_write_set_bytes_per_block(a, 10)); 125 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a)); 126 assertEqualIntA(a, ARCHIVE_FAILED, 127 archive_write_set_filter_option(a, NULL, "nonexistent-option", "0")); 128 assertEqualIntA(a, ARCHIVE_FAILED, 129 archive_write_set_filter_option(a, NULL, "compression-level", "abc")); 130 assertEqualIntA(a, ARCHIVE_FAILED, 131 archive_write_set_filter_option(a, NULL, "compression-level", "99")); 132 assertEqualIntA(a, ARCHIVE_OK, 133 archive_write_set_filter_option(a, NULL, "compression-level", "9")); 134 assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); 135 for (i = 0; i < 100; i++) { 136 snprintf(path, sizeof(path), "file%03d", i); 137 assert((ae = archive_entry_new()) != NULL); 138 archive_entry_copy_pathname(ae, path); 139 archive_entry_set_size(ae, datasize); 140 archive_entry_set_filetype(ae, AE_IFREG); 141 assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 142 assertA(datasize == (size_t)archive_write_data(a, data, datasize)); 143 archive_entry_free(ae); 144 } 145 assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 146 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 147 148 149 assert((a = archive_read_new()) != NULL); 150 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 151 r = archive_read_support_filter_lzip(a); 152 if (r == ARCHIVE_WARN) { 153 skipping("lzip reading not fully supported on this platform"); 154 } else { 155 assertEqualIntA(a, ARCHIVE_OK, 156 archive_read_support_filter_all(a)); 157 assertEqualIntA(a, ARCHIVE_OK, 158 archive_read_open_memory(a, buff, used2)); 159 for (i = 0; i < 100; i++) { 160 snprintf(path, sizeof(path), "file%03d", i); 161 failure("Trying to read %s", path); 162 if (!assertEqualIntA(a, ARCHIVE_OK, 163 archive_read_next_header(a, &ae))) 164 break; 165 assertEqualString(path, archive_entry_pathname(ae)); 166 assertEqualInt((int)datasize, archive_entry_size(ae)); 167 } 168 assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 169 } 170 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 171 172 /* 173 * Repeat again, with much lower compression. 174 */ 175 assert((a = archive_write_new()) != NULL); 176 assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 177 assertEqualIntA(a, ARCHIVE_OK, 178 archive_write_set_bytes_per_block(a, 10)); 179 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a)); 180 assertEqualIntA(a, ARCHIVE_OK, 181 archive_write_set_filter_option(a, NULL, "compression-level", "0")); 182 assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); 183 for (i = 0; i < 100; i++) { 184 snprintf(path, sizeof(path), "file%03d", i); 185 assert((ae = archive_entry_new()) != NULL); 186 archive_entry_copy_pathname(ae, path); 187 archive_entry_set_size(ae, datasize); 188 archive_entry_set_filetype(ae, AE_IFREG); 189 assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); 190 failure("Writing file %s", path); 191 assertEqualIntA(a, datasize, 192 (size_t)archive_write_data(a, data, datasize)); 193 archive_entry_free(ae); 194 } 195 assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 196 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 197 198 /* Level 0 really does result in larger data. */ 199 failure("Compression-level=0 wrote %d bytes; default wrote %d bytes", 200 (int)used2, (int)used1); 201 assert(used2 > used1); 202 203 assert((a = archive_read_new()) != NULL); 204 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 205 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 206 r = archive_read_support_filter_lzip(a); 207 if (r == ARCHIVE_WARN) { 208 skipping("lzip reading not fully supported on this platform"); 209 } else { 210 assertEqualIntA(a, ARCHIVE_OK, 211 archive_read_open_memory(a, buff, used2)); 212 for (i = 0; i < 100; i++) { 213 snprintf(path, sizeof(path), "file%03d", i); 214 if (!assertEqualInt(ARCHIVE_OK, 215 archive_read_next_header(a, &ae))) 216 break; 217 assertEqualString(path, archive_entry_pathname(ae)); 218 assertEqualInt((int)datasize, archive_entry_size(ae)); 219 } 220 assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 221 } 222 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 223 224 /* 225 * Test various premature shutdown scenarios to make sure we 226 * don't crash or leak memory. 227 */ 228 assert((a = archive_write_new()) != NULL); 229 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a)); 230 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 231 232 assert((a = archive_write_new()) != NULL); 233 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a)); 234 assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 235 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 236 237 assert((a = archive_write_new()) != NULL); 238 assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 239 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a)); 240 assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 241 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 242 243 assert((a = archive_write_new()) != NULL); 244 assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); 245 assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a)); 246 assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); 247 assertEqualInt(ARCHIVE_OK, archive_write_close(a)); 248 assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 249 250 /* 251 * Clean up. 252 */ 253 free(data); 254 free(buff); 255 } 256