]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Add a test of hdrcharset option for ustar format.
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Mon, 18 Apr 2011 04:53:34 +0000 (00:53 -0400)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Mon, 18 Apr 2011 04:53:34 +0000 (00:53 -0400)
SVN-Revision: 3251

Makefile.am
libarchive/test/CMakeLists.txt
libarchive/test/test_read_format_ustar_filename.c [new file with mode: 0644]
libarchive/test/test_read_format_ustar_filename_cp866.tar.Z.uu [new file with mode: 0644]
libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu [new file with mode: 0644]
libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu [new file with mode: 0644]

index 2dc7a1184a2af40564c42ede493a33202fb25bc8..62ada7929c4d52dac144a3240ffe1e60e2236e87 100644 (file)
@@ -342,6 +342,7 @@ libarchive_test_SOURCES=                                    \
        libarchive/test/test_read_format_tlz.c                  \
        libarchive/test/test_read_format_txz.c                  \
        libarchive/test/test_read_format_tz.c                   \
+       libarchive/test/test_read_format_ustar_filename.c       \
        libarchive/test/test_read_format_xar.c                  \
        libarchive/test/test_read_format_zip.c                  \
        libarchive/test/test_read_format_zip_filename.c         \
@@ -478,6 +479,9 @@ libarchive_test_EXTRA_DIST=\
        libarchive/test/test_read_format_raw.data.uu                    \
        libarchive/test/test_read_format_tar_empty_filename.tar.uu      \
        libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu    \
+       libarchive/test/test_read_format_ustar_filename_cp866.tar.Z.uu  \
+       libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu  \
+       libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu  \
        libarchive/test/test_read_format_zip.zip.uu                     \
        libarchive/test/test_read_format_zip_filename_cp866.zip.uu      \
        libarchive/test/test_read_format_zip_filename_cp932.zip.uu      \
index d5c39930954aad3df2c493534f21a42275fbd28c..ca2f9348222e096b0a84a02e50cdc7339e0f81f5 100644 (file)
@@ -112,6 +112,7 @@ IF(ENABLE_TEST)
     test_read_format_tlz.c
     test_read_format_txz.c
     test_read_format_tz.c
+    test_read_format_ustar_filename.c
     test_read_format_xar.c
     test_read_format_zip.c
     test_read_format_zip_filename.c
