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