1231200Smm/*-
2231200Smm * Copyright (c) 2011 Michihiro NAKAJIMA
3231200Smm * All rights reserved.
4231200Smm *
5231200Smm * Redistribution and use in source and binary forms, with or without
6231200Smm * modification, are permitted provided that the following conditions
7231200Smm * are met:
8231200Smm * 1. Redistributions of source code must retain the above copyright
9231200Smm *    notice, this list of conditions and the following disclaimer.
10231200Smm * 2. Redistributions in binary form must reproduce the above copyright
11231200Smm *    notice, this list of conditions and the following disclaimer in the
12231200Smm *    documentation and/or other materials provided with the distribution.
13231200Smm *
14231200Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15231200Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16231200Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17231200Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18231200Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19231200Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20231200Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21231200Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22231200Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23231200Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24231200Smm */
25231200Smm#include "test.h"
26231200Smm__FBSDID("$FreeBSD");
27231200Smm
28302001Smm#if defined(_WIN32) && !defined(__CYGWIN__)
29302001Smm#define	close		_close
30302001Smm#define	open		_open
31302001Smm#endif
32302001Smm
33231200Smm/*
34238856Smm * Extract a non-encoded file.
35238856Smm * The header of the 7z archive files is not encoded.
36231200Smm */
37231200Smmstatic void
38302001Smmtest_copy(int use_open_fd)
39231200Smm{
40231200Smm	const char *refname = "test_read_format_7zip_copy.7z";
41231200Smm	struct archive_entry *ae;
42231200Smm	struct archive *a;
43231200Smm	char buff[128];
44302001Smm	int fd = -1;
45231200Smm
46231200Smm	extract_reference_file(refname);
47231200Smm	assert((a = archive_read_new()) != NULL);
48231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
49231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
50302001Smm	if (use_open_fd) {
51302001Smm		fd = open(refname, O_RDONLY | O_BINARY);
52302001Smm		assertEqualIntA(a, ARCHIVE_OK,
53302001Smm		    archive_read_open_fd(a, fd, 10240));
54302001Smm	} else {
55302001Smm		assertEqualIntA(a, ARCHIVE_OK,
56302001Smm		    archive_read_open_filename(a, refname, 10240));
57302001Smm	}
58231200Smm
59231200Smm	/* Verify regular file1. */
60231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
61238856Smm	assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae));
62231200Smm	assertEqualString("file1", archive_entry_pathname(ae));
63231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
64231200Smm	assertEqualInt(60, archive_entry_size(ae));
65302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
66302001Smm	assert(archive_read_has_encrypted_entries(a) > ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
67231200Smm	assertEqualInt(60, archive_read_data(a, buff, sizeof(buff)));
68231200Smm	assertEqualMem(buff, "    ", 4);
69231200Smm
70231200Smm	assertEqualInt(1, archive_file_count(a));
71231200Smm
72231200Smm	/* End of archive. */
73231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
74231200Smm
75231200Smm	/* Verify archive format. */
76248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
77231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
78231200Smm
79231200Smm	/* Close the archive. */
80231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
81231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
82302001Smm	if (fd != -1)
83302001Smm		close(fd);
84231200Smm}
85231200Smm
86231200Smm/*
87231200Smm * An archive file has no entry.
88231200Smm */
89231200Smmstatic void
90358090Smmtest_empty_archive(void)
91231200Smm{
92231200Smm	const char *refname = "test_read_format_7zip_empty_archive.7z";
93231200Smm	struct archive_entry *ae;
94231200Smm	struct archive *a;
95231200Smm
96231200Smm	extract_reference_file(refname);
97231200Smm	assert((a = archive_read_new()) != NULL);
98231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
99231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
100231200Smm	assertEqualIntA(a, ARCHIVE_OK,
101231200Smm	    archive_read_open_filename(a, refname, 10240));
102231200Smm
103231200Smm	/* End of archive. */
104231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
105231200Smm
106231200Smm	assertEqualInt(0, archive_file_count(a));
107231200Smm
108231200Smm	/* Verify archive format. */
109248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
110231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
111231200Smm
112231200Smm	/* Close the archive. */
113231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
114231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
115231200Smm}
116231200Smm
117231200Smm/*
118231200Smm * An archive file has one empty file. It means there is no content
119231200Smm * in the archive file except for a header.
120231200Smm */
121231200Smmstatic void
122358090Smmtest_empty_file(void)
123231200Smm{
124231200Smm	const char *refname = "test_read_format_7zip_empty_file.7z";
125231200Smm	struct archive_entry *ae;
126231200Smm	struct archive *a;
127231200Smm
128231200Smm	extract_reference_file(refname);
129231200Smm	assert((a = archive_read_new()) != NULL);
130231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
131231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
132231200Smm	assertEqualIntA(a, ARCHIVE_OK,
133231200Smm	    archive_read_open_filename(a, refname, 10240));
134231200Smm
135231200Smm	/* Verify regular empty. */
136231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
137231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
138231200Smm	assertEqualString("empty", archive_entry_pathname(ae));
139231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
140231200Smm	assertEqualInt(0, archive_entry_size(ae));
141302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
142302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
143231200Smm
144231200Smm	assertEqualInt(1, archive_file_count(a));
145231200Smm
146231200Smm	/* End of archive. */
147231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
148231200Smm
149231200Smm	/* Verify archive format. */
150248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
151231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
152231200Smm
153231200Smm	/* Close the archive. */
154231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
155231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
156231200Smm}
157231200Smm
158231200Smm/*
159231200Smm * Extract an encoded file.
160238856Smm * The header of the 7z archive files is not encoded.
161231200Smm */
162231200Smmstatic void
163231200Smmtest_plain_header(const char *refname)
164231200Smm{
165231200Smm	struct archive_entry *ae;
166231200Smm	struct archive *a;
167231200Smm	char buff[128];
168231200Smm
169231200Smm	extract_reference_file(refname);
170231200Smm	assert((a = archive_read_new()) != NULL);
171231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
172231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
173231200Smm	assertEqualIntA(a, ARCHIVE_OK,
174231200Smm	    archive_read_open_filename(a, refname, 10240));
175231200Smm
176231200Smm	/* Verify regular file1. */
177231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
178231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
179231200Smm	assertEqualString("file1", archive_entry_pathname(ae));
180231200Smm	assertEqualInt(1322058763, archive_entry_mtime(ae));
181231200Smm	assertEqualInt(2844, archive_entry_size(ae));
182302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
183302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
184231200Smm	assertEqualInt(sizeof(buff), archive_read_data(a, buff, sizeof(buff)));
185231200Smm	assertEqualMem(buff, "The libarchive distribution ", 28);
186231200Smm
187231200Smm	assertEqualInt(1, archive_file_count(a));
188231200Smm
189231200Smm	/* End of archive. */
190231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
191231200Smm
192231200Smm	/* Verify archive format. */
193248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
194231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
195231200Smm
196231200Smm	/* Close the archive. */
197231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
198231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
199231200Smm}
200231200Smm
201231200Smm/*
202231200Smm * Extract multi files.
203238856Smm * The header of the 7z archive files is encoded with LZMA.
204231200Smm */
205231200Smmstatic void
206231200Smmtest_extract_all_files(const char *refname)
207231200Smm{
208231200Smm	struct archive_entry *ae;
209231200Smm	struct archive *a;
210231200Smm	char buff[128];
211231200Smm
212231200Smm	extract_reference_file(refname);
213231200Smm	assert((a = archive_read_new()) != NULL);
214231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
215231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
216231200Smm	assertEqualIntA(a, ARCHIVE_OK,
217231200Smm	    archive_read_open_filename(a, refname, 10240));
218231200Smm
219231200Smm	/* Verify regular file1. */
220231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
221231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
222231200Smm	assertEqualString("dir1/file1", archive_entry_pathname(ae));
223231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
224231200Smm	assertEqualInt(13, archive_entry_size(ae));
225302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
226302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
227231200Smm	assertEqualInt(13, archive_read_data(a, buff, sizeof(buff)));
228231200Smm	assertEqualMem(buff, "aaaaaaaaaaaa\n", 13);
229231200Smm
230231200Smm	/* Verify regular file2. */
231231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
232231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
233231200Smm	assertEqualString("file2", archive_entry_pathname(ae));
234231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
235231200Smm	assertEqualInt(26, archive_entry_size(ae));
236302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
237302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
238231200Smm	assertEqualInt(26, archive_read_data(a, buff, sizeof(buff)));
239231200Smm	assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26);
240231200Smm
241231200Smm	/* Verify regular file3. */
242231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
243231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
244231200Smm	assertEqualString("file3", archive_entry_pathname(ae));
245231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
246231200Smm	assertEqualInt(39, archive_entry_size(ae));
247302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
248302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
249231200Smm	assertEqualInt(39, archive_read_data(a, buff, sizeof(buff)));
250231200Smm	assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39);
251231200Smm
252231200Smm	/* Verify regular file4. */
253231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
254231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
255231200Smm	assertEqualString("file4", archive_entry_pathname(ae));
256231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
257231200Smm	assertEqualInt(52, archive_entry_size(ae));
258302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
259302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
260231200Smm	assertEqualInt(52, archive_read_data(a, buff, sizeof(buff)));
261231200Smm	assertEqualMem(buff,
262231200Smm	    "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52);
263231200Smm
264231200Smm	/* Verify directory dir1. */
265231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
266231200Smm	assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae));
267231200Smm	assertEqualString("dir1/", archive_entry_pathname(ae));
268231200Smm	assertEqualInt(2764801, archive_entry_mtime(ae));
269302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
270302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
271231200Smm
272231200Smm	assertEqualInt(5, archive_file_count(a));
273231200Smm
274231200Smm	/* End of archive. */
275231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
276231200Smm
277231200Smm	/* Verify archive format. */
278248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
279231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
280231200Smm
281231200Smm	/* Close the archive. */
282231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
283231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
284231200Smm}
285231200Smm
286231200Smm/*
287231200Smm * Extract last file.
288238856Smm * The header of the 7z archive files is encoded with LZMA.
289231200Smm */
290231200Smmstatic void
291231200Smmtest_extract_last_file(const char *refname)
292231200Smm{
293231200Smm	struct archive_entry *ae;
294231200Smm	struct archive *a;
295231200Smm	char buff[128];
296231200Smm
297231200Smm	extract_reference_file(refname);
298231200Smm	assert((a = archive_read_new()) != NULL);
299231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
300231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
301231200Smm	assertEqualIntA(a, ARCHIVE_OK,
302231200Smm	    archive_read_open_filename(a, refname, 10240));
303231200Smm
304231200Smm	/* Verify regular file1. */
305231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
306231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
307231200Smm	assertEqualString("dir1/file1", archive_entry_pathname(ae));
308231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
309231200Smm	assertEqualInt(13, archive_entry_size(ae));
310302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
311302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
312231200Smm
313231200Smm	/* Verify regular file2. */
314231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
315231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
316231200Smm	assertEqualString("file2", archive_entry_pathname(ae));
317231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
318231200Smm	assertEqualInt(26, archive_entry_size(ae));
319302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
320302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
321231200Smm
322231200Smm	/* Verify regular file3. */
323231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
324231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
325231200Smm	assertEqualString("file3", archive_entry_pathname(ae));
326231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
327231200Smm	assertEqualInt(39, archive_entry_size(ae));
328302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
329302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
330231200Smm
331231200Smm	/* Verify regular file4. */
332231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
333231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
334231200Smm	assertEqualString("file4", archive_entry_pathname(ae));
335231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
336231200Smm	assertEqualInt(52, archive_entry_size(ae));
337302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
338302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
339231200Smm	assertEqualInt(52, archive_read_data(a, buff, sizeof(buff)));
340231200Smm	assertEqualMem(buff,
341231200Smm	    "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52);
342231200Smm
343231200Smm	/* Verify directory dir1. */
344231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
345231200Smm	assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae));
346231200Smm	assertEqualString("dir1/", archive_entry_pathname(ae));
347231200Smm	assertEqualInt(2764801, archive_entry_mtime(ae));
348302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
349302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
350231200Smm
351231200Smm	assertEqualInt(5, archive_file_count(a));
352231200Smm
353231200Smm	/* End of archive. */
354231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
355231200Smm
356231200Smm	/* Verify archive format. */
357248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
358231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
359231200Smm
360231200Smm	/* Close the archive. */
361231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
362231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
363231200Smm}
364231200Smm
365231200Smm/*
366238856Smm * Extract a mixed archive file which has both LZMA and LZMA2 encoded files.
367231200Smm *  LZMA: file1, file2, file3, file4
368231200Smm *  LZMA2: zfile1, zfile2, zfile3, zfile4
369231200Smm */
370231200Smmstatic void
371231200Smmtest_extract_all_files2(const char *refname)
372231200Smm{
373231200Smm	struct archive_entry *ae;
374231200Smm	struct archive *a;
375231200Smm	char buff[128];
376231200Smm
377231200Smm	extract_reference_file(refname);
378231200Smm	assert((a = archive_read_new()) != NULL);
379231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
380231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
381231200Smm	assertEqualIntA(a, ARCHIVE_OK,
382231200Smm	    archive_read_open_filename(a, refname, 10240));
383231200Smm
384231200Smm	/* Verify regular file1. */
385231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
386231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
387231200Smm	assertEqualString("dir1/file1", archive_entry_pathname(ae));
388231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
389231200Smm	assertEqualInt(13, archive_entry_size(ae));
390302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
391302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
392231200Smm	assertEqualInt(13, archive_read_data(a, buff, sizeof(buff)));
393231200Smm	assertEqualMem(buff, "aaaaaaaaaaaa\n", 13);
394231200Smm
395231200Smm	/* Verify regular file2. */
396231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
397231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
398231200Smm	assertEqualString("file2", archive_entry_pathname(ae));
399231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
400231200Smm	assertEqualInt(26, archive_entry_size(ae));
401302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
402302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
403231200Smm	assertEqualInt(26, archive_read_data(a, buff, sizeof(buff)));
404231200Smm	assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26);
405231200Smm
406231200Smm	/* Verify regular file3. */
407231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
408231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
409231200Smm	assertEqualString("file3", archive_entry_pathname(ae));
410231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
411231200Smm	assertEqualInt(39, archive_entry_size(ae));
412302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
413302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
414231200Smm	assertEqualInt(39, archive_read_data(a, buff, sizeof(buff)));
415231200Smm	assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39);
416231200Smm
417231200Smm	/* Verify regular file4. */
418231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
419231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
420231200Smm	assertEqualString("file4", archive_entry_pathname(ae));
421231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
422231200Smm	assertEqualInt(52, archive_entry_size(ae));
423302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
424302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
425231200Smm	assertEqualInt(52, archive_read_data(a, buff, sizeof(buff)));
426231200Smm	assertEqualMem(buff,
427231200Smm	    "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52);
428231200Smm
429231200Smm	/* Verify regular zfile1. */
430231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
431231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
432231200Smm	assertEqualString("dir1/zfile1", archive_entry_pathname(ae));
433231200Smm	assertEqualInt(5184001, archive_entry_mtime(ae));
434231200Smm	assertEqualInt(13, archive_entry_size(ae));
435302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
436302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
437231200Smm	assertEqualInt(13, archive_read_data(a, buff, sizeof(buff)));
438231200Smm	assertEqualMem(buff, "aaaaaaaaaaaa\n", 13);
439231200Smm
440231200Smm	/* Verify regular zfile2. */
441231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
442231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
443231200Smm	assertEqualString("zfile2", archive_entry_pathname(ae));
444231200Smm	assertEqualInt(5184001, archive_entry_mtime(ae));
445231200Smm	assertEqualInt(26, archive_entry_size(ae));
446302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
447302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
448231200Smm	assertEqualInt(26, archive_read_data(a, buff, sizeof(buff)));
449231200Smm	assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26);
450231200Smm
451231200Smm	/* Verify regular zfile3. */
452231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
453231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
454231200Smm	assertEqualString("zfile3", archive_entry_pathname(ae));
455231200Smm	assertEqualInt(5184001, archive_entry_mtime(ae));
456231200Smm	assertEqualInt(39, archive_entry_size(ae));
457302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
458302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
459231200Smm	assertEqualInt(39, archive_read_data(a, buff, sizeof(buff)));
460231200Smm	assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39);
461231200Smm
462231200Smm	/* Verify regular zfile4. */
463231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
464231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
465231200Smm	assertEqualString("zfile4", archive_entry_pathname(ae));
466231200Smm	assertEqualInt(5184001, archive_entry_mtime(ae));
467231200Smm	assertEqualInt(52, archive_entry_size(ae));
468302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
469302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
470231200Smm	assertEqualInt(52, archive_read_data(a, buff, sizeof(buff)));
471231200Smm	assertEqualMem(buff,
472231200Smm	    "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52);
473231200Smm
474231200Smm	/* Verify directory dir1. */
475231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
476231200Smm	assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae));
477231200Smm	assertEqualString("dir1/", archive_entry_pathname(ae));
478231200Smm	assertEqualInt(2764801, archive_entry_mtime(ae));
479302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
480302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
481231200Smm
482231200Smm	assertEqualInt(9, archive_file_count(a));
483231200Smm
484231200Smm	/* End of archive. */
485231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
486231200Smm
487231200Smm	/* Verify archive format. */
488248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
489231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
490231200Smm
491231200Smm	/* Close the archive. */
492231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
493231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
494231200Smm}
495231200Smm
496231200Smm/*
497231200Smm * Extract a file compressed with DELTA + LZMA[12].
498231200Smm */
499231200Smmstatic void
500231200Smmtest_delta_lzma(const char *refname)
501231200Smm{
502231200Smm	struct archive_entry *ae;
503231200Smm	struct archive *a;
504231200Smm	size_t remaining;
505231200Smm	ssize_t bytes;
506231200Smm	char buff[1024];
507231200Smm
508231200Smm	extract_reference_file(refname);
509231200Smm	assert((a = archive_read_new()) != NULL);
510231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
511231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
512231200Smm	assertEqualIntA(a, ARCHIVE_OK,
513231200Smm	    archive_read_open_filename(a, refname, 10240));
514231200Smm
515231200Smm	/* Verify regular file1. */
516231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
517231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
518231200Smm	assertEqualString("file1", archive_entry_pathname(ae));
519231200Smm	assertEqualInt(172802, archive_entry_mtime(ae));
520231200Smm	assertEqualInt(27627, archive_entry_size(ae));
521302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
522302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
523231200Smm	remaining = (size_t)archive_entry_size(ae);
524231200Smm	while (remaining) {
525231200Smm		if (remaining < sizeof(buff))
526231200Smm			assertEqualInt(remaining,
527231200Smm			    bytes = archive_read_data(a, buff, sizeof(buff)));
528231200Smm		else
529231200Smm			assertEqualInt(sizeof(buff),
530231200Smm			    bytes = archive_read_data(a, buff, sizeof(buff)));
531231200Smm		if (bytes > 0)
532231200Smm			remaining -= bytes;
533231200Smm		else
534231200Smm			break;
535231200Smm	}
536231200Smm	assertEqualInt(0, remaining);
537231200Smm
538231200Smm	assertEqualInt(1, archive_file_count(a));
539231200Smm
540231200Smm	/* End of archive. */
541231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
542231200Smm
543231200Smm	/* Verify archive format. */
544248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
545231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
546231200Smm
547231200Smm	/* Close the archive. */
548231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
549231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
550231200Smm}
551231200Smm
552231200Smm/*
553231200Smm * Extract a file compressed with BCJ + LZMA2.
554231200Smm */
555231200Smmstatic void
556231200Smmtest_bcj(const char *refname)
557231200Smm{
558231200Smm	struct archive_entry *ae;
559231200Smm	struct archive *a;
560231200Smm	size_t remaining;
561231200Smm	ssize_t bytes;
562231200Smm	char buff[1024];
563231200Smm
564231200Smm	extract_reference_file(refname);
565231200Smm	assert((a = archive_read_new()) != NULL);
566231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
567231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
568231200Smm	assertEqualIntA(a, ARCHIVE_OK,
569231200Smm	    archive_read_open_filename(a, refname, 10240));
570231200Smm
571231200Smm	/* Verify regular x86exe. */
572231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
573238856Smm	assertEqualInt((AE_IFREG | 0444), archive_entry_mode(ae) & ~0111);
574231200Smm	assertEqualString("x86exe", archive_entry_pathname(ae));
575231200Smm	assertEqualInt(172802, archive_entry_mtime(ae));
576231200Smm	assertEqualInt(27328, archive_entry_size(ae));
577302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
578302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
579231200Smm	remaining = (size_t)archive_entry_size(ae);
580231200Smm	while (remaining) {
581231200Smm		if (remaining < sizeof(buff))
582231200Smm			assertEqualInt(remaining,
583231200Smm			    bytes = archive_read_data(a, buff, sizeof(buff)));
584231200Smm		else
585231200Smm			assertEqualInt(sizeof(buff),
586231200Smm			    bytes = archive_read_data(a, buff, sizeof(buff)));
587231200Smm		if (bytes > 0)
588231200Smm			remaining -= bytes;
589231200Smm		else
590231200Smm			break;
591231200Smm	}
592231200Smm	assertEqualInt(0, remaining);
593231200Smm
594231200Smm	assertEqualInt(1, archive_file_count(a));
595231200Smm
596231200Smm	/* End of archive. */
597231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
598231200Smm
599231200Smm	/* Verify archive format. */
600248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
601231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
602231200Smm
603231200Smm	/* Close the archive. */
604231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
605231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
606231200Smm}
607231200Smm
608231200Smm/*
609231200Smm * Extract a file compressed with PPMd.
610231200Smm */
611231200Smmstatic void
612358090Smmtest_ppmd(void)
613231200Smm{
614231200Smm	const char *refname = "test_read_format_7zip_ppmd.7z";
615231200Smm	struct archive_entry *ae;
616231200Smm	struct archive *a;
617231200Smm	size_t remaining;
618231200Smm	ssize_t bytes;
619231200Smm	char buff[1024];
620231200Smm
621231200Smm	extract_reference_file(refname);
622231200Smm	assert((a = archive_read_new()) != NULL);
623231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
624231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
625231200Smm	assertEqualIntA(a, ARCHIVE_OK,
626231200Smm	    archive_read_open_filename(a, refname, 10240));
627231200Smm
628231200Smm	/* Verify regular file1. */
629231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
630238856Smm	assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae));
631231200Smm	assertEqualString("ppmd_test.txt", archive_entry_pathname(ae));
632231200Smm	assertEqualInt(1322464589, archive_entry_mtime(ae));
633231200Smm	assertEqualInt(102400, archive_entry_size(ae));
634302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
635302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
636231200Smm	remaining = (size_t)archive_entry_size(ae);
637231200Smm	while (remaining) {
638231200Smm		if (remaining < sizeof(buff))
639231200Smm			assertEqualInt(remaining,
640231200Smm			    bytes = archive_read_data(a, buff, sizeof(buff)));
641231200Smm		else
642231200Smm			assertEqualInt(sizeof(buff),
643231200Smm			    bytes = archive_read_data(a, buff, sizeof(buff)));
644231200Smm		if (bytes > 0)
645231200Smm			remaining -= bytes;
646231200Smm		else
647231200Smm			break;
648231200Smm	}
649231200Smm	assertEqualInt(0, remaining);
650231200Smm
651231200Smm	assertEqualInt(1, archive_file_count(a));
652231200Smm
653231200Smm	/* End of archive. */
654231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
655231200Smm
656231200Smm	/* Verify archive format. */
657248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
658231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
659231200Smm
660231200Smm	/* Close the archive. */
661231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
662231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
663231200Smm}
664231200Smm
665231200Smmstatic void
666358090Smmtest_symname(void)
667231200Smm{
668231200Smm	const char *refname = "test_read_format_7zip_symbolic_name.7z";
669231200Smm	struct archive_entry *ae;
670231200Smm	struct archive *a;
671231200Smm	char buff[128];
672231200Smm
673231200Smm	extract_reference_file(refname);
674231200Smm	assert((a = archive_read_new()) != NULL);
675231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
676231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
677231200Smm	assertEqualIntA(a, ARCHIVE_OK,
678231200Smm	    archive_read_open_filename(a, refname, 10240));
679231200Smm
680231200Smm	/* Verify regular file1. */
681231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
682231200Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
683231200Smm	assertEqualString("file1", archive_entry_pathname(ae));
684231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
685231200Smm	assertEqualInt(32, archive_entry_size(ae));
686302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
687302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
688231200Smm	assertEqualInt(32, archive_read_data(a, buff, sizeof(buff)));
689231200Smm	assertEqualMem(buff, "hellohellohello\nhellohellohello\n", 32);
690231200Smm
691313571Smm	/* Verify symbolic-link symlinkfile. */
692231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
693231200Smm	assertEqualInt((AE_IFLNK | 0755), archive_entry_mode(ae));
694231200Smm	assertEqualString("symlinkfile", archive_entry_pathname(ae));
695231200Smm	assertEqualString("file1", archive_entry_symlink(ae));
696231200Smm	assertEqualInt(86401, archive_entry_mtime(ae));
697302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
698302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
699231200Smm
700231200Smm	assertEqualInt(2, archive_file_count(a));
701231200Smm
702231200Smm	/* End of archive. */
703231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
704231200Smm
705231200Smm	/* Verify archive format. */
706248616Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
707231200Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
708231200Smm
709231200Smm	/* Close the archive. */
710231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
711231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
712231200Smm}
713231200Smm
714231200Smm
715231200SmmDEFINE_TEST(test_read_format_7zip)
716231200Smm{
717231200Smm	struct archive *a;
718231200Smm
719248616Smm	assert((a = archive_read_new()) != NULL);
720231200Smm
721248616Smm	/* Extracting with liblzma */
722248616Smm	if (ARCHIVE_OK != archive_read_support_filter_xz(a)) {
723358090Smm		skipping("7zip:lzma decoding is not supported on this "
724358090Smm		    "platform");
725248616Smm	} else {
726248616Smm		test_symname();
727248616Smm		test_extract_all_files("test_read_format_7zip_copy_2.7z");
728248616Smm		test_extract_last_file("test_read_format_7zip_copy_2.7z");
729248616Smm		test_extract_all_files2("test_read_format_7zip_lzma1_lzma2.7z");
730248616Smm		test_bcj("test_read_format_7zip_bcj2_copy_lzma.7z");
731248616Smm	}
732248616Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
733248616Smm}
734248616Smm
735248616SmmDEFINE_TEST(test_read_format_7zip_bzip2)
736248616Smm{
737248616Smm	struct archive *a;
738248616Smm
739231200Smm	assert((a = archive_read_new()) != NULL);
740231200Smm
741231200Smm	/* Extracting with libbzip2 */
742231200Smm	if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) {
743231200Smm		skipping("7zip:bzip2 decoding is not supported on this platform");
744231200Smm	} else {
745231200Smm		test_plain_header("test_read_format_7zip_bzip2.7z");
746231200Smm		test_bcj("test_read_format_7zip_bcj_bzip2.7z");
747231200Smm		test_bcj("test_read_format_7zip_bcj2_bzip2.7z");
748231200Smm	}
749231200Smm
750248616Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
751248616Smm}
752248616Smm
753302001SmmDEFINE_TEST(test_read_format_7zip_from_fd)
754302001Smm{
755302001Smm	test_copy(1);/* read a 7zip file from a file descriptor. */
756302001Smm}
757302001Smm
758248616SmmDEFINE_TEST(test_read_format_7zip_copy)
759248616Smm{
760302001Smm	test_copy(0);
761248616Smm	test_bcj("test_read_format_7zip_bcj_copy.7z");
762248616Smm	test_bcj("test_read_format_7zip_bcj2_copy_1.7z");
763248616Smm	test_bcj("test_read_format_7zip_bcj2_copy_2.7z");
764248616Smm}
765248616Smm
766248616SmmDEFINE_TEST(test_read_format_7zip_deflate)
767248616Smm{
768248616Smm	struct archive *a;
769248616Smm
770248616Smm	assert((a = archive_read_new()) != NULL);
771248616Smm
772231200Smm	/* Extracting with libz */
773231200Smm	if (ARCHIVE_OK != archive_read_support_filter_gzip(a)) {
774248616Smm		skipping(
775248616Smm		    "7zip:deflate decoding is not supported on this platform");
776231200Smm	} else {
777231200Smm		test_plain_header("test_read_format_7zip_deflate.7z");
778231200Smm		test_bcj("test_read_format_7zip_bcj_deflate.7z");
779231200Smm		test_bcj("test_read_format_7zip_bcj2_deflate.7z");
780231200Smm	}
781231200Smm
782248616Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
783248616Smm}
784248616Smm
785248616SmmDEFINE_TEST(test_read_format_7zip_empty)
786248616Smm{
787248616Smm	test_empty_archive();
788248616Smm	test_empty_file();
789248616Smm}
790248616Smm
791248616SmmDEFINE_TEST(test_read_format_7zip_lzma1)
792248616Smm{
793248616Smm	struct archive *a;
794248616Smm
795248616Smm	assert((a = archive_read_new()) != NULL);
796248616Smm
797231200Smm	/* Extracting with liblzma */
798231200Smm	if (ARCHIVE_OK != archive_read_support_filter_xz(a)) {
799358090Smm		skipping("7zip:lzma decoding is not supported on this "
800358090Smm		    "platform");
801231200Smm	} else {
802231200Smm		test_plain_header("test_read_format_7zip_lzma1.7z");
803231200Smm		test_extract_all_files("test_read_format_7zip_lzma1_2.7z");
804231200Smm		test_extract_last_file("test_read_format_7zip_lzma1_2.7z");
805231200Smm		test_bcj("test_read_format_7zip_bcj_lzma1.7z");
806231200Smm		test_bcj("test_read_format_7zip_bcj2_lzma1_1.7z");
807231200Smm		test_bcj("test_read_format_7zip_bcj2_lzma1_2.7z");
808248616Smm		test_delta_lzma("test_read_format_7zip_delta_lzma1.7z");
809358090Smm		test_delta_lzma("test_read_format_7zip_delta4_lzma1.7z");
810248616Smm	}
811248616Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
812248616Smm}
813248616Smm
814248616SmmDEFINE_TEST(test_read_format_7zip_lzma2)
815248616Smm{
816248616Smm	struct archive *a;
817248616Smm
818248616Smm	assert((a = archive_read_new()) != NULL);
819248616Smm
820248616Smm	/* Extracting with liblzma */
821248616Smm	if (ARCHIVE_OK != archive_read_support_filter_xz(a)) {
822358090Smm		skipping("7zip:lzma decoding is not supported on this "
823358090Smm		    "platform");
824248616Smm	} else {
825248616Smm		test_plain_header("test_read_format_7zip_lzma2.7z");
826248616Smm		test_bcj("test_read_format_7zip_bcj_lzma2.7z");
827231200Smm		test_bcj("test_read_format_7zip_bcj2_lzma2_1.7z");
828231200Smm		test_bcj("test_read_format_7zip_bcj2_lzma2_2.7z");
829231200Smm		test_delta_lzma("test_read_format_7zip_delta_lzma2.7z");
830358090Smm		test_delta_lzma("test_read_format_7zip_delta4_lzma2.7z");
831231200Smm	}
832231200Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
833231200Smm}
834231200Smm
835248616SmmDEFINE_TEST(test_read_format_7zip_ppmd)
836248616Smm{
837248616Smm	test_ppmd();
838248616Smm}
839