test_read_format_gtar_filename.c revision 231200
1231200Smm/*-
2231200Smm * Copyright (c) 2011 Michihiro NAKAJIMA
3231200Smm * All rights reserved.
4231200Smm *
5231200Smm * Redistribution and use in source and binary forms, with or without
6231200Smm * modification, are permitted provided that the following conditions
7231200Smm * are met:
8231200Smm * 1. Redistributions of source code must retain the above copyright
9231200Smm *    notice, this list of conditions and the following disclaimer.
10231200Smm * 2. Redistributions in binary form must reproduce the above copyright
11231200Smm *    notice, this list of conditions and the following disclaimer in the
12231200Smm *    documentation and/or other materials provided with the distribution.
13231200Smm *
14231200Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15231200Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16231200Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17231200Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18231200Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19231200Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20231200Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21231200Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22231200Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23231200Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24231200Smm */
25231200Smm#include "test.h"
26231200Smm__FBSDID("$FreeBSD");
27231200Smm
28231200Smm#include <locale.h>
29231200Smm
30231200Smmstatic void
31231200Smmtest_read_format_gtar_filename_eucJP_UTF8(const char *refname)
32231200Smm{
33231200Smm	struct archive *a;
34231200Smm	struct archive_entry *ae;
35231200Smm
36231200Smm	/*
37231200Smm	 * Read eucJP filename in en_US.UTF-8 with "hdrcharset=eucJP" option.
38231200Smm	 */
39231200Smm	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
40231200Smm		skipping("en_US.UTF-8 locale not available on this system.");
41231200Smm		return;
42231200Smm	}
43231200Smm
44231200Smm	assert((a = archive_read_new()) != NULL);
45231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
46231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
47231200Smm	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
48231200Smm		skipping("This system cannot convert character-set"
49231200Smm		    " from eucJP to UTF-8.");
50231200Smm		goto cleanup;
51231200Smm	}
52231200Smm	assertEqualIntA(a, ARCHIVE_OK,
53231200Smm	    archive_read_open_filename(a, refname, 10240));
54231200Smm
55231200Smm	/* Verify regular file. */
56231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
57231200Smm	assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt",
58231200Smm	    archive_entry_pathname(ae));
59231200Smm	assertEqualInt(8, archive_entry_size(ae));
60231200Smm
61231200Smm	/* Verify regular file. */
62231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
63231200Smm	assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae));
64231200Smm	assertEqualInt(4, archive_entry_size(ae));
65231200Smm
66231200Smm
67231200Smm	/* End of archive. */
68231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
69231200Smm
70231200Smm	/* Verify archive format. */
71231200Smm	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
72231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
73231200Smm
74231200Smm	/* Close the archive. */
75231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
76231200Smmcleanup:
77231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
78231200Smm}
79231200Smm
80231200Smmstatic void
81231200Smmtest_read_format_gtar_filename_CP866_KOI8R(const char *refname)
82231200Smm{
83231200Smm	struct archive *a;
84231200Smm	struct archive_entry *ae;
85231200Smm
86231200Smm	/*
87231200Smm	 * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option.
88231200Smm	 */
89231200Smm	if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") &&
90231200Smm	    NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
91231200Smm		skipping("ru_RU.KOI8-R locale not available on this system.");
92231200Smm		return;
93231200Smm	}
94231200Smm
95231200Smm	assert((a = archive_read_new()) != NULL);
96231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
97231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
98231200Smm	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
99231200Smm		skipping("This system cannot convert character-set"
100231200Smm		    " from CP866 to KOI8-R.");
101231200Smm		goto cleanup;
102231200Smm	}
103231200Smm	assertEqualIntA(a, ARCHIVE_OK,
104231200Smm	    archive_read_open_filename(a, refname, 10240));
105231200Smm
106231200Smm	/* Verify regular file. */
107231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
108231200Smm	assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
109231200Smm	    archive_entry_pathname(ae));
110231200Smm	assertEqualInt(6, archive_entry_size(ae));
111231200Smm
112231200Smm	/* Verify regular file. */
113231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
114231200Smm	assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
115231200Smm	    archive_entry_pathname(ae));
116231200Smm	assertEqualInt(6, archive_entry_size(ae));
117231200Smm
118231200Smm
119231200Smm	/* End of archive. */
120231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
121231200Smm
122231200Smm	/* Verify archive format. */
123231200Smm	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
124231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
125231200Smm
126231200Smm	/* Close the archive. */
127231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
128231200Smmcleanup:
129231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
130231200Smm}
131231200Smm
132231200Smmstatic void
133231200Smmtest_read_format_gtar_filename_CP866_UTF8(const char *refname)
134231200Smm{
135231200Smm	struct archive *a;
136231200Smm	struct archive_entry *ae;
137231200Smm
138231200Smm	/*
139231200Smm	 * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option.
140231200Smm	 */
141231200Smm	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
142231200Smm		skipping("en_US.UTF-8 locale not available on this system.");
143231200Smm		return;
144231200Smm	}
145231200Smm
146231200Smm	assert((a = archive_read_new()) != NULL);
147231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
148231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
149231200Smm	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
150231200Smm		skipping("This system cannot convert character-set"
151231200Smm		    " from CP866 to UTF-8.");
152231200Smm		goto cleanup;
153231200Smm	}
154231200Smm	assertEqualIntA(a, ARCHIVE_OK,
155231200Smm	    archive_read_open_filename(a, refname, 10240));
156231200Smm
157231200Smm	/* Verify regular file. */
158231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
159231200Smm	assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
160231200Smm	    archive_entry_pathname(ae));
161231200Smm	assertEqualInt(6, archive_entry_size(ae));
162231200Smm
163231200Smm	/* Verify regular file. */
164231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
165231200Smm	assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
166231200Smm	    archive_entry_pathname(ae));
167231200Smm	assertEqualInt(6, archive_entry_size(ae));
168231200Smm
169231200Smm
170231200Smm	/* End of archive. */
171231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
172231200Smm
173231200Smm	/* Verify archive format. */
174231200Smm	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
175231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
176231200Smm
177231200Smm	/* Close the archive. */
178231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
179231200Smmcleanup:
180231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
181231200Smm}
182231200Smm
183231200Smmstatic void
184231200Smmtest_read_format_gtar_filename_KOI8R_CP866(const char *refname)
185231200Smm{
186231200Smm	struct archive *a;
187231200Smm	struct archive_entry *ae;
188231200Smm
189231200Smm	/*
190231200Smm	 * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option.
191231200Smm	 */
192231200Smm	if (NULL == setlocale(LC_ALL, "Russian_Russia.866") &&
193231200Smm	    NULL == setlocale(LC_ALL, "ru_RU.CP866")) {
194231200Smm		skipping("ru_RU.CP866 locale not available on this system.");
195231200Smm		return;
196231200Smm	}
197231200Smm
198231200Smm	assert((a = archive_read_new()) != NULL);
199231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
200231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
201231200Smm	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
202231200Smm		skipping("This system cannot convert character-set"
203231200Smm		    " from KOI8-R to CP866.");
204231200Smm		goto cleanup;
205231200Smm	}
206231200Smm	assertEqualIntA(a, ARCHIVE_OK,
207231200Smm	    archive_read_open_filename(a, refname, 10240));
208231200Smm
209231200Smm	/* Verify regular file. */
210231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
211231200Smm	assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2",
212231200Smm	    archive_entry_pathname(ae));
213231200Smm	assertEqualInt(6, archive_entry_size(ae));
214231200Smm
215231200Smm	/* Verify regular file. */
216231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
217231200Smm	assertEqualString("\x8f\x90\x88\x82\x85\x92",
218231200Smm	    archive_entry_pathname(ae));
219231200Smm	assertEqualInt(6, archive_entry_size(ae));
220231200Smm
221231200Smm
222231200Smm	/* End of archive. */
223231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
224231200Smm
225231200Smm	/* Verify archive format. */
226231200Smm	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
227231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
228231200Smm
229231200Smm	/* Close the archive. */
230231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
231231200Smmcleanup:
232231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
233231200Smm}
234231200Smm
235231200Smmstatic void
236231200Smmtest_read_format_gtar_filename_KOI8R_UTF8(const char *refname)
237231200Smm{
238231200Smm	struct archive *a;
239231200Smm	struct archive_entry *ae;
240231200Smm
241231200Smm	/*
242231200Smm	 * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option.
243231200Smm	 */
244231200Smm	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
245231200Smm		skipping("en_US.UTF-8 locale not available on this system.");
246231200Smm		return;
247231200Smm	}
248231200Smm
249231200Smm	assert((a = archive_read_new()) != NULL);
250231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
251231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
252231200Smm	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
253231200Smm		skipping("This system cannot convert character-set"
254231200Smm		    " from KOI8-R to UTF-8.");
255231200Smm		goto cleanup;
256231200Smm	}
257231200Smm	assertEqualIntA(a, ARCHIVE_OK,
258231200Smm	    archive_read_open_filename(a, refname, 10240));
259231200Smm
260231200Smm	/* Verify regular file. */
261231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
262231200Smm	assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
263231200Smm	    archive_entry_pathname(ae));
264231200Smm	assertEqualInt(6, archive_entry_size(ae));
265231200Smm
266231200Smm	/* Verify regular file. */
267231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
268231200Smm	assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
269231200Smm	    archive_entry_pathname(ae));
270231200Smm	assertEqualInt(6, archive_entry_size(ae));
271231200Smm
272231200Smm
273231200Smm	/* End of archive. */
274231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
275231200Smm
276231200Smm	/* Verify archive format. */
277231200Smm	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
278231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
279231200Smm
280231200Smm	/* Close the archive. */
281231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
282231200Smmcleanup:
283231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
284231200Smm}
285231200Smm
286231200Smmstatic void
287231200Smmtest_read_format_gtar_filename_eucJP_CP932(const char *refname)
288231200Smm{
289231200Smm	struct archive *a;
290231200Smm	struct archive_entry *ae;
291231200Smm
292231200Smm	/*
293231200Smm	 * Read eucJP filename in CP932/SJIS with "hdrcharset=eucJP" option.
294231200Smm	 */
295231200Smm	if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
296231200Smm	    NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
297231200Smm		skipping("CP932 locale not available on this system.");
298231200Smm		return;
299231200Smm	}
300231200Smm
301231200Smm	assert((a = archive_read_new()) != NULL);
302231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
303231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
304231200Smm	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
305231200Smm		skipping("This system cannot convert character-set"
306231200Smm		    " from eucJP.");
307231200Smm		goto cleanup;
308231200Smm	}
309231200Smm	assertEqualIntA(a, ARCHIVE_OK,
310231200Smm	    archive_read_open_filename(a, refname, 10240));
311231200Smm
312231200Smm	/* Verify regular file. */
313231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
314231200Smm	assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae));
315231200Smm	assertEqualInt(8, archive_entry_size(ae));
316231200Smm
317231200Smm	/* Verify regular file. */
318231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
319231200Smm	assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae));
320231200Smm	assertEqualInt(4, archive_entry_size(ae));
321231200Smm
322231200Smm
323231200Smm	/* End of archive. */
324231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
325231200Smm
326231200Smm	/* Verify archive format. */
327231200Smm	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
328231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
329231200Smm
330231200Smm	/* Close the archive. */
331231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
332231200Smmcleanup:
333231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
334231200Smm}
335231200Smm
336231200Smmstatic void
337231200Smmtest_read_format_gtar_filename_CP866_CP1251(const char *refname)
338231200Smm{
339231200Smm	struct archive *a;
340231200Smm	struct archive_entry *ae;
341231200Smm
342231200Smm	/*
343231200Smm	 * Read CP866 filename in CP1251 with "hdrcharset=CP866" option.
344231200Smm	 */
345231200Smm	if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
346231200Smm	    NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
347231200Smm		skipping("CP1251 locale not available on this system.");
348231200Smm		return;
349231200Smm	}
350231200Smm
351231200Smm	assert((a = archive_read_new()) != NULL);
352231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
353231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
354231200Smm	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
355231200Smm		skipping("This system cannot convert character-set"
356231200Smm		    " from CP866 to CP1251.");
357231200Smm		goto cleanup;
358231200Smm	}
359231200Smm	assertEqualIntA(a, ARCHIVE_OK,
360231200Smm	    archive_read_open_filename(a, refname, 10240));
361231200Smm
362231200Smm	/* Verify regular file. */
363231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
364231200Smm	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
365231200Smm	    archive_entry_pathname(ae));
366231200Smm	assertEqualInt(6, archive_entry_size(ae));
367231200Smm
368231200Smm	/* Verify regular file. */
369231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
370231200Smm	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
371231200Smm	    archive_entry_pathname(ae));
372231200Smm	assertEqualInt(6, archive_entry_size(ae));
373231200Smm
374231200Smm
375231200Smm	/* End of archive. */
376231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
377231200Smm
378231200Smm	/* Verify archive format. */
379231200Smm	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
380231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
381231200Smm
382231200Smm	/* Close the archive. */
383231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
384231200Smmcleanup:
385231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
386231200Smm}
387231200Smm
388231200Smm/*
389231200Smm * This test only for Windows platform because other archiver
390231200Smm * applications on Windows translate CP1251 filenames into CP866
391231200Smm * filenames and store it in the gtar file and so we should read
392231200Smm * it by default on Windows.
393231200Smm */
394231200Smmstatic void
395231200Smmtest_read_format_gtar_filename_CP866_CP1251_win(const char *refname)
396231200Smm{
397231200Smm	struct archive *a;
398231200Smm	struct archive_entry *ae;
399231200Smm
400231200Smm	/*
401231200Smm	 * Read CP866 filename in CP1251 without "hdrcharset=CP866" option.
402231200Smm	 */
403231200Smm	if (NULL == setlocale(LC_ALL, "Russian_Russia")) {
404231200Smm		skipping("Russian_Russia locale not available on this system.");
405231200Smm		return;
406231200Smm	}
407231200Smm
408231200Smm	assert((a = archive_read_new()) != NULL);
409231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
410231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
411231200Smm	assertEqualIntA(a, ARCHIVE_OK,
412231200Smm	    archive_read_open_filename(a, refname, 10240));
413231200Smm
414231200Smm	/* Verify regular file. */
415231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
416231200Smm	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
417231200Smm	    archive_entry_pathname(ae));
418231200Smm	assertEqualInt(6, archive_entry_size(ae));
419231200Smm
420231200Smm	/* Verify regular file. */
421231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
422231200Smm	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
423231200Smm	    archive_entry_pathname(ae));
424231200Smm	assertEqualInt(6, archive_entry_size(ae));
425231200Smm
426231200Smm
427231200Smm	/* End of archive. */
428231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
429231200Smm
430231200Smm	/* Verify archive format. */
431231200Smm	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
432231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
433231200Smm
434231200Smm	/* Close the archive. */
435231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
436231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
437231200Smm}
438231200Smm
439231200Smmstatic void
440231200Smmtest_read_format_gtar_filename_KOI8R_CP1251(const char *refname)
441231200Smm{
442231200Smm	struct archive *a;
443231200Smm	struct archive_entry *ae;
444231200Smm
445231200Smm	/*
446231200Smm	 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option.
447231200Smm	 */
448231200Smm	if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
449231200Smm	    NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
450231200Smm		skipping("CP1251 locale not available on this system.");
451231200Smm		return;
452231200Smm	}
453231200Smm
454231200Smm	assert((a = archive_read_new()) != NULL);
455231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
456231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
457231200Smm	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
458231200Smm		skipping("This system cannot convert character-set"
459231200Smm		    " from KOI8-R to CP1251.");
460231200Smm		goto cleanup;
461231200Smm	}
462231200Smm	assertEqualIntA(a, ARCHIVE_OK,
463231200Smm	    archive_read_open_filename(a, refname, 10240));
464231200Smm
465231200Smm	/* Verify regular file. */
466231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
467231200Smm	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
468231200Smm	    archive_entry_pathname(ae));
469231200Smm	assertEqualInt(6, archive_entry_size(ae));
470231200Smm
471231200Smm	/* Verify regular file. */
472231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
473231200Smm	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
474231200Smm	    archive_entry_pathname(ae));
475231200Smm	assertEqualInt(6, archive_entry_size(ae));
476231200Smm
477231200Smm
478231200Smm	/* End of archive. */
479231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
480231200Smm
481231200Smm	/* Verify archive format. */
482231200Smm	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
483231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
484231200Smm
485231200Smm	/* Close the archive. */
486231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
487231200Smmcleanup:
488231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
489231200Smm}
490231200Smm
491231200Smm
492231200SmmDEFINE_TEST(test_read_format_gtar_filename)
493231200Smm{
494231200Smm	const char *refname1 = "test_read_format_gtar_filename_eucjp.tar.Z";
495231200Smm	const char *refname2 = "test_read_format_gtar_filename_cp866.tar.Z";
496231200Smm	const char *refname3 = "test_read_format_gtar_filename_koi8r.tar.Z";
497231200Smm
498231200Smm	extract_reference_file(refname1);
499231200Smm	test_read_format_gtar_filename_eucJP_UTF8(refname1);
500231200Smm	test_read_format_gtar_filename_eucJP_CP932(refname1);
501231200Smm
502231200Smm	extract_reference_file(refname2);
503231200Smm	test_read_format_gtar_filename_CP866_KOI8R(refname2);
504231200Smm	test_read_format_gtar_filename_CP866_UTF8(refname2);
505231200Smm	test_read_format_gtar_filename_CP866_CP1251(refname2);
506231200Smm	test_read_format_gtar_filename_CP866_CP1251_win(refname2);
507231200Smm
508231200Smm	extract_reference_file(refname3);
509231200Smm	test_read_format_gtar_filename_KOI8R_CP866(refname3);
510231200Smm	test_read_format_gtar_filename_KOI8R_UTF8(refname3);
511231200Smm	test_read_format_gtar_filename_KOI8R_CP1251(refname3);
512231200Smm}
513