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