]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libarchive/libarchive/test/test_read_format_zip_filename.c
MFC r299529,r299540,r299576,r299896:
[FreeBSD/stable/10.git] / contrib / libarchive / libarchive / test / test_read_format_zip_filename.c
1 /*-
2  * Copyright (c) 2011 Michihiro NAKAJIMA
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 #include "test.h"
26 __FBSDID("$FreeBSD");
27
28 #include <locale.h>
29
30 DEFINE_TEST(test_read_format_zip_filename_CP932_eucJP)
31 {
32         const char *refname = "test_read_format_zip_filename_cp932.zip";
33         struct archive *a;
34         struct archive_entry *ae;
35
36         /*
37          * Read CP932 filename in ja_JP.eucJP with "hdrcharset=CP932" option.
38          */
39         if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) {
40                 skipping("ja_JP.eucJP locale not available on this system.");
41                 return;
42         }
43         extract_reference_file(refname);
44
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=CP932")) {
49                 skipping("This system cannot convert character-set"
50                     " from CP932 to eucJP.");
51                 goto cleanup;
52         }
53         assertEqualIntA(a, ARCHIVE_OK,
54             archive_read_open_filename(a, refname, 10240));
55
56         /* Verify regular file. */
57         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
58         assertEqualString(
59             "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb0\xec\xcd\xf7\xc9\xbd\x2e\x74\x78\x74",
60             archive_entry_pathname(ae));
61         assertEqualInt(5, archive_entry_size(ae));
62         assertEqualInt(archive_entry_is_encrypted(ae), 0);
63         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
64
65         /* Verify regular file. */
66         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
67         assertEqualString(
68             "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb4\xc1\xbb\xfa\x2e\x74\x78\x74",
69             archive_entry_pathname(ae));
70         assertEqualInt(5, archive_entry_size(ae));
71         assertEqualInt(archive_entry_is_encrypted(ae), 0);
72         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
73
74
75         /* End of archive. */
76         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
77         assertEqualInt(archive_entry_is_encrypted(ae), 0);
78         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
79
80         /* Verify archive format. */
81         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
82         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
83
84         /* Close the archive. */
85         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
86 cleanup:
87         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
88 }
89
90 DEFINE_TEST(test_read_format_zip_filename_CP932_UTF8)
91 {
92         const char *refname = "test_read_format_zip_filename_cp932.zip";
93         struct archive *a;
94         struct archive_entry *ae;
95
96         /*
97          * Read CP932 filename in en_US.UTF-8 with "hdrcharset=CP932" option.
98          */
99         if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
100                 skipping("en_US.UTF-8 locale not available on this system.");
101                 return;
102         }
103         extract_reference_file(refname);
104
105         assert((a = archive_read_new()) != NULL);
106         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
107         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
108         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) {
109                 skipping("This system cannot convert character-set"
110                     " from CP932 to UTF-8.");
111                 goto cleanup;
112         }
113         assertEqualIntA(a, ARCHIVE_OK,
114             archive_read_open_filename(a, refname, 10240));
115
116         /* Verify regular file. */
117         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
118         assertEqualInt(archive_entry_is_encrypted(ae), 0);
119         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
120 #if defined(__APPLE__)
121         /* Compare NFD string. */
122         assertEqualUTF8String(
123             "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f"
124             "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74",
125             archive_entry_pathname(ae));
126 #else
127         /* Compare NFC string. */
128         assertEqualUTF8String(
129             "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f"
130             "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74",
131             archive_entry_pathname(ae));
132 #endif
133         assertEqualInt(5, archive_entry_size(ae));
134
135         /* Verify regular file. */
136         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
137         assertEqualInt(archive_entry_is_encrypted(ae), 0);
138         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
139 #if defined(__APPLE__)
140         /* Compare NFD string. */
141         assertEqualUTF8String(
142             "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f"
143             "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74",
144             archive_entry_pathname(ae));
145 #else
146         /* Compare NFC string. */
147         assertEqualUTF8String(
148             "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f"
149             "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74",
150             archive_entry_pathname(ae));
151 #endif
152         assertEqualInt(5, archive_entry_size(ae));
153
154
155         /* End of archive. */
156         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
157
158         /* Verify archive format. */
159         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
160         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
161
162         /* Close the archive. */
163         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
164 cleanup:
165         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
166 }
167
168 DEFINE_TEST(test_read_format_zip_filename_UTF8_eucJP)
169 {
170         const char *refname = "test_read_format_zip_filename_utf8_jp.zip";
171         struct archive *a;
172         struct archive_entry *ae;
173
174         /*
175          * Read UTF-8 filename in ja_JP.eucJP without charset option
176          * because the file name in the sample file is UTF-8 and
177          * Bit 11 of its general purpose bit flag is set.
178          */
179         if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) {
180                 skipping("ja_JP.eucJP locale not availablefilename_ on "
181                          "this system.");
182                 return;
183         }
184         extract_reference_file(refname);
185         assert((a = archive_read_new()) != NULL);
186         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
187         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
188                 skipping("This system cannot convert character-set"
189                     " from UTF-8 to eucJP.");
190                 goto cleanup;
191         }
192         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
193
194         assert((a = archive_read_new()) != NULL);
195         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
196         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
197         assertEqualIntA(a, ARCHIVE_OK,
198             archive_read_open_filename(a, refname, 10240));
199
200         /* Verify directory file. */
201         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
202         assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
203         assertEqualString("\xc9\xbd\xa4\xc0\xa4\xe8\x2f",
204             archive_entry_pathname(ae));
205         assertEqualInt(0, archive_entry_size(ae));
206         assertEqualInt(archive_entry_is_encrypted(ae), 0);
207         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
208
209         /* Verify regular file. */
210         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
211         assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
212         assertEqualString(
213             "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb0\xec\xcd\xf7\xc9\xbd\x2e\x74\x78\x74",
214             archive_entry_pathname(ae));
215         assertEqualInt(5, archive_entry_size(ae));
216         assertEqualInt(archive_entry_is_encrypted(ae), 0);
217         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
218
219         /* Verify regular file. */
220         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
221         assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
222         assertEqualString(
223             "\xc9\xbd\xa4\xc0\xa4\xe8\x2f\xb4\xc1\xbb\xfa\x2e\x74\x78\x74",
224             archive_entry_pathname(ae));
225         assertEqualInt(5, archive_entry_size(ae));
226         assertEqualInt(archive_entry_is_encrypted(ae), 0);
227         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
228
229
230         /* End of archive. */
231         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
232
233         /* Verify archive format. */
234         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
235         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
236
237         /* Close the archive. */
238         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
239 cleanup:
240         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
241 }
242
243 DEFINE_TEST(test_read_format_zip_filename_UTF8_UTF8)
244 {
245         const char *refname = "test_read_format_zip_filename_utf8_jp.zip";
246         struct archive *a;
247         struct archive_entry *ae;
248
249         /*
250          * Read UTF-8 filename in en_US.UTF-8 without charset option
251          * because the file name in the sample file is UTF-8 and
252          * Bit 11 of its general purpose bit flag is set.
253          */
254         if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
255                 skipping("en_US.UTF-8 locale not available on this system.");
256                 return;
257         }
258         extract_reference_file(refname);
259
260         assert((a = archive_read_new()) != NULL);
261         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
262         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
263         assertEqualIntA(a, ARCHIVE_OK,
264             archive_read_open_filename(a, refname, 10240));
265
266         /* Verify directory file. */
267         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
268         assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
269 #if defined(__APPLE__)
270         /* Compare NFD string. */
271         assertEqualUTF8String(
272             "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f",
273             archive_entry_pathname(ae));
274 #else
275         /* Compare NFC string. */
276         assertEqualUTF8String(
277             "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f",
278             archive_entry_pathname(ae));
279 #endif
280         assertEqualInt(0, archive_entry_size(ae));
281         assertEqualInt(archive_entry_is_encrypted(ae), 0);
282         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
283
284         /* Verify regular file. */
285         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
286         assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
287 #if defined(__APPLE__)
288         /* Compare NFD string. */
289         assertEqualUTF8String(
290             "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f"
291             "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74",
292             archive_entry_pathname(ae));
293 #else
294         /* Compare NFC string. */
295         assertEqualUTF8String(
296             "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f"
297             "\xe4\xb8\x80\xe8\xa6\xa7\xe8\xa1\xa8\x2e\x74\x78\x74",
298             archive_entry_pathname(ae));
299 #endif
300         assertEqualInt(5, archive_entry_size(ae));
301         assertEqualInt(archive_entry_is_encrypted(ae), 0);
302         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
303
304         /* Verify regular file. */
305         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
306         assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
307 #if defined(__APPLE__)
308         /* Compare NFD string. */
309         assertEqualUTF8String(
310             "\xe8\xa1\xa8\xe3\x81\x9f\xe3\x82\x99\xe3\x82\x88\x2f"
311             "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74",
312             archive_entry_pathname(ae));
313 #else
314         /* Compare NFC string. */
315         assertEqualUTF8String(
316             "\xe8\xa1\xa8\xe3\x81\xa0\xe3\x82\x88\x2f"
317             "\xe6\xbc\xa2\xe5\xad\x97\x2e\x74\x78\x74",
318             archive_entry_pathname(ae));
319 #endif
320         assertEqualInt(5, archive_entry_size(ae));
321         assertEqualInt(archive_entry_is_encrypted(ae), 0);
322         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
323
324
325         /* End of archive. */
326         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
327
328         /* Verify archive format. */
329         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
330         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
331
332         /* Close the archive. */
333         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
334         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
335 }
336
337 DEFINE_TEST(test_read_format_zip_filename_CP866_KOI8R)
338 {
339         const char *refname = "test_read_format_zip_filename_cp866.zip";
340         struct archive *a;
341         struct archive_entry *ae;
342
343         /*
344          * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option.
345          */
346         if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") &&
347             NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
348                 skipping("ru_RU.KOI8-R locale not available on this system.");
349                 return;
350         }
351         extract_reference_file(refname);
352
353         assert((a = archive_read_new()) != NULL);
354         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
355         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
356         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
357                 skipping("This system cannot convert character-set"
358                     " from CP866 to KOI8-R.");
359                 goto cleanup;
360         }
361         assertEqualIntA(a, ARCHIVE_OK,
362             archive_read_open_filename(a, refname, 10240));
363
364         /* Verify regular file. */
365         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
366         assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
367             archive_entry_pathname(ae));
368         assertEqualInt(6, archive_entry_size(ae));
369         assertEqualInt(archive_entry_is_encrypted(ae), 0);
370         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
371
372         /* Verify regular file. */
373         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
374         assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
375             archive_entry_pathname(ae));
376         assertEqualInt(6, archive_entry_size(ae));
377         assertEqualInt(archive_entry_is_encrypted(ae), 0);
378         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
379
380
381         /* End of archive. */
382         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
383
384         /* Verify archive format. */
385         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
386         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
387
388         /* Close the archive. */
389         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
390 cleanup:
391         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
392 }
393
394 DEFINE_TEST(test_read_format_zip_filename_CP866_UTF8)
395 {
396         const char *refname = "test_read_format_zip_filename_cp866.zip";
397         struct archive *a;
398         struct archive_entry *ae;
399
400         /*
401          * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option.
402          */
403         if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
404                 skipping("en_US.UTF-8 locale not available on this system.");
405                 return;
406         }
407         extract_reference_file(refname);
408
409         assert((a = archive_read_new()) != NULL);
410         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
411         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
412         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
413                 skipping("This system cannot convert character-set"
414                     " from CP866 to UTF-8.");
415                 goto cleanup;
416         }
417         assertEqualIntA(a, ARCHIVE_OK,
418             archive_read_open_filename(a, refname, 10240));
419
420         /* Verify regular file. */
421         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
422         assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
423             archive_entry_pathname(ae));
424         assertEqualInt(6, archive_entry_size(ae));
425         assertEqualInt(archive_entry_is_encrypted(ae), 0);
426         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
427
428         /* Verify regular file. */
429         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
430         assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
431             archive_entry_pathname(ae));
432         assertEqualInt(6, archive_entry_size(ae));
433         assertEqualInt(archive_entry_is_encrypted(ae), 0);
434         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
435
436
437         /* End of archive. */
438         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
439
440         /* Verify archive format. */
441         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
442         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
443
444         /* Close the archive. */
445         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
446 cleanup:
447         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
448 }
449
450 DEFINE_TEST(test_read_format_zip_filename_KOI8R_CP866)
451 {
452         const char *refname = "test_read_format_zip_filename_koi8r.zip";
453         struct archive *a;
454         struct archive_entry *ae;
455
456         /*
457          * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option.
458          */
459         if (NULL == setlocale(LC_ALL, "Russian_Russia.866") &&
460             NULL == setlocale(LC_ALL, "ru_RU.CP866")) {
461                 skipping("ru_RU.CP866 locale not available on this system.");
462                 return;
463         }
464         extract_reference_file(refname);
465
466         assert((a = archive_read_new()) != NULL);
467         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
468         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
469         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
470                 skipping("This system cannot convert character-set"
471                     " from KOI8-R to CP866.");
472                 goto cleanup;
473         }
474         assertEqualIntA(a, ARCHIVE_OK,
475             archive_read_open_filename(a, refname, 10240));
476
477         /* Verify regular file. */
478         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
479         assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2",
480             archive_entry_pathname(ae));
481         assertEqualInt(6, archive_entry_size(ae));
482         assertEqualInt(archive_entry_is_encrypted(ae), 0);
483         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
484
485         /* Verify regular file. */
486         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
487         assertEqualString("\x8f\x90\x88\x82\x85\x92",
488             archive_entry_pathname(ae));
489         assertEqualInt(6, archive_entry_size(ae));
490         assertEqualInt(archive_entry_is_encrypted(ae), 0);
491         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
492
493
494         /* End of archive. */
495         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
496
497         /* Verify archive format. */
498         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
499         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
500
501         /* Close the archive. */
502         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
503 cleanup:
504         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
505 }
506
507 DEFINE_TEST(test_read_format_zip_filename_KOI8R_UTF8)
508 {
509         const char *refname = "test_read_format_zip_filename_koi8r.zip";
510         struct archive *a;
511         struct archive_entry *ae;
512
513         /*
514          * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option.
515          */
516         if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
517                 skipping("en_US.UTF-8 locale not available on this system.");
518                 return;
519         }
520         extract_reference_file(refname);
521
522         assert((a = archive_read_new()) != NULL);
523         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
524         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
525         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
526                 skipping("This system cannot convert character-set"
527                     " from KOI8-R to UTF-8.");
528                 goto cleanup;
529         }
530         assertEqualIntA(a, ARCHIVE_OK,
531             archive_read_open_filename(a, refname, 10240));
532
533         /* Verify regular file. */
534         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
535         assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
536             archive_entry_pathname(ae));
537         assertEqualInt(6, archive_entry_size(ae));
538         assertEqualInt(archive_entry_is_encrypted(ae), 0);
539         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
540
541         /* Verify regular file. */
542         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
543         assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
544             archive_entry_pathname(ae));
545         assertEqualInt(6, archive_entry_size(ae));
546         assertEqualInt(archive_entry_is_encrypted(ae), 0);
547         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
548
549
550         /* End of archive. */
551         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
552
553         /* Verify archive format. */
554         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
555         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
556
557         /* Close the archive. */
558         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
559 cleanup:
560         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
561 }
562
563 DEFINE_TEST(test_read_format_zip_filename_UTF8_KOI8R)
564 {
565         const char *refname = "test_read_format_zip_filename_utf8_ru.zip";
566         struct archive *a;
567         struct archive_entry *ae;
568
569         /*
570          * Read UTF-8 filename in ru_RU.KOI8-R with "hdrcharset=UTF-8" option.
571          */
572         if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") &&
573             NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
574                 skipping("ru_RU.KOI8-R locale not available on this system.");
575                 return;
576         }
577         extract_reference_file(refname);
578
579         assert((a = archive_read_new()) != NULL);
580         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
581         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
582                 skipping("This system cannot convert character-set"
583                     " from UTF-8 to KOI8-R.");
584                 goto cleanup;
585         }
586         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
587
588         /* Re-create a read archive object. */
589         assert((a = archive_read_new()) != NULL);
590         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
591         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
592         assertEqualIntA(a, ARCHIVE_OK,
593             archive_read_open_filename(a, refname, 10240));
594
595         /* Verify regular file. */
596         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
597         assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
598             archive_entry_pathname(ae));
599         assertEqualInt(6, archive_entry_size(ae));
600         assertEqualInt(archive_entry_is_encrypted(ae), 0);
601         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
602
603         /* Verify regular file. */
604         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
605         assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
606             archive_entry_pathname(ae));
607         assertEqualInt(6, archive_entry_size(ae));
608         assertEqualInt(archive_entry_is_encrypted(ae), 0);
609         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
610
611
612         /* End of archive. */
613         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
614
615         /* Verify archive format. */
616         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
617         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
618
619         /* Close the archive. */
620         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
621 cleanup:
622         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
623 }
624
625 DEFINE_TEST(test_read_format_zip_filename_UTF8_CP866)
626 {
627         const char *refname = "test_read_format_zip_filename_utf8_ru.zip";
628         struct archive *a;
629         struct archive_entry *ae;
630
631         /*
632          * Read UTF-8 filename in ru_RU.CP866 without charset option
633          * because the file name in the sample file is UTF-8 and
634          * Bit 11 of its general purpose bit flag is set.
635          */
636         if (NULL == setlocale(LC_ALL, "Russian_Russia.866") &&
637                 NULL == setlocale(LC_ALL, "ru_RU.CP866")) {
638                 skipping("ru_RU.CP866 locale not available on this system.");
639                 return;
640         }
641         extract_reference_file(refname);
642
643         assert((a = archive_read_new()) != NULL);
644         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
645         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
646         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
647                 skipping("This system cannot convert character-set"
648                     " from UTF-8 to CP866.");
649                 goto cleanup;
650         }
651         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
652
653         /* Re-create a read archive object. */
654         assert((a = archive_read_new()) != NULL);
655         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
656         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
657         assertEqualIntA(a, ARCHIVE_OK,
658             archive_read_open_filename(a, refname, 10240));
659
660         /* Verify regular file. */
661         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
662         assertEqualString("\x8f\x90\x88\x82\x85\x92",
663             archive_entry_pathname(ae));
664         assertEqualInt(6, archive_entry_size(ae));
665         assertEqualInt(archive_entry_is_encrypted(ae), 0);
666         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
667
668         /* Verify regular file. */
669         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
670         assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2",
671             archive_entry_pathname(ae));
672         assertEqualInt(6, archive_entry_size(ae));
673         assertEqualInt(archive_entry_is_encrypted(ae), 0);
674         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
675
676
677         /* End of archive. */
678         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
679
680         /* Verify archive format. */
681         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
682         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
683
684         /* Close the archive. */
685         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
686 cleanup:
687         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
688 }
689
690 DEFINE_TEST(test_read_format_zip_filename_UTF8_UTF8_ru)
691 {
692         const char *refname = "test_read_format_zip_filename_utf8_ru.zip";
693         struct archive *a;
694         struct archive_entry *ae;
695
696         /*
697          * Read UTF-8 filename in en_US.UTF-8 without charset option
698          * because the file name in the sample file is UTF-8 and
699          * Bit 11 of its general purpose bit flag is set.
700          */
701         if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
702                 skipping("en_US.UTF-8 locale not available on this system.");
703                 return;
704         }
705         extract_reference_file(refname);
706
707         assert((a = archive_read_new()) != NULL);
708         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
709         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
710         assertEqualIntA(a, ARCHIVE_OK,
711             archive_read_open_filename(a, refname, 10240));
712
713         /* Verify regular file. */
714         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
715         assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
716             archive_entry_pathname(ae));
717         assertEqualInt(6, archive_entry_size(ae));
718         assertEqualInt(archive_entry_is_encrypted(ae), 0);
719         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
720
721         /* Verify regular file. */
722         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
723         assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
724             archive_entry_pathname(ae));
725         assertEqualInt(6, archive_entry_size(ae));
726         assertEqualInt(archive_entry_is_encrypted(ae), 0);
727         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
728
729
730         /* End of archive. */
731         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
732
733         /* Verify archive format. */
734         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
735         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
736
737         /* Close the archive. */
738         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
739         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
740 }
741
742 DEFINE_TEST(test_read_format_zip_filename_CP932_CP932)
743 {
744         const char *refname = "test_read_format_zip_filename_cp932.zip";
745         struct archive *a;
746         struct archive_entry *ae;
747
748         /*
749          * Read CP932 filename in CP932/SJIS with "hdrcharset=CP932" option.
750          */
751         if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
752             NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
753                 skipping("CP932 locale not available on this system.");
754                 return;
755         }
756         extract_reference_file(refname);
757
758         assert((a = archive_read_new()) != NULL);
759         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
760         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
761         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) {
762                 skipping("This system cannot convert character-set"
763                     " from CP932.");
764                 goto cleanup;
765         }
766         assertEqualIntA(a, ARCHIVE_OK,
767             archive_read_open_filename(a, refname, 10240));
768
769         /* Verify regular file. */
770         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
771         assertEqualString(
772                 "\x95\x5c\x82\xbe\x82\xe6\x2f\x88\xea\x97\x97\x95\x5c.txt",
773             archive_entry_pathname(ae));
774         assertEqualInt(5, archive_entry_size(ae));
775         assertEqualInt(archive_entry_is_encrypted(ae), 0);
776         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
777
778         /* Verify regular file. */
779         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
780         assertEqualString(
781                 "\x95\x5c\x82\xbe\x82\xe6\x2f\x8a\xbf\x8e\x9a.txt",
782             archive_entry_pathname(ae));
783         assertEqualInt(5, archive_entry_size(ae));
784         assertEqualInt(archive_entry_is_encrypted(ae), 0);
785         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
786
787
788         /* End of archive. */
789         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
790
791         /* Verify archive format. */
792         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
793         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
794
795         /* Close the archive. */
796         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
797 cleanup:
798         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
799 }
800
801 DEFINE_TEST(test_read_format_zip_filename_UTF8_CP932)
802 {
803         const char *refname = "test_read_format_zip_filename_utf8_jp.zip";
804         struct archive *a;
805         struct archive_entry *ae;
806
807         /*
808          * Read UTF-8 filename in CP932/SJIS without charset option
809          * because the file name in the sample file is UTF-8 and
810          * Bit 11 of its general purpose bit flag is set.
811          */
812         if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
813             NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
814                 skipping("CP932 locale not available on this system.");
815                 return;
816         }
817         extract_reference_file(refname);
818
819         assert((a = archive_read_new()) != NULL);
820         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
821         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
822                 skipping("This system cannot convert character-set"
823                     " from UTF-8 to CP932.");
824                 goto cleanup;
825         }
826         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
827
828         /* Re-create a read archive object. */
829         assert((a = archive_read_new()) != NULL);
830         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
831         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
832         assertEqualIntA(a, ARCHIVE_OK,
833             archive_read_open_filename(a, refname, 10240));
834
835         /* Verify regular file. */
836         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
837         assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
838         assertEqualString(
839                 "\x95\x5c\x82\xbe\x82\xe6\x2f",
840             archive_entry_pathname(ae));
841         assertEqualInt(0, archive_entry_size(ae));
842         assertEqualInt(archive_entry_is_encrypted(ae), 0);
843         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
844
845         /* Verify directory file. */
846         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
847         assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
848         assertEqualString(
849                 "\x95\x5c\x82\xbe\x82\xe6\x2f\x88\xea\x97\x97\x95\x5c.txt",
850             archive_entry_pathname(ae));
851         assertEqualInt(5, archive_entry_size(ae));
852         assertEqualInt(archive_entry_is_encrypted(ae), 0);
853         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
854
855         /* Verify regular file. */
856         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
857         assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
858         assertEqualString(
859                 "\x95\x5c\x82\xbe\x82\xe6\x2f\x8a\xbf\x8e\x9a.txt",
860             archive_entry_pathname(ae));
861         assertEqualInt(5, archive_entry_size(ae));
862         assertEqualInt(archive_entry_is_encrypted(ae), 0);
863         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
864
865         /* End of archive. */
866         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
867
868         /* Verify archive format. */
869         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
870         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
871
872         /* Close the archive. */
873         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
874 cleanup:
875         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
876 }
877
878 DEFINE_TEST(test_read_format_zip_filename_CP866_CP1251)
879 {
880         const char *refname = "test_read_format_zip_filename_cp866.zip";
881         struct archive *a;
882         struct archive_entry *ae;
883
884         /*
885          * Read CP866 filename in CP1251 with "hdrcharset=CP866" option.
886          */
887         if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
888             NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
889                 skipping("CP1251 locale not available on this system.");
890                 return;
891         }
892         extract_reference_file(refname);
893
894         assert((a = archive_read_new()) != NULL);
895         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
896         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
897         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
898                 skipping("This system cannot convert character-set"
899                     " from CP866 to CP1251.");
900                 goto cleanup;
901         }
902         assertEqualIntA(a, ARCHIVE_OK,
903             archive_read_open_filename(a, refname, 10240));
904
905         /* Verify regular file. */
906         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
907         assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
908             archive_entry_pathname(ae));
909         assertEqualInt(6, archive_entry_size(ae));
910         assertEqualInt(archive_entry_is_encrypted(ae), 0);
911         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
912
913         /* Verify regular file. */
914         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
915         assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
916             archive_entry_pathname(ae));
917         assertEqualInt(6, archive_entry_size(ae));
918         assertEqualInt(archive_entry_is_encrypted(ae), 0);
919         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
920
921
922         /* End of archive. */
923         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
924
925         /* Verify archive format. */
926         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
927         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
928
929         /* Close the archive. */
930         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
931 cleanup:
932         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
933 }
934
935 /*
936  * This test only for Windows platform because other archiver
937  * applications on Windows translate CP1251 filenames into CP866
938  * filenames and store it in the zip file and so we should read
939  * it by default on Windows.
940  */
941 DEFINE_TEST(test_read_format_zip_filename_CP866_CP1251_win)
942 {
943         const char *refname = "test_read_format_zip_filename_cp866.zip";
944         struct archive *a;
945         struct archive_entry *ae;
946
947         /*
948          * Read CP866 filename in CP1251 without "hdrcharset=CP866" option.
949          */
950         if (NULL == setlocale(LC_ALL, "Russian_Russia")) {
951                 skipping("Russian_Russia locale not available on this system.");
952                 return;
953         }
954         extract_reference_file(refname);
955
956         assert((a = archive_read_new()) != NULL);
957         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
958         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
959         assertEqualIntA(a, ARCHIVE_OK,
960             archive_read_open_filename(a, refname, 10240));
961
962         /* Verify regular file. */
963         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
964         assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
965             archive_entry_pathname(ae));
966         assertEqualInt(6, archive_entry_size(ae));
967         assertEqualInt(archive_entry_is_encrypted(ae), 0);
968         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
969
970         /* Verify regular file. */
971         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
972         assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
973             archive_entry_pathname(ae));
974         assertEqualInt(6, archive_entry_size(ae));
975         assertEqualInt(archive_entry_is_encrypted(ae), 0);
976         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
977
978
979         /* End of archive. */
980         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
981
982         /* Verify archive format. */
983         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
984         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
985
986         /* Close the archive. */
987         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
988         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
989 }
990
991 DEFINE_TEST(test_read_format_zip_filename_KOI8R_CP1251)
992 {
993         const char *refname = "test_read_format_zip_filename_koi8r.zip";
994         struct archive *a;
995         struct archive_entry *ae;
996
997         /*
998          * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option.
999          */
1000         if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
1001             NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
1002                 skipping("CP1251 locale not available on this system.");
1003                 return;
1004         }
1005         extract_reference_file(refname);
1006
1007         assert((a = archive_read_new()) != NULL);
1008         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
1009         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
1010         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
1011                 skipping("This system cannot convert character-set"
1012                     " from KOI8-R to CP1251.");
1013                 goto cleanup;
1014         }
1015         assertEqualIntA(a, ARCHIVE_OK,
1016             archive_read_open_filename(a, refname, 10240));
1017
1018         /* Verify regular file. */
1019         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1020         assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
1021             archive_entry_pathname(ae));
1022         assertEqualInt(6, archive_entry_size(ae));
1023         assertEqualInt(archive_entry_is_encrypted(ae), 0);
1024         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1025
1026         /* Verify regular file. */
1027         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1028         assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
1029             archive_entry_pathname(ae));
1030         assertEqualInt(6, archive_entry_size(ae));
1031         assertEqualInt(archive_entry_is_encrypted(ae), 0);
1032         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1033
1034
1035         /* End of archive. */
1036         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
1037
1038         /* Verify archive format. */
1039         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
1040         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
1041
1042         /* Close the archive. */
1043         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
1044 cleanup:
1045         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1046 }
1047
1048 DEFINE_TEST(test_read_format_zip_filename_UTF8_CP1251)
1049 {
1050         const char *refname = "test_read_format_zip_filename_utf8_ru.zip";
1051         struct archive *a;
1052         struct archive_entry *ae;
1053
1054         /*
1055          * Read UTF-8 filename in CP1251 without charset option
1056          * because the file name in the sample file is UTF-8 and
1057          * Bit 11 of its general purpose bit flag is set.
1058          */
1059         if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
1060             NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
1061                 skipping("CP1251 locale not available on this system.");
1062                 return;
1063         }
1064         extract_reference_file(refname);
1065
1066         assert((a = archive_read_new()) != NULL);
1067         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
1068         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
1069                 skipping("This system cannot convert character-set"
1070                     " from UTF-8 to CP1251.");
1071                 goto cleanup;
1072         }
1073         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1074
1075         /* Re-create a read archive object. */
1076         assert((a = archive_read_new()) != NULL);
1077         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
1078         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
1079         assertEqualIntA(a, ARCHIVE_OK,
1080             archive_read_open_filename(a, refname, 10240));
1081
1082         /* Verify regular file. */
1083         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1084         assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
1085             archive_entry_pathname(ae));
1086         assertEqualInt(6, archive_entry_size(ae));
1087         assertEqualInt(archive_entry_is_encrypted(ae), 0);
1088         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1089
1090         /* Verify regular file. */
1091         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1092         assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
1093             archive_entry_pathname(ae));
1094         assertEqualInt(6, archive_entry_size(ae));
1095         assertEqualInt(archive_entry_is_encrypted(ae), 0);
1096         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1097
1098
1099         /* End of archive. */
1100         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
1101
1102         /* Verify archive format. */
1103         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
1104         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
1105
1106         /* Close the archive. */
1107         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
1108 cleanup:
1109         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1110 }
1111
1112 /*
1113  * The sample zip file was made in LANG=KOI8-R and it contains two
1114  * files the charset of which are different.
1115  * - the filename of first file is stored in KOI8-R.
1116  * - the filename of second file is stored in UTF-8.
1117  *
1118  * Whenever hdrcharset option is specified, we will correctly read the
1119  * filename of sencod file, which is stored in UTF-8.
1120  */
1121
1122 DEFINE_TEST(test_read_format_zip_filename_KOI8R_UTF8_2)
1123 {
1124         const char *refname = "test_read_format_zip_filename_utf8_ru2.zip";
1125         struct archive *a;
1126         struct archive_entry *ae;
1127
1128         /*
1129          * Read filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option.
1130          */
1131         if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
1132                 skipping("en_US.UTF-8 locale not available on this system.");
1133                 return;
1134         }
1135         extract_reference_file(refname);
1136
1137         assert((a = archive_read_new()) != NULL);
1138         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
1139         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
1140         if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
1141                 skipping("This system cannot convert character-set"
1142                     " from KOI8-R to UTF-8.");
1143                 goto next_test;
1144         }
1145         assertEqualIntA(a, ARCHIVE_OK,
1146             archive_read_open_filename(a, refname, 10240));
1147
1148         /* Verify regular first file. */
1149         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1150         assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
1151             archive_entry_pathname(ae));
1152         assertEqualInt(6, archive_entry_size(ae));
1153         assertEqualInt(archive_entry_is_encrypted(ae), 0);
1154         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1155
1156         /*
1157          * Verify regular second file.
1158          * The filename is not translated because Bit 11 of its general
1159          * purpose bit flag is set and so we know the conversion is unneeded.
1160          */
1161         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1162         assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
1163             archive_entry_pathname(ae));
1164         assertEqualInt(6, archive_entry_size(ae));
1165         assertEqualInt(archive_entry_is_encrypted(ae), 0);
1166         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1167
1168
1169         /* End of archive. */
1170         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
1171
1172         /* Verify archive format. */
1173         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
1174         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
1175
1176         /* Close the archive. */
1177         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
1178 next_test:
1179         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1180
1181         /*
1182          * Read filename in en_US.UTF-8 without "hdrcharset=KOI8-R" option.
1183          * The filename we can properly read is only second file.
1184          */
1185         assert((a = archive_read_new()) != NULL);
1186         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
1187         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
1188         assertEqualIntA(a, ARCHIVE_OK,
1189             archive_read_open_filename(a, refname, 10240));
1190
1191         /*
1192          * Verify regular first file.
1193          * The filename is not translated to UTF-8 because Bit 11 of
1194          * its general purpose bit flag is *not* set and so there is
1195          * not way to know its charset.
1196          */
1197         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1198         /* A filename is in KOI8-R. */
1199         assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
1200             archive_entry_pathname(ae));
1201         assertEqualInt(6, archive_entry_size(ae));
1202         assertEqualInt(archive_entry_is_encrypted(ae), 0);
1203         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1204
1205         /* Verify regular file. */
1206         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1207         assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
1208             archive_entry_pathname(ae));
1209         assertEqualInt(6, archive_entry_size(ae));
1210         assertEqualInt(archive_entry_is_encrypted(ae), 0);
1211         assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1212
1213
1214         /* End of archive. */
1215         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
1216
1217         /* Verify archive format. */
1218         assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
1219         assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
1220
1221         /* Close the archive. */
1222         assertEqualInt(ARCHIVE_OK, archive_read_close(a));
1223         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1224 }