test_write_format_zip.c revision 302001
1/*-
2 * Copyright (c) 2003-2008 Tim Kientzle
3 * Copyright (c) 2008 Anselm Strauss
4 * Copyright (c) 2014 Michihiro NAKAJIMA
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28/*
29 * Development supported by Google Summer of Code 2008.
30 */
31
32#include "test.h"
33__FBSDID("$FreeBSD: stable/10/contrib/libarchive/libarchive/test/test_write_format_zip.c 302001 2016-06-17 22:40:10Z mm $");
34
35/*
36 * This test doesn't actually check that the zip writer is
37 * correct, just that our zip reader can read the output of
38 * our zip writer.  We do more detailed checks of the bits
39 * elsewhere.
40 */
41
42/*
43 * Write a variety of different file types into the archive.
44 */
45static void
46write_contents(struct archive *a)
47{
48	struct archive_entry *ae;
49
50	/*
51	 * First write things with the "default" compression.
52	 * The library will choose "deflate" for most things if it's
53	 * available, else "store".
54	 */
55
56	/*
57	 * Write a file to it.
58	 */
59	assert((ae = archive_entry_new()) != NULL);
60	archive_entry_set_mtime(ae, 1, 10);
61	archive_entry_copy_pathname(ae, "file");
62	archive_entry_set_mode(ae, AE_IFREG | 0755);
63	archive_entry_set_size(ae, 8);
64	assertEqualInt(0, archive_write_header(a, ae));
65	archive_entry_free(ae);
66	assertEqualInt(8, archive_write_data(a, "12345678", 9));
67	assertEqualInt(0, archive_write_data(a, "1", 1));
68
69	/*
70	 * Write another file to it.
71	 */
72	assert((ae = archive_entry_new()) != NULL);
73	archive_entry_set_mtime(ae, 1, 10);
74	archive_entry_copy_pathname(ae, "file2");
75	archive_entry_set_mode(ae, AE_IFREG | 0755);
76	archive_entry_set_size(ae, 4);
77	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
78	archive_entry_free(ae);
79	assertEqualInt(4, archive_write_data(a, "1234", 4));
80
81	/*
82	 * Write a file with an unknown size.
83	 */
84	assert((ae = archive_entry_new()) != NULL);
85	archive_entry_set_mtime(ae, 2, 15);
86	archive_entry_copy_pathname(ae, "file3");
87	archive_entry_set_mode(ae, AE_IFREG | 0621);
88	archive_entry_unset_size(ae);
89	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
90	archive_entry_free(ae);
91	assertEqualInt(5, archive_write_data(a, "mnopq", 5));
92
93	/*
94	 * Write symbolic link.
95	 */
96	assert((ae = archive_entry_new()) != NULL);
97	archive_entry_set_mtime(ae, 1, 10);
98	assertEqualInt(1, archive_entry_mtime(ae));
99	assertEqualInt(10, archive_entry_mtime_nsec(ae));
100	archive_entry_copy_pathname(ae, "symlink");
101	assertEqualString("symlink", archive_entry_pathname(ae));
102	archive_entry_copy_symlink(ae, "file1");
103	assertEqualString("file1", archive_entry_symlink(ae));
104	archive_entry_set_mode(ae, AE_IFLNK | 0755);
105	assertEqualInt((AE_IFLNK | 0755), archive_entry_mode(ae));
106	archive_entry_set_size(ae, 4);
107
108	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
109	archive_entry_free(ae);
110
111	/*
112	 * Write a directory to it.
113	 */
114	assert((ae = archive_entry_new()) != NULL);
115	archive_entry_set_mtime(ae, 11, 110);
116	archive_entry_copy_pathname(ae, "dir");
117	archive_entry_set_mode(ae, S_IFDIR | 0755);
118	archive_entry_set_size(ae, 512);
119	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
120	failure("size should be zero so that applications know not to write");
121	assertEqualInt(0, archive_entry_size(ae));
122	archive_entry_free(ae);
123	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
124
125	/*
126	 * Force "deflate" compression if the platform supports it.
127	 */
128#ifdef HAVE_ZLIB_H
129	assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_deflate(a));
130
131	/*
132	 * Write a file to it.
133	 */
134	assert((ae = archive_entry_new()) != NULL);
135	archive_entry_set_mtime(ae, 1, 10);
136	archive_entry_copy_pathname(ae, "file_deflate");
137	archive_entry_set_mode(ae, AE_IFREG | 0755);
138	archive_entry_set_size(ae, 8);
139	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
140	archive_entry_free(ae);
141	assertEqualInt(8, archive_write_data(a, "12345678", 9));
142	assertEqualInt(0, archive_write_data(a, "1", 1));
143
144	/*
145	 * Write another file to it.
146	 */
147	assert((ae = archive_entry_new()) != NULL);
148	archive_entry_set_mtime(ae, 1, 10);
149	archive_entry_copy_pathname(ae, "file2_deflate");
150	archive_entry_set_mode(ae, AE_IFREG | 0755);
151	archive_entry_set_size(ae, 4);
152	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
153	archive_entry_free(ae);
154	assertEqualInt(4, archive_write_data(a, "1234", 4));
155
156	/*
157	 * Write a file with an unknown size.
158	 */
159	assert((ae = archive_entry_new()) != NULL);
160	archive_entry_set_mtime(ae, 2, 15);
161	archive_entry_copy_pathname(ae, "file3_deflate");
162	archive_entry_set_mode(ae, AE_IFREG | 0621);
163	archive_entry_unset_size(ae);
164	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
165	archive_entry_free(ae);
166	assertEqualInt(5, archive_write_data(a, "ghijk", 5));
167
168	/*
169	 * Write symbolic like file to it.
170	 */
171	assert((ae = archive_entry_new()) != NULL);
172	archive_entry_set_mtime(ae, 1, 10);
173	archive_entry_copy_pathname(ae, "symlink_deflate");
174	archive_entry_copy_symlink(ae, "file1");
175	archive_entry_set_mode(ae, AE_IFLNK | 0755);
176	archive_entry_set_size(ae, 4);
177	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
178	archive_entry_free(ae);
179
180	/*
181	 * Write a directory to it.
182	 */
183	assert((ae = archive_entry_new()) != NULL);
184	archive_entry_set_mtime(ae, 11, 110);
185	archive_entry_copy_pathname(ae, "dir_deflate");
186	archive_entry_set_mode(ae, S_IFDIR | 0755);
187	archive_entry_set_size(ae, 512);
188	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
189	failure("size should be zero so that applications know not to write");
190	assertEqualInt(0, archive_entry_size(ae));
191	archive_entry_free(ae);
192	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
193	assertEqualIntA(a, ARCHIVE_OK, archive_write_finish_entry(a));
194#endif
195
196	/*
197	 * Now write a bunch of entries with "store" compression.
198	 */
199	assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_store(a));
200
201	/*
202	 * Write a file to it.
203	 */
204	assert((ae = archive_entry_new()) != NULL);
205	archive_entry_set_mtime(ae, 1, 10);
206	archive_entry_copy_pathname(ae, "file_stored");
207	archive_entry_set_mode(ae, AE_IFREG | 0755);
208	archive_entry_set_size(ae, 8);
209	assertEqualInt(0, archive_write_header(a, ae));
210	archive_entry_free(ae);
211	assertEqualInt(8, archive_write_data(a, "12345678", 9));
212	assertEqualInt(0, archive_write_data(a, "1", 1));
213
214	/*
215	 * Write another file to it.
216	 */
217	assert((ae = archive_entry_new()) != NULL);
218	archive_entry_set_mtime(ae, 1, 10);
219	archive_entry_copy_pathname(ae, "file2_stored");
220	archive_entry_set_mode(ae, AE_IFREG | 0755);
221	archive_entry_set_size(ae, 4);
222	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
223	archive_entry_free(ae);
224	assertEqualInt(4, archive_write_data(a, "ACEG", 4));
225
226	/*
227	 * Write a file with an unknown size.
228	 */
229	assert((ae = archive_entry_new()) != NULL);
230	archive_entry_set_mtime(ae, 2, 15);
231	archive_entry_copy_pathname(ae, "file3_stored");
232	archive_entry_set_mode(ae, AE_IFREG | 0621);
233	archive_entry_unset_size(ae);
234	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
235	archive_entry_free(ae);
236	assertEqualInt(5, archive_write_data(a, "ijklm", 5));
237
238	/*
239	 * Write symbolic like file to it.
240	 */
241	assert((ae = archive_entry_new()) != NULL);
242	archive_entry_set_mtime(ae, 1, 10);
243	archive_entry_copy_pathname(ae, "symlink_stored");
244	archive_entry_copy_symlink(ae, "file1");
245	archive_entry_set_mode(ae, AE_IFLNK | 0755);
246	archive_entry_set_size(ae, 4);
247	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
248	archive_entry_free(ae);
249
250	/*
251	 * Write a directory to it.
252	 */
253	assert((ae = archive_entry_new()) != NULL);
254	archive_entry_set_mtime(ae, 11, 110);
255	archive_entry_copy_pathname(ae, "dir_stored");
256	archive_entry_set_mode(ae, S_IFDIR | 0755);
257	archive_entry_set_size(ae, 512);
258	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
259	failure("size should be zero so that applications know not to write");
260	assertEqualInt(0, archive_entry_size(ae));
261	archive_entry_free(ae);
262	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
263
264
265	/* Close out the archive. */
266	assertEqualInt(ARCHIVE_OK, archive_write_close(a));
267	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
268}
269
270/*
271 * Read back all of the entries and verify their values.
272 */
273static void
274verify_contents(struct archive *a, int seeking, int content)
275{
276	char filedata[64];
277	struct archive_entry *ae;
278
279	/*
280	 * Default compression options:
281	 */
282
283	/* Read and verify first file. */
284	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
285	assertEqualInt(1, archive_entry_mtime(ae));
286	/* Zip doesn't store high-resolution mtime. */
287	assertEqualInt(0, archive_entry_mtime_nsec(ae));
288	assertEqualInt(0, archive_entry_atime(ae));
289	assertEqualInt(0, archive_entry_ctime(ae));
290	assertEqualString("file", archive_entry_pathname(ae));
291	if (seeking) {
292		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
293	}
294	assert(archive_entry_size_is_set(ae));
295	assertEqualInt(8, archive_entry_size(ae));
296	if (content) {
297		assertEqualIntA(a, 8,
298		    archive_read_data(a, filedata, sizeof(filedata)));
299		assertEqualMem(filedata, "12345678", 8);
300	}
301
302	/* Read the second file back. */
303	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
304	assertEqualInt(1, archive_entry_mtime(ae));
305	assertEqualInt(0, archive_entry_mtime_nsec(ae));
306	assertEqualInt(0, archive_entry_atime(ae));
307	assertEqualInt(0, archive_entry_ctime(ae));
308	assertEqualString("file2", archive_entry_pathname(ae));
309	if (seeking) {
310		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
311	}
312	assertEqualInt(4, archive_entry_size(ae));
313	assert(archive_entry_size_is_set(ae));
314	if (content) {
315		assertEqualIntA(a, 4,
316		    archive_read_data(a, filedata, sizeof(filedata)));
317		assertEqualMem(filedata, "1234", 4);
318	}
319
320	/* Read the third file back. */
321	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
322	assertEqualInt(2, archive_entry_mtime(ae));
323	assertEqualInt(0, archive_entry_mtime_nsec(ae));
324	assertEqualInt(0, archive_entry_atime(ae));
325	assertEqualInt(0, archive_entry_ctime(ae));
326	assertEqualString("file3", archive_entry_pathname(ae));
327	if (seeking) {
328		assertEqualInt(5, archive_entry_size(ae));
329		assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
330	} else {
331		assertEqualInt(0, archive_entry_size_is_set(ae));
332	}
333	if (content) {
334		assertEqualIntA(a, 5,
335		    archive_read_data(a, filedata, sizeof(filedata)));
336		assertEqualMem(filedata, "mnopq", 5);
337	}
338
339	/* Read symlink. */
340	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
341	assertEqualInt(1, archive_entry_mtime(ae));
342	assertEqualInt(0, archive_entry_mtime_nsec(ae));
343	assertEqualInt(0, archive_entry_atime(ae));
344	assertEqualInt(0, archive_entry_ctime(ae));
345	assertEqualString("symlink", archive_entry_pathname(ae));
346	assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
347	assertEqualInt(0, archive_entry_size(ae));
348	assertEqualString("file1", archive_entry_symlink(ae));
349
350	/* Read the dir entry back. */
351	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
352	assertEqualInt(11, archive_entry_mtime(ae));
353	assertEqualInt(0, archive_entry_mtime_nsec(ae));
354	assertEqualInt(0, archive_entry_atime(ae));
355	assertEqualInt(0, archive_entry_ctime(ae));
356	assertEqualString("dir/", archive_entry_pathname(ae));
357	if (seeking)
358		assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
359	assertEqualInt(0, archive_entry_size(ae));
360	if (content) {
361		assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
362	}
363
364#ifdef HAVE_ZLIB_H
365	/*
366	 * Deflate compression option:
367	 */
368
369	/* Read and verify first file. */
370	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
371	assertEqualInt(1, archive_entry_mtime(ae));
372	/* Zip doesn't store high-resolution mtime. */
373	assertEqualInt(0, archive_entry_mtime_nsec(ae));
374	assertEqualInt(0, archive_entry_atime(ae));
375	assertEqualInt(0, archive_entry_ctime(ae));
376	assertEqualString("file_deflate", archive_entry_pathname(ae));
377	if (seeking)
378		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
379	assertEqualInt(8, archive_entry_size(ae));
380	assert(archive_entry_size_is_set(ae));
381	if (content) {
382		assertEqualIntA(a, 8,
383		    archive_read_data(a, filedata, sizeof(filedata)));
384		assertEqualMem(filedata, "12345678", 8);
385	}
386
387
388	/* Read the second file back. */
389	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
390	assertEqualInt(1, archive_entry_mtime(ae));
391	assertEqualInt(0, archive_entry_mtime_nsec(ae));
392	assertEqualInt(0, archive_entry_atime(ae));
393	assertEqualInt(0, archive_entry_ctime(ae));
394	assertEqualString("file2_deflate", archive_entry_pathname(ae));
395	if (seeking)
396		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
397	assertEqualInt(4, archive_entry_size(ae));
398	assert(archive_entry_size_is_set(ae));
399	if (content) {
400		assertEqualIntA(a, 4,
401		    archive_read_data(a, filedata, sizeof(filedata)));
402		assertEqualMem(filedata, "1234", 4);
403	}
404
405	/* Read the third file back. */
406	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
407	assertEqualInt(2, archive_entry_mtime(ae));
408	assertEqualInt(0, archive_entry_mtime_nsec(ae));
409	assertEqualInt(0, archive_entry_atime(ae));
410	assertEqualInt(0, archive_entry_ctime(ae));
411	assertEqualString("file3_deflate", archive_entry_pathname(ae));
412	if (seeking) {
413		assertEqualInt(5, archive_entry_size(ae));
414		assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
415	} else {
416		assertEqualInt(0, archive_entry_size_is_set(ae));
417	}
418	if (content) {
419		assertEqualIntA(a, 5,
420		    archive_read_data(a, filedata, sizeof(filedata)));
421		assertEqualMem(filedata, "ghijk", 4);
422	}
423
424	/* Read symlink. */
425	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
426	assertEqualInt(1, archive_entry_mtime(ae));
427	assertEqualInt(0, archive_entry_mtime_nsec(ae));
428	assertEqualInt(0, archive_entry_atime(ae));
429	assertEqualInt(0, archive_entry_ctime(ae));
430	assertEqualString("symlink_deflate", archive_entry_pathname(ae));
431	assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
432	assertEqualInt(0, archive_entry_size(ae));
433	assertEqualString("file1", archive_entry_symlink(ae));
434
435	/* Read the dir entry back. */
436	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
437	assertEqualInt(11, archive_entry_mtime(ae));
438	assertEqualInt(0, archive_entry_mtime_nsec(ae));
439	assertEqualInt(0, archive_entry_atime(ae));
440	assertEqualInt(0, archive_entry_ctime(ae));
441	assertEqualString("dir_deflate/", archive_entry_pathname(ae));
442	if (seeking) {
443		assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
444	}
445	assertEqualInt(0, archive_entry_size(ae));
446	if (content) {
447		assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
448	}
449#endif
450
451	/*
452	 * Store compression option:
453	 */
454
455	/* Read and verify first file. */
456	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
457	assertEqualInt(1, archive_entry_mtime(ae));
458	/* Zip doesn't store high-resolution mtime. */
459	assertEqualInt(0, archive_entry_mtime_nsec(ae));
460	assertEqualInt(0, archive_entry_atime(ae));
461	assertEqualInt(0, archive_entry_ctime(ae));
462	assertEqualString("file_stored", archive_entry_pathname(ae));
463	if (seeking)
464		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
465	assert(archive_entry_size_is_set(ae));
466	assertEqualInt(8, archive_entry_size(ae));
467	if (content) {
468		assertEqualIntA(a, 8,
469		    archive_read_data(a, filedata, sizeof(filedata)));
470		assertEqualMem(filedata, "12345678", 8);
471	}
472
473
474	/* Read the second file back. */
475	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
476	assertEqualInt(1, archive_entry_mtime(ae));
477	assertEqualInt(0, archive_entry_mtime_nsec(ae));
478	assertEqualInt(0, archive_entry_atime(ae));
479	assertEqualInt(0, archive_entry_ctime(ae));
480	assertEqualString("file2_stored", archive_entry_pathname(ae));
481	if (seeking)
482		assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
483	assertEqualInt(4, archive_entry_size(ae));
484	assert(archive_entry_size_is_set(ae));
485	if (content) {
486		assertEqualIntA(a, 4,
487		    archive_read_data(a, filedata, sizeof(filedata)));
488		assertEqualMem(filedata, "ACEG", 4);
489	}
490
491	/* Read the third file back. */
492	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
493	assertEqualInt(2, archive_entry_mtime(ae));
494	assertEqualInt(0, archive_entry_mtime_nsec(ae));
495	assertEqualInt(0, archive_entry_atime(ae));
496	assertEqualInt(0, archive_entry_ctime(ae));
497	assertEqualString("file3_stored", archive_entry_pathname(ae));
498	if (seeking) {
499		assertEqualInt(5, archive_entry_size(ae));
500		assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae));
501	} else {
502		assertEqualInt(0, archive_entry_size_is_set(ae));
503	}
504	if (content) {
505		assertEqualIntA(a, 5,
506		    archive_read_data(a, filedata, sizeof(filedata)));
507		assertEqualMem(filedata, "ijklm", 4);
508	}
509
510	/* Read symlink. */
511	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
512	assertEqualInt(1, archive_entry_mtime(ae));
513	assertEqualInt(0, archive_entry_mtime_nsec(ae));
514	assertEqualInt(0, archive_entry_atime(ae));
515	assertEqualInt(0, archive_entry_ctime(ae));
516	assertEqualString("symlink_stored", archive_entry_pathname(ae));
517	assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
518	assertEqualInt(0, archive_entry_size(ae));
519	assertEqualString("file1", archive_entry_symlink(ae));
520
521	/* Read the dir entry back. */
522	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
523	assertEqualInt(11, archive_entry_mtime(ae));
524	assertEqualInt(0, archive_entry_mtime_nsec(ae));
525	assertEqualInt(0, archive_entry_atime(ae));
526	assertEqualInt(0, archive_entry_ctime(ae));
527	assertEqualString("dir_stored/", archive_entry_pathname(ae));
528	if (seeking)
529		assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
530	assertEqualInt(0, archive_entry_size(ae));
531	if (content) {
532		assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
533	}
534
535	/* Verify the end of the archive. */
536	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
537	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
538	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
539}
540
541/*
542 * Do a write-then-read roundtrip.
543 */
544DEFINE_TEST(test_write_format_zip)
545{
546	struct archive *a;
547	size_t used;
548	size_t buffsize = 1000000;
549	char *buff;
550
551	buff = malloc(buffsize);
552
553	/* Create a new archive in memory. */
554	assert((a = archive_write_new()) != NULL);
555	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
556	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
557	assertEqualIntA(a, ARCHIVE_OK,
558	    archive_write_set_options(a, "zip:experimental"));
559	assertEqualIntA(a, ARCHIVE_OK,
560	    archive_write_open_memory(a, buff, buffsize, &used));
561	write_contents(a);
562	dumpfile("constructed.zip", buff, used);
563
564	/*
565	 * Now, read the data back.
566	 */
567	/* With the standard memory reader. */
568	assert((a = archive_read_new()) != NULL);
569	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
570	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
571	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
572	verify_contents(a, 1, 1);
573
574	/* With the test memory reader -- streaming mode. */
575	assert((a = archive_read_new()) != NULL);
576	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
577	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
578	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
579	/* Streaming reader doesn't see mode information from Central Directory. */
580	verify_contents(a, 0, 1);
581
582	assert((a = archive_read_new()) != NULL);
583	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
584	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
585	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
586	/* Streaming reader doesn't see mode information from Central Directory. */
587	verify_contents(a, 0, 0);
588
589	/* With the test memory reader -- seeking mode. */
590	assert((a = archive_read_new()) != NULL);
591	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
592	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
593	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
594	verify_contents(a, 1, 1);
595
596	assert((a = archive_read_new()) != NULL);
597	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
598	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
599	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
600	verify_contents(a, 1, 0);
601
602	free(buff);
603}
604
605/*
606 * Do a write-then-read roundtrip with Zip64 enabled.
607 */
608DEFINE_TEST(test_write_format_zip64)
609{
610	struct archive *a;
611	size_t used;
612	size_t buffsize = 1000000;
613	char *buff;
614
615	buff = malloc(buffsize);
616
617	/* Create a new archive in memory. */
618	assert((a = archive_write_new()) != NULL);
619	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
620	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
621	assertEqualIntA(a, ARCHIVE_OK,
622	    archive_write_set_options(a, "zip:zip64"));
623	assertEqualIntA(a, ARCHIVE_OK,
624	    archive_write_set_options(a, "zip:experimental"));
625	assertEqualIntA(a, ARCHIVE_OK,
626	    archive_write_open_memory(a, buff, buffsize, &used));
627	write_contents(a);
628	dumpfile("constructed64.zip", buff, used);
629
630	/*
631	 * Now, read the data back.
632	 */
633	/* With the standard memory reader. */
634	assert((a = archive_read_new()) != NULL);
635	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
636	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
637	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
638	verify_contents(a, 1, 1);
639
640	/* With the test memory reader -- streaming mode. */
641	assert((a = archive_read_new()) != NULL);
642	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
643	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
644	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
645	/* Streaming reader doesn't see mode information from Central Directory. */
646	verify_contents(a, 0, 1);
647
648	assert((a = archive_read_new()) != NULL);
649	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
650	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
651	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
652	/* Streaming reader doesn't see mode information from Central Directory. */
653	verify_contents(a, 0, 0);
654
655	/* With the test memory reader -- seeking mode. */
656	assert((a = archive_read_new()) != NULL);
657	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
658	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
659	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
660	verify_contents(a, 1, 1);
661
662	assert((a = archive_read_new()) != NULL);
663	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
664	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
665	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
666	verify_contents(a, 1, 0);
667
668	free(buff);
669}
670
671DEFINE_TEST(test_write_format_zip_traditional_pkware_encryption)
672{
673	struct archive *a;
674	size_t used;
675	size_t buffsize = 1000000;
676	char *buff;
677
678	buff = malloc(buffsize);
679
680	/* Create a new archive in memory. */
681	assert((a = archive_write_new()) != NULL);
682	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
683	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
684	if (ARCHIVE_OK != archive_write_set_options(a,
685		    "zip:encryption=zipcrypt")) {
686		skipping("This system does not have cryptographic liberary");
687		archive_write_free(a);
688		free(buff);
689		return;
690	}
691	assertEqualIntA(a, ARCHIVE_OK,
692	    archive_write_set_passphrase(a, "password1234"));
693	assertEqualIntA(a, ARCHIVE_OK,
694	    archive_write_set_options(a, "zip:experimental"));
695	assertEqualIntA(a, ARCHIVE_OK,
696	    archive_write_open_memory(a, buff, buffsize, &used));
697	write_contents(a);
698	dumpfile("constructed.zip", buff, used);
699
700	/*
701	 * Now, read the data back.
702	 */
703	/* With the standard memory reader. */
704	assert((a = archive_read_new()) != NULL);
705	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
706	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
707	assertEqualIntA(a, ARCHIVE_OK,
708	    archive_read_add_passphrase(a, "password1234"));
709	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
710	verify_contents(a, 1, 1);
711
712	/* With the test memory reader -- streaming mode. */
713	assert((a = archive_read_new()) != NULL);
714	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
715	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
716	assertEqualIntA(a, ARCHIVE_OK,
717	    archive_read_add_passphrase(a, "password1234"));
718	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
719	/* Streaming reader doesn't see mode information from Central Directory. */
720	verify_contents(a, 0, 1);
721
722	assert((a = archive_read_new()) != NULL);
723	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
724	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
725	assertEqualIntA(a, ARCHIVE_OK,
726	    archive_read_add_passphrase(a, "password1234"));
727	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
728	/* Streaming reader doesn't see mode information from Central Directory. */
729	verify_contents(a, 0, 0);
730
731	/* With the test memory reader -- seeking mode. */
732	assert((a = archive_read_new()) != NULL);
733	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
734	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
735	assertEqualIntA(a, ARCHIVE_OK,
736	    archive_read_add_passphrase(a, "password1234"));
737	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
738	verify_contents(a, 1, 1);
739
740	assert((a = archive_read_new()) != NULL);
741	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
742	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
743	assertEqualIntA(a, ARCHIVE_OK,
744	    archive_read_add_passphrase(a, "password1234"));
745	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
746	verify_contents(a, 1, 0);
747
748	free(buff);
749}
750
751DEFINE_TEST(test_write_format_zip_winzip_aes128_encryption)
752{
753	struct archive *a;
754	size_t used;
755	size_t buffsize = 1000000;
756	char *buff;
757
758	buff = malloc(buffsize);
759
760	/* Create a new archive in memory. */
761	assert((a = archive_write_new()) != NULL);
762	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
763	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
764	if (ARCHIVE_OK != archive_write_set_options(a, "zip:encryption=aes128"))
765	{
766		skipping("This system does not have cryptographic liberary");
767		archive_write_free(a);
768		free(buff);
769		return;
770	}
771	assertEqualIntA(a, ARCHIVE_OK,
772	    archive_write_set_passphrase(a, "password1234"));
773	assertEqualIntA(a, ARCHIVE_OK,
774	    archive_write_set_options(a, "zip:experimental"));
775	assertEqualIntA(a, ARCHIVE_OK,
776	    archive_write_open_memory(a, buff, buffsize, &used));
777	write_contents(a);
778	dumpfile("constructed.zip", buff, used);
779
780	/*
781	 * Now, read the data back.
782	 */
783	/* With the standard memory reader. */
784	assert((a = archive_read_new()) != NULL);
785	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
786	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
787	assertEqualIntA(a, ARCHIVE_OK,
788	    archive_read_add_passphrase(a, "password1234"));
789	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
790	verify_contents(a, 1, 1);
791
792	/* With the test memory reader -- streaming mode. */
793	assert((a = archive_read_new()) != NULL);
794	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
795	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
796	assertEqualIntA(a, ARCHIVE_OK,
797	    archive_read_add_passphrase(a, "password1234"));
798	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
799	/* Streaming reader doesn't see mode information from Central Directory. */
800	verify_contents(a, 0, 1);
801
802	assert((a = archive_read_new()) != NULL);
803	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
804	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
805	assertEqualIntA(a, ARCHIVE_OK,
806	    archive_read_add_passphrase(a, "password1234"));
807	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
808	/* Streaming reader doesn't see mode information from Central Directory. */
809	verify_contents(a, 0, 0);
810
811	/* With the test memory reader -- seeking mode. */
812	assert((a = archive_read_new()) != NULL);
813	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
814	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
815	assertEqualIntA(a, ARCHIVE_OK,
816	    archive_read_add_passphrase(a, "password1234"));
817	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
818	verify_contents(a, 1, 1);
819
820	assert((a = archive_read_new()) != NULL);
821	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
822	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
823	assertEqualIntA(a, ARCHIVE_OK,
824	    archive_read_add_passphrase(a, "password1234"));
825	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
826	verify_contents(a, 1, 0);
827
828	free(buff);
829}
830
831DEFINE_TEST(test_write_format_zip_winzip_aes256_encryption)
832{
833	struct archive *a;
834	size_t used;
835	size_t buffsize = 1000000;
836	char *buff;
837
838	buff = malloc(buffsize);
839
840	/* Create a new archive in memory. */
841	assert((a = archive_write_new()) != NULL);
842	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
843	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
844	if (ARCHIVE_OK != archive_write_set_options(a, "zip:encryption=aes256"))
845	{
846		skipping("This system does not have cryptographic liberary");
847		archive_write_free(a);
848		free(buff);
849		return;
850	}
851	assertEqualIntA(a, ARCHIVE_OK,
852	    archive_write_set_passphrase(a, "password1234"));
853	assertEqualIntA(a, ARCHIVE_OK,
854	    archive_write_set_options(a, "zip:experimental"));
855	assertEqualIntA(a, ARCHIVE_OK,
856	    archive_write_open_memory(a, buff, buffsize, &used));
857	write_contents(a);
858	dumpfile("constructed.zip", buff, used);
859
860	/*
861	 * Now, read the data back.
862	 */
863	/* With the standard memory reader. */
864	assert((a = archive_read_new()) != NULL);
865	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
866	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
867	assertEqualIntA(a, ARCHIVE_OK,
868	    archive_read_add_passphrase(a, "password1234"));
869	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
870	verify_contents(a, 1, 1);
871
872	/* With the test memory reader -- streaming mode. */
873	assert((a = archive_read_new()) != NULL);
874	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
875	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
876	assertEqualIntA(a, ARCHIVE_OK,
877	    archive_read_add_passphrase(a, "password1234"));
878	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
879	/* Streaming reader doesn't see mode information from Central Directory. */
880	verify_contents(a, 0, 1);
881
882	assert((a = archive_read_new()) != NULL);
883	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
884	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
885	assertEqualIntA(a, ARCHIVE_OK,
886	    archive_read_add_passphrase(a, "password1234"));
887	assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, buff, used, 7));
888	/* Streaming reader doesn't see mode information from Central Directory. */
889	verify_contents(a, 0, 0);
890
891	/* With the test memory reader -- seeking mode. */
892	assert((a = archive_read_new()) != NULL);
893	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
894	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
895	assertEqualIntA(a, ARCHIVE_OK,
896	    archive_read_add_passphrase(a, "password1234"));
897	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
898	verify_contents(a, 1, 1);
899
900	assert((a = archive_read_new()) != NULL);
901	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
902	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
903	assertEqualIntA(a, ARCHIVE_OK,
904	    archive_read_add_passphrase(a, "password1234"));
905	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
906	verify_contents(a, 1, 0);
907
908	free(buff);
909}
910