1 /*-
2 * Copyright (c) 2011 Michihiro NAKAJIMA
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25 #include "test.h"
26
27 #include <locale.h>
28
DEFINE_TEST(test_read_format_gtar_filename_eucJP_UTF8)29 DEFINE_TEST(test_read_format_gtar_filename_eucJP_UTF8)
30 {
31 const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z";
32 struct archive *a;
33 struct archive_entry *ae;
34
35 /*
36 * Read eucJP filename in en_US.UTF-8 with "hdrcharset=eucJP" option.
37 */
38 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
39 skipping("en_US.UTF-8 locale not available on this system.");
40 return;
41 }
42 extract_reference_file(refname);
43
44 assert((a = archive_read_new()) != NULL);
45 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
46 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
47 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
48 skipping("This system cannot convert character-set"
49 " from eucJP to UTF-8.");
50 goto cleanup;
51 }
52 assertEqualIntA(a, ARCHIVE_OK,
53 archive_read_open_filename(a, refname, 10240));
54
55 /* Verify regular file. */
56 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
57 assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt",
58 archive_entry_pathname(ae));
59 assertEqualInt(8, archive_entry_size(ae));
60
61 /* Verify regular file. */
62 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
63 assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae));
64 assertEqualInt(4, archive_entry_size(ae));
65 assertEqualInt(archive_entry_is_encrypted(ae), 0);
66 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
67
68
69 /* End of archive. */
70 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
71
72 /* Verify archive format. */
73 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
74 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
75
76 /* Close the archive. */
77 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
78 cleanup:
79 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
80 }
81
DEFINE_TEST(test_read_format_gtar_filename_CP866_KOI8R)82 DEFINE_TEST(test_read_format_gtar_filename_CP866_KOI8R)
83 {
84 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
85 struct archive *a;
86 struct archive_entry *ae;
87
88 /*
89 * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option.
90 */
91 if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") &&
92 NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
93 skipping("ru_RU.KOI8-R locale not available on this system.");
94 return;
95 }
96 extract_reference_file(refname);
97
98 assert((a = archive_read_new()) != NULL);
99 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
100 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
101 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
102 skipping("This system cannot convert character-set"
103 " from CP866 to KOI8-R.");
104 goto cleanup;
105 }
106 assertEqualIntA(a, ARCHIVE_OK,
107 archive_read_open_filename(a, refname, 10240));
108
109 /* Verify regular file. */
110 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
111 assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
112 archive_entry_pathname(ae));
113 assertEqualInt(6, archive_entry_size(ae));
114
115 /* Verify regular file. */
116 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
117 assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
118 archive_entry_pathname(ae));
119 assertEqualInt(6, archive_entry_size(ae));
120
121
122 /* End of archive. */
123 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
124
125 /* Verify archive format. */
126 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
127 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
128
129 /* Close the archive. */
130 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
131 cleanup:
132 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
133 }
134
DEFINE_TEST(test_read_format_gtar_filename_CP866_UTF8)135 DEFINE_TEST(test_read_format_gtar_filename_CP866_UTF8)
136 {
137 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
138 struct archive *a;
139 struct archive_entry *ae;
140
141 /*
142 * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option.
143 */
144 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
145 skipping("en_US.UTF-8 locale not available on this system.");
146 return;
147 }
148 extract_reference_file(refname);
149
150 assert((a = archive_read_new()) != NULL);
151 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
152 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
153 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
154 skipping("This system cannot convert character-set"
155 " from CP866 to UTF-8.");
156 goto cleanup;
157 }
158 assertEqualIntA(a, ARCHIVE_OK,
159 archive_read_open_filename(a, refname, 10240));
160
161 /* Verify regular file. */
162 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
163 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
164 archive_entry_pathname(ae));
165 assertEqualInt(6, archive_entry_size(ae));
166
167 /* Verify regular file. */
168 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
169 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
170 archive_entry_pathname(ae));
171 assertEqualInt(6, archive_entry_size(ae));
172
173
174 /* End of archive. */
175 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
176
177 /* Verify archive format. */
178 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
179 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
180
181 /* Close the archive. */
182 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
183 cleanup:
184 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
185 }
186
DEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP866)187 DEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP866)
188 {
189 const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z";
190 struct archive *a;
191 struct archive_entry *ae;
192
193 /*
194 * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option.
195 */
196 if (NULL == setlocale(LC_ALL, "Russian_Russia.866") &&
197 NULL == setlocale(LC_ALL, "ru_RU.CP866")) {
198 skipping("ru_RU.CP866 locale not available on this system.");
199 return;
200 }
201 extract_reference_file(refname);
202
203 assert((a = archive_read_new()) != NULL);
204 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
205 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
206 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
207 skipping("This system cannot convert character-set"
208 " from KOI8-R to CP866.");
209 goto cleanup;
210 }
211 assertEqualIntA(a, ARCHIVE_OK,
212 archive_read_open_filename(a, refname, 10240));
213
214 /* Verify regular file. */
215 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
216 assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2",
217 archive_entry_pathname(ae));
218 assertEqualInt(6, archive_entry_size(ae));
219
220 /* Verify regular file. */
221 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
222 assertEqualString("\x8f\x90\x88\x82\x85\x92",
223 archive_entry_pathname(ae));
224 assertEqualInt(6, archive_entry_size(ae));
225
226
227 /* End of archive. */
228 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
229
230 /* Verify archive format. */
231 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
232 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
233
234 /* Close the archive. */
235 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
236 cleanup:
237 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
238 }
239
DEFINE_TEST(test_read_format_gtar_filename_KOI8R_UTF8)240 DEFINE_TEST(test_read_format_gtar_filename_KOI8R_UTF8)
241 {
242 const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z";
243 struct archive *a;
244 struct archive_entry *ae;
245
246 /*
247 * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option.
248 */
249 if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
250 skipping("en_US.UTF-8 locale not available on this system.");
251 return;
252 }
253 extract_reference_file(refname);
254
255 assert((a = archive_read_new()) != NULL);
256 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
257 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
258 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
259 skipping("This system cannot convert character-set"
260 " from KOI8-R to UTF-8.");
261 goto cleanup;
262 }
263 assertEqualIntA(a, ARCHIVE_OK,
264 archive_read_open_filename(a, refname, 10240));
265
266 /* Verify regular file. */
267 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
268 assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
269 archive_entry_pathname(ae));
270 assertEqualInt(6, archive_entry_size(ae));
271
272 /* Verify regular file. */
273 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
274 assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
275 archive_entry_pathname(ae));
276 assertEqualInt(6, archive_entry_size(ae));
277
278
279 /* End of archive. */
280 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
281
282 /* Verify archive format. */
283 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
284 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
285
286 /* Close the archive. */
287 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
288 cleanup:
289 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
290 }
291
DEFINE_TEST(test_read_format_gtar_filename_eucJP_CP932)292 DEFINE_TEST(test_read_format_gtar_filename_eucJP_CP932)
293 {
294 const char *refname = "test_read_format_gtar_filename_eucjp.tar.Z";
295 struct archive *a;
296 struct archive_entry *ae;
297
298 /*
299 * Read eucJP filename in CP932/SJIS with "hdrcharset=eucJP" option.
300 */
301 if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
302 NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
303 skipping("CP932 locale not available on this system.");
304 return;
305 }
306 extract_reference_file(refname);
307
308 assert((a = archive_read_new()) != NULL);
309 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
310 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
311 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
312 skipping("This system cannot convert character-set"
313 " from eucJP.");
314 goto cleanup;
315 }
316 assertEqualIntA(a, ARCHIVE_OK,
317 archive_read_open_filename(a, refname, 10240));
318
319 /* Verify regular file. */
320 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
321 assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae));
322 assertEqualInt(8, archive_entry_size(ae));
323
324 /* Verify regular file. */
325 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
326 assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae));
327 assertEqualInt(4, archive_entry_size(ae));
328
329
330 /* End of archive. */
331 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
332
333 /* Verify archive format. */
334 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
335 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
336
337 /* Close the archive. */
338 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
339 cleanup:
340 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
341 }
342
DEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251)343 DEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251)
344 {
345 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
346 struct archive *a;
347 struct archive_entry *ae;
348
349 /*
350 * Read CP866 filename in CP1251 with "hdrcharset=CP866" option.
351 */
352 if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
353 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
354 skipping("CP1251 locale not available on this system.");
355 return;
356 }
357 extract_reference_file(refname);
358
359 assert((a = archive_read_new()) != NULL);
360 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
361 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
362 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
363 skipping("This system cannot convert character-set"
364 " from CP866 to CP1251.");
365 goto cleanup;
366 }
367 assertEqualIntA(a, ARCHIVE_OK,
368 archive_read_open_filename(a, refname, 10240));
369
370 /* Verify regular file. */
371 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
372 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
373 archive_entry_pathname(ae));
374 assertEqualInt(6, archive_entry_size(ae));
375
376 /* Verify regular file. */
377 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
378 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
379 archive_entry_pathname(ae));
380 assertEqualInt(6, archive_entry_size(ae));
381
382
383 /* End of archive. */
384 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
385
386 /* Verify archive format. */
387 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
388 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
389
390 /* Close the archive. */
391 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
392 cleanup:
393 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
394 }
395
396 /*
397 * This test only for Windows platform because other archiver
398 * applications on Windows translate CP1251 filenames into CP866
399 * filenames and store it in the gtar file and so we should read
400 * it by default on Windows.
401 */
DEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251_win)402 DEFINE_TEST(test_read_format_gtar_filename_CP866_CP1251_win)
403 {
404 const char *refname = "test_read_format_gtar_filename_cp866.tar.Z";
405 struct archive *a;
406 struct archive_entry *ae;
407
408 /*
409 * Read CP866 filename in CP1251 without "hdrcharset=CP866" option.
410 */
411 if (NULL == setlocale(LC_ALL, "Russian_Russia")) {
412 skipping("Russian_Russia locale not available on this system.");
413 return;
414 }
415 extract_reference_file(refname);
416
417 assert((a = archive_read_new()) != NULL);
418 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
419 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
420 assertEqualIntA(a, ARCHIVE_OK,
421 archive_read_open_filename(a, refname, 10240));
422
423 /* Verify regular file. */
424 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
425 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
426 archive_entry_pathname(ae));
427 assertEqualInt(6, archive_entry_size(ae));
428
429 /* Verify regular file. */
430 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
431 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
432 archive_entry_pathname(ae));
433 assertEqualInt(6, archive_entry_size(ae));
434
435
436 /* End of archive. */
437 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
438
439 /* Verify archive format. */
440 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
441 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
442
443 /* Close the archive. */
444 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
445 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
446 }
447
DEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP1251)448 DEFINE_TEST(test_read_format_gtar_filename_KOI8R_CP1251)
449 {
450 const char *refname = "test_read_format_gtar_filename_koi8r.tar.Z";
451 struct archive *a;
452 struct archive_entry *ae;
453
454 /*
455 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option.
456 */
457 if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
458 NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
459 skipping("CP1251 locale not available on this system.");
460 return;
461 }
462 extract_reference_file(refname);
463
464 assert((a = archive_read_new()) != NULL);
465 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
466 assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
467 if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
468 skipping("This system cannot convert character-set"
469 " from KOI8-R to CP1251.");
470 goto cleanup;
471 }
472 assertEqualIntA(a, ARCHIVE_OK,
473 archive_read_open_filename(a, refname, 10240));
474
475 /* Verify regular file. */
476 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
477 assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
478 archive_entry_pathname(ae));
479 assertEqualInt(6, archive_entry_size(ae));
480
481 /* Verify regular file. */
482 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
483 assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
484 archive_entry_pathname(ae));
485 assertEqualInt(6, archive_entry_size(ae));
486
487
488 /* End of archive. */
489 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
490
491 /* Verify archive format. */
492 assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
493 assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a));
494
495 /* Close the archive. */
496 assertEqualInt(ARCHIVE_OK, archive_read_close(a));
497 cleanup:
498 assertEqualInt(ARCHIVE_OK, archive_read_free(a));
499 }
500
501