test_read_format_gtar_filename.c revision 302001
1272850Shrs/*-
2272850Shrs * Copyright (c) 2011 Michihiro NAKAJIMA
326206Swpaul * All rights reserved.
4272850Shrs *
5272850Shrs * Redistribution and use in source and binary forms, with or without
6272850Shrs * modification, are permitted provided that the following conditions
726206Swpaul * are met:
8272850Shrs * 1. Redistributions of source code must retain the above copyright
9272850Shrs *    notice, this list of conditions and the following disclaimer.
10272850Shrs * 2. Redistributions in binary form must reproduce the above copyright
11272850Shrs *    notice, this list of conditions and the following disclaimer in the
12272850Shrs *    documentation and/or other materials provided with the distribution.
13272850Shrs *
14272850Shrs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15272850Shrs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16272850Shrs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1726206Swpaul * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18272850Shrs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19272850Shrs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20272850Shrs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21272850Shrs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22272850Shrs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23272850Shrs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24272850Shrs */
25272850Shrs#include "test.h"
26272850Shrs__FBSDID("$FreeBSD");
27272850Shrs
28272850Shrs#include <locale.h>
29272850Shrs
3026206SwpaulDEFINE_TEST(test_read_format_gtar_filename_eucJP_UTF8)
3126206Swpaul{
3226206Swpaul	const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z";
33114629Sobrien	struct archive *a;
34114629Sobrien	struct archive_entry *ae;
3526206Swpaul
3626206Swpaul	/*
3726206Swpaul	 * Read eucJP filename in en_US.UTF-8 with "hdrcharset=eucJP" option.
3826206Swpaul	 */
3926206Swpaul	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
4026206Swpaul		skipping("en_US.UTF-8 locale not available on this system.");
4126206Swpaul		return;
4226206Swpaul	}
4326206Swpaul	extract_reference_file(refname);
4426206Swpaul
4526206Swpaul	assert((a = archive_read_new()) != NULL);
4626206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
4726206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
4826206Swpaul	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
4926206Swpaul		skipping("This system cannot convert character-set"
5026206Swpaul		    " from eucJP to UTF-8.");
5126206Swpaul		goto cleanup;
5226206Swpaul	}
5326206Swpaul	assertEqualIntA(a, ARCHIVE_OK,
5426206Swpaul	    archive_read_open_filename(a, refname, 10240));
5526206Swpaul
5626206Swpaul	/* Verify regular file. */
5726206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
5826206Swpaul	assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt",
5926206Swpaul	    archive_entry_pathname(ae));
6026206Swpaul	assertEqualInt(8, archive_entry_size(ae));
6126206Swpaul
6226206Swpaul	/* Verify regular file. */
6326206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
6426206Swpaul	assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae));
6526206Swpaul	assertEqualInt(4, archive_entry_size(ae));
6626206Swpaul	assertEqualInt(archive_entry_is_encrypted(ae), 0);
6726206Swpaul	assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
6826206Swpaul
6926206Swpaul
7026206Swpaul	/* End of archive. */
7126206Swpaul	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
7226206Swpaul
7326206Swpaul	/* Verify archive format. */
7426206Swpaul	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
7526206Swpaul	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
7626206Swpaul
7726206Swpaul	/* Close the archive. */
7826206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
7926206Swpaulcleanup:
8026206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
8126206Swpaul}
8226206Swpaul
8326206SwpaulDEFINE_TEST(test_read_format_gtar_filename_CP866_KOI8R)
8426206Swpaul{
8526206Swpaul	const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
8626206Swpaul	struct archive *a;
8726206Swpaul	struct archive_entry *ae;
8826206Swpaul
8926206Swpaul	/*
9026206Swpaul	 * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option.
9126206Swpaul	 */
9226206Swpaul	if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") &&
9326206Swpaul	    NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
9426206Swpaul		skipping("ru_RU.KOI8-R locale not available on this system.");
9526206Swpaul		return;
9626206Swpaul	}
9726206Swpaul	extract_reference_file(refname);
9826206Swpaul
9926206Swpaul	assert((a = archive_read_new()) != NULL);
10026206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
10126206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
10226206Swpaul	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
10326206Swpaul		skipping("This system cannot convert character-set"
10426206Swpaul		    " from CP866 to KOI8-R.");
10526206Swpaul		goto cleanup;
10626206Swpaul	}
10726206Swpaul	assertEqualIntA(a, ARCHIVE_OK,
10826206Swpaul	    archive_read_open_filename(a, refname, 10240));
10926206Swpaul
11026206Swpaul	/* Verify regular file. */
11126206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
11226206Swpaul	assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
11326206Swpaul	    archive_entry_pathname(ae));
11426206Swpaul	assertEqualInt(6, archive_entry_size(ae));
11526206Swpaul
11626206Swpaul	/* Verify regular file. */
11726206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
11826206Swpaul	assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
11926206Swpaul	    archive_entry_pathname(ae));
12026206Swpaul	assertEqualInt(6, archive_entry_size(ae));
12126206Swpaul
12226206Swpaul
12326206Swpaul	/* End of archive. */
12426206Swpaul	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
12526206Swpaul
12626206Swpaul	/* Verify archive format. */
12726206Swpaul	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
12826206Swpaul	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
12926206Swpaul
13026206Swpaul	/* Close the archive. */
13126206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
13226206Swpaulcleanup:
13326206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
13426206Swpaul}
13526206Swpaul
13626206SwpaulDEFINE_TEST(test_read_format_gtar_filename_CP866_UTF8)
13726206Swpaul{
13826206Swpaul	const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
13926206Swpaul	struct archive *a;
14026206Swpaul	struct archive_entry *ae;
14126206Swpaul
14226206Swpaul	/*
14326206Swpaul	 * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option.
14426206Swpaul	 */
14526206Swpaul	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
14626206Swpaul		skipping("en_US.UTF-8 locale not available on this system.");
14726206Swpaul		return;
14826206Swpaul	}
14926206Swpaul	extract_reference_file(refname);
15026206Swpaul
15126206Swpaul	assert((a = archive_read_new()) != NULL);
15226206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
15326206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
15426206Swpaul	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
15526206Swpaul		skipping("This system cannot convert character-set"
15626206Swpaul		    " from CP866 to UTF-8.");
15726206Swpaul		goto cleanup;
15826206Swpaul	}
15926206Swpaul	assertEqualIntA(a, ARCHIVE_OK,
16026206Swpaul	    archive_read_open_filename(a, refname, 10240));
16126206Swpaul
16226206Swpaul	/* Verify regular file. */
16326206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
16426206Swpaul	assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
16526206Swpaul	    archive_entry_pathname(ae));
16626206Swpaul	assertEqualInt(6, archive_entry_size(ae));
16726206Swpaul
16826206Swpaul	/* Verify regular file. */
16926206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
17026206Swpaul	assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
17126206Swpaul	    archive_entry_pathname(ae));
17226206Swpaul	assertEqualInt(6, archive_entry_size(ae));
17326206Swpaul
17426206Swpaul
17526206Swpaul	/* End of archive. */
17626206Swpaul	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
17726206Swpaul
17826206Swpaul	/* Verify archive format. */
17926206Swpaul	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
18026206Swpaul	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
18126206Swpaul
18226206Swpaul	/* Close the archive. */
18326206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
18426206Swpaulcleanup:
18526206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
18626206Swpaul}
18726206Swpaul
18826206SwpaulDEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP866)
18926206Swpaul{
19026206Swpaul	const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z";
19126206Swpaul	struct archive *a;
19226206Swpaul	struct archive_entry *ae;
19326206Swpaul
194108533Sschweikh	/*
19526206Swpaul	 * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option.
196229781Suqs	 */
197229781Suqs	if (NULL == setlocale(LC_ALL, "Russian_Russia.866") &&
19826206Swpaul	    NULL == setlocale(LC_ALL, "ru_RU.CP866")) {
19926206Swpaul		skipping("ru_RU.CP866 locale not available on this system.");
20026206Swpaul		return;
20126206Swpaul	}
20226206Swpaul	extract_reference_file(refname);
20326206Swpaul
20426206Swpaul	assert((a = archive_read_new()) != NULL);
20526206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
20626206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
20726206Swpaul	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
20826206Swpaul		skipping("This system cannot convert character-set"
20926206Swpaul		    " from KOI8-R to CP866.");
21026206Swpaul		goto cleanup;
21126206Swpaul	}
21226206Swpaul	assertEqualIntA(a, ARCHIVE_OK,
21326206Swpaul	    archive_read_open_filename(a, refname, 10240));
21426206Swpaul
21526206Swpaul	/* Verify regular file. */
21626206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
21726206Swpaul	assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2",
21826206Swpaul	    archive_entry_pathname(ae));
21926206Swpaul	assertEqualInt(6, archive_entry_size(ae));
22026206Swpaul
22126206Swpaul	/* Verify regular file. */
22226206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
22326206Swpaul	assertEqualString("\x8f\x90\x88\x82\x85\x92",
22426206Swpaul	    archive_entry_pathname(ae));
22526206Swpaul	assertEqualInt(6, archive_entry_size(ae));
22626206Swpaul
22726206Swpaul
22826206Swpaul	/* End of archive. */
22926206Swpaul	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
23026206Swpaul
23126206Swpaul	/* Verify archive format. */
23226206Swpaul	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
23326206Swpaul	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
23426206Swpaul
23526206Swpaul	/* Close the archive. */
23626206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
23726206Swpaulcleanup:
23826206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
23926206Swpaul}
24026206Swpaul
24126206SwpaulDEFINE_TEST(test_read_format_gtar_filename_KOI8R_UTF8)
24226206Swpaul{
24326206Swpaul	const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z";
24426206Swpaul	struct archive *a;
24526206Swpaul	struct archive_entry *ae;
24626206Swpaul
24726206Swpaul	/*
24826206Swpaul	 * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option.
24926206Swpaul	 */
25026206Swpaul	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
25126206Swpaul		skipping("en_US.UTF-8 locale not available on this system.");
25226206Swpaul		return;
25326206Swpaul	}
25426206Swpaul	extract_reference_file(refname);
25526206Swpaul
25626206Swpaul	assert((a = archive_read_new()) != NULL);
25726206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
25826206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
25926206Swpaul	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
26026206Swpaul		skipping("This system cannot convert character-set"
26126206Swpaul		    " from KOI8-R to UTF-8.");
26226206Swpaul		goto cleanup;
26326206Swpaul	}
26426206Swpaul	assertEqualIntA(a, ARCHIVE_OK,
26526206Swpaul	    archive_read_open_filename(a, refname, 10240));
26626206Swpaul
26726206Swpaul	/* Verify regular file. */
26826206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
26926206Swpaul	assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
27026206Swpaul	    archive_entry_pathname(ae));
27126206Swpaul	assertEqualInt(6, archive_entry_size(ae));
27226206Swpaul
27326206Swpaul	/* Verify regular file. */
27426206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
27526206Swpaul	assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
27626206Swpaul	    archive_entry_pathname(ae));
27726206Swpaul	assertEqualInt(6, archive_entry_size(ae));
27826206Swpaul
27926206Swpaul
28072089Sasmodai	/* End of archive. */
28126206Swpaul	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
28226206Swpaul
28326206Swpaul	/* Verify archive format. */
28426206Swpaul	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
28526206Swpaul	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
28626206Swpaul
28726206Swpaul	/* Close the archive. */
28826206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
28926206Swpaulcleanup:
29026206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
29126206Swpaul}
29226206Swpaul
29326206SwpaulDEFINE_TEST(test_read_format_gtar_filename_eucJP_CP932)
29426206Swpaul{
29526206Swpaul	const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z";
29626206Swpaul	struct archive *a;
29726206Swpaul	struct archive_entry *ae;
29826206Swpaul
29926206Swpaul	/*
30026206Swpaul	 * Read eucJP filename in CP932/SJIS with "hdrcharset=eucJP" option.
30126206Swpaul	 */
30226206Swpaul	if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
30326206Swpaul	    NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
30426206Swpaul		skipping("CP932 locale not available on this system.");
30526206Swpaul		return;
30626206Swpaul	}
30726206Swpaul	extract_reference_file(refname);
30826206Swpaul
30926206Swpaul	assert((a = archive_read_new()) != NULL);
31026206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
31126206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
31226206Swpaul	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
31326206Swpaul		skipping("This system cannot convert character-set"
31426206Swpaul		    " from eucJP.");
31526206Swpaul		goto cleanup;
31626206Swpaul	}
31726206Swpaul	assertEqualIntA(a, ARCHIVE_OK,
31826206Swpaul	    archive_read_open_filename(a, refname, 10240));
31926206Swpaul
32026206Swpaul	/* Verify regular file. */
32126206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
32226206Swpaul	assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae));
32326206Swpaul	assertEqualInt(8, archive_entry_size(ae));
32426206Swpaul
32526206Swpaul	/* Verify regular file. */
32626206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
32726206Swpaul	assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae));
32826206Swpaul	assertEqualInt(4, archive_entry_size(ae));
32926206Swpaul
33026206Swpaul
33126206Swpaul	/* End of archive. */
33226206Swpaul	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
33326206Swpaul
33426206Swpaul	/* Verify archive format. */
33526206Swpaul	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
33626206Swpaul	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
33726206Swpaul
33826206Swpaul	/* Close the archive. */
33926206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
34026206Swpaulcleanup:
34126206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
34226206Swpaul}
34326206Swpaul
34426206SwpaulDEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251)
34526206Swpaul{
34626206Swpaul	const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
34726206Swpaul	struct archive *a;
34826206Swpaul	struct archive_entry *ae;
34926206Swpaul
35026206Swpaul	/*
35126206Swpaul	 * Read CP866 filename in CP1251 with "hdrcharset=CP866" option.
35226206Swpaul	 */
35326206Swpaul	if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
35426206Swpaul	    NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
35526206Swpaul		skipping("CP1251 locale not available on this system.");
35626206Swpaul		return;
35726206Swpaul	}
35826206Swpaul	extract_reference_file(refname);
35926206Swpaul
36026206Swpaul	assert((a = archive_read_new()) != NULL);
36126206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
36226206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
36326206Swpaul	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
36426206Swpaul		skipping("This system cannot convert character-set"
36526206Swpaul		    " from CP866 to CP1251.");
36626206Swpaul		goto cleanup;
36726206Swpaul	}
36826206Swpaul	assertEqualIntA(a, ARCHIVE_OK,
36926206Swpaul	    archive_read_open_filename(a, refname, 10240));
37026206Swpaul
37126206Swpaul	/* Verify regular file. */
37226206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
37326206Swpaul	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
37426206Swpaul	    archive_entry_pathname(ae));
37526206Swpaul	assertEqualInt(6, archive_entry_size(ae));
37626206Swpaul
37726206Swpaul	/* Verify regular file. */
37826206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
37926206Swpaul	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
38026206Swpaul	    archive_entry_pathname(ae));
38126206Swpaul	assertEqualInt(6, archive_entry_size(ae));
38226206Swpaul
38326206Swpaul
38426206Swpaul	/* End of archive. */
38526206Swpaul	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
38626206Swpaul
38726206Swpaul	/* Verify archive format. */
38826206Swpaul	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
38926206Swpaul	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
39026206Swpaul
39126206Swpaul	/* Close the archive. */
39226206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
39326206Swpaulcleanup:
39426206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
39526206Swpaul}
39626206Swpaul
39726206Swpaul/*
39826206Swpaul * This test only for Windows platform because other archiver
39926206Swpaul * applications on Windows translate CP1251 filenames into CP866
40026206Swpaul * filenames and store it in the gtar file and so we should read
40126206Swpaul * it by default on Windows.
40226206Swpaul */
40326206SwpaulDEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251_win)
40426206Swpaul{
40526206Swpaul	const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
40626206Swpaul	struct archive *a;
40726206Swpaul	struct archive_entry *ae;
40826206Swpaul
40926206Swpaul	/*
41026206Swpaul	 * Read CP866 filename in CP1251 without "hdrcharset=CP866" option.
41126206Swpaul	 */
41226206Swpaul	if (NULL == setlocale(LC_ALL, "Russian_Russia")) {
41326206Swpaul		skipping("Russian_Russia locale not available on this system.");
41426206Swpaul		return;
41526206Swpaul	}
41626206Swpaul	extract_reference_file(refname);
41726206Swpaul
41826206Swpaul	assert((a = archive_read_new()) != NULL);
41926206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
42026206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
42126206Swpaul	assertEqualIntA(a, ARCHIVE_OK,
42226206Swpaul	    archive_read_open_filename(a, refname, 10240));
42326206Swpaul
42426206Swpaul	/* Verify regular file. */
42526206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
42626206Swpaul	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
42726206Swpaul	    archive_entry_pathname(ae));
42826206Swpaul	assertEqualInt(6, archive_entry_size(ae));
42926206Swpaul
43026206Swpaul	/* Verify regular file. */
43126206Swpaul	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
43226206Swpaul	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
43326206Swpaul	    archive_entry_pathname(ae));
43426206Swpaul	assertEqualInt(6, archive_entry_size(ae));
43526206Swpaul
43626206Swpaul
43726206Swpaul	/* End of archive. */
43826206Swpaul	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
43926206Swpaul
44026206Swpaul	/* Verify archive format. */
44126206Swpaul	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
44226206Swpaul	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
44326206Swpaul
44426206Swpaul	/* Close the archive. */
44526206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
44626206Swpaul	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
44726206Swpaul}
44826206Swpaul
44926206SwpaulDEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP1251)
45026206Swpaul{
45126206Swpaul	const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z";
45226206Swpaul	struct archive *a;
45326206Swpaul	struct archive_entry *ae;
45426206Swpaul
45526206Swpaul	/*
45626206Swpaul	 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option.
45726206Swpaul	 */
45826206Swpaul	if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
45926206Swpaul	    NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
46026206Swpaul		skipping("CP1251 locale not available on this system.");
46126206Swpaul		return;
46226206Swpaul	}
46326206Swpaul	extract_reference_file(refname);
46426206Swpaul
46526206Swpaul	assert((a = archive_read_new()) != NULL);
466	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
467	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
468	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
469		skipping("This system cannot convert character-set"
470		    " from KOI8-R to CP1251.");
471		goto cleanup;
472	}
473	assertEqualIntA(a, ARCHIVE_OK,
474	    archive_read_open_filename(a, refname, 10240));
475
476	/* Verify regular file. */
477	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
478	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
479	    archive_entry_pathname(ae));
480	assertEqualInt(6, archive_entry_size(ae));
481
482	/* Verify regular file. */
483	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
484	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
485	    archive_entry_pathname(ae));
486	assertEqualInt(6, archive_entry_size(ae));
487
488
489	/* End of archive. */
490	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
491
492	/* Verify archive format. */
493	assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
494	assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
495
496	/* Close the archive. */
497	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
498cleanup:
499	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
500}
501
502