test_read_format_zip.c revision 344673
1/*-
2 * Copyright (c) 2003-2007 Tim Kientzle
3 * Copyright (c) 2011 Michihiro NAKAJIMA
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26#include "test.h"
27__FBSDID("$FreeBSD: stable/11/contrib/libarchive/libarchive/test/test_read_format_zip.c 344673 2019-02-28 22:56:15Z mm $");
28
29#define __LIBARCHIVE_BUILD
30#include <archive_crc32.h>
31
32static
33int extract_one(struct archive* a, struct archive_entry* ae, uint32_t crc)
34{
35    la_ssize_t fsize, bytes_read;
36    uint8_t* buf;
37    int ret = 1;
38    uint32_t computed_crc;
39
40    fsize = archive_entry_size(ae);
41    buf = malloc(fsize);
42    if(buf == NULL)
43        return 1;
44
45    bytes_read = archive_read_data(a, buf, fsize);
46    if(bytes_read != fsize) {
47        assertEqualInt(bytes_read, fsize);
48        goto fn_exit;
49    }
50
51    computed_crc = crc32(0, buf, fsize);
52    assertEqualInt(computed_crc, crc);
53    ret = 0;
54
55fn_exit:
56    free(buf);
57    return ret;
58}
59
60static
61int extract_one_using_blocks(struct archive* a, int block_size, uint32_t crc)
62{
63	uint8_t* buf;
64	int ret = 1;
65	uint32_t computed_crc = 0;
66	la_ssize_t bytes_read;
67
68	buf = malloc(block_size);
69	if(buf == NULL)
70		return 1;
71
72	while(1) {
73		bytes_read = archive_read_data(a, buf, block_size);
74		if(bytes_read == ARCHIVE_RETRY)
75			continue;
76		else if(bytes_read == 0)
77			break;
78		else if(bytes_read < 0) {
79			/* If we're here, it means the decompressor has failed
80			 * to properly decode test file. */
81			assertA(0);
82			ret = 1;
83			goto fn_exit;
84		} else {
85			/* ok */
86		}
87
88		computed_crc = crc32(computed_crc, buf, bytes_read);
89	}
90
91	assertEqualInt(computed_crc, crc);
92	ret = 0;
93
94fn_exit:
95	free(buf);
96	return ret;
97}
98
99/*
100 * The reference file for this has been manually tweaked so that:
101 *   * file2 has length-at-end but file1 does not
102 *   * file2 has an invalid CRC
103 */
104static void
105verify_basic(struct archive *a, int seek_checks)
106{
107	struct archive_entry *ae;
108	char *buff[128];
109	const void *pv;
110	size_t s;
111	int64_t o;
112
113	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
114        assertEqualString("ZIP 1.0 (uncompressed)", archive_format_name(a));
115	assertEqualString("dir/", archive_entry_pathname(ae));
116	assertEqualInt(1179604249, archive_entry_mtime(ae));
117	assertEqualInt(0, archive_entry_size(ae));
118	if (seek_checks)
119		assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
120	assertEqualInt(archive_entry_is_encrypted(ae), 0);
121	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
122	assertEqualIntA(a, ARCHIVE_EOF,
123	    archive_read_data_block(a, &pv, &s, &o));
124	assertEqualInt((int)s, 0);
125
126	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
127        assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a));
128	assertEqualString("file1", archive_entry_pathname(ae));
129	assertEqualInt(1179604289, archive_entry_mtime(ae));
130	if (seek_checks)
131		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
132	assertEqualInt(18, archive_entry_size(ae));
133	assertEqualInt(archive_entry_is_encrypted(ae), 0);
134	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
135	failure("archive_read_data() returns number of bytes read");
136	if (archive_zlib_version() != NULL) {
137		assertEqualInt(18, archive_read_data(a, buff, 19));
138		assertEqualMem(buff, "hello\nhello\nhello\n", 18);
139	} else {
140		assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19));
141		assertEqualString(archive_error_string(a),
142		    "Unsupported ZIP compression method (deflation)");
143		assert(archive_errno(a) != 0);
144	}
145
146	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
147        assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a));
148	assertEqualString("file2", archive_entry_pathname(ae));
149	assertEqualInt(1179605932, archive_entry_mtime(ae));
150	assertEqualInt(archive_entry_is_encrypted(ae), 0);
151	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
152	if (seek_checks) {
153		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
154	}
155	assert(archive_entry_size_is_set(ae));
156	assertEqualInt(18, archive_entry_size(ae));
157	if (archive_zlib_version() != NULL) {
158		failure("file2 has a bad CRC, so read should fail and not change buff");
159		memset(buff, 'a', 19);
160		assertEqualInt(ARCHIVE_WARN, archive_read_data(a, buff, 19));
161		assertEqualMem(buff, "aaaaaaaaaaaaaaaaaaa", 19);
162	} else {
163		assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19));
164		assertEqualString(archive_error_string(a),
165		    "Unsupported ZIP compression method (deflation)");
166		assert(archive_errno(a) != 0);
167	}
168	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
169        assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a));
170	/* Verify the number of files read. */
171	failure("the archive file has three files");
172	assertEqualInt(3, archive_file_count(a));
173	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
174	assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
175	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
176	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
177}
178
179static void
180test_basic(void)
181{
182	const char *refname = "test_read_format_zip.zip";
183	struct archive *a;
184	char *p;
185	size_t s;
186
187	extract_reference_file(refname);
188
189	/* Verify with seeking reader. */
190	assert((a = archive_read_new()) != NULL);
191	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
192	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
193	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240));
194	verify_basic(a, 1);
195
196	/* Verify with streaming reader. */
197	p = slurpfile(&s, refname);
198	assert((a = archive_read_new()) != NULL);
199	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
200	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
201	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 31));
202	verify_basic(a, 0);
203	free(p);
204}
205
206/*
207 * Read Info-ZIP New Unix Extra Field 0x7875 "ux".
208 *  Currently stores Unix UID/GID up to 32 bits.
209 */
210static void
211verify_info_zip_ux(struct archive *a, int seek_checks)
212{
213	struct archive_entry *ae;
214	char *buff[128];
215
216	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
217	assertEqualString("file1", archive_entry_pathname(ae));
218	assertEqualInt(1300668680, archive_entry_mtime(ae));
219	assertEqualInt(18, archive_entry_size(ae));
220	assertEqualInt(archive_entry_is_encrypted(ae), 0);
221	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
222	if (seek_checks)
223		assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae));
224	failure("zip reader should read Info-ZIP New Unix Extra Field");
225	assertEqualInt(1001, archive_entry_uid(ae));
226	assertEqualInt(1001, archive_entry_gid(ae));
227	if (archive_zlib_version() != NULL) {
228		failure("archive_read_data() returns number of bytes read");
229		assertEqualInt(18, archive_read_data(a, buff, 19));
230		assertEqualMem(buff, "hello\nhello\nhello\n", 18);
231	} else {
232		assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19));
233		assertEqualString(archive_error_string(a),
234		    "Unsupported ZIP compression method (deflation)");
235		assert(archive_errno(a) != 0);
236	}
237	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
238
239	/* Verify the number of files read. */
240	failure("the archive file has just one file");
241	assertEqualInt(1, archive_file_count(a));
242
243	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
244	assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a));
245	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
246	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
247}
248
249static void
250test_info_zip_ux(void)
251{
252	const char *refname = "test_read_format_zip_ux.zip";
253	struct archive *a;
254	char *p;
255	size_t s;
256
257	extract_reference_file(refname);
258
259	/* Verify with seeking reader. */
260	assert((a = archive_read_new()) != NULL);
261	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
262	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
263	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240));
264	verify_info_zip_ux(a, 1);
265
266	/* Verify with streaming reader. */
267	p = slurpfile(&s, refname);
268	assert((a = archive_read_new()) != NULL);
269	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
270	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
271	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 108));
272	verify_info_zip_ux(a, 0);
273	free(p);
274}
275
276/*
277 * Verify that test_read_extract correctly works with
278 * Zip entries that use length-at-end.
279 */
280static void
281verify_extract_length_at_end(struct archive *a, int seek_checks)
282{
283	struct archive_entry *ae;
284
285	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
286
287	assertEqualInt(archive_entry_is_encrypted(ae), 0);
288	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
289	assertEqualString("hello.txt", archive_entry_pathname(ae));
290	if (seek_checks) {
291		assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae));
292		assert(archive_entry_size_is_set(ae));
293		assertEqualInt(6, archive_entry_size(ae));
294	} else {
295		assert(!archive_entry_size_is_set(ae));
296		assertEqualInt(0, archive_entry_size(ae));
297	}
298
299	if (archive_zlib_version() != NULL) {
300		assertEqualIntA(a, ARCHIVE_OK, archive_read_extract(a, ae, 0));
301		assertFileContents("hello\x0A", 6, "hello.txt");
302	} else {
303		assertEqualIntA(a, ARCHIVE_FAILED, archive_read_extract(a, ae, 0));
304		assertEqualString(archive_error_string(a),
305		    "Unsupported ZIP compression method (deflation)");
306		assert(archive_errno(a) != 0);
307	}
308
309	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
310	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
311}
312
313static void
314test_extract_length_at_end(void)
315{
316	const char *refname = "test_read_format_zip_length_at_end.zip";
317	char *p;
318	size_t s;
319	struct archive *a;
320
321	extract_reference_file(refname);
322
323	/* Verify extraction with seeking reader. */
324	assert((a = archive_read_new()) != NULL);
325	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
326	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
327	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240));
328	verify_extract_length_at_end(a, 1);
329
330	/* Verify extraction with streaming reader. */
331	p = slurpfile(&s, refname);
332	assert((a = archive_read_new()) != NULL);
333	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
334	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
335	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 108));
336	verify_extract_length_at_end(a, 0);
337	free(p);
338}
339
340static void
341test_symlink(void)
342{
343	const char *refname = "test_read_format_zip_symlink.zip";
344	char *p;
345	size_t s;
346	struct archive *a;
347	struct archive_entry *ae;
348
349	extract_reference_file(refname);
350	p = slurpfile(&s, refname);
351
352	/* Symlinks can only be extracted with the seeking reader. */
353	assert((a = archive_read_new()) != NULL);
354	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
355	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 1));
356
357	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
358	assertEqualString("file", archive_entry_pathname(ae));
359	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
360	assertEqualInt(archive_entry_is_encrypted(ae), 0);
361	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
362
363	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
364	assertEqualString("symlink", archive_entry_pathname(ae));
365	assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
366	assertEqualInt(0, archive_entry_size(ae));
367	assertEqualString("file", archive_entry_symlink(ae));
368	assertEqualInt(archive_entry_is_encrypted(ae), 0);
369	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
370
371	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
372	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
373	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
374
375	free(p);
376}
377
378DEFINE_TEST(test_read_format_zip)
379{
380	test_basic();
381	test_info_zip_ux();
382	test_extract_length_at_end();
383	test_symlink();
384}
385
386DEFINE_TEST(test_read_format_zip_ppmd_one_file)
387{
388	const char *refname = "test_read_format_zip_ppmd8.zipx";
389	struct archive *a;
390	struct archive_entry *ae;
391
392	extract_reference_file(refname);
393
394	assert((a = archive_read_new()) != NULL);
395	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
396	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
397	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
398	assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a));
399	assertEqualString("vimrc", archive_entry_pathname(ae));
400	assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA));
401	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
402	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
403	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
404}
405
406DEFINE_TEST(test_read_format_zip_ppmd_one_file_blockread)
407{
408	const char *refname = "test_read_format_zip_ppmd8.zipx";
409	struct archive *a;
410	struct archive_entry *ae;
411
412	extract_reference_file(refname);
413
414	assert((a = archive_read_new()) != NULL);
415	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
416	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
417	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
418	assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a));
419	assertEqualString("vimrc", archive_entry_pathname(ae));
420	assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0xBA8E3BAA));
421	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
422	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
423	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
424}
425
426DEFINE_TEST(test_read_format_zip_ppmd_multi)
427{
428	const char *refname = "test_read_format_zip_ppmd8_multi.zipx";
429	struct archive *a;
430	struct archive_entry *ae;
431
432	extract_reference_file(refname);
433
434	assert((a = archive_read_new()) != NULL);
435	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
436	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
437
438	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
439	assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a));
440	assertEqualString("smartd.conf", archive_entry_pathname(ae));
441	assertEqualIntA(a, 0, extract_one(a, ae, 0x8DD7379E));
442
443	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
444	assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a));
445	assertEqualString("ts.conf", archive_entry_pathname(ae));
446	assertEqualIntA(a, 0, extract_one(a, ae, 0x7AE59B31));
447
448	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
449	assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a));
450	assertEqualString("vimrc", archive_entry_pathname(ae));
451	assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA));
452
453	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
454	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
455	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
456}
457
458DEFINE_TEST(test_read_format_zip_ppmd_multi_blockread)
459{
460	const char *refname = "test_read_format_zip_ppmd8_multi.zipx";
461	struct archive *a;
462	struct archive_entry *ae;
463
464	extract_reference_file(refname);
465
466	assert((a = archive_read_new()) != NULL);
467	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
468	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
469
470	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
471	assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a));
472	assertEqualString("smartd.conf", archive_entry_pathname(ae));
473	assertEqualIntA(a, 0, extract_one_using_blocks(a, 12, 0x8DD7379E));
474
475	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
476	assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a));
477	assertEqualString("ts.conf", archive_entry_pathname(ae));
478	assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0x7AE59B31));
479
480	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
481	assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a));
482	assertEqualString("vimrc", archive_entry_pathname(ae));
483	assertEqualIntA(a, 0, extract_one_using_blocks(a, 14, 0xBA8E3BAA));
484
485	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
486	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
487	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
488}
489
490DEFINE_TEST(test_read_format_zip_lzma_one_file)
491{
492	const char *refname = "test_read_format_zip_lzma.zipx";
493	struct archive *a;
494	struct archive_entry *ae;
495
496	extract_reference_file(refname);
497
498	assert((a = archive_read_new()) != NULL);
499	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
500	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
501	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
502	assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
503	assertEqualString("vimrc", archive_entry_pathname(ae));
504	assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA));
505	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
506	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
507	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
508}
509
510DEFINE_TEST(test_read_format_zip_lzma_one_file_blockread)
511{
512	const char *refname = "test_read_format_zip_lzma.zipx";
513	struct archive *a;
514	struct archive_entry *ae;
515
516	extract_reference_file(refname);
517
518	assert((a = archive_read_new()) != NULL);
519	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
520	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
521	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
522	assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
523	assertEqualString("vimrc", archive_entry_pathname(ae));
524	assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0xBA8E3BAA));
525	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
526	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
527	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
528}
529
530DEFINE_TEST(test_read_format_zip_lzma_multi)
531{
532	const char *refname = "test_read_format_zip_lzma_multi.zipx";
533	struct archive *a;
534	struct archive_entry *ae;
535
536	extract_reference_file(refname);
537
538	assert((a = archive_read_new()) != NULL);
539	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
540	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
541
542	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
543	assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
544	assertEqualString("smartd.conf", archive_entry_pathname(ae));
545	assertEqualIntA(a, 0, extract_one(a, ae, 0x8DD7379E));
546
547	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
548	assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
549	assertEqualString("ts.conf", archive_entry_pathname(ae));
550	assertEqualIntA(a, 0, extract_one(a, ae, 0x7AE59B31));
551
552	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
553	assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
554	assertEqualString("vimrc", archive_entry_pathname(ae));
555	assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA));
556
557	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
558	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
559	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
560}
561
562DEFINE_TEST(test_read_format_zip_lzma_multi_blockread)
563{
564	const char *refname = "test_read_format_zip_lzma_multi.zipx";
565	struct archive *a;
566	struct archive_entry *ae;
567
568	extract_reference_file(refname);
569
570	assert((a = archive_read_new()) != NULL);
571	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
572	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
573
574	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
575	assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
576	assertEqualString("smartd.conf", archive_entry_pathname(ae));
577	assertEqualIntA(a, 0, extract_one_using_blocks(a, 12, 0x8DD7379E));
578
579	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
580	assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
581	assertEqualString("ts.conf", archive_entry_pathname(ae));
582	assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0x7AE59B31));
583
584	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
585	assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
586	assertEqualString("vimrc", archive_entry_pathname(ae));
587	assertEqualIntA(a, 0, extract_one_using_blocks(a, 14, 0xBA8E3BAA));
588
589	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
590	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
591	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
592}
593
594
595DEFINE_TEST(test_read_format_zip_bzip2_one_file)
596{
597	const char *refname = "test_read_format_zip_bzip2.zipx";
598	struct archive *a;
599	struct archive_entry *ae;
600
601	extract_reference_file(refname);
602
603	assert((a = archive_read_new()) != NULL);
604	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
605	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
606	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
607	assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a));
608	assertEqualString("vimrc", archive_entry_pathname(ae));
609	assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA));
610	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
611	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
612	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
613}
614
615DEFINE_TEST(test_read_format_zip_bzip2_one_file_blockread)
616{
617	const char *refname = "test_read_format_zip_bzip2.zipx";
618	struct archive *a;
619	struct archive_entry *ae;
620
621	extract_reference_file(refname);
622
623	assert((a = archive_read_new()) != NULL);
624	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
625	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
626	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
627	assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a));
628	assertEqualString("vimrc", archive_entry_pathname(ae));
629	assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0xBA8E3BAA));
630	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
631	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
632	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
633}
634
635DEFINE_TEST(test_read_format_zip_bzip2_multi)
636{
637	const char *refname = "test_read_format_zip_bzip2_multi.zipx";
638	struct archive *a;
639	struct archive_entry *ae;
640
641	extract_reference_file(refname);
642
643	assert((a = archive_read_new()) != NULL);
644	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
645	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
646
647	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
648	assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a));
649	assertEqualString("smartd.conf", archive_entry_pathname(ae));
650	assertEqualIntA(a, 0, extract_one(a, ae, 0x8DD7379E));
651
652	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
653	assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a));
654	assertEqualString("ts.conf", archive_entry_pathname(ae));
655	assertEqualIntA(a, 0, extract_one(a, ae, 0x7AE59B31));
656
657	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
658	assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a));
659	assertEqualString("vimrc", archive_entry_pathname(ae));
660	assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA));
661
662	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
663	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
664	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
665}
666
667DEFINE_TEST(test_read_format_zip_bzip2_multi_blockread)
668{
669	const char *refname = "test_read_format_zip_bzip2_multi.zipx";
670	struct archive *a;
671	struct archive_entry *ae;
672
673	extract_reference_file(refname);
674
675	assert((a = archive_read_new()) != NULL);
676	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
677	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
678
679	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
680	assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a));
681	assertEqualString("smartd.conf", archive_entry_pathname(ae));
682	assertEqualIntA(a, 0, extract_one_using_blocks(a, 12, 0x8DD7379E));
683
684	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
685	assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a));
686	assertEqualString("ts.conf", archive_entry_pathname(ae));
687	assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0x7AE59B31));
688
689	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
690	assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a));
691	assertEqualString("vimrc", archive_entry_pathname(ae));
692	assertEqualIntA(a, 0, extract_one_using_blocks(a, 14, 0xBA8E3BAA));
693
694	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
695	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
696	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
697}
698
699DEFINE_TEST(test_read_format_zip_xz_multi)
700{
701	const char *refname = "test_read_format_zip_xz_multi.zipx";
702	struct archive *a;
703	struct archive_entry *ae;
704
705	extract_reference_file(refname);
706
707	assert((a = archive_read_new()) != NULL);
708	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
709	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
710
711	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
712	assertEqualString("ZIP 2.0 (xz)", archive_format_name(a));
713	assertEqualString("bash.bashrc", archive_entry_pathname(ae));
714	assertEqualIntA(a, 0, extract_one(a, ae, 0xF751B8C9));
715
716	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
717	assertEqualString("ZIP 2.0 (xz)", archive_format_name(a));
718	assertEqualString("pacman.conf", archive_entry_pathname(ae));
719	assertEqualIntA(a, 0, extract_one(a, ae, 0xB20B7F88));
720
721	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
722	assertEqualString("ZIP 2.0 (xz)", archive_format_name(a));
723	assertEqualString("profile", archive_entry_pathname(ae));
724	assertEqualIntA(a, 0, extract_one(a, ae, 0x2329F054));
725
726	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
727	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
728	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
729}
730
731DEFINE_TEST(test_read_format_zip_xz_multi_blockread)
732{
733	const char *refname = "test_read_format_zip_xz_multi.zipx";
734	struct archive *a;
735	struct archive_entry *ae;
736
737	extract_reference_file(refname);
738
739	assert((a = archive_read_new()) != NULL);
740	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
741	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
742
743	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
744	assertEqualString("ZIP 2.0 (xz)", archive_format_name(a));
745	assertEqualString("bash.bashrc", archive_entry_pathname(ae));
746	assertEqualIntA(a, 0, extract_one_using_blocks(a, 12, 0xF751B8C9));
747
748	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
749	assertEqualString("ZIP 2.0 (xz)", archive_format_name(a));
750	assertEqualString("pacman.conf", archive_entry_pathname(ae));
751	assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0xB20B7F88));
752
753	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
754	assertEqualString("ZIP 2.0 (xz)", archive_format_name(a));
755	assertEqualString("profile", archive_entry_pathname(ae));
756	assertEqualIntA(a, 0, extract_one_using_blocks(a, 14, 0x2329F054));
757
758	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
759	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
760	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
761}
762