aboutsummaryrefslogtreecommitdiff
path: root/libarchive/test/test_zip_filename_encoding.c
diff options
context:
space:
mode:
Diffstat (limited to 'libarchive/test/test_zip_filename_encoding.c')
-rw-r--r--libarchive/test/test_zip_filename_encoding.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/libarchive/test/test_zip_filename_encoding.c b/libarchive/test/test_zip_filename_encoding.c
index b6786f2c3b18..1cb394547066 100644
--- a/libarchive/test/test_zip_filename_encoding.c
+++ b/libarchive/test/test_zip_filename_encoding.c
@@ -622,3 +622,43 @@ DEFINE_TEST(test_zip_filename_encoding_UTF16_win)
/* NOTE: ZIP does not support hardlinks */
#endif
}
+
+DEFINE_TEST(test_zip_filename_encoding_fail_UTF16_win)
+{
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ skipping("This test is meant to verify unicode string handling"
+ " on Windows with UTF-16 names");
+ return;
+#else
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ /* Test the C locale by not calling setlocale. */
+
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_zip(a));
+ if (archive_write_set_options(a, "hdrcharset=CP437") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from UTF-16 to CP437.");
+ archive_write_free(a);
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set the filename using a UTF-16 string */
+ archive_entry_copy_pathname_w(entry, L"\u8868.txt");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_FAILED, archive_write_header(a, entry));
+ /* The pathname cannot even be represented in the current locale
+ for inclusion in the error message. */
+ assertEqualString("Can't translate pathname to CP437",
+ archive_error_string(a));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+#endif
+}