1/*-
2 * Copyright (c) 2011-2012 Michihiro NAKAJIMA
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26
27#include "test.h"
28__FBSDID("$FreeBSD$");
29
30static void
31test_basic(const char *compression_type)
32{
33	char filedata[64];
34	struct archive_entry *ae;
35	struct archive *a;
36	size_t used;
37	size_t buffsize = 1000;
38	char *buff;
39
40	buff = malloc(buffsize);
41
42	/* Create a new archive in memory. */
43	assert((a = archive_write_new()) != NULL);
44	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_7zip(a));
45	if (compression_type != NULL &&
46	    ARCHIVE_OK != archive_write_set_format_option(a, "7zip",
47	    "compression", compression_type)) {
48		skipping("%s writing not fully supported on this platform",
49		   compression_type);
50		assertEqualInt(ARCHIVE_OK, archive_write_free(a));
51		free(buff);
52		return;
53	}
54	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
55	assertEqualIntA(a, ARCHIVE_OK,
56	    archive_write_open_memory(a, buff, buffsize, &used));
57
58	/*
59	 * Write an empty file to it.
60	 */
61	assert((ae = archive_entry_new()) != NULL);
62	archive_entry_set_mtime(ae, 1, 10);
63	assertEqualInt(1, archive_entry_mtime(ae));
64	assertEqualInt(10, archive_entry_mtime_nsec(ae));
65	archive_entry_copy_pathname(ae, "empty");
66	assertEqualString("empty", archive_entry_pathname(ae));
67	archive_entry_set_mode(ae, AE_IFREG | 0755);
68	assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae));
69
70	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
71	archive_entry_free(ae);
72
73	/*
74	 * Write another empty file to it.
75	 */
76	assert((ae = archive_entry_new()) != NULL);
77	archive_entry_set_mtime(ae, 1, 10);
78	assertEqualInt(1, archive_entry_mtime(ae));
79	assertEqualInt(10, archive_entry_mtime_nsec(ae));
80	archive_entry_copy_pathname(ae, "empty2");
81	assertEqualString("empty2", archive_entry_pathname(ae));
82	archive_entry_set_mode(ae, AE_IFREG | 0444);
83	assertEqualInt((AE_IFREG | 0444), archive_entry_mode(ae));
84
85	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
86	archive_entry_free(ae);
87
88	/*
89	 * Write a file to it.
90	 */
91	assert((ae = archive_entry_new()) != NULL);
92	archive_entry_set_mtime(ae, 1, 100);
93	assertEqualInt(1, archive_entry_mtime(ae));
94	assertEqualInt(100, archive_entry_mtime_nsec(ae));
95	archive_entry_copy_pathname(ae, "file");
96	assertEqualString("file", archive_entry_pathname(ae));
97	archive_entry_set_mode(ae, AE_IFREG | 0755);
98	assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae));
99	archive_entry_set_size(ae, 8);
100
101	assertEqualInt(0, archive_write_header(a, ae));
102	archive_entry_free(ae);
103	assertEqualInt(8, archive_write_data(a, "12345678", 9));
104	assertEqualInt(0, archive_write_data(a, "1", 1));
105
106	/*
107	 * Write another file to it.
108	 */
109	assert((ae = archive_entry_new()) != NULL);
110	archive_entry_set_mtime(ae, 1, 10);
111	assertEqualInt(1, archive_entry_mtime(ae));
112	assertEqualInt(10, archive_entry_mtime_nsec(ae));
113	archive_entry_copy_pathname(ae, "file2");
114	assertEqualString("file2", archive_entry_pathname(ae));
115	archive_entry_set_mode(ae, AE_IFREG | 0755);
116	assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae));
117	archive_entry_set_size(ae, 4);
118
119	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
120	archive_entry_free(ae);
121	assertEqualInt(4, archive_write_data(a, "1234", 5));
122
123	/*
124	 * Write a symbolic file to it.
125	 */
126	assert((ae = archive_entry_new()) != NULL);
127	archive_entry_set_mtime(ae, 1, 10);
128	assertEqualInt(1, archive_entry_mtime(ae));
129	assertEqualInt(10, archive_entry_mtime_nsec(ae));
130	archive_entry_copy_pathname(ae, "symbolic");
131	archive_entry_copy_symlink(ae, "file1");
132	assertEqualString("symbolic", archive_entry_pathname(ae));
133	archive_entry_set_mode(ae, AE_IFLNK | 0755);
134	assertEqualInt((AE_IFLNK | 0755), archive_entry_mode(ae));
135
136	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
137	archive_entry_free(ae);
138
139	/*
140	 * Write a directory to it.
141	 */
142	assert((ae = archive_entry_new()) != NULL);
143	archive_entry_set_mtime(ae, 11, 100);
144	archive_entry_copy_pathname(ae, "dir");
145	archive_entry_set_mode(ae, AE_IFDIR | 0755);
146	archive_entry_set_size(ae, 512);
147
148	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
149	failure("size should be zero so that applications know not to write");
150	assertEqualInt(0, archive_entry_size(ae));
151	archive_entry_free(ae);
152	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
153
154	/*
155	 * Write a sub directory to it.
156	 */
157	assert((ae = archive_entry_new()) != NULL);
158	archive_entry_set_mtime(ae, 11, 200);
159	archive_entry_copy_pathname(ae, "dir/subdir");
160	archive_entry_set_mode(ae, AE_IFDIR | 0755);
161	archive_entry_set_size(ae, 512);
162
163	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
164	failure("size should be zero so that applications know not to write");
165	assertEqualInt(0, archive_entry_size(ae));
166	archive_entry_free(ae);
167	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
168
169	/*
170	 * Write a sub sub-directory to it.
171	 */
172	assert((ae = archive_entry_new()) != NULL);
173	archive_entry_set_mtime(ae, 11, 300);
174	archive_entry_copy_pathname(ae, "dir/subdir/subdir");
175	archive_entry_set_mode(ae, AE_IFDIR | 0755);
176	archive_entry_set_size(ae, 512);
177
178	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
179	failure("size should be zero so that applications know not to write");
180	assertEqualInt(0, archive_entry_size(ae));
181	archive_entry_free(ae);
182	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
183
184	/* Close out the archive. */
185	assertEqualInt(ARCHIVE_OK, archive_write_close(a));
186	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
187
188	/* Verify the initial header. */
189	assertEqualMem(buff, "\x37\x7a\xbc\xaf\x27\x1c\x00\x03", 8);
190
191	/*
192	 * Now, read the data back.
193	 */
194	/* With the test memory reader -- seeking mode. */
195	assert((a = archive_read_new()) != NULL);
196	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
197	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
198	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
199
200	/*
201	 * Read and verify first file.
202	 */
203	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
204	assertEqualInt(1, archive_entry_mtime(ae));
205	assertEqualInt(100, archive_entry_mtime_nsec(ae));
206	assertEqualInt(0, archive_entry_atime(ae));
207	assertEqualInt(0, archive_entry_ctime(ae));
208	assertEqualString("file", archive_entry_pathname(ae));
209	assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
210	assertEqualInt(8, archive_entry_size(ae));
211	assertEqualIntA(a, 8,
212	    archive_read_data(a, filedata, sizeof(filedata)));
213	assertEqualMem(filedata, "12345678", 8);
214
215
216	/*
217	 * Read the second file back.
218	 */
219	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
220	assertEqualInt(1, archive_entry_mtime(ae));
221	assertEqualInt(0, archive_entry_mtime_nsec(ae));
222	assertEqualInt(0, archive_entry_atime(ae));
223	assertEqualInt(0, archive_entry_ctime(ae));
224	assertEqualString("file2", archive_entry_pathname(ae));
225	assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
226	assertEqualInt(4, archive_entry_size(ae));
227	assertEqualIntA(a, 4,
228	    archive_read_data(a, filedata, sizeof(filedata)));
229	assertEqualMem(filedata, "1234", 4);
230
231	/*
232	 * Read and verify a symbolic file.
233	 */
234	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
235	assertEqualInt(1, archive_entry_mtime(ae));
236	assertEqualInt(0, archive_entry_mtime_nsec(ae));
237	assertEqualInt(0, archive_entry_atime(ae));
238	assertEqualInt(0, archive_entry_ctime(ae));
239	assertEqualString("symbolic", archive_entry_pathname(ae));
240	assertEqualString("file1", archive_entry_symlink(ae));
241	assertEqualInt(AE_IFLNK | 0755, archive_entry_mode(ae));
242	assertEqualInt(0, archive_entry_size(ae));
243
244	/*
245	 * Read and verify an empty file.
246	 */
247	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
248	assertEqualInt(1, archive_entry_mtime(ae));
249	assertEqualInt(0, archive_entry_mtime_nsec(ae));
250	assertEqualInt(0, archive_entry_atime(ae));
251	assertEqualInt(0, archive_entry_ctime(ae));
252	assertEqualString("empty", archive_entry_pathname(ae));
253	assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
254	assertEqualInt(0, archive_entry_size(ae));
255
256	/*
257	 * Read and verify an empty file.
258	 */
259	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
260	assertEqualInt(1, archive_entry_mtime(ae));
261	assertEqualInt(0, archive_entry_mtime_nsec(ae));
262	assertEqualInt(0, archive_entry_atime(ae));
263	assertEqualInt(0, archive_entry_ctime(ae));
264	assertEqualString("empty2", archive_entry_pathname(ae));
265	assertEqualInt(AE_IFREG | 0444, archive_entry_mode(ae));
266	assertEqualInt(0, archive_entry_size(ae));
267
268	/*
269	 * Read the sub sub-dir entry back.
270	 */
271	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
272	assertEqualInt(11, archive_entry_mtime(ae));
273	assertEqualInt(300, archive_entry_mtime_nsec(ae));
274	assertEqualInt(0, archive_entry_atime(ae));
275	assertEqualInt(0, archive_entry_ctime(ae));
276	assertEqualString("dir/subdir/subdir/", archive_entry_pathname(ae));
277	assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
278	assertEqualInt(0, archive_entry_size(ae));
279	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
280
281	/*
282	 * Read the sub dir entry back.
283	 */
284	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
285	assertEqualInt(11, archive_entry_mtime(ae));
286	assertEqualInt(200, archive_entry_mtime_nsec(ae));
287	assertEqualInt(0, archive_entry_atime(ae));
288	assertEqualInt(0, archive_entry_ctime(ae));
289	assertEqualString("dir/subdir/", archive_entry_pathname(ae));
290	assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
291	assertEqualInt(0, archive_entry_size(ae));
292	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
293
294	/*
295	 * Read the dir entry back.
296	 */
297	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
298	assertEqualInt(11, archive_entry_mtime(ae));
299	assertEqualInt(100, archive_entry_mtime_nsec(ae));
300	assertEqualInt(0, archive_entry_atime(ae));
301	assertEqualInt(0, archive_entry_ctime(ae));
302	assertEqualString("dir/", archive_entry_pathname(ae));
303	assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
304	assertEqualInt(0, archive_entry_size(ae));
305	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
306
307	/* Verify the end of the archive. */
308	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
309
310	/* Verify archive format. */
311	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
312	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
313
314	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
315	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
316
317	free(buff);
318}
319
320static void
321test_basic2(const char *compression_type)
322{
323	char filedata[64];
324	struct archive_entry *ae;
325	struct archive *a;
326	size_t used;
327	size_t buffsize = 1000;
328	char *buff;
329
330	buff = malloc(buffsize);
331
332	/* Create a new archive in memory. */
333	assert((a = archive_write_new()) != NULL);
334	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_7zip(a));
335	if (compression_type != NULL &&
336	    ARCHIVE_OK != archive_write_set_format_option(a, "7zip",
337	    "compression", compression_type)) {
338		skipping("%s writing not fully supported on this platform",
339		   compression_type);
340		assertEqualInt(ARCHIVE_OK, archive_write_free(a));
341		free(buff);
342		return;
343	}
344	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
345	assertEqualIntA(a, ARCHIVE_OK,
346	    archive_write_open_memory(a, buff, buffsize, &used));
347
348	/*
349	 * Write a file to it.
350	 */
351	assert((ae = archive_entry_new()) != NULL);
352	archive_entry_set_mtime(ae, 1, 100);
353	assertEqualInt(1, archive_entry_mtime(ae));
354	assertEqualInt(100, archive_entry_mtime_nsec(ae));
355	archive_entry_copy_pathname(ae, "file");
356	assertEqualString("file", archive_entry_pathname(ae));
357	archive_entry_set_mode(ae, AE_IFREG | 0755);
358	assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae));
359	archive_entry_set_size(ae, 8);
360
361	assertEqualInt(0, archive_write_header(a, ae));
362	archive_entry_free(ae);
363	assertEqualInt(8, archive_write_data(a, "12345678", 9));
364	assertEqualInt(0, archive_write_data(a, "1", 1));
365
366	/*
367	 * Write another file to it.
368	 */
369	assert((ae = archive_entry_new()) != NULL);
370	archive_entry_set_mtime(ae, 1, 10);
371	assertEqualInt(1, archive_entry_mtime(ae));
372	assertEqualInt(10, archive_entry_mtime_nsec(ae));
373	archive_entry_copy_pathname(ae, "file2");
374	assertEqualString("file2", archive_entry_pathname(ae));
375	archive_entry_set_mode(ae, AE_IFREG | 0755);
376	assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae));
377	archive_entry_set_size(ae, 4);
378
379	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
380	archive_entry_free(ae);
381	assertEqualInt(4, archive_write_data(a, "1234", 5));
382
383	/*
384	 * Write a directory to it.
385	 */
386	assert((ae = archive_entry_new()) != NULL);
387	archive_entry_set_mtime(ae, 11, 100);
388	archive_entry_copy_pathname(ae, "dir");
389	archive_entry_set_mode(ae, AE_IFDIR | 0755);
390	archive_entry_set_size(ae, 512);
391
392	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
393	failure("size should be zero so that applications know not to write");
394	assertEqualInt(0, archive_entry_size(ae));
395	archive_entry_free(ae);
396	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
397
398	/*
399	 * Write a sub directory to it.
400	 */
401	assert((ae = archive_entry_new()) != NULL);
402	archive_entry_set_mtime(ae, 11, 200);
403	archive_entry_copy_pathname(ae, "dir/subdir");
404	archive_entry_set_mode(ae, AE_IFDIR | 0755);
405	archive_entry_set_size(ae, 512);
406
407	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
408	failure("size should be zero so that applications know not to write");
409	assertEqualInt(0, archive_entry_size(ae));
410	archive_entry_free(ae);
411	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
412
413	/*
414	 * Write a sub sub-directory to it.
415	 */
416	assert((ae = archive_entry_new()) != NULL);
417	archive_entry_set_mtime(ae, 11, 300);
418	archive_entry_copy_pathname(ae, "dir/subdir/subdir");
419	archive_entry_set_mode(ae, AE_IFDIR | 0755);
420	archive_entry_set_size(ae, 512);
421
422	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
423	failure("size should be zero so that applications know not to write");
424	assertEqualInt(0, archive_entry_size(ae));
425	archive_entry_free(ae);
426	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
427
428	/* Close out the archive. */
429	assertEqualInt(ARCHIVE_OK, archive_write_close(a));
430	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
431
432	/* Verify the initial header. */
433	assertEqualMem(buff, "\x37\x7a\xbc\xaf\x27\x1c\x00\x03", 8);
434
435	/*
436	 * Now, read the data back.
437	 */
438	/* With the test memory reader -- seeking mode. */
439	assert((a = archive_read_new()) != NULL);
440	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
441	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
442	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
443
444	/*
445	 * Read and verify first file.
446	 */
447	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
448	assertEqualInt(1, archive_entry_mtime(ae));
449	assertEqualInt(100, archive_entry_mtime_nsec(ae));
450	assertEqualInt(0, archive_entry_atime(ae));
451	assertEqualInt(0, archive_entry_ctime(ae));
452	assertEqualString("file", archive_entry_pathname(ae));
453	assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
454	assertEqualInt(8, archive_entry_size(ae));
455	assertEqualIntA(a, 8,
456	    archive_read_data(a, filedata, sizeof(filedata)));
457	assertEqualMem(filedata, "12345678", 8);
458
459
460	/*
461	 * Read the second file back.
462	 */
463	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
464	assertEqualInt(1, archive_entry_mtime(ae));
465	assertEqualInt(0, archive_entry_mtime_nsec(ae));
466	assertEqualInt(0, archive_entry_atime(ae));
467	assertEqualInt(0, archive_entry_ctime(ae));
468	assertEqualString("file2", archive_entry_pathname(ae));
469	assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
470	assertEqualInt(4, archive_entry_size(ae));
471	assertEqualIntA(a, 4,
472	    archive_read_data(a, filedata, sizeof(filedata)));
473	assertEqualMem(filedata, "1234", 4);
474
475	/*
476	 * Read the sub sub-dir entry back.
477	 */
478	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
479	assertEqualInt(11, archive_entry_mtime(ae));
480	assertEqualInt(300, archive_entry_mtime_nsec(ae));
481	assertEqualInt(0, archive_entry_atime(ae));
482	assertEqualInt(0, archive_entry_ctime(ae));
483	assertEqualString("dir/subdir/subdir/", archive_entry_pathname(ae));
484	assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
485	assertEqualInt(0, archive_entry_size(ae));
486	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
487
488	/*
489	 * Read the sub dir entry back.
490	 */
491	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
492	assertEqualInt(11, archive_entry_mtime(ae));
493	assertEqualInt(200, archive_entry_mtime_nsec(ae));
494	assertEqualInt(0, archive_entry_atime(ae));
495	assertEqualInt(0, archive_entry_ctime(ae));
496	assertEqualString("dir/subdir/", archive_entry_pathname(ae));
497	assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
498	assertEqualInt(0, archive_entry_size(ae));
499	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
500
501	/*
502	 * Read the dir entry back.
503	 */
504	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
505	assertEqualInt(11, archive_entry_mtime(ae));
506	assertEqualInt(100, archive_entry_mtime_nsec(ae));
507	assertEqualInt(0, archive_entry_atime(ae));
508	assertEqualInt(0, archive_entry_ctime(ae));
509	assertEqualString("dir/", archive_entry_pathname(ae));
510	assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae));
511	assertEqualInt(0, archive_entry_size(ae));
512	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
513
514	/* Verify the end of the archive. */
515	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
516
517	/* Verify archive format. */
518	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
519	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
520
521	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
522	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
523
524	free(buff);
525}
526
527DEFINE_TEST(test_write_format_7zip)
528{
529	/* Test that making a 7-Zip archive file by default compression
530	 * in whatever compressions are supported on the running platform. */
531	test_basic(NULL);
532	/* Test that making a 7-Zip archive file without empty files. */
533	test_basic2(NULL);
534}
535
536DEFINE_TEST(test_write_format_7zip_basic_bzip2)
537{
538	/* Test that making a 7-Zip archive file with bzip2 compression. */
539	test_basic("bzip2");
540}
541
542DEFINE_TEST(test_write_format_7zip_basic_copy)
543{
544	/* Test that making a 7-Zip archive file without compression. */
545	test_basic("copy");
546}
547
548DEFINE_TEST(test_write_format_7zip_basic_deflate)
549{
550	/* Test that making a 7-Zip archive file with deflate compression. */
551	test_basic("deflate");
552}
553
554DEFINE_TEST(test_write_format_7zip_basic_lzma1)
555{
556	/* Test that making a 7-Zip archive file with lzma1 compression. */
557	test_basic("lzma1");
558}
559
560DEFINE_TEST(test_write_format_7zip_basic_lzma2)
561{
562	/* Test that making a 7-Zip archive file with lzma2 compression. */
563	test_basic("lzma2");
564}
565
566DEFINE_TEST(test_write_format_7zip_basic_ppmd)
567{
568	/* Test that making a 7-Zip archive file with PPMd compression. */
569	test_basic("ppmd");
570}
571