]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libarchive/libarchive/test/test_write_format_zip.c
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / libarchive / libarchive / test / test_write_format_zip.c
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$");
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  */
45 static void
46 write_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  */
273 static void
274 verify_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  */
544 DEFINE_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  */
608 DEFINE_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
671 DEFINE_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
751 DEFINE_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
831 DEFINE_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 }