test_read_format_lha_filename.c revision 232153
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__FBSDID("$FreeBSD");
27
28#include <locale.h>
29
30static void
31test_read_format_lha_filename_CP932_eucJP(const char *refname)
32{
33	struct archive *a;
34	struct archive_entry *ae;
35
36	/*
37	 * Read LHA filename in ja_JP.eucJP.
38	 */
39	if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) {
40		skipping("ja_JP.eucJP locale not available on this system.");
41		return;
42	}
43
44	/*
45	 * Create a read object only for a test that platform support
46	 * a character-set conversion because we can read a character-set
47	 * of filenames from the header of an lha archive file and so we
48	 * want to test that it works well.
49	 */
50	assert((a = archive_read_new()) != NULL);
51	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
52	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) {
53		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
54		skipping("This system cannot convert character-set"
55		    " from CP932 to eucJP.");
56		return;
57	}
58	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
59
60	assert((a = archive_read_new()) != NULL);
61	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
62	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
63	assertEqualIntA(a, ARCHIVE_OK,
64	    archive_read_open_filename(a, refname, 10240));
65
66	/* Verify regular file. */
67	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
68	assertEqualString("\xB4\xC1\xBB\xFA\x2E\x74\x78\x74",
69	    archive_entry_pathname(ae));
70	assertEqualInt(8, archive_entry_size(ae));
71
72	/* Verify regular file. */
73	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
74	assertEqualString("\xC9\xBD\x2E\x74\x78\x74", archive_entry_pathname(ae));
75	assertEqualInt(4, archive_entry_size(ae));
76
77
78	/* End of archive. */
79	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
80
81	/* Verify archive format. */
82	assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a));
83	assertEqualIntA(a, ARCHIVE_FORMAT_LHA, archive_format(a));
84
85	/* Close the archive. */
86	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
87	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
88}
89
90static void
91test_read_format_lha_filename_CP932_UTF8(const char *refname)
92{
93	struct archive *a;
94	struct archive_entry *ae;
95
96	/*
97	 * Read LHA filename in en_US.UTF-8.
98	 */
99	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
100		skipping("en_US.UTF-8 locale not available on this system.");
101		return;
102	}
103	/*
104	 * Create a read object only for a test that platform support
105	 * a character-set conversion because we can read a character-set
106	 * of filenames from the header of an lha archive file and so we
107	 * want to test that it works well.
108	 */
109	assert((a = archive_read_new()) != NULL);
110	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
111	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP932")) {
112		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
113		skipping("This system cannot convert character-set"
114		    " from CP932 to UTF-8.");
115		return;
116	}
117	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
118
119	assert((a = archive_read_new()) != NULL);
120	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
121	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
122	assertEqualIntA(a, ARCHIVE_OK,
123	    archive_read_open_filename(a, refname, 10240));
124
125	/* Verify regular file. */
126	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
127	assertEqualString("\xE6\xBC\xA2\xE5\xAD\x97\x2E\x74\x78\x74",
128	    archive_entry_pathname(ae));
129	assertEqualInt(8, archive_entry_size(ae));
130
131	/* Verify regular file. */
132	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
133	assertEqualString("\xE8\xA1\xA8\x2E\x74\x78\x74",
134	    archive_entry_pathname(ae));
135	assertEqualInt(4, archive_entry_size(ae));
136
137
138	/* End of archive. */
139	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
140
141	/* Verify archive format. */
142	assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a));
143	assertEqualIntA(a, ARCHIVE_FORMAT_LHA, archive_format(a));
144
145	/* Close the archive. */
146	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
147	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
148}
149
150#if defined(_WIN32) && !defined(__CYGWIN__)
151static void
152test_read_format_lha_filename_CP932_Windows(const char *refname)
153{
154	struct archive *a;
155	struct archive_entry *ae;
156
157	/*
158	 * Read LHA filename in jpn on Windows.
159	 */
160	if (NULL == setlocale(LC_ALL, "jpn")) {
161		skipping("jpn locale not available on this system.");
162		return;
163	}
164	/*
165	 * Create a read object only for a test that platform support
166	 * a character-set conversion because we can read a character-set
167	 * of filenames from the header of an lha archive file and so we
168	 * want to test that it works well.
169	 */
170	assert((a = archive_read_new()) != NULL);
171	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
172	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
173	assertEqualIntA(a, ARCHIVE_OK,
174	    archive_read_open_filename(a, refname, 10240));
175
176	/* Verify regular file. */
177	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
178	assertEqualString("\x8A\xBF\x8E\x9A\x2E\x74\x78\x74",
179	    archive_entry_pathname(ae));
180	assertEqualInt(8, archive_entry_size(ae));
181
182	/* Verify regular file. */
183	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
184	assertEqualString("\x95\x5C\x2E\x74\x78\x74", archive_entry_pathname(ae));
185	assertEqualInt(4, archive_entry_size(ae));
186
187
188	/* End of archive. */
189	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
190
191	/* Verify archive format. */
192	assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a));
193	assertEqualIntA(a, ARCHIVE_FORMAT_LHA, archive_format(a));
194
195	/* Close the archive. */
196	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
197	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
198}
199#else
200/* Stub */
201static void
202test_read_format_lha_filename_CP932_Windows(const char *refname)
203{
204	(void)refname; /* UNUSED */
205}
206#endif
207
208DEFINE_TEST(test_read_format_lha_filename)
209{
210	/* A sample file was created with LHA32.EXE through UNLHA.DLL. */
211	const char *refname = "test_read_format_lha_filename_cp932.lzh";
212
213	extract_reference_file(refname);
214
215	test_read_format_lha_filename_CP932_eucJP(refname);
216	test_read_format_lha_filename_CP932_UTF8(refname);
217	test_read_format_lha_filename_CP932_Windows(refname);
218}
219