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 30299529SmmDEFINE_TEST(test_read_format_gtar_filename_eucJP_UTF8) 31231200Smm{ 32299529Smm const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z"; 33231200Smm struct archive *a; 34231200Smm struct archive_entry *ae; 35231200Smm 36231200Smm /* 37231200Smm * Read eucJP filename in en_US.UTF-8 with "hdrcharset=eucJP" option. 38231200Smm */ 39231200Smm if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 40231200Smm skipping("en_US.UTF-8 locale not available on this system."); 41231200Smm return; 42231200Smm } 43299529Smm extract_reference_file(refname); 44231200Smm 45231200Smm assert((a = archive_read_new()) != NULL); 46231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 47231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 48231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) { 49231200Smm skipping("This system cannot convert character-set" 50231200Smm " from eucJP to UTF-8."); 51231200Smm goto cleanup; 52231200Smm } 53231200Smm assertEqualIntA(a, ARCHIVE_OK, 54231200Smm archive_read_open_filename(a, refname, 10240)); 55231200Smm 56231200Smm /* Verify regular file. */ 57231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 58231200Smm assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt", 59231200Smm archive_entry_pathname(ae)); 60231200Smm assertEqualInt(8, archive_entry_size(ae)); 61231200Smm 62231200Smm /* Verify regular file. */ 63231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 64231200Smm assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae)); 65231200Smm assertEqualInt(4, archive_entry_size(ae)); 66299529Smm assertEqualInt(archive_entry_is_encrypted(ae), 0); 67299529Smm assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 68231200Smm 69231200Smm 70231200Smm /* End of archive. */ 71231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 72231200Smm 73231200Smm /* Verify archive format. */ 74231200Smm assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 75231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, 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 83299529SmmDEFINE_TEST(test_read_format_gtar_filename_CP866_KOI8R) 84231200Smm{ 85299529Smm const char *refname = "test_read_format_gtar_filename_cp866.tar.Z"; 86231200Smm struct archive *a; 87231200Smm struct archive_entry *ae; 88231200Smm 89231200Smm /* 90231200Smm * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option. 91231200Smm */ 92231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") && 93231200Smm NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) { 94231200Smm skipping("ru_RU.KOI8-R locale not available on this system."); 95231200Smm return; 96231200Smm } 97299529Smm extract_reference_file(refname); 98231200Smm 99231200Smm assert((a = archive_read_new()) != NULL); 100231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 101231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 102231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 103231200Smm skipping("This system cannot convert character-set" 104231200Smm " from CP866 to KOI8-R."); 105231200Smm goto cleanup; 106231200Smm } 107231200Smm assertEqualIntA(a, ARCHIVE_OK, 108231200Smm archive_read_open_filename(a, refname, 10240)); 109231200Smm 110231200Smm /* Verify regular file. */ 111231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 112231200Smm assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4", 113231200Smm archive_entry_pathname(ae)); 114231200Smm assertEqualInt(6, archive_entry_size(ae)); 115231200Smm 116231200Smm /* Verify regular file. */ 117231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 118231200Smm assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4", 119231200Smm archive_entry_pathname(ae)); 120231200Smm assertEqualInt(6, archive_entry_size(ae)); 121231200Smm 122231200Smm 123231200Smm /* End of archive. */ 124231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 125231200Smm 126231200Smm /* Verify archive format. */ 127231200Smm assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 128231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 129231200Smm 130231200Smm /* Close the archive. */ 131231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 132231200Smmcleanup: 133231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 134231200Smm} 135231200Smm 136299529SmmDEFINE_TEST(test_read_format_gtar_filename_CP866_UTF8) 137231200Smm{ 138299529Smm const char *refname = "test_read_format_gtar_filename_cp866.tar.Z"; 139231200Smm struct archive *a; 140231200Smm struct archive_entry *ae; 141231200Smm 142231200Smm /* 143231200Smm * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option. 144231200Smm */ 145231200Smm if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 146231200Smm skipping("en_US.UTF-8 locale not available on this system."); 147231200Smm return; 148231200Smm } 149299529Smm extract_reference_file(refname); 150231200Smm 151231200Smm assert((a = archive_read_new()) != NULL); 152231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 153231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 154231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 155231200Smm skipping("This system cannot convert character-set" 156231200Smm " from CP866 to UTF-8."); 157231200Smm goto cleanup; 158231200Smm } 159231200Smm assertEqualIntA(a, ARCHIVE_OK, 160231200Smm archive_read_open_filename(a, refname, 10240)); 161231200Smm 162231200Smm /* Verify regular file. */ 163231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 164231200Smm assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 165231200Smm archive_entry_pathname(ae)); 166231200Smm assertEqualInt(6, archive_entry_size(ae)); 167231200Smm 168231200Smm /* Verify regular file. */ 169231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 170231200Smm assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 171231200Smm archive_entry_pathname(ae)); 172231200Smm assertEqualInt(6, archive_entry_size(ae)); 173231200Smm 174231200Smm 175231200Smm /* End of archive. */ 176231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 177231200Smm 178231200Smm /* Verify archive format. */ 179231200Smm assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 180231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 181231200Smm 182231200Smm /* Close the archive. */ 183231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 184231200Smmcleanup: 185231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 186231200Smm} 187231200Smm 188299529SmmDEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP866) 189231200Smm{ 190299529Smm const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z"; 191231200Smm struct archive *a; 192231200Smm struct archive_entry *ae; 193231200Smm 194231200Smm /* 195231200Smm * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option. 196231200Smm */ 197231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia.866") && 198231200Smm NULL == setlocale(LC_ALL, "ru_RU.CP866")) { 199231200Smm skipping("ru_RU.CP866 locale not available on this system."); 200231200Smm return; 201231200Smm } 202299529Smm extract_reference_file(refname); 203231200Smm 204231200Smm assert((a = archive_read_new()) != NULL); 205231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 206231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 207231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 208231200Smm skipping("This system cannot convert character-set" 209231200Smm " from KOI8-R to CP866."); 210231200Smm goto cleanup; 211231200Smm } 212231200Smm assertEqualIntA(a, ARCHIVE_OK, 213231200Smm archive_read_open_filename(a, refname, 10240)); 214231200Smm 215231200Smm /* Verify regular file. */ 216231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 217231200Smm assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2", 218231200Smm archive_entry_pathname(ae)); 219231200Smm assertEqualInt(6, archive_entry_size(ae)); 220231200Smm 221231200Smm /* Verify regular file. */ 222231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 223231200Smm assertEqualString("\x8f\x90\x88\x82\x85\x92", 224231200Smm archive_entry_pathname(ae)); 225231200Smm assertEqualInt(6, archive_entry_size(ae)); 226231200Smm 227231200Smm 228231200Smm /* End of archive. */ 229231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 230231200Smm 231231200Smm /* Verify archive format. */ 232231200Smm assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 233231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 234231200Smm 235231200Smm /* Close the archive. */ 236231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 237231200Smmcleanup: 238231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 239231200Smm} 240231200Smm 241299529SmmDEFINE_TEST(test_read_format_gtar_filename_KOI8R_UTF8) 242231200Smm{ 243299529Smm const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z"; 244231200Smm struct archive *a; 245231200Smm struct archive_entry *ae; 246231200Smm 247231200Smm /* 248231200Smm * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option. 249231200Smm */ 250231200Smm if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { 251231200Smm skipping("en_US.UTF-8 locale not available on this system."); 252231200Smm return; 253231200Smm } 254299529Smm extract_reference_file(refname); 255231200Smm 256231200Smm assert((a = archive_read_new()) != NULL); 257231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 258231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 259231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 260231200Smm skipping("This system cannot convert character-set" 261231200Smm " from KOI8-R to UTF-8."); 262231200Smm goto cleanup; 263231200Smm } 264231200Smm assertEqualIntA(a, ARCHIVE_OK, 265231200Smm archive_read_open_filename(a, refname, 10240)); 266231200Smm 267231200Smm /* Verify regular file. */ 268231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 269231200Smm assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82", 270231200Smm archive_entry_pathname(ae)); 271231200Smm assertEqualInt(6, archive_entry_size(ae)); 272231200Smm 273231200Smm /* Verify regular file. */ 274231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 275231200Smm assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2", 276231200Smm archive_entry_pathname(ae)); 277231200Smm assertEqualInt(6, archive_entry_size(ae)); 278231200Smm 279231200Smm 280231200Smm /* End of archive. */ 281231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 282231200Smm 283231200Smm /* Verify archive format. */ 284231200Smm assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 285231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 286231200Smm 287231200Smm /* Close the archive. */ 288231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 289231200Smmcleanup: 290231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 291231200Smm} 292231200Smm 293299529SmmDEFINE_TEST(test_read_format_gtar_filename_eucJP_CP932) 294231200Smm{ 295299529Smm const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z"; 296231200Smm struct archive *a; 297231200Smm struct archive_entry *ae; 298231200Smm 299231200Smm /* 300231200Smm * Read eucJP filename in CP932/SJIS with "hdrcharset=eucJP" option. 301231200Smm */ 302231200Smm if (NULL == setlocale(LC_ALL, "Japanese_Japan") && 303231200Smm NULL == setlocale(LC_ALL, "ja_JP.SJIS")) { 304231200Smm skipping("CP932 locale not available on this system."); 305231200Smm return; 306231200Smm } 307299529Smm extract_reference_file(refname); 308231200Smm 309231200Smm assert((a = archive_read_new()) != NULL); 310231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 311231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 312231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) { 313231200Smm skipping("This system cannot convert character-set" 314231200Smm " from eucJP."); 315231200Smm goto cleanup; 316231200Smm } 317231200Smm assertEqualIntA(a, ARCHIVE_OK, 318231200Smm archive_read_open_filename(a, refname, 10240)); 319231200Smm 320231200Smm /* Verify regular file. */ 321231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 322231200Smm assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae)); 323231200Smm assertEqualInt(8, archive_entry_size(ae)); 324231200Smm 325231200Smm /* Verify regular file. */ 326231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 327231200Smm assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae)); 328231200Smm assertEqualInt(4, archive_entry_size(ae)); 329231200Smm 330231200Smm 331231200Smm /* End of archive. */ 332231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 333231200Smm 334231200Smm /* Verify archive format. */ 335231200Smm assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 336231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 337231200Smm 338231200Smm /* Close the archive. */ 339231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 340231200Smmcleanup: 341231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 342231200Smm} 343231200Smm 344299529SmmDEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251) 345231200Smm{ 346299529Smm const char *refname = "test_read_format_gtar_filename_cp866.tar.Z"; 347231200Smm struct archive *a; 348231200Smm struct archive_entry *ae; 349231200Smm 350231200Smm /* 351231200Smm * Read CP866 filename in CP1251 with "hdrcharset=CP866" option. 352231200Smm */ 353231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia") && 354231200Smm NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 355231200Smm skipping("CP1251 locale not available on this system."); 356231200Smm return; 357231200Smm } 358299529Smm extract_reference_file(refname); 359231200Smm 360231200Smm assert((a = archive_read_new()) != NULL); 361231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 362231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 363231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) { 364231200Smm skipping("This system cannot convert character-set" 365231200Smm " from CP866 to CP1251."); 366231200Smm goto cleanup; 367231200Smm } 368231200Smm assertEqualIntA(a, ARCHIVE_OK, 369231200Smm archive_read_open_filename(a, refname, 10240)); 370231200Smm 371231200Smm /* Verify regular file. */ 372231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 373231200Smm assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 374231200Smm archive_entry_pathname(ae)); 375231200Smm assertEqualInt(6, archive_entry_size(ae)); 376231200Smm 377231200Smm /* Verify regular file. */ 378231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 379231200Smm assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 380231200Smm archive_entry_pathname(ae)); 381231200Smm assertEqualInt(6, archive_entry_size(ae)); 382231200Smm 383231200Smm 384231200Smm /* End of archive. */ 385231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 386231200Smm 387231200Smm /* Verify archive format. */ 388231200Smm assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 389231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 390231200Smm 391231200Smm /* Close the archive. */ 392231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 393231200Smmcleanup: 394231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 395231200Smm} 396231200Smm 397231200Smm/* 398231200Smm * This test only for Windows platform because other archiver 399231200Smm * applications on Windows translate CP1251 filenames into CP866 400231200Smm * filenames and store it in the gtar file and so we should read 401231200Smm * it by default on Windows. 402231200Smm */ 403299529SmmDEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251_win) 404231200Smm{ 405299529Smm const char *refname = "test_read_format_gtar_filename_cp866.tar.Z"; 406231200Smm struct archive *a; 407231200Smm struct archive_entry *ae; 408231200Smm 409231200Smm /* 410231200Smm * Read CP866 filename in CP1251 without "hdrcharset=CP866" option. 411231200Smm */ 412231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia")) { 413231200Smm skipping("Russian_Russia locale not available on this system."); 414231200Smm return; 415231200Smm } 416299529Smm extract_reference_file(refname); 417231200Smm 418231200Smm assert((a = archive_read_new()) != NULL); 419231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 420231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 421231200Smm assertEqualIntA(a, ARCHIVE_OK, 422231200Smm archive_read_open_filename(a, refname, 10240)); 423231200Smm 424231200Smm /* Verify regular file. */ 425231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 426231200Smm assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 427231200Smm archive_entry_pathname(ae)); 428231200Smm assertEqualInt(6, archive_entry_size(ae)); 429231200Smm 430231200Smm /* Verify regular file. */ 431231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 432231200Smm assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 433231200Smm archive_entry_pathname(ae)); 434231200Smm assertEqualInt(6, archive_entry_size(ae)); 435231200Smm 436231200Smm 437231200Smm /* End of archive. */ 438231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 439231200Smm 440231200Smm /* Verify archive format. */ 441231200Smm assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 442231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 443231200Smm 444231200Smm /* Close the archive. */ 445231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 446231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 447231200Smm} 448231200Smm 449299529SmmDEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP1251) 450231200Smm{ 451299529Smm const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z"; 452231200Smm struct archive *a; 453231200Smm struct archive_entry *ae; 454231200Smm 455231200Smm /* 456231200Smm * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option. 457231200Smm */ 458231200Smm if (NULL == setlocale(LC_ALL, "Russian_Russia") && 459231200Smm NULL == setlocale(LC_ALL, "ru_RU.CP1251")) { 460231200Smm skipping("CP1251 locale not available on this system."); 461231200Smm return; 462231200Smm } 463299529Smm extract_reference_file(refname); 464231200Smm 465231200Smm assert((a = archive_read_new()) != NULL); 466231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 467231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 468231200Smm if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) { 469231200Smm skipping("This system cannot convert character-set" 470231200Smm " from KOI8-R to CP1251."); 471231200Smm goto cleanup; 472231200Smm } 473231200Smm assertEqualIntA(a, ARCHIVE_OK, 474231200Smm archive_read_open_filename(a, refname, 10240)); 475231200Smm 476231200Smm /* Verify regular file. */ 477231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 478231200Smm assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2", 479231200Smm archive_entry_pathname(ae)); 480231200Smm assertEqualInt(6, archive_entry_size(ae)); 481231200Smm 482231200Smm /* Verify regular file. */ 483231200Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 484231200Smm assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2", 485231200Smm archive_entry_pathname(ae)); 486231200Smm assertEqualInt(6, archive_entry_size(ae)); 487231200Smm 488231200Smm 489231200Smm /* End of archive. */ 490231200Smm assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 491231200Smm 492231200Smm /* Verify archive format. */ 493231200Smm assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); 494231200Smm assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); 495231200Smm 496231200Smm /* Close the archive. */ 497231200Smm assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 498231200Smmcleanup: 499231200Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 500231200Smm} 501231200Smm 502