2 * Copyright (c) 2011 Michihiro NAKAJIMA
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 DEFINE_TEST(test_read_format_gtar_filename_eucJP_UTF8)
32 const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z";
34 struct archive_entry *ae;
37 * Read eucJP filename in en_US.UTF-8 with "hdrcharset=eucJP" option.
39 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
40 skipping("en_US.UTF-8 locale not available on this system.");
43 extract_reference_file(refname);
45 assert((a = archive_read_new()) != NULL);
46 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
47 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
48 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
49 skipping("This system cannot convert character-set"
50 " from eucJP to UTF-8.");
53 assertEqualIntA(a, ARCHIVE_OK,
54 archive_read_open_filename(a, refname, 10240));
56 /* Verify regular file. */
57 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
58 assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt",
59 archive_entry_pathname(ae));
60 assertEqualInt(8, archive_entry_size(ae));
62 /* Verify regular file. */
63 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
64 assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae));
65 assertEqualInt(4, archive_entry_size(ae));
66 assertEqualInt(archive_entry_is_encrypted(ae), 0);
67 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
71 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
73 /* Verify archive format. */
74 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
75 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
77 /* Close the archive. */
78 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
80 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
83 DEFINE_TEST(test_read_format_gtar_filename_CP866_KOI8R)
85 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
87 struct archive_entry *ae;
90 * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option.
92 if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") &&
93 NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
94 skipping("ru_RU.KOI8-R locale not available on this system.");
97 extract_reference_file(refname);
99 assert((a = archive_read_new()) != NULL);
100 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
101 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
102 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
103 skipping("This system cannot convert character-set"
104 " from CP866 to KOI8-R.");
107 assertEqualIntA(a, ARCHIVE_OK,
108 archive_read_open_filename(a, refname, 10240));
110 /* Verify regular file. */
111 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
112 assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
113 archive_entry_pathname(ae));
114 assertEqualInt(6, archive_entry_size(ae));
116 /* Verify regular file. */
117 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
118 assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
119 archive_entry_pathname(ae));
120 assertEqualInt(6, archive_entry_size(ae));
123 /* End of archive. */
124 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
126 /* Verify archive format. */
127 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
128 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
130 /* Close the archive. */
131 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
133 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
136 DEFINE_TEST(test_read_format_gtar_filename_CP866_UTF8)
138 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
140 struct archive_entry *ae;
143 * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option.
145 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
146 skipping("en_US.UTF-8 locale not available on this system.");
149 extract_reference_file(refname);
151 assert((a = archive_read_new()) != NULL);
152 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
153 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
154 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
155 skipping("This system cannot convert character-set"
156 " from CP866 to UTF-8.");
159 assertEqualIntA(a, ARCHIVE_OK,
160 archive_read_open_filename(a, refname, 10240));
162 /* Verify regular file. */
163 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
164 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
165 archive_entry_pathname(ae));
166 assertEqualInt(6, archive_entry_size(ae));
168 /* Verify regular file. */
169 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
170 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
171 archive_entry_pathname(ae));
172 assertEqualInt(6, archive_entry_size(ae));
175 /* End of archive. */
176 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
178 /* Verify archive format. */
179 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
180 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
182 /* Close the archive. */
183 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
185 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
188 DEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP866)
190 const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z";
192 struct archive_entry *ae;
195 * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option.
197 if (NULL == setlocale(LC_ALL, "Russian_Russia.866") &&
198 NULL == setlocale(LC_ALL, "ru_RU.CP866")) {
199 skipping("ru_RU.CP866 locale not available on this system.");
202 extract_reference_file(refname);
204 assert((a = archive_read_new()) != NULL);
205 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
206 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
207 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
208 skipping("This system cannot convert character-set"
209 " from KOI8-R to CP866.");
212 assertEqualIntA(a, ARCHIVE_OK,
213 archive_read_open_filename(a, refname, 10240));
215 /* Verify regular file. */
216 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
217 assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2",
218 archive_entry_pathname(ae));
219 assertEqualInt(6, archive_entry_size(ae));
221 /* Verify regular file. */
222 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
223 assertEqualString("\x8f\x90\x88\x82\x85\x92",
224 archive_entry_pathname(ae));
225 assertEqualInt(6, archive_entry_size(ae));
228 /* End of archive. */
229 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
231 /* Verify archive format. */
232 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
233 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
235 /* Close the archive. */
236 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
238 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
241 DEFINE_TEST(test_read_format_gtar_filename_KOI8R_UTF8)
243 const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z";
245 struct archive_entry *ae;
248 * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option.
250 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
251 skipping("en_US.UTF-8 locale not available on this system.");
254 extract_reference_file(refname);
256 assert((a = archive_read_new()) != NULL);
257 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
258 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
259 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
260 skipping("This system cannot convert character-set"
261 " from KOI8-R to UTF-8.");
264 assertEqualIntA(a, ARCHIVE_OK,
265 archive_read_open_filename(a, refname, 10240));
267 /* Verify regular file. */
268 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
269 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
270 archive_entry_pathname(ae));
271 assertEqualInt(6, archive_entry_size(ae));
273 /* Verify regular file. */
274 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
275 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
276 archive_entry_pathname(ae));
277 assertEqualInt(6, archive_entry_size(ae));
280 /* End of archive. */
281 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
283 /* Verify archive format. */
284 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
285 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
287 /* Close the archive. */
288 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
290 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
293 DEFINE_TEST(test_read_format_gtar_filename_eucJP_CP932)
295 const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z";
297 struct archive_entry *ae;
300 * Read eucJP filename in CP932/SJIS with "hdrcharset=eucJP" option.
302 if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
303 NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
304 skipping("CP932 locale not available on this system.");
307 extract_reference_file(refname);
309 assert((a = archive_read_new()) != NULL);
310 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
311 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
312 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
313 skipping("This system cannot convert character-set"
317 assertEqualIntA(a, ARCHIVE_OK,
318 archive_read_open_filename(a, refname, 10240));
320 /* Verify regular file. */
321 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
322 assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae));
323 assertEqualInt(8, archive_entry_size(ae));
325 /* Verify regular file. */
326 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
327 assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae));
328 assertEqualInt(4, archive_entry_size(ae));
331 /* End of archive. */
332 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
334 /* Verify archive format. */
335 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
336 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
338 /* Close the archive. */
339 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
341 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
344 DEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251)
346 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
348 struct archive_entry *ae;
351 * Read CP866 filename in CP1251 with "hdrcharset=CP866" option.
353 if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
354 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
355 skipping("CP1251 locale not available on this system.");
358 extract_reference_file(refname);
360 assert((a = archive_read_new()) != NULL);
361 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
362 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
363 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
364 skipping("This system cannot convert character-set"
365 " from CP866 to CP1251.");
368 assertEqualIntA(a, ARCHIVE_OK,
369 archive_read_open_filename(a, refname, 10240));
371 /* Verify regular file. */
372 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
373 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
374 archive_entry_pathname(ae));
375 assertEqualInt(6, archive_entry_size(ae));
377 /* Verify regular file. */
378 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
379 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
380 archive_entry_pathname(ae));
381 assertEqualInt(6, archive_entry_size(ae));
384 /* End of archive. */
385 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
387 /* Verify archive format. */
388 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
389 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
391 /* Close the archive. */
392 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
394 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
398 * This test only for Windows platform because other archiver
399 * applications on Windows translate CP1251 filenames into CP866
400 * filenames and store it in the gtar file and so we should read
401 * it by default on Windows.
403 DEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251_win)
405 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
407 struct archive_entry *ae;
410 * Read CP866 filename in CP1251 without "hdrcharset=CP866" option.
412 if (NULL == setlocale(LC_ALL, "Russian_Russia")) {
413 skipping("Russian_Russia locale not available on this system.");
416 extract_reference_file(refname);
418 assert((a = archive_read_new()) != NULL);
419 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
420 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
421 assertEqualIntA(a, ARCHIVE_OK,
422 archive_read_open_filename(a, refname, 10240));
424 /* Verify regular file. */
425 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
426 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
427 archive_entry_pathname(ae));
428 assertEqualInt(6, archive_entry_size(ae));
430 /* Verify regular file. */
431 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
432 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
433 archive_entry_pathname(ae));
434 assertEqualInt(6, archive_entry_size(ae));
437 /* End of archive. */
438 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
440 /* Verify archive format. */
441 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
442 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
444 /* Close the archive. */
445 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
446 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
449 DEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP1251)
451 const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z";
453 struct archive_entry *ae;
456 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option.
458 if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
459 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
460 skipping("CP1251 locale not available on this system.");
463 extract_reference_file(refname);
465 assert((a = archive_read_new()) != NULL);
466 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
467 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
468 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
469 skipping("This system cannot convert character-set"
470 " from KOI8-R to CP1251.");
473 assertEqualIntA(a, ARCHIVE_OK,
474 archive_read_open_filename(a, refname, 10240));
476 /* Verify regular file. */
477 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
478 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
479 archive_entry_pathname(ae));
480 assertEqualInt(6, archive_entry_size(ae));
482 /* Verify regular file. */
483 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
484 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
485 archive_entry_pathname(ae));
486 assertEqualInt(6, archive_entry_size(ae));
489 /* End of archive. */
490 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
492 /* Verify archive format. */
493 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
494 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
496 /* Close the archive. */
497 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
499 assertEqualInt(ARCHIVE_OK, archive_read_free(a));