1299425Smm/*-
2299425Smm * Copyright (c) 2003-2008 Tim Kientzle
3299425Smm * Copyright (c) 2008 Anselm Strauss
4299425Smm * All rights reserved.
5299425Smm *
6299425Smm * Redistribution and use in source and binary forms, with or without
7299425Smm * modification, are permitted provided that the following conditions
8299425Smm * are met:
9299425Smm * 1. Redistributions of source code must retain the above copyright
10299425Smm *    notice, this list of conditions and the following disclaimer.
11299425Smm * 2. Redistributions in binary form must reproduce the above copyright
12299425Smm *    notice, this list of conditions and the following disclaimer in the
13299425Smm *    documentation and/or other materials provided with the distribution.
14299425Smm *
15299425Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16299425Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17299425Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18299425Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19299425Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20299425Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21299425Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22299425Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23299425Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24299425Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25299425Smm */
26299425Smm
27299425Smm/*
28299425Smm * Development supported by Google Summer of Code 2008.
29299425Smm */
30299425Smm
31299425Smm#include "test.h"
32370535Sgit2svn__FBSDID("$FreeBSD: stable/11/contrib/libarchive/libarchive/test/test_write_read_format_zip.c 370535 2021-09-10 08:34:36Z git2svn $");
33299425Smm
34299425Smm/*
35299425Smm * These tests verify that our reader can read files
36299425Smm * created by our writer.
37299425Smm */
38299425Smm
39299425Smm/*
40299425Smm * Write a variety of different file types into the archive.
41299425Smm */
42299425Smmstatic void
43299425Smmwrite_contents(struct archive *a)
44299425Smm{
45299425Smm	struct archive_entry *ae;
46299425Smm
47299425Smm	/*
48299425Smm	 * First write things with the "default" compression.
49299425Smm	 * The library will choose "deflate" for most things if it's
50299425Smm	 * available, else "store".
51299425Smm	 */
52299425Smm
53299425Smm	/*
54299425Smm	 * Write a file to it.
55299425Smm	 */
56299425Smm	assert((ae = archive_entry_new()) != NULL);
57299425Smm	archive_entry_set_mtime(ae, 1, 10);
58299425Smm	archive_entry_copy_pathname(ae, "file");
59299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
60299425Smm	archive_entry_set_size(ae, 8);
61299425Smm	assertEqualInt(0, archive_write_header(a, ae));
62299425Smm	archive_entry_free(ae);
63299425Smm	assertEqualInt(8, archive_write_data(a, "12345678", 9));
64299425Smm	assertEqualInt(0, archive_write_data(a, "1", 1));
65299425Smm
66299425Smm	/*
67299425Smm	 * Write another file to it.
68299425Smm	 */
69299425Smm	assert((ae = archive_entry_new()) != NULL);
70299425Smm	archive_entry_set_mtime(ae, 1, 10);
71299425Smm	archive_entry_copy_pathname(ae, "file2");
72299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
73299425Smm	archive_entry_set_size(ae, 4);
74299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
75299425Smm	archive_entry_free(ae);
76299425Smm	assertEqualInt(4, archive_write_data(a, "1234", 4));
77299425Smm
78299425Smm	/*
79299425Smm	 * Write a file with an unknown size.
80299425Smm	 */
81299425Smm	assert((ae = archive_entry_new()) != NULL);
82299425Smm	archive_entry_set_mtime(ae, 2, 15);
83299425Smm	archive_entry_copy_pathname(ae, "file3");
84299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0621);
85299425Smm	archive_entry_unset_size(ae);
86299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
87299425Smm	archive_entry_free(ae);
88299425Smm	assertEqualInt(5, archive_write_data(a, "mnopq", 5));
89299425Smm
90299425Smm	/*
91299425Smm	 * Write symbolic link.
92299425Smm	 */
93299425Smm	assert((ae = archive_entry_new()) != NULL);
94299425Smm	archive_entry_set_mtime(ae, 1, 10);
95299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
96299425Smm	assertEqualInt(10, archive_entry_mtime_nsec(ae));
97299425Smm	archive_entry_copy_pathname(ae, "symlink");
98299425Smm	assertEqualString("symlink", archive_entry_pathname(ae));
99299425Smm	archive_entry_copy_symlink(ae, "file1");
100299425Smm	assertEqualString("file1", archive_entry_symlink(ae));
101299425Smm	archive_entry_set_mode(ae, AE_IFLNK | 0755);
102299425Smm	assertEqualInt((AE_IFLNK | 0755), archive_entry_mode(ae));
103299425Smm	archive_entry_set_size(ae, 4);
104299425Smm
105299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
106299425Smm	archive_entry_free(ae);
107299425Smm
108299425Smm	/*
109299425Smm	 * Write a directory to it.
110299425Smm	 */
111299425Smm	assert((ae = archive_entry_new()) != NULL);
112299425Smm	archive_entry_set_mtime(ae, 11, 110);
113299425Smm	archive_entry_copy_pathname(ae, "dir");
114299425Smm	archive_entry_set_mode(ae, S_IFDIR | 0755);
115299425Smm	archive_entry_set_size(ae, 512);
116299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
117299425Smm	failure("size should be zero so that applications know not to write");
118299425Smm	assertEqualInt(0, archive_entry_size(ae));
119299425Smm	archive_entry_free(ae);
120299425Smm	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
121299425Smm
122299425Smm	/*
123299425Smm	 * Force "deflate" compression if the platform supports it.
124299425Smm	 */
125299425Smm#ifdef HAVE_ZLIB_H
126299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_deflate(a));
127299425Smm
128299425Smm	/*
129299425Smm	 * Write a file to it.
130299425Smm	 */
131299425Smm	assert((ae = archive_entry_new()) != NULL);
132299425Smm	archive_entry_set_mtime(ae, 1, 10);
133299425Smm	archive_entry_copy_pathname(ae, "file_deflate");
134299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
135299425Smm	archive_entry_set_size(ae, 8);
136299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
137299425Smm	archive_entry_free(ae);
138299425Smm	assertEqualInt(8, archive_write_data(a, "12345678", 9));
139299425Smm	assertEqualInt(0, archive_write_data(a, "1", 1));
140299425Smm
141299425Smm	/*
142299425Smm	 * Write another file to it.
143299425Smm	 */
144299425Smm	assert((ae = archive_entry_new()) != NULL);
145299425Smm	archive_entry_set_mtime(ae, 1, 10);
146299425Smm	archive_entry_copy_pathname(ae, "file2_deflate");
147299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
148299425Smm	archive_entry_set_size(ae, 4);
149299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
150299425Smm	archive_entry_free(ae);
151299425Smm	assertEqualInt(4, archive_write_data(a, "1234", 4));
152299425Smm
153299425Smm	/*
154299425Smm	 * Write a file with an unknown size.
155299425Smm	 */
156299425Smm	assert((ae = archive_entry_new()) != NULL);
157299425Smm	archive_entry_set_mtime(ae, 2, 15);
158299425Smm	archive_entry_copy_pathname(ae, "file3_deflate");
159299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0621);
160299425Smm	archive_entry_unset_size(ae);
161299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
162299425Smm	archive_entry_free(ae);
163299425Smm	assertEqualInt(5, archive_write_data(a, "ghijk", 5));
164299425Smm
165299425Smm	/*
166299425Smm	 * Write symbolic like file to it.
167299425Smm	 */
168299425Smm	assert((ae = archive_entry_new()) != NULL);
169299425Smm	archive_entry_set_mtime(ae, 1, 10);
170299425Smm	archive_entry_copy_pathname(ae, "symlink_deflate");
171299425Smm	archive_entry_copy_symlink(ae, "file1");
172299425Smm	archive_entry_set_mode(ae, AE_IFLNK | 0755);
173299425Smm	archive_entry_set_size(ae, 4);
174299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
175299425Smm	archive_entry_free(ae);
176299425Smm
177299425Smm	/*
178299425Smm	 * Write a directory to it.
179299425Smm	 */
180299425Smm	assert((ae = archive_entry_new()) != NULL);
181299425Smm	archive_entry_set_mtime(ae, 11, 110);
182299425Smm	archive_entry_copy_pathname(ae, "dir_deflate");
183299425Smm	archive_entry_set_mode(ae, S_IFDIR | 0755);
184299425Smm	archive_entry_set_size(ae, 512);
185299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
186299425Smm	failure("size should be zero so that applications know not to write");
187299425Smm	assertEqualInt(0, archive_entry_size(ae));
188299425Smm	archive_entry_free(ae);
189299425Smm	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
190299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_finish_entry(a));
191299425Smm#endif
192299425Smm
193299425Smm	/*
194299425Smm	 * Now write a bunch of entries with "store" compression.
195299425Smm	 */
196299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_store(a));
197299425Smm
198299425Smm	/*
199299425Smm	 * Write a file to it.
200299425Smm	 */
201299425Smm	assert((ae = archive_entry_new()) != NULL);
202299425Smm	archive_entry_set_mtime(ae, 1, 10);
203299425Smm	archive_entry_copy_pathname(ae, "file_stored");
204299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
205299425Smm	archive_entry_set_size(ae, 8);
206299425Smm	assertEqualInt(0, archive_write_header(a, ae));
207299425Smm	archive_entry_free(ae);
208299425Smm	assertEqualInt(8, archive_write_data(a, "12345678", 9));
209299425Smm	assertEqualInt(0, archive_write_data(a, "1", 1));
210299425Smm
211299425Smm	/*
212299425Smm	 * Write another file to it.
213299425Smm	 */
214299425Smm	assert((ae = archive_entry_new()) != NULL);
215299425Smm	archive_entry_set_mtime(ae, 1, 10);
216299425Smm	archive_entry_copy_pathname(ae, "file2_stored");
217299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
218299425Smm	archive_entry_set_size(ae, 4);
219299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
220299425Smm	archive_entry_free(ae);
221299425Smm	assertEqualInt(4, archive_write_data(a, "ACEG", 4));
222299425Smm
223299425Smm	/*
224299425Smm	 * Write a file with an unknown size.
225299425Smm	 */
226299425Smm	assert((ae = archive_entry_new()) != NULL);
227299425Smm	archive_entry_set_mtime(ae, 2, 15);
228299425Smm	archive_entry_copy_pathname(ae, "file3_stored");
229299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0621);
230299425Smm	archive_entry_unset_size(ae);
231299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
232299425Smm	archive_entry_free(ae);
233299425Smm	assertEqualInt(5, archive_write_data(a, "ijklm", 5));
234299425Smm
235299425Smm	/*
236299425Smm	 * Write symbolic like file to it.
237299425Smm	 */
238299425Smm	assert((ae = archive_entry_new()) != NULL);
239299425Smm	archive_entry_set_mtime(ae, 1, 10);
240299425Smm	archive_entry_copy_pathname(ae, "symlink_stored");
241299425Smm	archive_entry_copy_symlink(ae, "file1");
242299425Smm	archive_entry_set_mode(ae, AE_IFLNK | 0755);
243299425Smm	archive_entry_set_size(ae, 4);
244299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
245299425Smm	archive_entry_free(ae);
246299425Smm
247299425Smm	/*
248299425Smm	 * Write a directory to it.
249299425Smm	 */
250299425Smm	assert((ae = archive_entry_new()) != NULL);
251299425Smm	archive_entry_set_mtime(ae, 11, 110);
252299425Smm	archive_entry_copy_pathname(ae, "dir_stored");
253299425Smm	archive_entry_set_mode(ae, S_IFDIR | 0755);
254299425Smm	archive_entry_set_size(ae, 512);
255299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
256299425Smm	failure("size should be zero so that applications know not to write");
257299425Smm	assertEqualInt(0, archive_entry_size(ae));
258299425Smm	archive_entry_free(ae);
259299425Smm	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
260299425Smm
261299425Smm
262299425Smm	/* Close out the archive. */
263299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_close(a));
264299425Smm	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
265299425Smm}
266299425Smm
267299425Smm/*
268299425Smm * Read back all of the entries and verify their values.
269299425Smm */
270299425Smmstatic void
271299425Smmverify_contents(struct archive *a, int seeking, int improved_streaming)
272299425Smm{
273299425Smm	char filedata[64];
274299425Smm	struct archive_entry *ae;
275299425Smm
276299425Smm	/*
277299425Smm	 * Default compression options:
278299425Smm	 */
279299425Smm
280299425Smm	/* Read and verify first file. */
281299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
282299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
283299425Smm	/* Zip doesn't store high-resolution mtime. */
284299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
285299425Smm	assertEqualInt(0, archive_entry_atime(ae));
286299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
287299425Smm	assertEqualString("file", archive_entry_pathname(ae));
288299425Smm	if (seeking || improved_streaming) {
289299425Smm		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
290299425Smm	}
291299425Smm	assertEqualInt(8, archive_entry_size(ae));
292299425Smm	assert(archive_entry_size_is_set(ae));
293299425Smm	assertEqualIntA(a, 8,
294299425Smm	    archive_read_data(a, filedata, sizeof(filedata)));
295299425Smm	assertEqualMem(filedata, "12345678", 8);
296299425Smm
297299425Smm
298299425Smm	/* Read the second file back. */
299299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
300299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
301299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
302299425Smm	assertEqualInt(0, archive_entry_atime(ae));
303299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
304299425Smm	assertEqualString("file2", archive_entry_pathname(ae));
305299425Smm	if (seeking || improved_streaming) {
306299425Smm		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
307299425Smm	}
308299425Smm	assertEqualInt(4, archive_entry_size(ae));
309299425Smm	assert(archive_entry_size_is_set(ae));
310299425Smm	assertEqualIntA(a, 4,
311299425Smm	    archive_read_data(a, filedata, sizeof(filedata)));
312299425Smm	assertEqualMem(filedata, "1234", 4);
313299425Smm
314299425Smm	/* Read the third file back. */
315299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
316299425Smm	assertEqualInt(2, archive_entry_mtime(ae));
317299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
318299425Smm	assertEqualInt(0, archive_entry_atime(ae));
319299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
320299425Smm	assertEqualString("file3", archive_entry_pathname(ae));
321299425Smm	if (seeking || improved_streaming) {
322299425Smm		assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
323299425Smm	}
324299425Smm	if (seeking) {
325299425Smm		assertEqualInt(5, archive_entry_size(ae));
326299425Smm	} else {
327299425Smm		assertEqualInt(0, archive_entry_size_is_set(ae));
328299425Smm	}
329299425Smm	assertEqualIntA(a, 5,
330299425Smm	    archive_read_data(a, filedata, sizeof(filedata)));
331299425Smm	assertEqualMem(filedata, "mnopq", 5);
332299425Smm
333299425Smm	/* Read symlink. */
334299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
335299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
336299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
337299425Smm	assertEqualInt(0, archive_entry_atime(ae));
338299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
339299425Smm	assertEqualString("symlink", archive_entry_pathname(ae));
340299425Smm	if (seeking || improved_streaming) {
341299425Smm		assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
342299425Smm		assertEqualInt(0, archive_entry_size(ae));
343299425Smm		assertEqualString("file1", archive_entry_symlink(ae));
344299425Smm	} else {
345299425Smm		/* Streaming cannot read file type, so
346299425Smm		 * symlink body shows as regular file contents. */
347299425Smm		assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae));
348299425Smm		assertEqualInt(5, archive_entry_size(ae));
349299425Smm		assert(archive_entry_size_is_set(ae));
350299425Smm	}
351299425Smm
352299425Smm	/* Read the dir entry back. */
353299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
354299425Smm	assertEqualInt(11, archive_entry_mtime(ae));
355299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
356299425Smm	assertEqualInt(0, archive_entry_atime(ae));
357299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
358299425Smm	assertEqualString("dir/", archive_entry_pathname(ae));
359299425Smm	if (seeking || improved_streaming)
360299425Smm		assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
361299425Smm	assertEqualInt(0, archive_entry_size(ae));
362299425Smm	assert(archive_entry_size_is_set(ae));
363299425Smm	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
364299425Smm
365299425Smm#ifdef HAVE_ZLIB_H
366299425Smm	/*
367299425Smm	 * Deflate compression option:
368299425Smm	 */
369299425Smm
370299425Smm	/* Read and verify first file. */
371299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
372299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
373299425Smm	/* Zip doesn't store high-resolution mtime. */
374299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
375299425Smm	assertEqualInt(0, archive_entry_atime(ae));
376299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
377299425Smm	assertEqualString("file_deflate", archive_entry_pathname(ae));
378299425Smm	if (seeking || improved_streaming) {
379299425Smm		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
380299425Smm	}
381299425Smm	assertEqualInt(8, archive_entry_size(ae));
382299425Smm	assert(archive_entry_size_is_set(ae));
383299425Smm	assertEqualIntA(a, 8,
384299425Smm	    archive_read_data(a, filedata, sizeof(filedata)));
385299425Smm	assertEqualMem(filedata, "12345678", 8);
386299425Smm
387299425Smm
388299425Smm	/* Read the second file back. */
389299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
390299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
391299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
392299425Smm	assertEqualInt(0, archive_entry_atime(ae));
393299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
394299425Smm	assertEqualString("file2_deflate", archive_entry_pathname(ae));
395299425Smm	if (seeking || improved_streaming) {
396299425Smm		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
397299425Smm	}
398299425Smm	assertEqualInt(4, archive_entry_size(ae));
399299425Smm	assert(archive_entry_size_is_set(ae));
400299425Smm	assertEqualIntA(a, 4,
401299425Smm	    archive_read_data(a, filedata, sizeof(filedata)));
402299425Smm	assertEqualMem(filedata, "1234", 4);
403299425Smm
404299425Smm	/* Read the third file back. */
405299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
406299425Smm	assertEqualInt(2, archive_entry_mtime(ae));
407299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
408299425Smm	assertEqualInt(0, archive_entry_atime(ae));
409299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
410299425Smm	assertEqualString("file3_deflate", archive_entry_pathname(ae));
411299425Smm	if (seeking || improved_streaming) {
412299425Smm		assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
413299425Smm	}
414299425Smm	if (seeking) {
415299425Smm		assertEqualInt(5, archive_entry_size(ae));
416299425Smm	} else {
417299425Smm		assertEqualInt(0, archive_entry_size_is_set(ae));
418299425Smm	}
419299425Smm	assertEqualIntA(a, 5,
420299425Smm	    archive_read_data(a, filedata, sizeof(filedata)));
421299425Smm	assertEqualMem(filedata, "ghijk", 4);
422299425Smm
423299425Smm	/* Read symlink. */
424299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
425299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
426299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
427299425Smm	assertEqualInt(0, archive_entry_atime(ae));
428299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
429299425Smm	assertEqualString("symlink_deflate", archive_entry_pathname(ae));
430299425Smm	if (seeking || improved_streaming) {
431299425Smm		assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
432299425Smm		assertEqualInt(0, archive_entry_size(ae));
433299425Smm		assertEqualString("file1", archive_entry_symlink(ae));
434299425Smm	} else {
435299425Smm		assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae));
436299425Smm		assertEqualInt(5, archive_entry_size(ae));
437299425Smm		assertEqualIntA(a, 5, archive_read_data(a, filedata, 10));
438299425Smm		assertEqualMem(filedata, "file1", 5);
439299425Smm	}
440299425Smm
441299425Smm	/* Read the dir entry back. */
442299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
443299425Smm	assertEqualInt(11, archive_entry_mtime(ae));
444299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
445299425Smm	assertEqualInt(0, archive_entry_atime(ae));
446299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
447299425Smm	assertEqualString("dir_deflate/", archive_entry_pathname(ae));
448299425Smm	if (seeking) {
449299425Smm		assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
450299425Smm	}
451299425Smm	assertEqualInt(0, archive_entry_size(ae));
452299425Smm	assert(archive_entry_size_is_set(ae));
453299425Smm	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
454299425Smm#endif
455299425Smm
456299425Smm	/*
457299425Smm	 * Store compression option:
458299425Smm	 */
459299425Smm
460299425Smm	/* Read and verify first file. */
461299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
462299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
463299425Smm	/* Zip doesn't store high-resolution mtime. */
464299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
465299425Smm	assertEqualInt(0, archive_entry_atime(ae));
466299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
467299425Smm	assertEqualString("file_stored", archive_entry_pathname(ae));
468299425Smm	if (seeking || improved_streaming) {
469299425Smm		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
470299425Smm	}
471299425Smm	assert(archive_entry_size_is_set(ae));
472299425Smm	assert(archive_entry_size_is_set(ae));
473299425Smm	assertEqualInt(8, archive_entry_size(ae));
474299425Smm	assertEqualIntA(a, 8,
475299425Smm	    archive_read_data(a, filedata, sizeof(filedata)));
476299425Smm	assertEqualMem(filedata, "12345678", 8);
477299425Smm
478299425Smm
479299425Smm	/* Read the second file back. */
480299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
481299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
482299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
483299425Smm	assertEqualInt(0, archive_entry_atime(ae));
484299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
485299425Smm	assertEqualString("file2_stored", archive_entry_pathname(ae));
486299425Smm	if (seeking || improved_streaming) {
487299425Smm		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
488299425Smm	}
489299425Smm	assertEqualInt(4, archive_entry_size(ae));
490299425Smm	assert(archive_entry_size_is_set(ae));
491299425Smm	assertEqualIntA(a, 4,
492299425Smm	    archive_read_data(a, filedata, sizeof(filedata)));
493299425Smm	assertEqualMem(filedata, "ACEG", 4);
494299425Smm
495299425Smm	/* Read the third file back. */
496299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
497299425Smm	assertEqualInt(2, archive_entry_mtime(ae));
498299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
499299425Smm	assertEqualInt(0, archive_entry_atime(ae));
500299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
501299425Smm	assertEqualString("file3_stored", archive_entry_pathname(ae));
502299425Smm	if (seeking || improved_streaming)
503299425Smm		assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
504299425Smm	if (seeking) {
505299425Smm		assertEqualInt(5, archive_entry_size(ae));
506299425Smm	} else {
507299425Smm		assertEqualInt(0, archive_entry_size_is_set(ae));
508299425Smm	}
509299425Smm	assertEqualIntA(a, 5,
510299425Smm	    archive_read_data(a, filedata, sizeof(filedata)));
511299425Smm	assertEqualMem(filedata, "ijklm", 4);
512299425Smm
513299425Smm	/* Read symlink. */
514299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
515299425Smm	assertEqualInt(1, archive_entry_mtime(ae));
516299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
517299425Smm	assertEqualInt(0, archive_entry_atime(ae));
518299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
519299425Smm	assertEqualString("symlink_stored", archive_entry_pathname(ae));
520299425Smm	if (seeking || improved_streaming) {
521299425Smm		assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
522299425Smm		assertEqualInt(0, archive_entry_size(ae));
523299425Smm		assertEqualString("file1", archive_entry_symlink(ae));
524299425Smm	} else {
525299425Smm		assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae));
526299425Smm		assertEqualInt(5, archive_entry_size(ae));
527299425Smm		assertEqualIntA(a, 5, archive_read_data(a, filedata, 10));
528299425Smm		assertEqualMem(filedata, "file1", 5);
529299425Smm	}
530299425Smm
531299425Smm	/* Read the dir entry back. */
532299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
533299425Smm	assertEqualInt(11, archive_entry_mtime(ae));
534299425Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
535299425Smm	assertEqualInt(0, archive_entry_atime(ae));
536299425Smm	assertEqualInt(0, archive_entry_ctime(ae));
537299425Smm	assertEqualString("dir_stored/", archive_entry_pathname(ae));
538299425Smm	if (seeking || improved_streaming)
539299425Smm		assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
540299425Smm	assertEqualInt(0, archive_entry_size(ae));
541299425Smm	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
542299425Smm
543299425Smm	/* Verify the end of the archive. */
544299425Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
545299425Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
546299425Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
547299425Smm}
548299425Smm
549299425Smm/*
550299425Smm * Do a write-then-read roundtrip.
551299425Smm */
552299425SmmDEFINE_TEST(test_write_read_format_zip)
553299425Smm{
554299425Smm	struct archive *a;
555299425Smm	size_t used;
556299425Smm	size_t buffsize = 1000000;
557299425Smm	char *buff;
558299425Smm
559299425Smm	buff = malloc(buffsize);
560299425Smm
561299425Smm	/* Create a new archive in memory. */
562299425Smm	assert((a = archive_write_new()) != NULL);
563299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
564299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
565299425Smm	assertEqualIntA(a, ARCHIVE_OK,
566299425Smm	    archive_write_open_memory(a, buff, buffsize, &used));
567299425Smm	write_contents(a);
568299425Smm	dumpfile("constructed.zip", buff, used);
569299425Smm
570299425Smm	/*
571299425Smm	 * Now, read the data back.
572299425Smm	 */
573299425Smm	/* With the standard memory reader. */
574299425Smm	assert((a = archive_read_new()) != NULL);
575299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
576299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
577299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
578299425Smm	verify_contents(a, 1, 0);
579299425Smm
580299425Smm	/* With the test memory reader -- streaming mode. */
581299425Smm	assert((a = archive_read_new()) != NULL);
582299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
583299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
584299425Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
585299425Smm	/* Streaming reader doesn't see mode information from Central Directory. */
586299425Smm	verify_contents(a, 0, 0);
587299425Smm
588299425Smm	/* With the test memory reader -- seeking mode. */
589299425Smm	assert((a = archive_read_new()) != NULL);
590299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
591299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
592299425Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
593299425Smm	verify_contents(a, 1, 0);
594299425Smm
595299425Smm	free(buff);
596299425Smm}
597299425Smm
598299425Smm/*
599299425Smm * Do a write-then-read roundtrip with 'el' extension enabled.
600299425Smm */
601299425SmmDEFINE_TEST(test_write_read_format_zip_improved_streaming)
602299425Smm{
603299425Smm	struct archive *a;
604299425Smm	size_t used;
605299425Smm	size_t buffsize = 1000000;
606299425Smm	char *buff;
607299425Smm
608299425Smm	buff = malloc(buffsize);
609299425Smm
610299425Smm	/* Create a new archive in memory. */
611299425Smm	assert((a = archive_write_new()) != NULL);
612299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
613299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
614299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:experimental"));
615299425Smm	assertEqualIntA(a, ARCHIVE_OK,
616299425Smm	    archive_write_open_memory(a, buff, buffsize, &used));
617299425Smm	write_contents(a);
618299425Smm	dumpfile("constructed.zip", buff, used);
619299425Smm
620299425Smm	/*
621299425Smm	 * Now, read the data back.
622299425Smm	 */
623299425Smm	/* With the standard memory reader. */
624299425Smm	assert((a = archive_read_new()) != NULL);
625299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
626299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
627299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
628299425Smm	verify_contents(a, 1, 1);
629299425Smm
630299425Smm	/* With the test memory reader -- streaming mode. */
631299425Smm	assert((a = archive_read_new()) != NULL);
632299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
633299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
634299425Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
635299425Smm	/* Streaming reader doesn't see mode information from Central Directory. */
636299425Smm	verify_contents(a, 0, 1);
637299425Smm
638299425Smm	/* With the test memory reader -- seeking mode. */
639299425Smm	assert((a = archive_read_new()) != NULL);
640299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
641299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
642299425Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
643299425Smm	verify_contents(a, 1, 1);
644299425Smm
645299425Smm	free(buff);
646299425Smm}
647299425Smm
648299425Smm/*
649299425Smm * Do a write-then-read roundtrip with Zip64 enabled.
650299425Smm */
651299425SmmDEFINE_TEST(test_write_read_format_zip64)
652299425Smm{
653299425Smm	struct archive *a;
654299425Smm	size_t used;
655299425Smm	size_t buffsize = 1000000;
656299425Smm	char *buff;
657299425Smm
658299425Smm	buff = malloc(buffsize);
659299425Smm
660299425Smm	/* Create a new archive in memory. */
661299425Smm	assert((a = archive_write_new()) != NULL);
662299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
663299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
664299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:zip64"));
665299425Smm#if ZIP_IMPROVED_STREAMING
666299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:experimental"));
667299425Smm#endif
668299425Smm	assertEqualIntA(a, ARCHIVE_OK,
669299425Smm	    archive_write_open_memory(a, buff, buffsize, &used));
670299425Smm	write_contents(a);
671299425Smm	dumpfile("constructed64.zip", buff, used);
672299425Smm
673299425Smm	/*
674299425Smm	 * Now, read the data back.
675299425Smm	 */
676299425Smm	/* With the standard memory reader. */
677299425Smm	assert((a = archive_read_new()) != NULL);
678299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
679299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
680299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
681299425Smm	verify_contents(a, 1, 0);
682299425Smm
683299425Smm	/* With the test memory reader -- streaming mode. */
684299425Smm	assert((a = archive_read_new()) != NULL);
685299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
686299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
687299425Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
688299425Smm	/* Streaming reader doesn't see mode information from Central Directory. */
689299425Smm	verify_contents(a, 0, 0);
690299425Smm
691299425Smm	/* With the test memory reader -- seeking mode. */
692299425Smm	assert((a = archive_read_new()) != NULL);
693299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
694299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
695299425Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
696299425Smm	verify_contents(a, 1, 0);
697299425Smm
698299425Smm	free(buff);
699299425Smm}
700299425Smm
701299425Smm
702299425Smm/*
703299425Smm * Do a write-then-read roundtrip with Zip64 enabled and 'el' extension enabled.
704299425Smm */
705299425SmmDEFINE_TEST(test_write_read_format_zip64_improved_streaming)
706299425Smm{
707299425Smm	struct archive *a;
708299425Smm	size_t used;
709299425Smm	size_t buffsize = 1000000;
710299425Smm	char *buff;
711299425Smm
712299425Smm	buff = malloc(buffsize);
713299425Smm
714299425Smm	/* Create a new archive in memory. */
715299425Smm	assert((a = archive_write_new()) != NULL);
716299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
717299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
718299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:zip64"));
719299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:experimental"));
720299425Smm	assertEqualIntA(a, ARCHIVE_OK,
721299425Smm	    archive_write_open_memory(a, buff, buffsize, &used));
722299425Smm	write_contents(a);
723299425Smm	dumpfile("constructed64.zip", buff, used);
724299425Smm
725299425Smm	/*
726299425Smm	 * Now, read the data back.
727299425Smm	 */
728299425Smm	/* With the standard memory reader. */
729299425Smm	assert((a = archive_read_new()) != NULL);
730299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
731299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
732299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
733299425Smm	verify_contents(a, 1, 1);
734299425Smm
735299425Smm	/* With the test memory reader -- streaming mode. */
736299425Smm	assert((a = archive_read_new()) != NULL);
737299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
738299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
739299425Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
740299425Smm	/* Streaming reader doesn't see mode information from Central Directory. */
741299425Smm	verify_contents(a, 0, 1);
742299425Smm
743299425Smm	/* With the test memory reader -- seeking mode. */
744299425Smm	assert((a = archive_read_new()) != NULL);
745299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
746299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
747299425Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
748299425Smm	verify_contents(a, 1, 1);
749299425Smm
750299425Smm	free(buff);
751299425Smm}
752