diff --git a/libarchive/test/test_read_format_ustar_filename.c b/libarchive/test/test_read_format_ustar_filename.c
new file mode 100644 (file)
index 0000000..59ccc8e
--- /dev/null
@@ -0,0 +1,512 @@
+/*-
+ * Copyright (c) 2011 Michihiro NAKAJIMA
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD");
+
+#include <locale.h>
+
+static void
+test_read_format_ustar_filename_eucJP_UTF8(const char *refname)
+{
+       struct archive *a;
+       struct archive_entry *ae;
+
+       /*
+        * Read eucJP filename in ja_JP.UTF-8 with "hdrcharset=eucJP" option.
+        */
+       if (NULL == setlocale(LC_ALL, "ja_JP.UTF-8")) {
+               skipping("ja_JP.UTF-8 locale not available on this system.");
+               return;
+       }
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
+               skipping("This system cannot convert character-set"
+                   " from eucJP to UTF-8.");
+               goto cleanup;
+       }
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt",
+           archive_entry_pathname(ae));
+       assertEqualInt(8, archive_entry_size(ae));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae));
+       assertEqualInt(4, archive_entry_size(ae));
+
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+       assertEqualIntA(a, ARCHIVE_FORMAT_TAR_USTAR, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+cleanup:
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+static void
+test_read_format_ustar_filename_CP866_KOI8R(const char *refname)
+{
+       struct archive *a;
+       struct archive_entry *ae;
+
+       /*
+        * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option.
+        */
+       if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") &&
+           NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
+               skipping("ru_RU.KOI8-R locale not available on this system.");
+               return;
+       }
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
+               skipping("This system cannot convert character-set"
+                   " from CP866 to KOI8-R.");
+               goto cleanup;
+       }
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+       assertEqualIntA(a, ARCHIVE_FORMAT_TAR_USTAR, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+cleanup:
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+static void
+test_read_format_ustar_filename_CP866_UTF8(const char *refname)
+{
+       struct archive *a;
+       struct archive_entry *ae;
+
+       /*
+        * Read CP866 filename in ru_RU.UTF-8 with "hdrcharset=CP866" option.
+        */
+       if (NULL == setlocale(LC_ALL, "ru_RU.UTF-8")) {
+               skipping("ru_RU.UTF-8 locale not available on this system.");
+               return;
+       }
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
+               skipping("This system cannot convert character-set"
+                   " from CP866 to UTF-8.");
+               goto cleanup;
+       }
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+       assertEqualIntA(a, ARCHIVE_FORMAT_TAR_USTAR, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+cleanup:
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+static void
+test_read_format_ustar_filename_KOI8R_CP866(const char *refname)
+{
+       struct archive *a;
+       struct archive_entry *ae;
+
+       /*
+        * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option.
+        */
+       if (NULL == setlocale(LC_ALL, "Russian_Russia.866") &&
+           NULL == setlocale(LC_ALL, "ru_RU.CP866")) {
+               skipping("ru_RU.CP866 locale not available on this system.");
+               return;
+       }
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
+               skipping("This system cannot convert character-set"
+                   " from KOI8-R to CP866.");
+               goto cleanup;
+       }
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\x8f\x90\x88\x82\x85\x92",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+       assertEqualIntA(a, ARCHIVE_FORMAT_TAR_USTAR, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+cleanup:
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+static void
+test_read_format_ustar_filename_KOI8R_UTF8(const char *refname)
+{
+       struct archive *a;
+       struct archive_entry *ae;
+
+       /*
+        * Read KOI8-R filename in ru_RU.UTF-8 with "hdrcharset=KOI8-R" option.
+        */
+       if (NULL == setlocale(LC_ALL, "ru_RU.UTF-8")) {
+               skipping("ru_RU.UTF-8 locale not available on this system.");
+               return;
+       }
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
+               skipping("This system cannot convert character-set"
+                   " from KOI8-R to UTF-8.");
+               goto cleanup;
+       }
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+       assertEqualIntA(a, ARCHIVE_FORMAT_TAR_USTAR, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+cleanup:
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+static void
+test_read_format_ustar_filename_eucJP_CP932(const char *refname)
+{
+       struct archive *a;
+       struct archive_entry *ae;
+
+       /*
+        * Read eucJP filename in CP932/SJIS with "hdrcharset=eucJP" option.
+        */
+       if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
+           NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
+               skipping("CP932 locale not available on this system.");
+               return;
+       }
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
+               skipping("This system cannot convert character-set"
+                   " from eucJP.");
+               goto cleanup;
+       }
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae));
+       assertEqualInt(8, archive_entry_size(ae));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae));
+       assertEqualInt(4, archive_entry_size(ae));
+
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+       assertEqualIntA(a, ARCHIVE_FORMAT_TAR_USTAR, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+cleanup:
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+static void
+test_read_format_ustar_filename_CP866_CP1251(const char *refname)
+{
+       struct archive *a;
+       struct archive_entry *ae;
+
+       /*
+        * Read CP866 filename in CP1251 with "hdrcharset=CP866" option.
+        */
+       if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
+           NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
+               skipping("CP1251 locale not available on this system.");
+               return;
+       }
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
+               skipping("This system cannot convert character-set"
+                   " from CP866 to CP1251.");
+               goto cleanup;
+       }
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+       assertEqualIntA(a, ARCHIVE_FORMAT_TAR_USTAR, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+cleanup:
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+/*
+ * This test only for Windows platform because other archiver
+ * applications on Windows translate CP1251 filenames into CP866
+ * filenames and store it in the ustar file and so we should read
+ * it by default on Windows.
+ */
+static void
+test_read_format_ustar_filename_CP866_CP1251_win(const char *refname)
+{
+       struct archive *a;
+       struct archive_entry *ae;
+
+       /*
+        * Read CP866 filename in CP1251 without "hdrcharset=CP866" option.
+        */
+       if (NULL == setlocale(LC_ALL, "Russian_Russia")) {
+               skipping("Russian_Russia locale not available on this system.");
+               return;
+       }
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+       assertEqualIntA(a, ARCHIVE_FORMAT_TAR_USTAR, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+static void
+test_read_format_ustar_filename_KOI8R_CP1251(const char *refname)
+{
+       struct archive *a;
+       struct archive_entry *ae;
+
+       /*
+        * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option.
+        */
+       if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
+           NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
+               skipping("CP1251 locale not available on this system.");
+               return;
+       }
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
+               skipping("This system cannot convert character-set"
+                   " from KOI8-R to CP1251.");
+               goto cleanup;
+       }
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+       /* Verify regular file. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
+           archive_entry_pathname(ae));
+       assertEqualInt(6, archive_entry_size(ae));
+
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+       assertEqualIntA(a, ARCHIVE_FORMAT_TAR_USTAR, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+cleanup:
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+
+DEFINE_TEST(test_read_format_ustar_filename)
+{
+       const char *refname1 = "test_read_format_ustar_filename_eucjp.tar.Z";
+       const char *refname2 = "test_read_format_ustar_filename_cp866.tar.Z";
+       const char *refname3 = "test_read_format_ustar_filename_koi8r.tar.Z";
+
+       extract_reference_file(refname1);
+       test_read_format_ustar_filename_eucJP_UTF8(refname1);
+       test_read_format_ustar_filename_eucJP_CP932(refname1);
+
+       extract_reference_file(refname2);
+       test_read_format_ustar_filename_CP866_KOI8R(refname2);
+       test_read_format_ustar_filename_CP866_UTF8(refname2);
+       test_read_format_ustar_filename_CP866_CP1251(refname2);
+       test_read_format_ustar_filename_CP866_CP1251_win(refname2);
+
+       extract_reference_file(refname3);
+       test_read_format_ustar_filename_KOI8R_CP866(refname3);
+       test_read_format_ustar_filename_KOI8R_UTF8(refname3);
+       test_read_format_ustar_filename_KOI8R_CP1251(refname3);
+}
diff --git a/libarchive/test/test_read_format_ustar_filename_cp866.tar.Z.uu b/libarchive/test/test_read_format_ustar_filename_cp866.tar.Z.uu
new file mode 100644 (file)
index 0000000..359fc2b
--- /dev/null
@@ -0,0 +1,8 @@
+begin 644 test_read_format_ustar_filename_cp866.tar.Z
+M'YV0CR`A$E1($H"#"!,J7,BPH<.'$"-*1`BCXHT:-4``J!CC8@R-'#V"K$BR
+MI`T0,6+4H'%CA@R5,#[&?%E#!@`0,";JW,FSIT\`=>;0"2-G(XPQ=<K\=(A4
+MZ5*&)2N.+*GQJ=6K6+-J_0E/7KI[Y>AM'4NVK-FS:-.J7<NVK=NW5E^!0R6J
+ME#BX>!V2O)C1:,<:'_V*-!J5Y,F4*UO2C(DSA@P;CF_FS$OY8="A12LV';MY
+K:^&I)*M6'DT::]>O84NK7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,K!```
+`
+end
diff --git a/libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu b/libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu
new file mode 100644 (file)
index 0000000..c6ab110
--- /dev/null
@@ -0,0 +1,9 @@
+begin 644 test_read_format_ustar_filename_eucjp.tar.Z
+M'YV0M(+MTN>"#AXZ`!(J7,BPH<.'$"-*G$@1`(R+-FC0`&$11HP;-6)PO/@Q
+MY,B+*%'&@`$B1HP:(6O(D"&3I4<9-V;$```"1L6?0(,*'0J@SAPZ8>1T'%.G
+M#%&(3)T^=9CRXLF4'*=JW<JUJU>BBGXYTB0HE2!D7].J7<NVK=NW<./*G4NW
+M[M-DO0H>M,L7(LJ,&SN6%"D8).&J53>ZA/ER9LV>,63`N.&S9]_+$HTB57HQ
+M:EK/7Q%?19D5L^G37-FD.8JZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'T[<
+!(0``
+`
+end
diff --git a/libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu b/libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu
new file mode 100644 (file)
index 0000000..15e0d63
--- /dev/null
@@ -0,0 +1,8 @@
+begin 644 test_read_format_ustar_filename_koi8r.tar.Z
+M'YV0T*0ENU:,&H"#"!,J7,BPH<.'$"-*1`BCXHT:-4``J!CC8@R-'#V"K$BR
+MI`T0,6+4H'%CAHR*,T["B#'#(@`0,";JW,FSIT\`=>;0"2-G(XPQ=<K\=(A4
+MZ5*&)2N.+*GQJ=6K6+-J_0E/7KI[Y>AM'4NVK-FS:-.J7<NVK=NW5KM^#0NW
+MKD.2%S,:[5CCXUZ11J.2/)ER9<N7,&+BI%GSQLV<=B,_##JT:,6F8S%O%3R5
+G9%7)H$-CE0M6K.C3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^^$
+`
+end