test_read_format_7zip.c revision 248616
1/*- 2 * Copyright (c) 2011 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 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25#include "test.h" 26__FBSDID("$FreeBSD"); 27 28/* 29 * Extract a non-encoded file. 30 * The header of the 7z archive files is not encoded. 31 */ 32static void 33test_copy() 34{ 35 const char *refname = "test_read_format_7zip_copy.7z"; 36 struct archive_entry *ae; 37 struct archive *a; 38 char buff[128]; 39 40 extract_reference_file(refname); 41 assert((a = archive_read_new()) != NULL); 42 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 43 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 44 assertEqualIntA(a, ARCHIVE_OK, 45 archive_read_open_filename(a, refname, 10240)); 46 47 /* Verify regular file1. */ 48 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 49 assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae)); 50 assertEqualString("file1", archive_entry_pathname(ae)); 51 assertEqualInt(86401, archive_entry_mtime(ae)); 52 assertEqualInt(60, archive_entry_size(ae)); 53 assertEqualInt(60, archive_read_data(a, buff, sizeof(buff))); 54 assertEqualMem(buff, " ", 4); 55 56 assertEqualInt(1, archive_file_count(a)); 57 58 /* End of archive. */ 59 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 60 61 /* Verify archive format. */ 62 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 63 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 64 65 /* Close the archive. */ 66 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 67 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 68} 69 70/* 71 * An archive file has no entry. 72 */ 73static void 74test_empty_archive() 75{ 76 const char *refname = "test_read_format_7zip_empty_archive.7z"; 77 struct archive_entry *ae; 78 struct archive *a; 79 80 extract_reference_file(refname); 81 assert((a = archive_read_new()) != NULL); 82 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 83 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 84 assertEqualIntA(a, ARCHIVE_OK, 85 archive_read_open_filename(a, refname, 10240)); 86 87 /* End of archive. */ 88 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 89 90 assertEqualInt(0, archive_file_count(a)); 91 92 /* Verify archive format. */ 93 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 94 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 95 96 /* Close the archive. */ 97 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 98 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 99} 100 101/* 102 * An archive file has one empty file. It means there is no content 103 * in the archive file except for a header. 104 */ 105static void 106test_empty_file() 107{ 108 const char *refname = "test_read_format_7zip_empty_file.7z"; 109 struct archive_entry *ae; 110 struct archive *a; 111 112 extract_reference_file(refname); 113 assert((a = archive_read_new()) != NULL); 114 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 115 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 116 assertEqualIntA(a, ARCHIVE_OK, 117 archive_read_open_filename(a, refname, 10240)); 118 119 /* Verify regular empty. */ 120 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 121 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 122 assertEqualString("empty", archive_entry_pathname(ae)); 123 assertEqualInt(86401, archive_entry_mtime(ae)); 124 assertEqualInt(0, archive_entry_size(ae)); 125 126 assertEqualInt(1, archive_file_count(a)); 127 128 /* End of archive. */ 129 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 130 131 /* Verify archive format. */ 132 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 133 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 134 135 /* Close the archive. */ 136 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 137 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 138} 139 140/* 141 * Extract an encoded file. 142 * The header of the 7z archive files is not encoded. 143 */ 144static void 145test_plain_header(const char *refname) 146{ 147 struct archive_entry *ae; 148 struct archive *a; 149 char buff[128]; 150 151 extract_reference_file(refname); 152 assert((a = archive_read_new()) != NULL); 153 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 154 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 155 assertEqualIntA(a, ARCHIVE_OK, 156 archive_read_open_filename(a, refname, 10240)); 157 158 /* Verify regular file1. */ 159 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 160 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 161 assertEqualString("file1", archive_entry_pathname(ae)); 162 assertEqualInt(1322058763, archive_entry_mtime(ae)); 163 assertEqualInt(2844, archive_entry_size(ae)); 164 assertEqualInt(sizeof(buff), archive_read_data(a, buff, sizeof(buff))); 165 assertEqualMem(buff, "The libarchive distribution ", 28); 166 167 assertEqualInt(1, archive_file_count(a)); 168 169 /* End of archive. */ 170 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 171 172 /* Verify archive format. */ 173 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 174 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 175 176 /* Close the archive. */ 177 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 178 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 179} 180 181/* 182 * Extract multi files. 183 * The header of the 7z archive files is encoded with LZMA. 184 */ 185static void 186test_extract_all_files(const char *refname) 187{ 188 struct archive_entry *ae; 189 struct archive *a; 190 char buff[128]; 191 192 extract_reference_file(refname); 193 assert((a = archive_read_new()) != NULL); 194 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 195 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 196 assertEqualIntA(a, ARCHIVE_OK, 197 archive_read_open_filename(a, refname, 10240)); 198 199 /* Verify regular file1. */ 200 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 201 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 202 assertEqualString("dir1/file1", archive_entry_pathname(ae)); 203 assertEqualInt(86401, archive_entry_mtime(ae)); 204 assertEqualInt(13, archive_entry_size(ae)); 205 assertEqualInt(13, archive_read_data(a, buff, sizeof(buff))); 206 assertEqualMem(buff, "aaaaaaaaaaaa\n", 13); 207 208 /* Verify regular file2. */ 209 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 210 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 211 assertEqualString("file2", archive_entry_pathname(ae)); 212 assertEqualInt(86401, archive_entry_mtime(ae)); 213 assertEqualInt(26, archive_entry_size(ae)); 214 assertEqualInt(26, archive_read_data(a, buff, sizeof(buff))); 215 assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26); 216 217 /* Verify regular file3. */ 218 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 219 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 220 assertEqualString("file3", archive_entry_pathname(ae)); 221 assertEqualInt(86401, archive_entry_mtime(ae)); 222 assertEqualInt(39, archive_entry_size(ae)); 223 assertEqualInt(39, archive_read_data(a, buff, sizeof(buff))); 224 assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39); 225 226 /* Verify regular file4. */ 227 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 228 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 229 assertEqualString("file4", archive_entry_pathname(ae)); 230 assertEqualInt(86401, archive_entry_mtime(ae)); 231 assertEqualInt(52, archive_entry_size(ae)); 232 assertEqualInt(52, archive_read_data(a, buff, sizeof(buff))); 233 assertEqualMem(buff, 234 "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52); 235 236 /* Verify directory dir1. */ 237 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 238 assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); 239 assertEqualString("dir1/", archive_entry_pathname(ae)); 240 assertEqualInt(2764801, archive_entry_mtime(ae)); 241 242 assertEqualInt(5, archive_file_count(a)); 243 244 /* End of archive. */ 245 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 246 247 /* Verify archive format. */ 248 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 249 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 250 251 /* Close the archive. */ 252 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 253 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 254} 255 256/* 257 * Extract last file. 258 * The header of the 7z archive files is encoded with LZMA. 259 */ 260static void 261test_extract_last_file(const char *refname) 262{ 263 struct archive_entry *ae; 264 struct archive *a; 265 char buff[128]; 266 267 extract_reference_file(refname); 268 assert((a = archive_read_new()) != NULL); 269 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 270 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 271 assertEqualIntA(a, ARCHIVE_OK, 272 archive_read_open_filename(a, refname, 10240)); 273 274 /* Verify regular file1. */ 275 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 276 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 277 assertEqualString("dir1/file1", archive_entry_pathname(ae)); 278 assertEqualInt(86401, archive_entry_mtime(ae)); 279 assertEqualInt(13, archive_entry_size(ae)); 280 281 /* Verify regular file2. */ 282 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 283 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 284 assertEqualString("file2", archive_entry_pathname(ae)); 285 assertEqualInt(86401, archive_entry_mtime(ae)); 286 assertEqualInt(26, archive_entry_size(ae)); 287 288 /* Verify regular file3. */ 289 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 290 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 291 assertEqualString("file3", archive_entry_pathname(ae)); 292 assertEqualInt(86401, archive_entry_mtime(ae)); 293 assertEqualInt(39, archive_entry_size(ae)); 294 295 /* Verify regular file4. */ 296 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 297 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 298 assertEqualString("file4", archive_entry_pathname(ae)); 299 assertEqualInt(86401, archive_entry_mtime(ae)); 300 assertEqualInt(52, archive_entry_size(ae)); 301 assertEqualInt(52, archive_read_data(a, buff, sizeof(buff))); 302 assertEqualMem(buff, 303 "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52); 304 305 /* Verify directory dir1. */ 306 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 307 assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); 308 assertEqualString("dir1/", archive_entry_pathname(ae)); 309 assertEqualInt(2764801, archive_entry_mtime(ae)); 310 311 assertEqualInt(5, archive_file_count(a)); 312 313 /* End of archive. */ 314 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 315 316 /* Verify archive format. */ 317 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 318 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 319 320 /* Close the archive. */ 321 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 322 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 323} 324 325/* 326 * Extract a mixed archive file which has both LZMA and LZMA2 encoded files. 327 * LZMA: file1, file2, file3, file4 328 * LZMA2: zfile1, zfile2, zfile3, zfile4 329 */ 330static void 331test_extract_all_files2(const char *refname) 332{ 333 struct archive_entry *ae; 334 struct archive *a; 335 char buff[128]; 336 337 extract_reference_file(refname); 338 assert((a = archive_read_new()) != NULL); 339 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 340 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 341 assertEqualIntA(a, ARCHIVE_OK, 342 archive_read_open_filename(a, refname, 10240)); 343 344 /* Verify regular file1. */ 345 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 346 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 347 assertEqualString("dir1/file1", archive_entry_pathname(ae)); 348 assertEqualInt(86401, archive_entry_mtime(ae)); 349 assertEqualInt(13, archive_entry_size(ae)); 350 assertEqualInt(13, archive_read_data(a, buff, sizeof(buff))); 351 assertEqualMem(buff, "aaaaaaaaaaaa\n", 13); 352 353 /* Verify regular file2. */ 354 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 355 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 356 assertEqualString("file2", archive_entry_pathname(ae)); 357 assertEqualInt(86401, archive_entry_mtime(ae)); 358 assertEqualInt(26, archive_entry_size(ae)); 359 assertEqualInt(26, archive_read_data(a, buff, sizeof(buff))); 360 assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26); 361 362 /* Verify regular file3. */ 363 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 364 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 365 assertEqualString("file3", archive_entry_pathname(ae)); 366 assertEqualInt(86401, archive_entry_mtime(ae)); 367 assertEqualInt(39, archive_entry_size(ae)); 368 assertEqualInt(39, archive_read_data(a, buff, sizeof(buff))); 369 assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39); 370 371 /* Verify regular file4. */ 372 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 373 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 374 assertEqualString("file4", archive_entry_pathname(ae)); 375 assertEqualInt(86401, archive_entry_mtime(ae)); 376 assertEqualInt(52, archive_entry_size(ae)); 377 assertEqualInt(52, archive_read_data(a, buff, sizeof(buff))); 378 assertEqualMem(buff, 379 "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52); 380 381 /* Verify regular zfile1. */ 382 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 383 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 384 assertEqualString("dir1/zfile1", archive_entry_pathname(ae)); 385 assertEqualInt(5184001, archive_entry_mtime(ae)); 386 assertEqualInt(13, archive_entry_size(ae)); 387 assertEqualInt(13, archive_read_data(a, buff, sizeof(buff))); 388 assertEqualMem(buff, "aaaaaaaaaaaa\n", 13); 389 390 /* Verify regular zfile2. */ 391 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 392 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 393 assertEqualString("zfile2", archive_entry_pathname(ae)); 394 assertEqualInt(5184001, archive_entry_mtime(ae)); 395 assertEqualInt(26, archive_entry_size(ae)); 396 assertEqualInt(26, archive_read_data(a, buff, sizeof(buff))); 397 assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26); 398 399 /* Verify regular zfile3. */ 400 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 401 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 402 assertEqualString("zfile3", archive_entry_pathname(ae)); 403 assertEqualInt(5184001, archive_entry_mtime(ae)); 404 assertEqualInt(39, archive_entry_size(ae)); 405 assertEqualInt(39, archive_read_data(a, buff, sizeof(buff))); 406 assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39); 407 408 /* Verify regular zfile4. */ 409 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 410 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 411 assertEqualString("zfile4", archive_entry_pathname(ae)); 412 assertEqualInt(5184001, archive_entry_mtime(ae)); 413 assertEqualInt(52, archive_entry_size(ae)); 414 assertEqualInt(52, archive_read_data(a, buff, sizeof(buff))); 415 assertEqualMem(buff, 416 "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52); 417 418 /* Verify directory dir1. */ 419 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 420 assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); 421 assertEqualString("dir1/", archive_entry_pathname(ae)); 422 assertEqualInt(2764801, archive_entry_mtime(ae)); 423 424 assertEqualInt(9, archive_file_count(a)); 425 426 /* End of archive. */ 427 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 428 429 /* Verify archive format. */ 430 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 431 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 432 433 /* Close the archive. */ 434 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 435 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 436} 437 438/* 439 * Extract a file compressed with DELTA + LZMA[12]. 440 */ 441static void 442test_delta_lzma(const char *refname) 443{ 444 struct archive_entry *ae; 445 struct archive *a; 446 size_t remaining; 447 ssize_t bytes; 448 char buff[1024]; 449 450 extract_reference_file(refname); 451 assert((a = archive_read_new()) != NULL); 452 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 453 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 454 assertEqualIntA(a, ARCHIVE_OK, 455 archive_read_open_filename(a, refname, 10240)); 456 457 /* Verify regular file1. */ 458 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 459 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 460 assertEqualString("file1", archive_entry_pathname(ae)); 461 assertEqualInt(172802, archive_entry_mtime(ae)); 462 assertEqualInt(27627, archive_entry_size(ae)); 463 remaining = (size_t)archive_entry_size(ae); 464 while (remaining) { 465 if (remaining < sizeof(buff)) 466 assertEqualInt(remaining, 467 bytes = archive_read_data(a, buff, sizeof(buff))); 468 else 469 assertEqualInt(sizeof(buff), 470 bytes = archive_read_data(a, buff, sizeof(buff))); 471 if (bytes > 0) 472 remaining -= bytes; 473 else 474 break; 475 } 476 assertEqualInt(0, remaining); 477 478 assertEqualInt(1, archive_file_count(a)); 479 480 /* End of archive. */ 481 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 482 483 /* Verify archive format. */ 484 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 485 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 486 487 /* Close the archive. */ 488 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 489 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 490} 491 492/* 493 * Extract a file compressed with BCJ + LZMA2. 494 */ 495static void 496test_bcj(const char *refname) 497{ 498 struct archive_entry *ae; 499 struct archive *a; 500 size_t remaining; 501 ssize_t bytes; 502 char buff[1024]; 503 504 extract_reference_file(refname); 505 assert((a = archive_read_new()) != NULL); 506 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 507 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 508 assertEqualIntA(a, ARCHIVE_OK, 509 archive_read_open_filename(a, refname, 10240)); 510 511 /* Verify regular x86exe. */ 512 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 513 assertEqualInt((AE_IFREG | 0444), archive_entry_mode(ae) & ~0111); 514 assertEqualString("x86exe", archive_entry_pathname(ae)); 515 assertEqualInt(172802, archive_entry_mtime(ae)); 516 assertEqualInt(27328, archive_entry_size(ae)); 517 remaining = (size_t)archive_entry_size(ae); 518 while (remaining) { 519 if (remaining < sizeof(buff)) 520 assertEqualInt(remaining, 521 bytes = archive_read_data(a, buff, sizeof(buff))); 522 else 523 assertEqualInt(sizeof(buff), 524 bytes = archive_read_data(a, buff, sizeof(buff))); 525 if (bytes > 0) 526 remaining -= bytes; 527 else 528 break; 529 } 530 assertEqualInt(0, remaining); 531 532 assertEqualInt(1, archive_file_count(a)); 533 534 /* End of archive. */ 535 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 536 537 /* Verify archive format. */ 538 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 539 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 540 541 /* Close the archive. */ 542 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 543 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 544} 545 546/* 547 * Extract a file compressed with PPMd. 548 */ 549static void 550test_ppmd() 551{ 552 const char *refname = "test_read_format_7zip_ppmd.7z"; 553 struct archive_entry *ae; 554 struct archive *a; 555 size_t remaining; 556 ssize_t bytes; 557 char buff[1024]; 558 559 extract_reference_file(refname); 560 assert((a = archive_read_new()) != NULL); 561 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 562 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 563 assertEqualIntA(a, ARCHIVE_OK, 564 archive_read_open_filename(a, refname, 10240)); 565 566 /* Verify regular file1. */ 567 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 568 assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae)); 569 assertEqualString("ppmd_test.txt", archive_entry_pathname(ae)); 570 assertEqualInt(1322464589, archive_entry_mtime(ae)); 571 assertEqualInt(102400, archive_entry_size(ae)); 572 remaining = (size_t)archive_entry_size(ae); 573 while (remaining) { 574 if (remaining < sizeof(buff)) 575 assertEqualInt(remaining, 576 bytes = archive_read_data(a, buff, sizeof(buff))); 577 else 578 assertEqualInt(sizeof(buff), 579 bytes = archive_read_data(a, buff, sizeof(buff))); 580 if (bytes > 0) 581 remaining -= bytes; 582 else 583 break; 584 } 585 assertEqualInt(0, remaining); 586 587 assertEqualInt(1, archive_file_count(a)); 588 589 /* End of archive. */ 590 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 591 592 /* Verify archive format. */ 593 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 594 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 595 596 /* Close the archive. */ 597 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 598 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 599} 600 601static void 602test_symname() 603{ 604 const char *refname = "test_read_format_7zip_symbolic_name.7z"; 605 struct archive_entry *ae; 606 struct archive *a; 607 char buff[128]; 608 609 extract_reference_file(refname); 610 assert((a = archive_read_new()) != NULL); 611 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 612 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 613 assertEqualIntA(a, ARCHIVE_OK, 614 archive_read_open_filename(a, refname, 10240)); 615 616 /* Verify regular file1. */ 617 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 618 assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); 619 assertEqualString("file1", archive_entry_pathname(ae)); 620 assertEqualInt(86401, archive_entry_mtime(ae)); 621 assertEqualInt(32, archive_entry_size(ae)); 622 assertEqualInt(32, archive_read_data(a, buff, sizeof(buff))); 623 assertEqualMem(buff, "hellohellohello\nhellohellohello\n", 32); 624 625 /* Verify symbolic-linke symlinkfile. */ 626 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 627 assertEqualInt((AE_IFLNK | 0755), archive_entry_mode(ae)); 628 assertEqualString("symlinkfile", archive_entry_pathname(ae)); 629 assertEqualString("file1", archive_entry_symlink(ae)); 630 assertEqualInt(86401, archive_entry_mtime(ae)); 631 632 assertEqualInt(2, archive_file_count(a)); 633 634 /* End of archive. */ 635 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 636 637 /* Verify archive format. */ 638 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 639 assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); 640 641 /* Close the archive. */ 642 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 643 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 644} 645 646 647DEFINE_TEST(test_read_format_7zip) 648{ 649 struct archive *a; 650 651 assert((a = archive_read_new()) != NULL); 652 653 /* Extracting with liblzma */ 654 if (ARCHIVE_OK != archive_read_support_filter_xz(a)) { 655 skipping("7zip:lzma decoding is not supported on this platform"); 656 } else { 657 test_symname(); 658 test_extract_all_files("test_read_format_7zip_copy_2.7z"); 659 test_extract_last_file("test_read_format_7zip_copy_2.7z"); 660 test_extract_all_files2("test_read_format_7zip_lzma1_lzma2.7z"); 661 test_bcj("test_read_format_7zip_bcj2_copy_lzma.7z"); 662 } 663 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 664} 665 666DEFINE_TEST(test_read_format_7zip_bzip2) 667{ 668 struct archive *a; 669 670 assert((a = archive_read_new()) != NULL); 671 672 /* Extracting with libbzip2 */ 673 if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { 674 skipping("7zip:bzip2 decoding is not supported on this platform"); 675 } else { 676 test_plain_header("test_read_format_7zip_bzip2.7z"); 677 test_bcj("test_read_format_7zip_bcj_bzip2.7z"); 678 test_bcj("test_read_format_7zip_bcj2_bzip2.7z"); 679 } 680 681 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 682} 683 684DEFINE_TEST(test_read_format_7zip_copy) 685{ 686 test_copy(); 687 test_bcj("test_read_format_7zip_bcj_copy.7z"); 688 test_bcj("test_read_format_7zip_bcj2_copy_1.7z"); 689 test_bcj("test_read_format_7zip_bcj2_copy_2.7z"); 690} 691 692DEFINE_TEST(test_read_format_7zip_deflate) 693{ 694 struct archive *a; 695 696 assert((a = archive_read_new()) != NULL); 697 698 /* Extracting with libz */ 699 if (ARCHIVE_OK != archive_read_support_filter_gzip(a)) { 700 skipping( 701 "7zip:deflate decoding is not supported on this platform"); 702 } else { 703 test_plain_header("test_read_format_7zip_deflate.7z"); 704 test_bcj("test_read_format_7zip_bcj_deflate.7z"); 705 test_bcj("test_read_format_7zip_bcj2_deflate.7z"); 706 } 707 708 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 709} 710 711DEFINE_TEST(test_read_format_7zip_empty) 712{ 713 test_empty_archive(); 714 test_empty_file(); 715} 716 717DEFINE_TEST(test_read_format_7zip_lzma1) 718{ 719 struct archive *a; 720 721 assert((a = archive_read_new()) != NULL); 722 723 /* Extracting with liblzma */ 724 if (ARCHIVE_OK != archive_read_support_filter_xz(a)) { 725 skipping("7zip:lzma decoding is not supported on this platform"); 726 } else { 727 test_plain_header("test_read_format_7zip_lzma1.7z"); 728 test_extract_all_files("test_read_format_7zip_lzma1_2.7z"); 729 test_extract_last_file("test_read_format_7zip_lzma1_2.7z"); 730 test_bcj("test_read_format_7zip_bcj_lzma1.7z"); 731 test_bcj("test_read_format_7zip_bcj2_lzma1_1.7z"); 732 test_bcj("test_read_format_7zip_bcj2_lzma1_2.7z"); 733 test_delta_lzma("test_read_format_7zip_delta_lzma1.7z"); 734 } 735 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 736} 737 738DEFINE_TEST(test_read_format_7zip_lzma2) 739{ 740 struct archive *a; 741 742 assert((a = archive_read_new()) != NULL); 743 744 /* Extracting with liblzma */ 745 if (ARCHIVE_OK != archive_read_support_filter_xz(a)) { 746 skipping("7zip:lzma decoding is not supported on this platform"); 747 } else { 748 test_plain_header("test_read_format_7zip_lzma2.7z"); 749 test_bcj("test_read_format_7zip_bcj_lzma2.7z"); 750 test_bcj("test_read_format_7zip_bcj2_lzma2_1.7z"); 751 test_bcj("test_read_format_7zip_bcj2_lzma2_2.7z"); 752 test_delta_lzma("test_read_format_7zip_delta_lzma2.7z"); 753 } 754 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 755} 756 757DEFINE_TEST(test_read_format_7zip_ppmd) 758{ 759 test_ppmd(); 760} 761