diff options
Diffstat (limited to 'libarchive/test/test_zip_filename_encoding.c')
| -rw-r--r-- | libarchive/test/test_zip_filename_encoding.c | 40 |
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 +} |
