test_read_format_zip_filename.c revision 232153
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#include <locale.h> 29 30static void 31test_read_format_zip_filename_CP932_eucJP(const char *refname) 32{ 33 struct archive *a; 34 struct archive_entry *ae; 35 36 /* 37 * Read CP932 filename in ja_JP.eucJP with "hdrcharset=CP932" option. 38 */ 39 if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) { 40 skipping("ja_JP.eucJP locale not available on this system."); 41 return; 42 } 43 44 assert((a = archive_read_new()) != NULL); 45 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 46 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 47 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) { 48 skipping("This system cannot convert character-set" 49 " from CP932 to eucJP."); 50 goto cleanup; 51 } 52 assertEqualIntA(a, ARCHIVE_OK, 53 archive_read_open_filename(a, refname, 10240)); 54 55 /* Verify regular file. */ 56 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 57 assertEqualString( 58 "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb0\xec\xcd\xf7\xc9\xbd\x2e\x74\x78\x74", 59 archive_entry_pathname(ae)); 60 assertEqualInt(5, archive_entry_size(ae)); 61 62 /* Verify regular file. */ 63 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 64 assertEqualString( 65 "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb4\xc1\xbb\xfa\x2e\x74\x78\x74", 66 archive_entry_pathname(ae)); 67 assertEqualInt(5, archive_entry_size(ae)); 68 69 70 /* End of archive. */ 71 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 72 73 /* Verify archive format. */ 74 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 75 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 76 77 /* Close the archive. */ 78 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 79cleanup: 80 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 81} 82 83static void 84test_read_format_zip_filename_CP932_UTF8(const char *refname) 85{ 86 struct archive *a; 87 struct archive_entry *ae; 88 89 /* 90 * Read CP932 filename in en_US.UTF-8 with "hdrcharset=CP932" option. 91 */ 92 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 93 skipping("en_US.UTF-8 locale not available on this system."); 94 return; 95 } 96 97 assert((a = archive_read_new()) != NULL); 98 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 99 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 100 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) { 101 skipping("This system cannot convert character-set" 102 " from CP932 to UTF-8."); 103 goto cleanup; 104 } 105 assertEqualIntA(a, ARCHIVE_OK, 106 archive_read_open_filename(a, refname, 10240)); 107 108 /* Verify regular file. */ 109 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 110#if defined(__APPLE__) 111 /* Compare NFD string. */ 112 assertEqualUTF8String( 113 "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f" 114 "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74", 115 archive_entry_pathname(ae)); 116#else 117 /* Compare NFC string. */ 118 assertEqualUTF8String( 119 "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f" 120 "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74", 121 archive_entry_pathname(ae)); 122#endif 123 assertEqualInt(5, archive_entry_size(ae)); 124 125 /* Verify regular file. */ 126 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 127#if defined(__APPLE__) 128 /* Compare NFD string. */ 129 assertEqualUTF8String( 130 "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f" 131 "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74", 132 archive_entry_pathname(ae)); 133#else 134 /* Compare NFC string. */ 135 assertEqualUTF8String( 136 "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f" 137 "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74", 138 archive_entry_pathname(ae)); 139#endif 140 assertEqualInt(5, archive_entry_size(ae)); 141 142 143 /* End of archive. */ 144 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 145 146 /* Verify archive format. */ 147 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 148 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 149 150 /* Close the archive. */ 151 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 152cleanup: 153 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 154} 155 156static void 157test_read_format_zip_filename_UTF8_eucJP(const char *refname) 158{ 159 struct archive *a; 160 struct archive_entry *ae; 161 162 /* 163 * Read UTF-8 filename in ja_JP.eucJP without charset option 164 * because the file name in the sample file is UTF-8 and 165 * Bit 11 of its general purpose bit flag is set. 166 */ 167 if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) { 168 skipping("ja_JP.eucJP locale not availablefilename_ on this system."); 169 return; 170 } 171 assert((a = archive_read_new()) != NULL); 172 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 173 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 174 skipping("This system cannot convert character-set" 175 " from UTF-8 to eucJP."); 176 goto cleanup; 177 } 178 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 179 180 assert((a = archive_read_new()) != NULL); 181 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 182 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 183 assertEqualIntA(a, ARCHIVE_OK, 184 archive_read_open_filename(a, refname, 10240)); 185 186 /* Verify directory file. */ 187 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 188 assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 189 assertEqualString("\xc9\xbd\xa4\xc0\xa4\xe8\x2f", 190 archive_entry_pathname(ae)); 191 assertEqualInt(0, archive_entry_size(ae)); 192 193 /* Verify regular file. */ 194 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 195 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 196 assertEqualString( 197 "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb0\xec\xcd\xf7\xc9\xbd\x2e\x74\x78\x74", 198 archive_entry_pathname(ae)); 199 assertEqualInt(5, archive_entry_size(ae)); 200 201 /* Verify regular file. */ 202 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 203 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 204 assertEqualString( 205 "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb4\xc1\xbb\xfa\x2e\x74\x78\x74", 206 archive_entry_pathname(ae)); 207 assertEqualInt(5, archive_entry_size(ae)); 208 209 210 /* End of archive. */ 211 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 212 213 /* Verify archive format. */ 214 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 215 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 216 217 /* Close the archive. */ 218 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 219cleanup: 220 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 221} 222 223static void 224test_read_format_zip_filename_UTF8_UTF8(const char *refname) 225{ 226 struct archive *a; 227 struct archive_entry *ae; 228 229 /* 230 * Read UTF-8 filename in en_US.UTF-8 without charset option 231 * because the file name in the sample file is UTF-8 and 232 * Bit 11 of its general purpose bit flag is set. 233 */ 234 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 235 skipping("en_US.UTF-8 locale not available on this system."); 236 return; 237 } 238 239 assert((a = archive_read_new()) != NULL); 240 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 241 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 242 assertEqualIntA(a, ARCHIVE_OK, 243 archive_read_open_filename(a, refname, 10240)); 244 245 /* Verify directory file. */ 246 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 247 assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 248#if defined(__APPLE__) 249 /* Compare NFD string. */ 250 assertEqualUTF8String( 251 "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f", 252 archive_entry_pathname(ae)); 253#else 254 /* Compare NFC string. */ 255 assertEqualUTF8String( 256 "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f", 257 archive_entry_pathname(ae)); 258#endif 259 assertEqualInt(0, archive_entry_size(ae)); 260 261 /* Verify regular file. */ 262 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 263 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 264#if defined(__APPLE__) 265 /* Compare NFD string. */ 266 assertEqualUTF8String( 267 "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f" 268 "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74", 269 archive_entry_pathname(ae)); 270#else 271 /* Compare NFC string. */ 272 assertEqualUTF8String( 273 "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f" 274 "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74", 275 archive_entry_pathname(ae)); 276#endif 277 assertEqualInt(5, archive_entry_size(ae)); 278 279 /* Verify regular file. */ 280 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 281 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 282#if defined(__APPLE__) 283 /* Compare NFD string. */ 284 assertEqualUTF8String( 285 "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f" 286 "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74", 287 archive_entry_pathname(ae)); 288#else 289 /* Compare NFC string. */ 290 assertEqualUTF8String( 291 "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f" 292 "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74", 293 archive_entry_pathname(ae)); 294#endif 295 assertEqualInt(5, archive_entry_size(ae)); 296 297 298 /* End of archive. */ 299 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 300 301 /* Verify archive format. */ 302 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 303 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 304 305 /* Close the archive. */ 306 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 307 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 308} 309 310static void 311test_read_format_zip_filename_CP866_KOI8R(const char *refname) 312{ 313 struct archive *a; 314 struct archive_entry *ae; 315 316 /* 317 * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option. 318 */ 319 if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") && 320 NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) { 321 skipping("ru_RU.KOI8-R locale not available on this system."); 322 return; 323 } 324 325 assert((a = archive_read_new()) != NULL); 326 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 327 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 328 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 329 skipping("This system cannot convert character-set" 330 " from CP866 to KOI8-R."); 331 goto cleanup; 332 } 333 assertEqualIntA(a, ARCHIVE_OK, 334 archive_read_open_filename(a, refname, 10240)); 335 336 /* Verify regular file. */ 337 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 338 assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 339 archive_entry_pathname(ae)); 340 assertEqualInt(6, archive_entry_size(ae)); 341 342 /* Verify regular file. */ 343 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 344 assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4", 345 archive_entry_pathname(ae)); 346 assertEqualInt(6, archive_entry_size(ae)); 347 348 349 /* End of archive. */ 350 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 351 352 /* Verify archive format. */ 353 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 354 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 355 356 /* Close the archive. */ 357 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 358cleanup: 359 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 360} 361 362static void 363test_read_format_zip_filename_CP866_UTF8(const char *refname) 364{ 365 struct archive *a; 366 struct archive_entry *ae; 367 368 /* 369 * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option. 370 */ 371 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 372 skipping("en_US.UTF-8 locale not available on this system."); 373 return; 374 } 375 376 assert((a = archive_read_new()) != NULL); 377 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 378 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 379 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 380 skipping("This system cannot convert character-set" 381 " from CP866 to UTF-8."); 382 goto cleanup; 383 } 384 assertEqualIntA(a, ARCHIVE_OK, 385 archive_read_open_filename(a, refname, 10240)); 386 387 /* Verify regular file. */ 388 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 389 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 390 archive_entry_pathname(ae)); 391 assertEqualInt(6, archive_entry_size(ae)); 392 393 /* Verify regular file. */ 394 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 395 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 396 archive_entry_pathname(ae)); 397 assertEqualInt(6, archive_entry_size(ae)); 398 399 400 /* End of archive. */ 401 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 402 403 /* Verify archive format. */ 404 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 405 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 406 407 /* Close the archive. */ 408 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 409cleanup: 410 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 411} 412 413static void 414test_read_format_zip_filename_KOI8R_CP866(const char *refname) 415{ 416 struct archive *a; 417 struct archive_entry *ae; 418 419 /* 420 * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option. 421 */ 422 if (NULL == setlocale(LC_ALL, "Russian_Russia.866") && 423 NULL == setlocale(LC_ALL, "ru_RU.CP866")) { 424 skipping("ru_RU.CP866 locale not available on this system."); 425 return; 426 } 427 428 assert((a = archive_read_new()) != NULL); 429 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 430 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 431 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 432 skipping("This system cannot convert character-set" 433 " from KOI8-R to CP866."); 434 goto cleanup; 435 } 436 assertEqualIntA(a, ARCHIVE_OK, 437 archive_read_open_filename(a, refname, 10240)); 438 439 /* Verify regular file. */ 440 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 441 assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2", 442 archive_entry_pathname(ae)); 443 assertEqualInt(6, archive_entry_size(ae)); 444 445 /* Verify regular file. */ 446 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 447 assertEqualString("\x8f\x90\x88\x82\x85\x92", 448 archive_entry_pathname(ae)); 449 assertEqualInt(6, archive_entry_size(ae)); 450 451 452 /* End of archive. */ 453 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 454 455 /* Verify archive format. */ 456 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 457 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 458 459 /* Close the archive. */ 460 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 461cleanup: 462 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 463} 464 465static void 466test_read_format_zip_filename_KOI8R_UTF8(const char *refname) 467{ 468 struct archive *a; 469 struct archive_entry *ae; 470 471 /* 472 * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option. 473 */ 474 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 475 skipping("en_US.UTF-8 locale not available on this system."); 476 return; 477 } 478 479 assert((a = archive_read_new()) != NULL); 480 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 481 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 482 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 483 skipping("This system cannot convert character-set" 484 " from KOI8-R to UTF-8."); 485 goto cleanup; 486 } 487 assertEqualIntA(a, ARCHIVE_OK, 488 archive_read_open_filename(a, refname, 10240)); 489 490 /* Verify regular file. */ 491 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 492 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 493 archive_entry_pathname(ae)); 494 assertEqualInt(6, archive_entry_size(ae)); 495 496 /* Verify regular file. */ 497 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 498 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 499 archive_entry_pathname(ae)); 500 assertEqualInt(6, archive_entry_size(ae)); 501 502 503 /* End of archive. */ 504 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 505 506 /* Verify archive format. */ 507 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 508 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 509 510 /* Close the archive. */ 511 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 512cleanup: 513 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 514} 515 516static void 517test_read_format_zip_filename_UTF8_KOI8R(const char *refname) 518{ 519 struct archive *a; 520 struct archive_entry *ae; 521 522 /* 523 * Read UTF-8 filename in ru_RU.KOI8-R with "hdrcharset=UTF-8" option. 524 */ 525 if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") && 526 NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) { 527 skipping("ru_RU.KOI8-R locale not available on this system."); 528 return; 529 } 530 531 assert((a = archive_read_new()) != NULL); 532 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 533 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 534 skipping("This system cannot convert character-set" 535 " from UTF-8 to KOI8-R."); 536 goto cleanup; 537 } 538 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 539 540 /* Re-create a read archive object. */ 541 assert((a = archive_read_new()) != NULL); 542 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 543 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 544 assertEqualIntA(a, ARCHIVE_OK, 545 archive_read_open_filename(a, refname, 10240)); 546 547 /* Verify regular file. */ 548 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 549 assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 550 archive_entry_pathname(ae)); 551 assertEqualInt(6, archive_entry_size(ae)); 552 553 /* Verify regular file. */ 554 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 555 assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4", 556 archive_entry_pathname(ae)); 557 assertEqualInt(6, archive_entry_size(ae)); 558 559 560 /* End of archive. */ 561 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 562 563 /* Verify archive format. */ 564 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 565 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 566 567 /* Close the archive. */ 568 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 569cleanup: 570 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 571} 572 573static void 574test_read_format_zip_filename_UTF8_CP866(const char *refname) 575{ 576 struct archive *a; 577 struct archive_entry *ae; 578 579 /* 580 * Read UTF-8 filename in ru_RU.CP866 without charset option 581 * because the file name in the sample file is UTF-8 and 582 * Bit 11 of its general purpose bit flag is set. 583 */ 584 if (NULL == setlocale(LC_ALL, "Russian_Russia.866") && 585 NULL == setlocale(LC_ALL, "ru_RU.CP866")) { 586 skipping("ru_RU.CP866 locale not available on this system."); 587 return; 588 } 589 590 assert((a = archive_read_new()) != NULL); 591 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 592 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 593 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 594 skipping("This system cannot convert character-set" 595 " from UTF-8 to CP866."); 596 goto cleanup; 597 } 598 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 599 600 /* Re-create a read archive object. */ 601 assert((a = archive_read_new()) != NULL); 602 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 603 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 604 assertEqualIntA(a, ARCHIVE_OK, 605 archive_read_open_filename(a, refname, 10240)); 606 607 /* Verify regular file. */ 608 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 609 assertEqualString("\x8f\x90\x88\x82\x85\x92", 610 archive_entry_pathname(ae)); 611 assertEqualInt(6, archive_entry_size(ae)); 612 613 /* Verify regular file. */ 614 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 615 assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2", 616 archive_entry_pathname(ae)); 617 assertEqualInt(6, archive_entry_size(ae)); 618 619 620 /* End of archive. */ 621 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 622 623 /* Verify archive format. */ 624 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 625 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 626 627 /* Close the archive. */ 628 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 629cleanup: 630 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 631} 632 633static void 634test_read_format_zip_filename_UTF8_UTF8_ru(const char *refname) 635{ 636 struct archive *a; 637 struct archive_entry *ae; 638 639 /* 640 * Read UTF-8 filename in en_US.UTF-8 without charset option 641 * because the file name in the sample file is UTF-8 and 642 * Bit 11 of its general purpose bit flag is set. 643 */ 644 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 645 skipping("en_US.UTF-8 locale not available on this system."); 646 return; 647 } 648 649 assert((a = archive_read_new()) != NULL); 650 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 651 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 652 assertEqualIntA(a, ARCHIVE_OK, 653 archive_read_open_filename(a, refname, 10240)); 654 655 /* Verify regular file. */ 656 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 657 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 658 archive_entry_pathname(ae)); 659 assertEqualInt(6, archive_entry_size(ae)); 660 661 /* Verify regular file. */ 662 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 663 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 664 archive_entry_pathname(ae)); 665 assertEqualInt(6, archive_entry_size(ae)); 666 667 668 /* End of archive. */ 669 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 670 671 /* Verify archive format. */ 672 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 673 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 674 675 /* Close the archive. */ 676 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 677 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 678} 679 680static void 681test_read_format_zip_filename_CP932_CP932(const char *refname) 682{ 683 struct archive *a; 684 struct archive_entry *ae; 685 686 /* 687 * Read CP932 filename in CP932/SJIS with "hdrcharset=CP932" option. 688 */ 689 if (NULL == setlocale(LC_ALL, "Japanese_Japan") && 690 NULL == setlocale(LC_ALL, "ja_JP.SJIS")) { 691 skipping("CP932 locale not available on this system."); 692 return; 693 } 694 695 assert((a = archive_read_new()) != NULL); 696 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 697 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 698 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) { 699 skipping("This system cannot convert character-set" 700 " from CP932."); 701 goto cleanup; 702 } 703 assertEqualIntA(a, ARCHIVE_OK, 704 archive_read_open_filename(a, refname, 10240)); 705 706 /* Verify regular file. */ 707 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 708 assertEqualString( 709 "\x95\x5c\x82\xbe\x82\xe6\x2f\x88\xea\x97\x97\x95\x5c.txt", 710 archive_entry_pathname(ae)); 711 assertEqualInt(5, archive_entry_size(ae)); 712 713 /* Verify regular file. */ 714 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 715 assertEqualString( 716 "\x95\x5c\x82\xbe\x82\xe6\x2f\x8a\xbf\x8e\x9a.txt", 717 archive_entry_pathname(ae)); 718 assertEqualInt(5, archive_entry_size(ae)); 719 720 721 /* End of archive. */ 722 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 723 724 /* Verify archive format. */ 725 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 726 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 727 728 /* Close the archive. */ 729 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 730cleanup: 731 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 732} 733 734static void 735test_read_format_zip_filename_UTF8_CP932(const char *refname) 736{ 737 struct archive *a; 738 struct archive_entry *ae; 739 740 /* 741 * Read UTF-8 filename in CP932/SJIS without charset option 742 * because the file name in the sample file is UTF-8 and 743 * Bit 11 of its general purpose bit flag is set. 744 */ 745 if (NULL == setlocale(LC_ALL, "Japanese_Japan") && 746 NULL == setlocale(LC_ALL, "ja_JP.SJIS")) { 747 skipping("CP932 locale not available on this system."); 748 return; 749 } 750 751 assert((a = archive_read_new()) != NULL); 752 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 753 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 754 skipping("This system cannot convert character-set" 755 " from UTF-8 to CP932."); 756 goto cleanup; 757 } 758 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 759 760 /* Re-create a read archive object. */ 761 assert((a = archive_read_new()) != NULL); 762 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 763 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 764 assertEqualIntA(a, ARCHIVE_OK, 765 archive_read_open_filename(a, refname, 10240)); 766 767 /* Verify regular file. */ 768 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 769 assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 770 assertEqualString( 771 "\x95\x5c\x82\xbe\x82\xe6\x2f", 772 archive_entry_pathname(ae)); 773 assertEqualInt(0, archive_entry_size(ae)); 774 775 /* Verify directory file. */ 776 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 777 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 778 assertEqualString( 779 "\x95\x5c\x82\xbe\x82\xe6\x2f\x88\xea\x97\x97\x95\x5c.txt", 780 archive_entry_pathname(ae)); 781 assertEqualInt(5, archive_entry_size(ae)); 782 783 /* Verify regular file. */ 784 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 785 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 786 assertEqualString( 787 "\x95\x5c\x82\xbe\x82\xe6\x2f\x8a\xbf\x8e\x9a.txt", 788 archive_entry_pathname(ae)); 789 assertEqualInt(5, archive_entry_size(ae)); 790 791 /* End of archive. */ 792 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 793 794 /* Verify archive format. */ 795 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 796 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 797 798 /* Close the archive. */ 799 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 800cleanup: 801 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 802} 803 804static void 805test_read_format_zip_filename_CP866_CP1251(const char *refname) 806{ 807 struct archive *a; 808 struct archive_entry *ae; 809 810 /* 811 * Read CP866 filename in CP1251 with "hdrcharset=CP866" option. 812 */ 813 if (NULL == setlocale(LC_ALL, "Russian_Russia") && 814 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 815 skipping("CP1251 locale not available on this system."); 816 return; 817 } 818 819 assert((a = archive_read_new()) != NULL); 820 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 821 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 822 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 823 skipping("This system cannot convert character-set" 824 " from CP866 to CP1251."); 825 goto cleanup; 826 } 827 assertEqualIntA(a, ARCHIVE_OK, 828 archive_read_open_filename(a, refname, 10240)); 829 830 /* Verify regular file. */ 831 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 832 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 833 archive_entry_pathname(ae)); 834 assertEqualInt(6, archive_entry_size(ae)); 835 836 /* Verify regular file. */ 837 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 838 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 839 archive_entry_pathname(ae)); 840 assertEqualInt(6, archive_entry_size(ae)); 841 842 843 /* End of archive. */ 844 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 845 846 /* Verify archive format. */ 847 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 848 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 849 850 /* Close the archive. */ 851 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 852cleanup: 853 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 854} 855 856/* 857 * This test only for Windows platform because other archiver 858 * applications on Windows translate CP1251 filenames into CP866 859 * filenames and store it in the zip file and so we should read 860 * it by default on Windows. 861 */ 862static void 863test_read_format_zip_filename_CP866_CP1251_win(const char *refname) 864{ 865 struct archive *a; 866 struct archive_entry *ae; 867 868 /* 869 * Read CP866 filename in CP1251 without "hdrcharset=CP866" option. 870 */ 871 if (NULL == setlocale(LC_ALL, "Russian_Russia")) { 872 skipping("Russian_Russia locale not available on this system."); 873 return; 874 } 875 876 assert((a = archive_read_new()) != NULL); 877 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 878 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 879 assertEqualIntA(a, ARCHIVE_OK, 880 archive_read_open_filename(a, refname, 10240)); 881 882 /* Verify regular file. */ 883 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 884 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 885 archive_entry_pathname(ae)); 886 assertEqualInt(6, archive_entry_size(ae)); 887 888 /* Verify regular file. */ 889 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 890 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 891 archive_entry_pathname(ae)); 892 assertEqualInt(6, archive_entry_size(ae)); 893 894 895 /* End of archive. */ 896 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 897 898 /* Verify archive format. */ 899 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 900 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 901 902 /* Close the archive. */ 903 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 904 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 905} 906 907static void 908test_read_format_zip_filename_KOI8R_CP1251(const char *refname) 909{ 910 struct archive *a; 911 struct archive_entry *ae; 912 913 /* 914 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option. 915 */ 916 if (NULL == setlocale(LC_ALL, "Russian_Russia") && 917 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 918 skipping("CP1251 locale not available on this system."); 919 return; 920 } 921 922 assert((a = archive_read_new()) != NULL); 923 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 924 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 925 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 926 skipping("This system cannot convert character-set" 927 " from KOI8-R to CP1251."); 928 goto cleanup; 929 } 930 assertEqualIntA(a, ARCHIVE_OK, 931 archive_read_open_filename(a, refname, 10240)); 932 933 /* Verify regular file. */ 934 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 935 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 936 archive_entry_pathname(ae)); 937 assertEqualInt(6, archive_entry_size(ae)); 938 939 /* Verify regular file. */ 940 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 941 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 942 archive_entry_pathname(ae)); 943 assertEqualInt(6, archive_entry_size(ae)); 944 945 946 /* End of archive. */ 947 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 948 949 /* Verify archive format. */ 950 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 951 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 952 953 /* Close the archive. */ 954 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 955cleanup: 956 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 957} 958 959static void 960test_read_format_zip_filename_UTF8_CP1251(const char *refname) 961{ 962 struct archive *a; 963 struct archive_entry *ae; 964 965 /* 966 * Read UTF-8 filename in CP1251 without charset option 967 * because the file name in the sample file is UTF-8 and 968 * Bit 11 of its general purpose bit flag is set. 969 */ 970 if (NULL == setlocale(LC_ALL, "Russian_Russia") && 971 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 972 skipping("CP1251 locale not available on this system."); 973 return; 974 } 975 976 assert((a = archive_read_new()) != NULL); 977 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 978 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 979 skipping("This system cannot convert character-set" 980 " from UTF-8 to CP1251."); 981 goto cleanup; 982 } 983 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 984 985 /* Re-create a read archive object. */ 986 assert((a = archive_read_new()) != NULL); 987 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 988 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 989 assertEqualIntA(a, ARCHIVE_OK, 990 archive_read_open_filename(a, refname, 10240)); 991 992 /* Verify regular file. */ 993 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 994 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 995 archive_entry_pathname(ae)); 996 assertEqualInt(6, archive_entry_size(ae)); 997 998 /* Verify regular file. */ 999 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1000 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 1001 archive_entry_pathname(ae)); 1002 assertEqualInt(6, archive_entry_size(ae)); 1003 1004 1005 /* End of archive. */ 1006 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 1007 1008 /* Verify archive format. */ 1009 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 1010 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 1011 1012 /* Close the archive. */ 1013 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 1014cleanup: 1015 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 1016} 1017 1018/* 1019 * The sample zip file was made in LANG=KOI8-R and it contains two 1020 * files the charset of which are different. 1021 * - the filename of first file is stored in KOI8-R. 1022 * - the filename of second file is stored in UTF-8. 1023 * 1024 * Whenever hdrcharset option is specified, we will correctly read the 1025 * filename of sencod file, which is stored in UTF-8. 1026 */ 1027 1028static void 1029test_read_format_zip_filename_KOI8R_UTF8_2(const char *refname) 1030{ 1031 struct archive *a; 1032 struct archive_entry *ae; 1033 1034 /* 1035 * Read filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option. 1036 */ 1037 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 1038 skipping("en_US.UTF-8 locale not available on this system."); 1039 return; 1040 } 1041 1042 assert((a = archive_read_new()) != NULL); 1043 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 1044 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 1045 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 1046 skipping("This system cannot convert character-set" 1047 " from KOI8-R to UTF-8."); 1048 goto next_test; 1049 } 1050 assertEqualIntA(a, ARCHIVE_OK, 1051 archive_read_open_filename(a, refname, 10240)); 1052 1053 /* Verify regular first file. */ 1054 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1055 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 1056 archive_entry_pathname(ae)); 1057 assertEqualInt(6, archive_entry_size(ae)); 1058 1059 /* 1060 * Verify regular second file. 1061 * The filename is not translated because Bit 11 of its general 1062 * purpose bit flag is set and so we know the conversion is unneeded. 1063 */ 1064 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1065 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 1066 archive_entry_pathname(ae)); 1067 assertEqualInt(6, archive_entry_size(ae)); 1068 1069 1070 /* End of archive. */ 1071 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 1072 1073 /* Verify archive format. */ 1074 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 1075 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 1076 1077 /* Close the archive. */ 1078 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 1079next_test: 1080 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 1081 1082 /* 1083 * Read filename in en_US.UTF-8 without "hdrcharset=KOI8-R" option. 1084 * The filename we can properly read is only second file. 1085 */ 1086 assert((a = archive_read_new()) != NULL); 1087 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 1088 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 1089 assertEqualIntA(a, ARCHIVE_OK, 1090 archive_read_open_filename(a, refname, 10240)); 1091 1092 /* 1093 * Verify regular first file. 1094 * The filename is not translated to UTF-8 because Bit 11 of 1095 * its general purpose bit flag is *not* set and so there is 1096 * not way to know its charset. 1097 */ 1098 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1099 /* A filename is in KOI8-R. */ 1100 assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 1101 archive_entry_pathname(ae)); 1102 assertEqualInt(6, archive_entry_size(ae)); 1103 1104 /* Verify regular file. */ 1105 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1106 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 1107 archive_entry_pathname(ae)); 1108 assertEqualInt(6, archive_entry_size(ae)); 1109 1110 1111 /* End of archive. */ 1112 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 1113 1114 /* Verify archive format. */ 1115 assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); 1116 assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 1117 1118 /* Close the archive. */ 1119 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 1120 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 1121} 1122 1123DEFINE_TEST(test_read_format_zip_filename) 1124{ 1125 const char *refname1 = "test_read_format_zip_filename_cp932.zip"; 1126 const char *refname2 = "test_read_format_zip_filename_utf8_jp.zip"; 1127 const char *refname3 = "test_read_format_zip_filename_cp866.zip"; 1128 const char *refname4 = "test_read_format_zip_filename_koi8r.zip"; 1129 const char *refname5 = "test_read_format_zip_filename_utf8_ru.zip"; 1130 const char *refname6 = "test_read_format_zip_filename_utf8_ru2.zip"; 1131 1132 extract_reference_file(refname1); 1133 test_read_format_zip_filename_CP932_eucJP(refname1); 1134 test_read_format_zip_filename_CP932_UTF8(refname1); 1135 test_read_format_zip_filename_CP932_CP932(refname1); 1136 1137 extract_reference_file(refname2); 1138 test_read_format_zip_filename_UTF8_eucJP(refname2); 1139 test_read_format_zip_filename_UTF8_UTF8(refname2); 1140 test_read_format_zip_filename_UTF8_CP932(refname2); 1141 1142 extract_reference_file(refname3); 1143 test_read_format_zip_filename_CP866_KOI8R(refname3); 1144 test_read_format_zip_filename_CP866_UTF8(refname3); 1145 test_read_format_zip_filename_CP866_CP1251(refname3); 1146 test_read_format_zip_filename_CP866_CP1251_win(refname3); 1147 1148 extract_reference_file(refname4); 1149 test_read_format_zip_filename_KOI8R_CP866(refname4); 1150 test_read_format_zip_filename_KOI8R_UTF8(refname4); 1151 test_read_format_zip_filename_KOI8R_CP1251(refname4); 1152 1153 extract_reference_file(refname5); 1154 test_read_format_zip_filename_UTF8_KOI8R(refname5); 1155 test_read_format_zip_filename_UTF8_CP866(refname5); 1156 test_read_format_zip_filename_UTF8_UTF8_ru(refname5); 1157 test_read_format_zip_filename_UTF8_CP1251(refname5); 1158 1159 /* The filenames contained in refname6 are different charset. */ 1160 extract_reference_file(refname6); 1161 test_read_format_zip_filename_KOI8R_UTF8_2(refname6); 1162} 1163