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 27 #include <locale.h> 28 29 DEFINE_TEST(test_read_format_gtar_filename_eucJP_UTF8) 30 { 31 const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z"; 32 struct archive *a; 33 struct archive_entry *ae; 34 35 /* 36 * Read eucJP filename in en_US.UTF-8 with "hdrcharset=eucJP" option. 37 */ 38 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 39 skipping("en_US.UTF-8 locale not available on this system."); 40 return; 41 } 42 extract_reference_file(refname); 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=eucJP")) { 48 skipping("This system cannot convert character-set" 49 " from eucJP to UTF-8."); 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("\xe6\xbc\xa2\xe5\xad\x97.txt", 58 archive_entry_pathname(ae)); 59 assertEqualInt(8, archive_entry_size(ae)); 60 61 /* Verify regular file. */ 62 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 63 assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae)); 64 assertEqualInt(4, archive_entry_size(ae)); 65 assertEqualInt(archive_entry_is_encrypted(ae), 0); 66 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 67 68 69 /* End of archive. */ 70 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 71 72 /* Verify archive format. */ 73 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 74 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 75 76 /* Close the archive. */ 77 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 78 cleanup: 79 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 80 } 81 82 DEFINE_TEST(test_read_format_gtar_filename_CP866_KOI8R) 83 { 84 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z"; 85 struct archive *a; 86 struct archive_entry *ae; 87 88 /* 89 * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option. 90 */ 91 if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") && 92 NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) { 93 skipping("ru_RU.KOI8-R locale not available on this system."); 94 return; 95 } 96 extract_reference_file(refname); 97 98 assert((a = archive_read_new()) != NULL); 99 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 100 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 101 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 102 skipping("This system cannot convert character-set" 103 " from CP866 to KOI8-R."); 104 goto cleanup; 105 } 106 assertEqualIntA(a, ARCHIVE_OK, 107 archive_read_open_filename(a, refname, 10240)); 108 109 /* Verify regular file. */ 110 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 111 assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 112 archive_entry_pathname(ae)); 113 assertEqualInt(6, archive_entry_size(ae)); 114 115 /* Verify regular file. */ 116 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 117 assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4", 118 archive_entry_pathname(ae)); 119 assertEqualInt(6, archive_entry_size(ae)); 120 121 122 /* End of archive. */ 123 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 124 125 /* Verify archive format. */ 126 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 127 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 128 129 /* Close the archive. */ 130 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 131 cleanup: 132 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 133 } 134 135 DEFINE_TEST(test_read_format_gtar_filename_CP866_UTF8) 136 { 137 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z"; 138 struct archive *a; 139 struct archive_entry *ae; 140 141 /* 142 * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option. 143 */ 144 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 145 skipping("en_US.UTF-8 locale not available on this system."); 146 return; 147 } 148 extract_reference_file(refname); 149 150 assert((a = archive_read_new()) != NULL); 151 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 152 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 153 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 154 skipping("This system cannot convert character-set" 155 " from CP866 to UTF-8."); 156 goto cleanup; 157 } 158 assertEqualIntA(a, ARCHIVE_OK, 159 archive_read_open_filename(a, refname, 10240)); 160 161 /* Verify regular file. */ 162 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 163 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 164 archive_entry_pathname(ae)); 165 assertEqualInt(6, archive_entry_size(ae)); 166 167 /* Verify regular file. */ 168 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 169 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 170 archive_entry_pathname(ae)); 171 assertEqualInt(6, archive_entry_size(ae)); 172 173 174 /* End of archive. */ 175 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 176 177 /* Verify archive format. */ 178 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 179 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 180 181 /* Close the archive. */ 182 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 183 cleanup: 184 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 185 } 186 187 DEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP866) 188 { 189 const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z"; 190 struct archive *a; 191 struct archive_entry *ae; 192 193 /* 194 * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option. 195 */ 196 if (NULL == setlocale(LC_ALL, "Russian_Russia.866") && 197 NULL == setlocale(LC_ALL, "ru_RU.CP866")) { 198 skipping("ru_RU.CP866 locale not available on this system."); 199 return; 200 } 201 extract_reference_file(refname); 202 203 assert((a = archive_read_new()) != NULL); 204 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 205 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 206 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 207 skipping("This system cannot convert character-set" 208 " from KOI8-R to CP866."); 209 goto cleanup; 210 } 211 assertEqualIntA(a, ARCHIVE_OK, 212 archive_read_open_filename(a, refname, 10240)); 213 214 /* Verify regular file. */ 215 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 216 assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2", 217 archive_entry_pathname(ae)); 218 assertEqualInt(6, archive_entry_size(ae)); 219 220 /* Verify regular file. */ 221 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 222 assertEqualString("\x8f\x90\x88\x82\x85\x92", 223 archive_entry_pathname(ae)); 224 assertEqualInt(6, archive_entry_size(ae)); 225 226 227 /* End of archive. */ 228 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 229 230 /* Verify archive format. */ 231 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 232 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 233 234 /* Close the archive. */ 235 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 236 cleanup: 237 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 238 } 239 240 DEFINE_TEST(test_read_format_gtar_filename_KOI8R_UTF8) 241 { 242 const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z"; 243 struct archive *a; 244 struct archive_entry *ae; 245 246 /* 247 * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option. 248 */ 249 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 250 skipping("en_US.UTF-8 locale not available on this system."); 251 return; 252 } 253 extract_reference_file(refname); 254 255 assert((a = archive_read_new()) != NULL); 256 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 257 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 258 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 259 skipping("This system cannot convert character-set" 260 " from KOI8-R to UTF-8."); 261 goto cleanup; 262 } 263 assertEqualIntA(a, ARCHIVE_OK, 264 archive_read_open_filename(a, refname, 10240)); 265 266 /* Verify regular file. */ 267 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 268 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 269 archive_entry_pathname(ae)); 270 assertEqualInt(6, archive_entry_size(ae)); 271 272 /* Verify regular file. */ 273 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 274 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 275 archive_entry_pathname(ae)); 276 assertEqualInt(6, archive_entry_size(ae)); 277 278 279 /* End of archive. */ 280 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 281 282 /* Verify archive format. */ 283 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 284 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 285 286 /* Close the archive. */ 287 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 288 cleanup: 289 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 290 } 291 292 DEFINE_TEST(test_read_format_gtar_filename_eucJP_CP932) 293 { 294 const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z"; 295 struct archive *a; 296 struct archive_entry *ae; 297 298 /* 299 * Read eucJP filename in CP932/SJIS with "hdrcharset=eucJP" option. 300 */ 301 if (NULL == setlocale(LC_ALL, "Japanese_Japan") && 302 NULL == setlocale(LC_ALL, "ja_JP.SJIS")) { 303 skipping("CP932 locale not available on this system."); 304 return; 305 } 306 extract_reference_file(refname); 307 308 assert((a = archive_read_new()) != NULL); 309 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 310 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 311 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) { 312 skipping("This system cannot convert character-set" 313 " from eucJP."); 314 goto cleanup; 315 } 316 assertEqualIntA(a, ARCHIVE_OK, 317 archive_read_open_filename(a, refname, 10240)); 318 319 /* Verify regular file. */ 320 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 321 assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae)); 322 assertEqualInt(8, archive_entry_size(ae)); 323 324 /* Verify regular file. */ 325 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 326 assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae)); 327 assertEqualInt(4, 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_COMPRESS, archive_filter_code(a, 0)); 335 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 336 337 /* Close the archive. */ 338 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 339 cleanup: 340 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 341 } 342 343 DEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251) 344 { 345 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z"; 346 struct archive *a; 347 struct archive_entry *ae; 348 349 /* 350 * Read CP866 filename in CP1251 with "hdrcharset=CP866" option. 351 */ 352 if (NULL == setlocale(LC_ALL, "Russian_Russia") && 353 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 354 skipping("CP1251 locale not available on this system."); 355 return; 356 } 357 extract_reference_file(refname); 358 359 assert((a = archive_read_new()) != NULL); 360 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 361 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 362 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 363 skipping("This system cannot convert character-set" 364 " from CP866 to CP1251."); 365 goto cleanup; 366 } 367 assertEqualIntA(a, ARCHIVE_OK, 368 archive_read_open_filename(a, refname, 10240)); 369 370 /* Verify regular file. */ 371 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 372 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 373 archive_entry_pathname(ae)); 374 assertEqualInt(6, archive_entry_size(ae)); 375 376 /* Verify regular file. */ 377 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 378 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 379 archive_entry_pathname(ae)); 380 assertEqualInt(6, archive_entry_size(ae)); 381 382 383 /* End of archive. */ 384 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 385 386 /* Verify archive format. */ 387 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 388 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 389 390 /* Close the archive. */ 391 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 392 cleanup: 393 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 394 } 395 396 /* 397 * This test only for Windows platform because other archiver 398 * applications on Windows translate CP1251 filenames into CP866 399 * filenames and store it in the gtar file and so we should read 400 * it by default on Windows. 401 */ 402 DEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251_win) 403 { 404 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z"; 405 struct archive *a; 406 struct archive_entry *ae; 407 408 /* 409 * Read CP866 filename in CP1251 without "hdrcharset=CP866" option. 410 */ 411 if (NULL == setlocale(LC_ALL, "Russian_Russia")) { 412 skipping("Russian_Russia locale not available on this system."); 413 return; 414 } 415 extract_reference_file(refname); 416 417 assert((a = archive_read_new()) != NULL); 418 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 419 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 420 assertEqualIntA(a, ARCHIVE_OK, 421 archive_read_open_filename(a, refname, 10240)); 422 423 /* Verify regular file. */ 424 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 425 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 426 archive_entry_pathname(ae)); 427 assertEqualInt(6, archive_entry_size(ae)); 428 429 /* Verify regular file. */ 430 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 431 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 432 archive_entry_pathname(ae)); 433 assertEqualInt(6, archive_entry_size(ae)); 434 435 436 /* End of archive. */ 437 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 438 439 /* Verify archive format. */ 440 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 441 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 442 443 /* Close the archive. */ 444 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 445 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 446 } 447 448 DEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP1251) 449 { 450 const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z"; 451 struct archive *a; 452 struct archive_entry *ae; 453 454 /* 455 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option. 456 */ 457 if (NULL == setlocale(LC_ALL, "Russian_Russia") && 458 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 459 skipping("CP1251 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=KOI8-R")) { 468 skipping("This system cannot convert character-set" 469 " from KOI8-R to CP1251."); 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("\xef\xf0\xe8\xe2\xe5\xf2", 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("\xcf\xd0\xc8\xc2\xc5\xd2", 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_COMPRESS, archive_filter_code(a, 0)); 493 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 494 495 /* Close the archive. */ 496 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 497 cleanup: 498 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 499 } 500 501