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