test_read_format_cpio_filename.c revision 302001
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 30DEFINE_TEST(test_read_format_cpio_filename_eucJP_UTF8) 31{ 32 const char *refname = "test_read_format_cpio_filename_eucjp.cpio"; 33 struct archive *a; 34 struct archive_entry *ae; 35 36 /* 37 * Read eucJP filename in en_US.UTF-8 with "hdrcharset=eucJP" option. 38 */ 39 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 40 skipping("en_US.UTF-8 locale not available on this system."); 41 return; 42 } 43 extract_reference_file(refname); 44 45 assert((a = archive_read_new()) != NULL); 46 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 47 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 48 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) { 49 skipping("This system cannot convert character-set" 50 " from eucJP to UTF-8."); 51 goto cleanup; 52 } 53 assertEqualIntA(a, ARCHIVE_OK, 54 archive_read_open_filename(a, refname, 10240)); 55 56 /* Verify regular file. */ 57 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 58 assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt", 59 archive_entry_pathname(ae)); 60 assertEqualInt(8, archive_entry_size(ae)); 61 assertEqualInt(archive_entry_is_encrypted(ae), 0); 62 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 63 64 /* Verify regular file. */ 65 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 66 assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae)); 67 assertEqualInt(4, archive_entry_size(ae)); 68 assertEqualInt(archive_entry_is_encrypted(ae), 0); 69 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 70 71 72 /* End of archive. */ 73 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 74 75 /* Verify archive format. */ 76 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 77 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 78 79 /* Close the archive. */ 80 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 81cleanup: 82 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 83} 84 85DEFINE_TEST(test_read_format_cpio_filename_UTF8_eucJP) 86{ 87 const char *refname = "test_read_format_cpio_filename_utf8_jp.cpio"; 88 struct archive *a; 89 struct archive_entry *ae; 90 91 /* 92 * Read UTF-8 filename in ja_JP.eucJP with "hdrcharset=UTF-8" option. 93 */ 94 if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) { 95 skipping("ja_JP.eucJP locale not available on this system."); 96 return; 97 } 98 extract_reference_file(refname); 99 100 assert((a = archive_read_new()) != NULL); 101 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 102 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 103 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 104 skipping("This system cannot convert character-set" 105 " from UTF-8 to eucJP."); 106 goto cleanup; 107 } 108 109 assertEqualIntA(a, ARCHIVE_OK, 110 archive_read_open_filename(a, refname, 10240)); 111 112 /* Verify regular file. */ 113 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 114 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 115 assertEqualString("\xb4\xc1\xbb\xfa.txt", archive_entry_pathname(ae)); 116 assertEqualInt(8, archive_entry_size(ae)); 117 118 /* Verify regular file. */ 119 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 120 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 121 assertEqualString("\xc9\xbd.txt", archive_entry_pathname(ae)); 122 assertEqualInt(4, archive_entry_size(ae)); 123 124 125 /* End of archive. */ 126 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 127 128 /* Verify archive format. */ 129 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 130 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 131 132 /* Close the archive. */ 133 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 134cleanup: 135 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 136} 137 138DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_jp) 139{ 140 const char *refname = "test_read_format_cpio_filename_utf8_jp.cpio"; 141 struct archive *a; 142 struct archive_entry *ae; 143 144 /* 145 * Read UTF-8 filename in en_US.UTF-8 without "hdrcharset=UTF-8" option. 146 */ 147 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 148 skipping("en_US.UTF-8 locale not available on this system."); 149 return; 150 } 151 extract_reference_file(refname); 152 153 assert((a = archive_read_new()) != NULL); 154 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 155 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 156 assertEqualIntA(a, ARCHIVE_OK, 157 archive_read_open_filename(a, refname, 10240)); 158 159 /* Verify regular file. */ 160 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 161 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 162 assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt", 163 archive_entry_pathname(ae)); 164 assertEqualInt(8, archive_entry_size(ae)); 165 166 /* Verify regular file. */ 167 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 168 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 169 assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae)); 170 assertEqualInt(4, archive_entry_size(ae)); 171 172 173 /* End of archive. */ 174 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 175 176 /* Verify archive format. */ 177 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 178 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 179 180 /* Close the archive. */ 181 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 182 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 183} 184 185DEFINE_TEST(test_read_format_cpio_filename_CP866_KOI8R) 186{ 187 const char *refname = "test_read_format_cpio_filename_cp866.cpio"; 188 struct archive *a; 189 struct archive_entry *ae; 190 191 /* 192 * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option. 193 */ 194 if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") && 195 NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) { 196 skipping("ru_RU.KOI8-R locale not available on this system."); 197 return; 198 } 199 extract_reference_file(refname); 200 201 assert((a = archive_read_new()) != NULL); 202 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 203 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 204 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 205 skipping("This system cannot convert character-set" 206 " from CP866 to KOI8-R."); 207 goto cleanup; 208 } 209 assertEqualIntA(a, ARCHIVE_OK, 210 archive_read_open_filename(a, refname, 10240)); 211 212 /* Verify regular file. */ 213 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 214 assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 215 archive_entry_pathname(ae)); 216 assertEqualInt(6, archive_entry_size(ae)); 217 218 /* Verify regular file. */ 219 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 220 assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4", 221 archive_entry_pathname(ae)); 222 assertEqualInt(6, archive_entry_size(ae)); 223 224 225 /* End of archive. */ 226 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 227 228 /* Verify archive format. */ 229 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 230 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 231 232 /* Close the archive. */ 233 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 234cleanup: 235 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 236} 237 238DEFINE_TEST(test_read_format_cpio_filename_CP866_UTF8) 239{ 240 const char *refname = "test_read_format_cpio_filename_cp866.cpio"; 241 struct archive *a; 242 struct archive_entry *ae; 243 244 /* 245 * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option. 246 */ 247 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 248 skipping("en_US.UTF-8 locale not available on this system."); 249 return; 250 } 251 extract_reference_file(refname); 252 253 assert((a = archive_read_new()) != NULL); 254 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 255 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 256 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 257 skipping("This system cannot convert character-set" 258 " from CP866 to UTF-8."); 259 goto cleanup; 260 } 261 assertEqualIntA(a, ARCHIVE_OK, 262 archive_read_open_filename(a, refname, 10240)); 263 264 /* Verify regular file. */ 265 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 266 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 267 archive_entry_pathname(ae)); 268 assertEqualInt(6, archive_entry_size(ae)); 269 270 /* Verify regular file. */ 271 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 272 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 273 archive_entry_pathname(ae)); 274 assertEqualInt(6, archive_entry_size(ae)); 275 276 277 /* End of archive. */ 278 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 279 280 /* Verify archive format. */ 281 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 282 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 283 284 /* Close the archive. */ 285 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 286cleanup: 287 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 288} 289 290DEFINE_TEST(test_read_format_cpio_filename_KOI8R_CP866) 291{ 292 const char *refname = "test_read_format_cpio_filename_koi8r.cpio"; 293 struct archive *a; 294 struct archive_entry *ae; 295 296 /* 297 * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option. 298 */ 299 if (NULL == setlocale(LC_ALL, "Russian_Russia.866") && 300 NULL == setlocale(LC_ALL, "ru_RU.CP866")) { 301 skipping("ru_RU.CP866 locale not available on this system."); 302 return; 303 } 304 extract_reference_file(refname); 305 306 assert((a = archive_read_new()) != NULL); 307 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 308 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 309 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 310 skipping("This system cannot convert character-set" 311 " from KOI8-R to CP866."); 312 goto cleanup; 313 } 314 assertEqualIntA(a, ARCHIVE_OK, 315 archive_read_open_filename(a, refname, 10240)); 316 317 /* Verify regular file. */ 318 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 319 assertEqualString("\x8f\x90\x88\x82\x85\x92", 320 archive_entry_pathname(ae)); 321 assertEqualInt(6, archive_entry_size(ae)); 322 323 /* Verify regular file. */ 324 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 325 assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2", 326 archive_entry_pathname(ae)); 327 assertEqualInt(6, archive_entry_size(ae)); 328 329 330 /* End of archive. */ 331 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 332 333 /* Verify archive format. */ 334 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 335 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 336 337 /* Close the archive. */ 338 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 339cleanup: 340 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 341} 342 343DEFINE_TEST(test_read_format_cpio_filename_KOI8R_UTF8) 344{ 345 const char *refname = "test_read_format_cpio_filename_koi8r.cpio"; 346 struct archive *a; 347 struct archive_entry *ae; 348 349 /* 350 * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option. 351 */ 352 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 353 skipping("en_US.UTF-8 locale not available on this system."); 354 return; 355 } 356 extract_reference_file(refname); 357 358 assert((a = archive_read_new()) != NULL); 359 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 360 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 361 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 362 skipping("This system cannot convert character-set" 363 " from KOI8-R to UTF-8."); 364 goto cleanup; 365 } 366 assertEqualIntA(a, ARCHIVE_OK, 367 archive_read_open_filename(a, refname, 10240)); 368 369 /* Verify regular file. */ 370 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 371 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 372 archive_entry_pathname(ae)); 373 assertEqualInt(6, archive_entry_size(ae)); 374 375 /* Verify regular file. */ 376 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 377 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 378 archive_entry_pathname(ae)); 379 assertEqualInt(6, archive_entry_size(ae)); 380 381 382 /* End of archive. */ 383 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 384 385 /* Verify archive format. */ 386 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 387 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 388 389 /* Close the archive. */ 390 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 391cleanup: 392 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 393} 394 395DEFINE_TEST(test_read_format_cpio_filename_UTF8_KOI8R) 396{ 397 const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio"; 398 struct archive *a; 399 struct archive_entry *ae; 400 401 /* 402 * Read UTF-8 filename in ru_RU.KOI8-R with "hdrcharset=UTF-8" option. 403 */ 404 if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") && 405 NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) { 406 skipping("ru_RU.KOI8-R locale not available on this system."); 407 return; 408 } 409 extract_reference_file(refname); 410 411 assert((a = archive_read_new()) != NULL); 412 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 413 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 414 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 415 skipping("This system cannot convert character-set" 416 " from UTF-8 to KOI8-R."); 417 goto cleanup; 418 } 419 assertEqualIntA(a, ARCHIVE_OK, 420 archive_read_open_filename(a, refname, 10240)); 421 422 /* Verify regular file. */ 423 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 424 assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 425 archive_entry_pathname(ae)); 426 assertEqualInt(6, archive_entry_size(ae)); 427 428 /* Verify regular file. */ 429 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 430 assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4", 431 archive_entry_pathname(ae)); 432 assertEqualInt(6, archive_entry_size(ae)); 433 434 435 /* End of archive. */ 436 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 437 438 /* Verify archive format. */ 439 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 440 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 441 442 /* Close the archive. */ 443 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 444cleanup: 445 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 446} 447 448DEFINE_TEST(test_read_format_cpio_filename_UTF8_CP866) 449{ 450 const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio"; 451 struct archive *a; 452 struct archive_entry *ae; 453 454 /* 455 * Read UTF-8 filename in ru_RU.CP866 with "hdrcharset=UTF-8" option. 456 */ 457 if (NULL == setlocale(LC_ALL, "Russian_Russia.866") && 458 NULL == setlocale(LC_ALL, "ru_RU.CP866")) { 459 skipping("ru_RU.CP866 locale not available on this system."); 460 return; 461 } 462 extract_reference_file(refname); 463 464 assert((a = archive_read_new()) != NULL); 465 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 466 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 467 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 468 skipping("This system cannot convert character-set" 469 " from UTF-8 to CP866."); 470 goto cleanup; 471 } 472 assertEqualIntA(a, ARCHIVE_OK, 473 archive_read_open_filename(a, refname, 10240)); 474 475 /* Verify regular file. */ 476 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 477 assertEqualString("\x8f\x90\x88\x82\x85\x92", 478 archive_entry_pathname(ae)); 479 assertEqualInt(6, archive_entry_size(ae)); 480 481 /* Verify regular file. */ 482 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 483 assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2", 484 archive_entry_pathname(ae)); 485 assertEqualInt(6, archive_entry_size(ae)); 486 487 488 /* End of archive. */ 489 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 490 491 /* Verify archive format. */ 492 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 493 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 494 495 /* Close the archive. */ 496 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 497cleanup: 498 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 499} 500 501DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_ru) 502{ 503 const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio"; 504 struct archive *a; 505 struct archive_entry *ae; 506 507 /* 508 * Read UTF-8 filename in en_US.UTF-8 without "hdrcharset=UTF-8" option. 509 */ 510 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 511 skipping("en_US.UTF-8 locale not available on this system."); 512 return; 513 } 514 extract_reference_file(refname); 515 516 assert((a = archive_read_new()) != NULL); 517 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 518 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 519 assertEqualIntA(a, ARCHIVE_OK, 520 archive_read_open_filename(a, refname, 10240)); 521 522 /* Verify regular file. */ 523 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 524 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 525 archive_entry_pathname(ae)); 526 assertEqualInt(6, archive_entry_size(ae)); 527 528 /* Verify regular file. */ 529 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 530 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 531 archive_entry_pathname(ae)); 532 assertEqualInt(6, archive_entry_size(ae)); 533 534 535 /* End of archive. */ 536 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 537 538 /* Verify archive format. */ 539 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 540 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 541 542 /* Close the archive. */ 543 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 544 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 545} 546 547DEFINE_TEST(test_read_format_cpio_filename_eucJP_CP932) 548{ 549 const char *refname = "test_read_format_cpio_filename_eucjp.cpio"; 550 struct archive *a; 551 struct archive_entry *ae; 552 553 /* 554 * Read eucJP filename in CP932/SJIS with "hdrcharset=eucJP" option. 555 */ 556 if (NULL == setlocale(LC_ALL, "Japanese_Japan") && 557 NULL == setlocale(LC_ALL, "ja_JP.SJIS")) { 558 skipping("CP932 locale not available on this system."); 559 return; 560 } 561 extract_reference_file(refname); 562 563 assert((a = archive_read_new()) != NULL); 564 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 565 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 566 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) { 567 skipping("This system cannot convert character-set" 568 " from eucJP."); 569 goto cleanup; 570 } 571 assertEqualIntA(a, ARCHIVE_OK, 572 archive_read_open_filename(a, refname, 10240)); 573 574 /* Verify regular file. */ 575 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 576 assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae)); 577 assertEqualInt(8, archive_entry_size(ae)); 578 579 /* Verify regular file. */ 580 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 581 assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae)); 582 assertEqualInt(4, archive_entry_size(ae)); 583 584 585 /* End of archive. */ 586 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 587 588 /* Verify archive format. */ 589 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 590 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 591 592 /* Close the archive. */ 593 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 594cleanup: 595 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 596} 597 598DEFINE_TEST(test_read_format_cpio_filename_UTF8_CP932) 599{ 600 const char *refname = "test_read_format_cpio_filename_utf8_jp.cpio"; 601 struct archive *a; 602 struct archive_entry *ae; 603 604 /* 605 * Read UTF-8 filename in CP932/SJIS with "hdrcharset=UTF-8" option. 606 */ 607 if (NULL == setlocale(LC_ALL, "Japanese_Japan") && 608 NULL == setlocale(LC_ALL, "ja_JP.SJIS")) { 609 skipping("CP932 locale not available on this system."); 610 return; 611 } 612 extract_reference_file(refname); 613 614 assert((a = archive_read_new()) != NULL); 615 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 616 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 617 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 618 skipping("This system cannot convert character-set" 619 " from UTF-8 to CP932."); 620 goto cleanup; 621 } 622 assertEqualIntA(a, ARCHIVE_OK, 623 archive_read_open_filename(a, refname, 10240)); 624 625 /* Verify regular file. */ 626 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 627 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 628 assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae)); 629 assertEqualInt(8, archive_entry_size(ae)); 630 631 /* Verify regular file. */ 632 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 633 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 634 assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae)); 635 assertEqualInt(4, archive_entry_size(ae)); 636 637 /* End of archive. */ 638 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 639 640 /* Verify archive format. */ 641 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 642 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 643 644 /* Close the archive. */ 645 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 646cleanup: 647 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 648} 649 650DEFINE_TEST(test_read_format_cpio_filename_CP866_CP1251) 651{ 652 const char *refname = "test_read_format_cpio_filename_cp866.cpio"; 653 struct archive *a; 654 struct archive_entry *ae; 655 656 /* 657 * Read CP866 filename in CP1251 with "hdrcharset=CP866" option. 658 */ 659 if (NULL == setlocale(LC_ALL, "Russian_Russia") && 660 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 661 skipping("CP1251 locale not available on this system."); 662 return; 663 } 664 extract_reference_file(refname); 665 666 assert((a = archive_read_new()) != NULL); 667 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 668 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 669 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 670 skipping("This system cannot convert character-set" 671 " from CP866 to CP1251."); 672 goto cleanup; 673 } 674 assertEqualIntA(a, ARCHIVE_OK, 675 archive_read_open_filename(a, refname, 10240)); 676 677 /* Verify regular file. */ 678 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 679 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 680 archive_entry_pathname(ae)); 681 assertEqualInt(6, archive_entry_size(ae)); 682 683 /* Verify regular file. */ 684 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 685 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 686 archive_entry_pathname(ae)); 687 assertEqualInt(6, archive_entry_size(ae)); 688 689 690 /* End of archive. */ 691 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 692 693 /* Verify archive format. */ 694 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 695 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 696 697 /* Close the archive. */ 698 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 699cleanup: 700 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 701} 702 703/* 704 * This test only for Windows platform because other archiver 705 * applications on Windows translate CP1251 filenames into CP866 706 * filenames and store it in the cpio file and so we should read 707 * it by default on Windows. 708 */ 709DEFINE_TEST(test_read_format_cpio_filename_CP866_CP1251_win) 710{ 711 const char *refname = "test_read_format_cpio_filename_cp866.cpio"; 712 struct archive *a; 713 struct archive_entry *ae; 714 715 /* 716 * Read CP866 filename in CP1251 without "hdrcharset=CP866" option. 717 */ 718 if (NULL == setlocale(LC_ALL, "Russian_Russia")) { 719 skipping("Russian_Russia locale not available on this system."); 720 return; 721 } 722 extract_reference_file(refname); 723 724 assert((a = archive_read_new()) != NULL); 725 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 726 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 727 assertEqualIntA(a, ARCHIVE_OK, 728 archive_read_open_filename(a, refname, 10240)); 729 730 /* Verify regular file. */ 731 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 732 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 733 archive_entry_pathname(ae)); 734 assertEqualInt(6, archive_entry_size(ae)); 735 736 /* Verify regular file. */ 737 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 738 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 739 archive_entry_pathname(ae)); 740 assertEqualInt(6, archive_entry_size(ae)); 741 742 743 /* End of archive. */ 744 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 745 746 /* Verify archive format. */ 747 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 748 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 749 750 /* Close the archive. */ 751 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 752 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 753} 754 755DEFINE_TEST(test_read_format_cpio_filename_KOI8R_CP1251) 756{ 757 const char *refname = "test_read_format_cpio_filename_koi8r.cpio"; 758 struct archive *a; 759 struct archive_entry *ae; 760 761 /* 762 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option. 763 */ 764 if (NULL == setlocale(LC_ALL, "Russian_Russia") && 765 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 766 skipping("CP1251 locale not available on this system."); 767 return; 768 } 769 extract_reference_file(refname); 770 771 assert((a = archive_read_new()) != NULL); 772 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 773 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 774 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 775 skipping("This system cannot convert character-set" 776 " from KOI8-R to CP1251."); 777 goto cleanup; 778 } 779 assertEqualIntA(a, ARCHIVE_OK, 780 archive_read_open_filename(a, refname, 10240)); 781 782 /* Verify regular file. */ 783 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 784 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 785 archive_entry_pathname(ae)); 786 assertEqualInt(6, archive_entry_size(ae)); 787 788 /* Verify regular file. */ 789 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 790 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 791 archive_entry_pathname(ae)); 792 assertEqualInt(6, archive_entry_size(ae)); 793 794 795 /* End of archive. */ 796 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 797 798 /* Verify archive format. */ 799 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 800 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 801 802 /* Close the archive. */ 803 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 804cleanup: 805 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 806} 807 808DEFINE_TEST(test_read_format_cpio_filename_UTF8_CP1251) 809{ 810 const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio"; 811 struct archive *a; 812 struct archive_entry *ae; 813 814 /* 815 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option. 816 */ 817 if (NULL == setlocale(LC_ALL, "Russian_Russia") && 818 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 819 skipping("CP1251 locale not available on this system."); 820 return; 821 } 822 extract_reference_file(refname); 823 824 assert((a = archive_read_new()) != NULL); 825 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 826 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 827 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 828 skipping("This system cannot convert character-set" 829 " from UTF-8 to CP1251."); 830 goto cleanup; 831 } 832 assertEqualIntA(a, ARCHIVE_OK, 833 archive_read_open_filename(a, refname, 10240)); 834 835 /* Verify regular file. */ 836 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 837 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 838 archive_entry_pathname(ae)); 839 assertEqualInt(6, archive_entry_size(ae)); 840 841 /* Verify regular file. */ 842 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 843 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 844 archive_entry_pathname(ae)); 845 assertEqualInt(6, archive_entry_size(ae)); 846 847 848 /* End of archive. */ 849 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 850 851 /* Verify archive format. */ 852 assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 853 assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a)); 854 855 /* Close the archive. */ 856 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 857cleanup: 858 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 859} 860 861