1231200Smm/*- 2231200Smm * Copyright (c) 2011 Michihiro NAKAJIMA 3231200Smm * All rights reserved. 4231200Smm * 5231200Smm * Redistribution and use in source and binary forms, with or without 6231200Smm * modification, are permitted provided that the following conditions 7231200Smm * are met: 8231200Smm * 1. Redistributions of source code must retain the above copyright 9231200Smm * notice, this list of conditions and the following disclaimer. 10231200Smm * 2. Redistributions in binary form must reproduce the above copyright 11231200Smm * notice, this list of conditions and the following disclaimer in the 12231200Smm * documentation and/or other materials provided with the distribution. 13231200Smm * 14231200Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15231200Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16231200Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17231200Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18231200Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19231200Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20231200Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21231200Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22231200Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23231200Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24231200Smm */ 25231200Smm#include "test.h" 26231200Smm__FBSDID("$FreeBSD"); 27231200Smm 28231200Smm#include <locale.h> 29231200Smm 30231200Smmstatic void 31231200Smmtest_read_format_zip_filename_CP932_eucJP(const char *refname) 32231200Smm{ 33231200Smm struct archive *a; 34231200Smm struct archive_entry *ae; 35231200Smm 36231200Smm /* 37231200Smm * Read CP932 filename in ja_JP.eucJP with "hdrcharset=CP932" option. 38231200Smm */ 39231200Smm if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) { 40231200Smm skipping("ja_JP.eucJP locale not available on this system."); 41231200Smm return; 42231200Smm } 43231200Smm 44231200Smm assert((a = archive_read_new()) != NULL); 45231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 46231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 47231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) { 48231200Smm skipping("This system cannot convert character-set" 49231200Smm " from CP932 to eucJP."); 50231200Smm goto cleanup; 51231200Smm } 52231200Smm assertEqualIntA(a, ARCHIVE_OK, 53231200Smm archive_read_open_filename(a, refname, 10240)); 54231200Smm 55231200Smm /* Verify regular file. */ 56231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 57231200Smm assertEqualString( 58231200Smm "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb0\xec\xcd\xf7\xc9\xbd\x2e\x74\x78\x74", 59231200Smm archive_entry_pathname(ae)); 60231200Smm assertEqualInt(5, archive_entry_size(ae)); 61231200Smm 62231200Smm /* Verify regular file. */ 63231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 64231200Smm assertEqualString( 65231200Smm "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb4\xc1\xbb\xfa\x2e\x74\x78\x74", 66231200Smm archive_entry_pathname(ae)); 67231200Smm assertEqualInt(5, archive_entry_size(ae)); 68231200Smm 69231200Smm 70231200Smm /* End of archive. */ 71231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 72231200Smm 73231200Smm /* Verify archive format. */ 74248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 75231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 76231200Smm 77231200Smm /* Close the archive. */ 78231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 79231200Smmcleanup: 80231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 81231200Smm} 82231200Smm 83231200Smmstatic void 84231200Smmtest_read_format_zip_filename_CP932_UTF8(const char *refname) 85231200Smm{ 86231200Smm struct archive *a; 87231200Smm struct archive_entry *ae; 88231200Smm 89231200Smm /* 90231200Smm * Read CP932 filename in en_US.UTF-8 with "hdrcharset=CP932" option. 91231200Smm */ 92231200Smm if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 93231200Smm skipping("en_US.UTF-8 locale not available on this system."); 94231200Smm return; 95231200Smm } 96231200Smm 97231200Smm assert((a = archive_read_new()) != NULL); 98231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 99231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 100231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) { 101231200Smm skipping("This system cannot convert character-set" 102231200Smm " from CP932 to UTF-8."); 103231200Smm goto cleanup; 104231200Smm } 105231200Smm assertEqualIntA(a, ARCHIVE_OK, 106231200Smm archive_read_open_filename(a, refname, 10240)); 107231200Smm 108231200Smm /* Verify regular file. */ 109231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 110231200Smm#if defined(__APPLE__) 111231200Smm /* Compare NFD string. */ 112231200Smm assertEqualUTF8String( 113231200Smm "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f" 114231200Smm "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74", 115231200Smm archive_entry_pathname(ae)); 116231200Smm#else 117231200Smm /* Compare NFC string. */ 118231200Smm assertEqualUTF8String( 119231200Smm "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f" 120231200Smm "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74", 121231200Smm archive_entry_pathname(ae)); 122231200Smm#endif 123231200Smm assertEqualInt(5, archive_entry_size(ae)); 124231200Smm 125231200Smm /* Verify regular file. */ 126231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 127231200Smm#if defined(__APPLE__) 128231200Smm /* Compare NFD string. */ 129231200Smm assertEqualUTF8String( 130231200Smm "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f" 131231200Smm "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74", 132231200Smm archive_entry_pathname(ae)); 133231200Smm#else 134231200Smm /* Compare NFC string. */ 135231200Smm assertEqualUTF8String( 136231200Smm "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f" 137231200Smm "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74", 138231200Smm archive_entry_pathname(ae)); 139231200Smm#endif 140231200Smm assertEqualInt(5, archive_entry_size(ae)); 141231200Smm 142231200Smm 143231200Smm /* End of archive. */ 144231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 145231200Smm 146231200Smm /* Verify archive format. */ 147248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 148231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 149231200Smm 150231200Smm /* Close the archive. */ 151231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 152231200Smmcleanup: 153231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 154231200Smm} 155231200Smm 156231200Smmstatic void 157231200Smmtest_read_format_zip_filename_UTF8_eucJP(const char *refname) 158231200Smm{ 159231200Smm struct archive *a; 160231200Smm struct archive_entry *ae; 161231200Smm 162231200Smm /* 163231200Smm * Read UTF-8 filename in ja_JP.eucJP without charset option 164231200Smm * because the file name in the sample file is UTF-8 and 165231200Smm * Bit 11 of its general purpose bit flag is set. 166231200Smm */ 167231200Smm if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) { 168231200Smm skipping("ja_JP.eucJP locale not availablefilename_ on this system."); 169231200Smm return; 170231200Smm } 171231200Smm assert((a = archive_read_new()) != NULL); 172231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 173231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 174231200Smm skipping("This system cannot convert character-set" 175231200Smm " from UTF-8 to eucJP."); 176231200Smm goto cleanup; 177231200Smm } 178231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 179231200Smm 180231200Smm assert((a = archive_read_new()) != NULL); 181231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 182231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 183231200Smm assertEqualIntA(a, ARCHIVE_OK, 184231200Smm archive_read_open_filename(a, refname, 10240)); 185231200Smm 186231200Smm /* Verify directory file. */ 187231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 188231200Smm assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 189231200Smm assertEqualString("\xc9\xbd\xa4\xc0\xa4\xe8\x2f", 190231200Smm archive_entry_pathname(ae)); 191231200Smm assertEqualInt(0, archive_entry_size(ae)); 192231200Smm 193231200Smm /* Verify regular file. */ 194231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 195231200Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 196231200Smm assertEqualString( 197231200Smm "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb0\xec\xcd\xf7\xc9\xbd\x2e\x74\x78\x74", 198231200Smm archive_entry_pathname(ae)); 199231200Smm assertEqualInt(5, archive_entry_size(ae)); 200231200Smm 201231200Smm /* Verify regular file. */ 202231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 203231200Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 204231200Smm assertEqualString( 205231200Smm "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb4\xc1\xbb\xfa\x2e\x74\x78\x74", 206231200Smm archive_entry_pathname(ae)); 207231200Smm assertEqualInt(5, archive_entry_size(ae)); 208231200Smm 209231200Smm 210231200Smm /* End of archive. */ 211231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 212231200Smm 213231200Smm /* Verify archive format. */ 214248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 215231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 216231200Smm 217231200Smm /* Close the archive. */ 218231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 219231200Smmcleanup: 220231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 221231200Smm} 222231200Smm 223231200Smmstatic void 224231200Smmtest_read_format_zip_filename_UTF8_UTF8(const char *refname) 225231200Smm{ 226231200Smm struct archive *a; 227231200Smm struct archive_entry *ae; 228231200Smm 229231200Smm /* 230231200Smm * Read UTF-8 filename in en_US.UTF-8 without charset option 231231200Smm * because the file name in the sample file is UTF-8 and 232231200Smm * Bit 11 of its general purpose bit flag is set. 233231200Smm */ 234231200Smm if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 235231200Smm skipping("en_US.UTF-8 locale not available on this system."); 236231200Smm return; 237231200Smm } 238231200Smm 239231200Smm assert((a = archive_read_new()) != NULL); 240231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 241231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 242231200Smm assertEqualIntA(a, ARCHIVE_OK, 243231200Smm archive_read_open_filename(a, refname, 10240)); 244231200Smm 245231200Smm /* Verify directory file. */ 246231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 247231200Smm assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 248231200Smm#if defined(__APPLE__) 249231200Smm /* Compare NFD string. */ 250231200Smm assertEqualUTF8String( 251231200Smm "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f", 252231200Smm archive_entry_pathname(ae)); 253231200Smm#else 254231200Smm /* Compare NFC string. */ 255231200Smm assertEqualUTF8String( 256231200Smm "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f", 257231200Smm archive_entry_pathname(ae)); 258231200Smm#endif 259231200Smm assertEqualInt(0, archive_entry_size(ae)); 260231200Smm 261231200Smm /* Verify regular file. */ 262231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 263231200Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 264231200Smm#if defined(__APPLE__) 265231200Smm /* Compare NFD string. */ 266231200Smm assertEqualUTF8String( 267231200Smm "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f" 268231200Smm "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74", 269231200Smm archive_entry_pathname(ae)); 270231200Smm#else 271231200Smm /* Compare NFC string. */ 272231200Smm assertEqualUTF8String( 273231200Smm "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f" 274231200Smm "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74", 275231200Smm archive_entry_pathname(ae)); 276231200Smm#endif 277231200Smm assertEqualInt(5, archive_entry_size(ae)); 278231200Smm 279231200Smm /* Verify regular file. */ 280231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 281231200Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 282231200Smm#if defined(__APPLE__) 283231200Smm /* Compare NFD string. */ 284231200Smm assertEqualUTF8String( 285231200Smm "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f" 286231200Smm "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74", 287231200Smm archive_entry_pathname(ae)); 288231200Smm#else 289231200Smm /* Compare NFC string. */ 290231200Smm assertEqualUTF8String( 291231200Smm "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f" 292231200Smm "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74", 293231200Smm archive_entry_pathname(ae)); 294231200Smm#endif 295231200Smm assertEqualInt(5, archive_entry_size(ae)); 296231200Smm 297231200Smm 298231200Smm /* End of archive. */ 299231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 300231200Smm 301231200Smm /* Verify archive format. */ 302248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 303231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 304231200Smm 305231200Smm /* Close the archive. */ 306231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 307231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 308231200Smm} 309231200Smm 310231200Smmstatic void 311231200Smmtest_read_format_zip_filename_CP866_KOI8R(const char *refname) 312231200Smm{ 313231200Smm struct archive *a; 314231200Smm struct archive_entry *ae; 315231200Smm 316231200Smm /* 317231200Smm * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option. 318231200Smm */ 319231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") && 320231200Smm NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) { 321231200Smm skipping("ru_RU.KOI8-R locale not available on this system."); 322231200Smm return; 323231200Smm } 324231200Smm 325231200Smm assert((a = archive_read_new()) != NULL); 326231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 327231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 328231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 329231200Smm skipping("This system cannot convert character-set" 330231200Smm " from CP866 to KOI8-R."); 331231200Smm goto cleanup; 332231200Smm } 333231200Smm assertEqualIntA(a, ARCHIVE_OK, 334231200Smm archive_read_open_filename(a, refname, 10240)); 335231200Smm 336231200Smm /* Verify regular file. */ 337231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 338231200Smm assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 339231200Smm archive_entry_pathname(ae)); 340231200Smm assertEqualInt(6, archive_entry_size(ae)); 341231200Smm 342231200Smm /* Verify regular file. */ 343231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 344231200Smm assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4", 345231200Smm archive_entry_pathname(ae)); 346231200Smm assertEqualInt(6, archive_entry_size(ae)); 347231200Smm 348231200Smm 349231200Smm /* End of archive. */ 350231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 351231200Smm 352231200Smm /* Verify archive format. */ 353248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 354231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 355231200Smm 356231200Smm /* Close the archive. */ 357231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 358231200Smmcleanup: 359231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 360231200Smm} 361231200Smm 362231200Smmstatic void 363231200Smmtest_read_format_zip_filename_CP866_UTF8(const char *refname) 364231200Smm{ 365231200Smm struct archive *a; 366231200Smm struct archive_entry *ae; 367231200Smm 368231200Smm /* 369231200Smm * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option. 370231200Smm */ 371231200Smm if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 372231200Smm skipping("en_US.UTF-8 locale not available on this system."); 373231200Smm return; 374231200Smm } 375231200Smm 376231200Smm assert((a = archive_read_new()) != NULL); 377231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 378231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 379231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 380231200Smm skipping("This system cannot convert character-set" 381231200Smm " from CP866 to UTF-8."); 382231200Smm goto cleanup; 383231200Smm } 384231200Smm assertEqualIntA(a, ARCHIVE_OK, 385231200Smm archive_read_open_filename(a, refname, 10240)); 386231200Smm 387231200Smm /* Verify regular file. */ 388231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 389231200Smm assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 390231200Smm archive_entry_pathname(ae)); 391231200Smm assertEqualInt(6, archive_entry_size(ae)); 392231200Smm 393231200Smm /* Verify regular file. */ 394231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 395231200Smm assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 396231200Smm archive_entry_pathname(ae)); 397231200Smm assertEqualInt(6, archive_entry_size(ae)); 398231200Smm 399231200Smm 400231200Smm /* End of archive. */ 401231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 402231200Smm 403231200Smm /* Verify archive format. */ 404248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 405231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 406231200Smm 407231200Smm /* Close the archive. */ 408231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 409231200Smmcleanup: 410231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 411231200Smm} 412231200Smm 413231200Smmstatic void 414231200Smmtest_read_format_zip_filename_KOI8R_CP866(const char *refname) 415231200Smm{ 416231200Smm struct archive *a; 417231200Smm struct archive_entry *ae; 418231200Smm 419231200Smm /* 420231200Smm * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option. 421231200Smm */ 422231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia.866") && 423231200Smm NULL == setlocale(LC_ALL, "ru_RU.CP866")) { 424231200Smm skipping("ru_RU.CP866 locale not available on this system."); 425231200Smm return; 426231200Smm } 427231200Smm 428231200Smm assert((a = archive_read_new()) != NULL); 429231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 430231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 431231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 432231200Smm skipping("This system cannot convert character-set" 433231200Smm " from KOI8-R to CP866."); 434231200Smm goto cleanup; 435231200Smm } 436231200Smm assertEqualIntA(a, ARCHIVE_OK, 437231200Smm archive_read_open_filename(a, refname, 10240)); 438231200Smm 439231200Smm /* Verify regular file. */ 440231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 441231200Smm assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2", 442231200Smm archive_entry_pathname(ae)); 443231200Smm assertEqualInt(6, archive_entry_size(ae)); 444231200Smm 445231200Smm /* Verify regular file. */ 446231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 447231200Smm assertEqualString("\x8f\x90\x88\x82\x85\x92", 448231200Smm archive_entry_pathname(ae)); 449231200Smm assertEqualInt(6, archive_entry_size(ae)); 450231200Smm 451231200Smm 452231200Smm /* End of archive. */ 453231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 454231200Smm 455231200Smm /* Verify archive format. */ 456248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 457231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 458231200Smm 459231200Smm /* Close the archive. */ 460231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 461231200Smmcleanup: 462231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 463231200Smm} 464231200Smm 465231200Smmstatic void 466231200Smmtest_read_format_zip_filename_KOI8R_UTF8(const char *refname) 467231200Smm{ 468231200Smm struct archive *a; 469231200Smm struct archive_entry *ae; 470231200Smm 471231200Smm /* 472231200Smm * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option. 473231200Smm */ 474231200Smm if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 475231200Smm skipping("en_US.UTF-8 locale not available on this system."); 476231200Smm return; 477231200Smm } 478231200Smm 479231200Smm assert((a = archive_read_new()) != NULL); 480231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 481231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 482231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 483231200Smm skipping("This system cannot convert character-set" 484231200Smm " from KOI8-R to UTF-8."); 485231200Smm goto cleanup; 486231200Smm } 487231200Smm assertEqualIntA(a, ARCHIVE_OK, 488231200Smm archive_read_open_filename(a, refname, 10240)); 489231200Smm 490231200Smm /* Verify regular file. */ 491231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 492231200Smm assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 493231200Smm archive_entry_pathname(ae)); 494231200Smm assertEqualInt(6, archive_entry_size(ae)); 495231200Smm 496231200Smm /* Verify regular file. */ 497231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 498231200Smm assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 499231200Smm archive_entry_pathname(ae)); 500231200Smm assertEqualInt(6, archive_entry_size(ae)); 501231200Smm 502231200Smm 503231200Smm /* End of archive. */ 504231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 505231200Smm 506231200Smm /* Verify archive format. */ 507248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 508231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 509231200Smm 510231200Smm /* Close the archive. */ 511231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 512231200Smmcleanup: 513231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 514231200Smm} 515231200Smm 516231200Smmstatic void 517231200Smmtest_read_format_zip_filename_UTF8_KOI8R(const char *refname) 518231200Smm{ 519231200Smm struct archive *a; 520231200Smm struct archive_entry *ae; 521231200Smm 522231200Smm /* 523231200Smm * Read UTF-8 filename in ru_RU.KOI8-R with "hdrcharset=UTF-8" option. 524231200Smm */ 525231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") && 526231200Smm NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) { 527231200Smm skipping("ru_RU.KOI8-R locale not available on this system."); 528231200Smm return; 529231200Smm } 530231200Smm 531231200Smm assert((a = archive_read_new()) != NULL); 532231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 533231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 534231200Smm skipping("This system cannot convert character-set" 535231200Smm " from UTF-8 to KOI8-R."); 536231200Smm goto cleanup; 537231200Smm } 538231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 539231200Smm 540231200Smm /* Re-create a read archive object. */ 541231200Smm assert((a = archive_read_new()) != NULL); 542231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 543231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 544231200Smm assertEqualIntA(a, ARCHIVE_OK, 545231200Smm archive_read_open_filename(a, refname, 10240)); 546231200Smm 547231200Smm /* Verify regular file. */ 548231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 549231200Smm assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 550231200Smm archive_entry_pathname(ae)); 551231200Smm assertEqualInt(6, archive_entry_size(ae)); 552231200Smm 553231200Smm /* Verify regular file. */ 554231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 555231200Smm assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4", 556231200Smm archive_entry_pathname(ae)); 557231200Smm assertEqualInt(6, archive_entry_size(ae)); 558231200Smm 559231200Smm 560231200Smm /* End of archive. */ 561231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 562231200Smm 563231200Smm /* Verify archive format. */ 564248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 565231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 566231200Smm 567231200Smm /* Close the archive. */ 568231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 569231200Smmcleanup: 570231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 571231200Smm} 572231200Smm 573231200Smmstatic void 574231200Smmtest_read_format_zip_filename_UTF8_CP866(const char *refname) 575231200Smm{ 576231200Smm struct archive *a; 577231200Smm struct archive_entry *ae; 578231200Smm 579231200Smm /* 580231200Smm * Read UTF-8 filename in ru_RU.CP866 without charset option 581231200Smm * because the file name in the sample file is UTF-8 and 582231200Smm * Bit 11 of its general purpose bit flag is set. 583231200Smm */ 584231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia.866") && 585231200Smm NULL == setlocale(LC_ALL, "ru_RU.CP866")) { 586231200Smm skipping("ru_RU.CP866 locale not available on this system."); 587231200Smm return; 588231200Smm } 589231200Smm 590231200Smm assert((a = archive_read_new()) != NULL); 591231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 592231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 593231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 594231200Smm skipping("This system cannot convert character-set" 595231200Smm " from UTF-8 to CP866."); 596231200Smm goto cleanup; 597231200Smm } 598231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 599231200Smm 600231200Smm /* Re-create a read archive object. */ 601231200Smm assert((a = archive_read_new()) != NULL); 602231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 603231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 604231200Smm assertEqualIntA(a, ARCHIVE_OK, 605231200Smm archive_read_open_filename(a, refname, 10240)); 606231200Smm 607231200Smm /* Verify regular file. */ 608231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 609231200Smm assertEqualString("\x8f\x90\x88\x82\x85\x92", 610231200Smm archive_entry_pathname(ae)); 611231200Smm assertEqualInt(6, archive_entry_size(ae)); 612231200Smm 613231200Smm /* Verify regular file. */ 614231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 615231200Smm assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2", 616231200Smm archive_entry_pathname(ae)); 617231200Smm assertEqualInt(6, archive_entry_size(ae)); 618231200Smm 619231200Smm 620231200Smm /* End of archive. */ 621231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 622231200Smm 623231200Smm /* Verify archive format. */ 624248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 625231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 626231200Smm 627231200Smm /* Close the archive. */ 628231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 629231200Smmcleanup: 630231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 631231200Smm} 632231200Smm 633231200Smmstatic void 634231200Smmtest_read_format_zip_filename_UTF8_UTF8_ru(const char *refname) 635231200Smm{ 636231200Smm struct archive *a; 637231200Smm struct archive_entry *ae; 638231200Smm 639231200Smm /* 640231200Smm * Read UTF-8 filename in en_US.UTF-8 without charset option 641231200Smm * because the file name in the sample file is UTF-8 and 642231200Smm * Bit 11 of its general purpose bit flag is set. 643231200Smm */ 644231200Smm if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 645231200Smm skipping("en_US.UTF-8 locale not available on this system."); 646231200Smm return; 647231200Smm } 648231200Smm 649231200Smm assert((a = archive_read_new()) != NULL); 650231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 651231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 652231200Smm assertEqualIntA(a, ARCHIVE_OK, 653231200Smm archive_read_open_filename(a, refname, 10240)); 654231200Smm 655231200Smm /* Verify regular file. */ 656231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 657231200Smm assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 658231200Smm archive_entry_pathname(ae)); 659231200Smm assertEqualInt(6, archive_entry_size(ae)); 660231200Smm 661231200Smm /* Verify regular file. */ 662231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 663231200Smm assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 664231200Smm archive_entry_pathname(ae)); 665231200Smm assertEqualInt(6, archive_entry_size(ae)); 666231200Smm 667231200Smm 668231200Smm /* End of archive. */ 669231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 670231200Smm 671231200Smm /* Verify archive format. */ 672248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 673231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 674231200Smm 675231200Smm /* Close the archive. */ 676231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 677231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 678231200Smm} 679231200Smm 680231200Smmstatic void 681231200Smmtest_read_format_zip_filename_CP932_CP932(const char *refname) 682231200Smm{ 683231200Smm struct archive *a; 684231200Smm struct archive_entry *ae; 685231200Smm 686231200Smm /* 687231200Smm * Read CP932 filename in CP932/SJIS with "hdrcharset=CP932" option. 688231200Smm */ 689231200Smm if (NULL == setlocale(LC_ALL, "Japanese_Japan") && 690231200Smm NULL == setlocale(LC_ALL, "ja_JP.SJIS")) { 691231200Smm skipping("CP932 locale not available on this system."); 692231200Smm return; 693231200Smm } 694231200Smm 695231200Smm assert((a = archive_read_new()) != NULL); 696231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 697231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 698231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) { 699231200Smm skipping("This system cannot convert character-set" 700231200Smm " from CP932."); 701231200Smm goto cleanup; 702231200Smm } 703231200Smm assertEqualIntA(a, ARCHIVE_OK, 704231200Smm archive_read_open_filename(a, refname, 10240)); 705231200Smm 706231200Smm /* Verify regular file. */ 707231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 708231200Smm assertEqualString( 709231200Smm "\x95\x5c\x82\xbe\x82\xe6\x2f\x88\xea\x97\x97\x95\x5c.txt", 710231200Smm archive_entry_pathname(ae)); 711231200Smm assertEqualInt(5, archive_entry_size(ae)); 712231200Smm 713231200Smm /* Verify regular file. */ 714231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 715231200Smm assertEqualString( 716231200Smm "\x95\x5c\x82\xbe\x82\xe6\x2f\x8a\xbf\x8e\x9a.txt", 717231200Smm archive_entry_pathname(ae)); 718231200Smm assertEqualInt(5, archive_entry_size(ae)); 719231200Smm 720231200Smm 721231200Smm /* End of archive. */ 722231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 723231200Smm 724231200Smm /* Verify archive format. */ 725248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 726231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 727231200Smm 728231200Smm /* Close the archive. */ 729231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 730231200Smmcleanup: 731231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 732231200Smm} 733231200Smm 734231200Smmstatic void 735231200Smmtest_read_format_zip_filename_UTF8_CP932(const char *refname) 736231200Smm{ 737231200Smm struct archive *a; 738231200Smm struct archive_entry *ae; 739231200Smm 740231200Smm /* 741231200Smm * Read UTF-8 filename in CP932/SJIS without charset option 742231200Smm * because the file name in the sample file is UTF-8 and 743231200Smm * Bit 11 of its general purpose bit flag is set. 744231200Smm */ 745231200Smm if (NULL == setlocale(LC_ALL, "Japanese_Japan") && 746231200Smm NULL == setlocale(LC_ALL, "ja_JP.SJIS")) { 747231200Smm skipping("CP932 locale not available on this system."); 748231200Smm return; 749231200Smm } 750231200Smm 751231200Smm assert((a = archive_read_new()) != NULL); 752231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 753231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 754231200Smm skipping("This system cannot convert character-set" 755231200Smm " from UTF-8 to CP932."); 756231200Smm goto cleanup; 757231200Smm } 758231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 759231200Smm 760231200Smm /* Re-create a read archive object. */ 761231200Smm assert((a = archive_read_new()) != NULL); 762231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 763231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 764231200Smm assertEqualIntA(a, ARCHIVE_OK, 765231200Smm archive_read_open_filename(a, refname, 10240)); 766231200Smm 767231200Smm /* Verify regular file. */ 768231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 769231200Smm assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 770231200Smm assertEqualString( 771231200Smm "\x95\x5c\x82\xbe\x82\xe6\x2f", 772231200Smm archive_entry_pathname(ae)); 773231200Smm assertEqualInt(0, archive_entry_size(ae)); 774231200Smm 775231200Smm /* Verify directory file. */ 776231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 777231200Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 778231200Smm assertEqualString( 779231200Smm "\x95\x5c\x82\xbe\x82\xe6\x2f\x88\xea\x97\x97\x95\x5c.txt", 780231200Smm archive_entry_pathname(ae)); 781231200Smm assertEqualInt(5, archive_entry_size(ae)); 782231200Smm 783231200Smm /* Verify regular file. */ 784231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 785231200Smm assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 786231200Smm assertEqualString( 787231200Smm "\x95\x5c\x82\xbe\x82\xe6\x2f\x8a\xbf\x8e\x9a.txt", 788231200Smm archive_entry_pathname(ae)); 789231200Smm assertEqualInt(5, archive_entry_size(ae)); 790231200Smm 791231200Smm /* End of archive. */ 792231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 793231200Smm 794231200Smm /* Verify archive format. */ 795248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 796231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 797231200Smm 798231200Smm /* Close the archive. */ 799231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 800231200Smmcleanup: 801231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 802231200Smm} 803231200Smm 804231200Smmstatic void 805231200Smmtest_read_format_zip_filename_CP866_CP1251(const char *refname) 806231200Smm{ 807231200Smm struct archive *a; 808231200Smm struct archive_entry *ae; 809231200Smm 810231200Smm /* 811231200Smm * Read CP866 filename in CP1251 with "hdrcharset=CP866" option. 812231200Smm */ 813231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia") && 814231200Smm NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 815231200Smm skipping("CP1251 locale not available on this system."); 816231200Smm return; 817231200Smm } 818231200Smm 819231200Smm assert((a = archive_read_new()) != NULL); 820231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 821231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 822231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 823231200Smm skipping("This system cannot convert character-set" 824231200Smm " from CP866 to CP1251."); 825231200Smm goto cleanup; 826231200Smm } 827231200Smm assertEqualIntA(a, ARCHIVE_OK, 828231200Smm archive_read_open_filename(a, refname, 10240)); 829231200Smm 830231200Smm /* Verify regular file. */ 831231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 832231200Smm assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 833231200Smm archive_entry_pathname(ae)); 834231200Smm assertEqualInt(6, archive_entry_size(ae)); 835231200Smm 836231200Smm /* Verify regular file. */ 837231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 838231200Smm assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 839231200Smm archive_entry_pathname(ae)); 840231200Smm assertEqualInt(6, archive_entry_size(ae)); 841231200Smm 842231200Smm 843231200Smm /* End of archive. */ 844231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 845231200Smm 846231200Smm /* Verify archive format. */ 847248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 848231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 849231200Smm 850231200Smm /* Close the archive. */ 851231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 852231200Smmcleanup: 853231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 854231200Smm} 855231200Smm 856231200Smm/* 857231200Smm * This test only for Windows platform because other archiver 858231200Smm * applications on Windows translate CP1251 filenames into CP866 859231200Smm * filenames and store it in the zip file and so we should read 860231200Smm * it by default on Windows. 861231200Smm */ 862231200Smmstatic void 863231200Smmtest_read_format_zip_filename_CP866_CP1251_win(const char *refname) 864231200Smm{ 865231200Smm struct archive *a; 866231200Smm struct archive_entry *ae; 867231200Smm 868231200Smm /* 869231200Smm * Read CP866 filename in CP1251 without "hdrcharset=CP866" option. 870231200Smm */ 871231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia")) { 872231200Smm skipping("Russian_Russia locale not available on this system."); 873231200Smm return; 874231200Smm } 875231200Smm 876231200Smm assert((a = archive_read_new()) != NULL); 877231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 878231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 879231200Smm assertEqualIntA(a, ARCHIVE_OK, 880231200Smm archive_read_open_filename(a, refname, 10240)); 881231200Smm 882231200Smm /* Verify regular file. */ 883231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 884231200Smm assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 885231200Smm archive_entry_pathname(ae)); 886231200Smm assertEqualInt(6, archive_entry_size(ae)); 887231200Smm 888231200Smm /* Verify regular file. */ 889231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 890231200Smm assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 891231200Smm archive_entry_pathname(ae)); 892231200Smm assertEqualInt(6, archive_entry_size(ae)); 893231200Smm 894231200Smm 895231200Smm /* End of archive. */ 896231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 897231200Smm 898231200Smm /* Verify archive format. */ 899248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 900231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 901231200Smm 902231200Smm /* Close the archive. */ 903231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 904231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 905231200Smm} 906231200Smm 907231200Smmstatic void 908231200Smmtest_read_format_zip_filename_KOI8R_CP1251(const char *refname) 909231200Smm{ 910231200Smm struct archive *a; 911231200Smm struct archive_entry *ae; 912231200Smm 913231200Smm /* 914231200Smm * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option. 915231200Smm */ 916231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia") && 917231200Smm NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 918231200Smm skipping("CP1251 locale not available on this system."); 919231200Smm return; 920231200Smm } 921231200Smm 922231200Smm assert((a = archive_read_new()) != NULL); 923231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 924231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 925231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 926231200Smm skipping("This system cannot convert character-set" 927231200Smm " from KOI8-R to CP1251."); 928231200Smm goto cleanup; 929231200Smm } 930231200Smm assertEqualIntA(a, ARCHIVE_OK, 931231200Smm archive_read_open_filename(a, refname, 10240)); 932231200Smm 933231200Smm /* Verify regular file. */ 934231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 935231200Smm assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 936231200Smm archive_entry_pathname(ae)); 937231200Smm assertEqualInt(6, archive_entry_size(ae)); 938231200Smm 939231200Smm /* Verify regular file. */ 940231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 941231200Smm assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 942231200Smm archive_entry_pathname(ae)); 943231200Smm assertEqualInt(6, archive_entry_size(ae)); 944231200Smm 945231200Smm 946231200Smm /* End of archive. */ 947231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 948231200Smm 949231200Smm /* Verify archive format. */ 950248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 951231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 952231200Smm 953231200Smm /* Close the archive. */ 954231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 955231200Smmcleanup: 956231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 957231200Smm} 958231200Smm 959231200Smmstatic void 960231200Smmtest_read_format_zip_filename_UTF8_CP1251(const char *refname) 961231200Smm{ 962231200Smm struct archive *a; 963231200Smm struct archive_entry *ae; 964231200Smm 965231200Smm /* 966231200Smm * Read UTF-8 filename in CP1251 without charset option 967231200Smm * because the file name in the sample file is UTF-8 and 968231200Smm * Bit 11 of its general purpose bit flag is set. 969231200Smm */ 970231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia") && 971231200Smm NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 972231200Smm skipping("CP1251 locale not available on this system."); 973231200Smm return; 974231200Smm } 975231200Smm 976231200Smm assert((a = archive_read_new()) != NULL); 977231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 978231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) { 979231200Smm skipping("This system cannot convert character-set" 980231200Smm " from UTF-8 to CP1251."); 981231200Smm goto cleanup; 982231200Smm } 983231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 984231200Smm 985231200Smm /* Re-create a read archive object. */ 986231200Smm assert((a = archive_read_new()) != NULL); 987231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 988231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 989231200Smm assertEqualIntA(a, ARCHIVE_OK, 990231200Smm archive_read_open_filename(a, refname, 10240)); 991231200Smm 992231200Smm /* Verify regular file. */ 993231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 994231200Smm assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 995231200Smm archive_entry_pathname(ae)); 996231200Smm assertEqualInt(6, archive_entry_size(ae)); 997231200Smm 998231200Smm /* Verify regular file. */ 999231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1000231200Smm assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 1001231200Smm archive_entry_pathname(ae)); 1002231200Smm assertEqualInt(6, archive_entry_size(ae)); 1003231200Smm 1004231200Smm 1005231200Smm /* End of archive. */ 1006231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 1007231200Smm 1008231200Smm /* Verify archive format. */ 1009248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 1010231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 1011231200Smm 1012231200Smm /* Close the archive. */ 1013231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 1014231200Smmcleanup: 1015231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 1016231200Smm} 1017231200Smm 1018231200Smm/* 1019231200Smm * The sample zip file was made in LANG=KOI8-R and it contains two 1020231200Smm * files the charset of which are different. 1021231200Smm * - the filename of first file is stored in KOI8-R. 1022231200Smm * - the filename of second file is stored in UTF-8. 1023231200Smm * 1024231200Smm * Whenever hdrcharset option is specified, we will correctly read the 1025231200Smm * filename of sencod file, which is stored in UTF-8. 1026231200Smm */ 1027231200Smm 1028231200Smmstatic void 1029231200Smmtest_read_format_zip_filename_KOI8R_UTF8_2(const char *refname) 1030231200Smm{ 1031231200Smm struct archive *a; 1032231200Smm struct archive_entry *ae; 1033231200Smm 1034231200Smm /* 1035231200Smm * Read filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option. 1036231200Smm */ 1037231200Smm if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 1038231200Smm skipping("en_US.UTF-8 locale not available on this system."); 1039231200Smm return; 1040231200Smm } 1041231200Smm 1042231200Smm assert((a = archive_read_new()) != NULL); 1043231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 1044231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 1045231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 1046231200Smm skipping("This system cannot convert character-set" 1047231200Smm " from KOI8-R to UTF-8."); 1048231200Smm goto next_test; 1049231200Smm } 1050231200Smm assertEqualIntA(a, ARCHIVE_OK, 1051231200Smm archive_read_open_filename(a, refname, 10240)); 1052231200Smm 1053231200Smm /* Verify regular first file. */ 1054231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1055231200Smm assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 1056231200Smm archive_entry_pathname(ae)); 1057231200Smm assertEqualInt(6, archive_entry_size(ae)); 1058231200Smm 1059231200Smm /* 1060231200Smm * Verify regular second file. 1061231200Smm * The filename is not translated because Bit 11 of its general 1062231200Smm * purpose bit flag is set and so we know the conversion is unneeded. 1063231200Smm */ 1064231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1065231200Smm assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 1066231200Smm archive_entry_pathname(ae)); 1067231200Smm assertEqualInt(6, archive_entry_size(ae)); 1068231200Smm 1069231200Smm 1070231200Smm /* End of archive. */ 1071231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 1072231200Smm 1073231200Smm /* Verify archive format. */ 1074248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 1075231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 1076231200Smm 1077231200Smm /* Close the archive. */ 1078231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 1079231200Smmnext_test: 1080231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 1081231200Smm 1082231200Smm /* 1083231200Smm * Read filename in en_US.UTF-8 without "hdrcharset=KOI8-R" option. 1084231200Smm * The filename we can properly read is only second file. 1085231200Smm */ 1086231200Smm assert((a = archive_read_new()) != NULL); 1087231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 1088231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 1089231200Smm assertEqualIntA(a, ARCHIVE_OK, 1090231200Smm archive_read_open_filename(a, refname, 10240)); 1091231200Smm 1092231200Smm /* 1093231200Smm * Verify regular first file. 1094231200Smm * The filename is not translated to UTF-8 because Bit 11 of 1095231200Smm * its general purpose bit flag is *not* set and so there is 1096231200Smm * not way to know its charset. 1097231200Smm */ 1098231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1099231200Smm /* A filename is in KOI8-R. */ 1100231200Smm assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 1101231200Smm archive_entry_pathname(ae)); 1102231200Smm assertEqualInt(6, archive_entry_size(ae)); 1103231200Smm 1104231200Smm /* Verify regular file. */ 1105231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 1106231200Smm assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 1107231200Smm archive_entry_pathname(ae)); 1108231200Smm assertEqualInt(6, archive_entry_size(ae)); 1109231200Smm 1110231200Smm 1111231200Smm /* End of archive. */ 1112231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 1113231200Smm 1114231200Smm /* Verify archive format. */ 1115248616Smm assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 1116231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 1117231200Smm 1118231200Smm /* Close the archive. */ 1119231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 1120231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 1121231200Smm} 1122231200Smm 1123231200SmmDEFINE_TEST(test_read_format_zip_filename) 1124231200Smm{ 1125231200Smm const char *refname1 = "test_read_format_zip_filename_cp932.zip"; 1126231200Smm const char *refname2 = "test_read_format_zip_filename_utf8_jp.zip"; 1127231200Smm const char *refname3 = "test_read_format_zip_filename_cp866.zip"; 1128231200Smm const char *refname4 = "test_read_format_zip_filename_koi8r.zip"; 1129231200Smm const char *refname5 = "test_read_format_zip_filename_utf8_ru.zip"; 1130231200Smm const char *refname6 = "test_read_format_zip_filename_utf8_ru2.zip"; 1131231200Smm 1132231200Smm extract_reference_file(refname1); 1133231200Smm test_read_format_zip_filename_CP932_eucJP(refname1); 1134231200Smm test_read_format_zip_filename_CP932_UTF8(refname1); 1135231200Smm test_read_format_zip_filename_CP932_CP932(refname1); 1136231200Smm 1137231200Smm extract_reference_file(refname2); 1138231200Smm test_read_format_zip_filename_UTF8_eucJP(refname2); 1139231200Smm test_read_format_zip_filename_UTF8_UTF8(refname2); 1140231200Smm test_read_format_zip_filename_UTF8_CP932(refname2); 1141231200Smm 1142231200Smm extract_reference_file(refname3); 1143231200Smm test_read_format_zip_filename_CP866_KOI8R(refname3); 1144231200Smm test_read_format_zip_filename_CP866_UTF8(refname3); 1145231200Smm test_read_format_zip_filename_CP866_CP1251(refname3); 1146231200Smm test_read_format_zip_filename_CP866_CP1251_win(refname3); 1147231200Smm 1148231200Smm extract_reference_file(refname4); 1149231200Smm test_read_format_zip_filename_KOI8R_CP866(refname4); 1150231200Smm test_read_format_zip_filename_KOI8R_UTF8(refname4); 1151231200Smm test_read_format_zip_filename_KOI8R_CP1251(refname4); 1152231200Smm 1153231200Smm extract_reference_file(refname5); 1154231200Smm test_read_format_zip_filename_UTF8_KOI8R(refname5); 1155231200Smm test_read_format_zip_filename_UTF8_CP866(refname5); 1156231200Smm test_read_format_zip_filename_UTF8_UTF8_ru(refname5); 1157231200Smm test_read_format_zip_filename_UTF8_CP1251(refname5); 1158231200Smm 1159231200Smm /* The filenames contained in refname6 are different charset. */ 1160231200Smm extract_reference_file(refname6); 1161231200Smm test_read_format_zip_filename_KOI8R_UTF8_2(refname6); 1162231200Smm} 1163