1248590Smm/*-
2248590Smm * Copyright (c) 2012 Michihiro NAKAJIMA
3248590Smm * All rights reserved.
4248590Smm *
5248590Smm * Redistribution and use in source and binary forms, with or without
6248590Smm * modification, are permitted provided that the following conditions
7248590Smm * are met:
8248590Smm * 1. Redistributions of source code must retain the above copyright
9248590Smm *    notice, this list of conditions and the following disclaimer.
10248590Smm * 2. Redistributions in binary form must reproduce the above copyright
11248590Smm *    notice, this list of conditions and the following disclaimer in the
12248590Smm *    documentation and/or other materials provided with the distribution.
13248590Smm *
14248590Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15248590Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16248590Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17248590Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18248590Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19248590Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20248590Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21248590Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22248590Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23248590Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24248590Smm */
25248590Smm
26248590Smm
27248590Smm#include "test.h"
28248590Smm__FBSDID("$FreeBSD$");
29248590Smm
30248590Smmstatic void
31248590Smmtest_format_by_name(const char *format_name, const char *compression_type,
32248590Smm    int format_id, int dot_stored, const void *image, size_t image_size)
33248590Smm{
34248590Smm	struct archive_entry *ae;
35248590Smm	struct archive *a;
36248590Smm	size_t used;
37248590Smm	size_t buffsize = 1024 * 1024;
38248590Smm	char *buff;
39248590Smm	int r;
40248590Smm
41248590Smm	assert((buff = malloc(buffsize)) != NULL);
42248590Smm	if (buff == NULL)
43248590Smm		return;
44248590Smm
45248590Smm	/* Create a new archive in memory. */
46248590Smm	assert((a = archive_write_new()) != NULL);
47248590Smm	r = archive_write_set_format_by_name(a, format_name);
48248590Smm	if (r == ARCHIVE_WARN) {
49248590Smm		skipping("%s format not fully supported on this platform",
50248590Smm		   compression_type);
51248590Smm		assertEqualInt(ARCHIVE_OK, archive_write_free(a));
52248590Smm		free(buff);
53248590Smm		return;
54248590Smm	}
55248590Smm	assertEqualIntA(a, ARCHIVE_OK, r);
56248590Smm	if (compression_type != NULL &&
57248590Smm	    ARCHIVE_OK != archive_write_set_format_option(a, format_name,
58248590Smm	    "compression", compression_type)) {
59248590Smm		skipping("%s writing not fully supported on this platform",
60248590Smm		   compression_type);
61248590Smm		assertEqualInt(ARCHIVE_OK, archive_write_free(a));
62248590Smm		free(buff);
63248590Smm		return;
64248590Smm	}
65248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
66248590Smm	assertEqualIntA(a, ARCHIVE_OK,
67248590Smm	    archive_write_open_memory(a, buff, buffsize, &used));
68248590Smm
69248590Smm	/*
70248590Smm	 * Write a file to it.
71248590Smm	 */
72248590Smm	assert((ae = archive_entry_new()) != NULL);
73248590Smm	archive_entry_set_mtime(ae, 1, 0);
74248590Smm	assertEqualInt(1, archive_entry_mtime(ae));
75248590Smm	archive_entry_set_ctime(ae, 1, 0);
76248590Smm	assertEqualInt(1, archive_entry_ctime(ae));
77248590Smm	archive_entry_set_atime(ae, 1, 0);
78248590Smm	assertEqualInt(1, archive_entry_atime(ae));
79248590Smm	archive_entry_copy_pathname(ae, "file");
80248590Smm	assertEqualString("file", archive_entry_pathname(ae));
81248590Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
82248590Smm	assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae));
83248590Smm	archive_entry_set_size(ae, 8);
84248590Smm	assertEqualInt(0, archive_write_header(a, ae));
85248590Smm	archive_entry_free(ae);
86248590Smm	assertEqualInt(8, archive_write_data(a, "12345678", 8));
87248590Smm
88248590Smm	/* Close out the archive. */
89248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
90248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
91248590Smm
92248590Smm	if (image && image_size > 0) {
93248590Smm		assertEqualMem(buff, image, image_size);
94248590Smm	}
95248590Smm	if (format_id > 0) {
96248590Smm		/*
97248590Smm		 * Now, read the data back.
98248590Smm		 */
99248590Smm		/* With the test memory reader -- seeking mode. */
100248590Smm		assert((a = archive_read_new()) != NULL);
101248590Smm		assertEqualIntA(a, ARCHIVE_OK,
102248590Smm		    archive_read_support_format_all(a));
103248590Smm		assertEqualIntA(a, ARCHIVE_OK,
104248590Smm		    archive_read_support_filter_all(a));
105248590Smm		assertEqualIntA(a, ARCHIVE_OK,
106248590Smm		    read_open_memory_seek(a, buff, used, 7));
107248590Smm
108248590Smm		if (dot_stored & 1) {
109248590Smm			assertEqualIntA(a, ARCHIVE_OK,
110248590Smm			    archive_read_next_header(a, &ae));
111248590Smm			assertEqualString(".", archive_entry_pathname(ae));
112248590Smm			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
113248590Smm		}
114248590Smm		/*
115248590Smm		 * Read and verify the file.
116248590Smm		 */
117248590Smm		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
118248590Smm		assertEqualInt(1, archive_entry_mtime(ae));
119248590Smm		if (dot_stored & 2) {
120248590Smm			assertEqualString("./file", archive_entry_pathname(ae));
121248590Smm		} else {
122248590Smm			assertEqualString("file", archive_entry_pathname(ae));
123248590Smm		}
124248590Smm		assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
125248590Smm		assertEqualInt(8, archive_entry_size(ae));
126248590Smm
127248590Smm		/* Verify the end of the archive. */
128248590Smm		assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
129248590Smm
130248590Smm		/* Verify archive format. */
131248590Smm		assertEqualIntA(a, ARCHIVE_FILTER_NONE,
132248590Smm		    archive_filter_code(a, 0));
133248590Smm		assertEqualIntA(a, format_id, archive_format(a));
134248590Smm
135248590Smm		assertEqualInt(ARCHIVE_OK, archive_read_close(a));
136248590Smm		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
137248590Smm	}
138248590Smm	free(buff);
139248590Smm}
140248590Smm
141248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_7zip)
142248590Smm{
143248590Smm	test_format_by_name("7zip", "copy", ARCHIVE_FORMAT_7ZIP, 0,
144248590Smm	    "\x37\x7a\xbc\xaf\x27\x1c\x00\x03", 8);
145248590Smm}
146248590Smm
147248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_ar)
148248590Smm{
149248590Smm	test_format_by_name("ar", NULL, ARCHIVE_FORMAT_AR, 0, NULL, 0);
150248590Smm}
151248590Smm
152248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_arbsd)
153248590Smm{
154248590Smm	test_format_by_name("arbsd", NULL, ARCHIVE_FORMAT_AR, 0, NULL, 0);
155248590Smm}
156248590Smm
157248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_argnu)
158248590Smm{
159248590Smm	test_format_by_name("argnu", NULL, ARCHIVE_FORMAT_AR_GNU, 0, NULL, 0);
160248590Smm}
161248590Smm
162248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_arsvr4)
163248590Smm{
164248590Smm	test_format_by_name("arsvr4", NULL, ARCHIVE_FORMAT_AR_GNU, 0, NULL, 0);
165248590Smm}
166248590Smm
167248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_bsdtar)
168248590Smm{
169248590Smm	test_format_by_name("bsdtar", NULL, ARCHIVE_FORMAT_TAR_USTAR, 0, NULL, 0);
170248590Smm}
171248590Smm
172248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_cd9660)
173248590Smm{
174248590Smm	test_format_by_name("cd9660", NULL, ARCHIVE_FORMAT_ISO9660_ROCKRIDGE, 1,
175248590Smm	    NULL, 0);
176248590Smm}
177248590Smm
178248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_cpio)
179248590Smm{
180248590Smm	test_format_by_name("cpio", NULL, ARCHIVE_FORMAT_CPIO_POSIX, 0, NULL, 0);
181248590Smm}
182248590Smm
183248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_gnutar)
184248590Smm{
185248590Smm	test_format_by_name("gnutar", NULL, ARCHIVE_FORMAT_TAR_GNUTAR, 0,
186248590Smm	    NULL, 0);
187248590Smm}
188248590Smm
189248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_iso)
190248590Smm{
191248590Smm	test_format_by_name("iso", NULL, ARCHIVE_FORMAT_ISO9660_ROCKRIDGE, 1,
192248590Smm	    NULL, 0);
193248590Smm}
194248590Smm
195248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_iso9660)
196248590Smm{
197248590Smm	test_format_by_name("iso9660", NULL, ARCHIVE_FORMAT_ISO9660_ROCKRIDGE, 1,
198248590Smm	    NULL, 0);
199248590Smm}
200248590Smm
201248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_mtree)
202248590Smm{
203248590Smm	test_format_by_name("mtree", NULL, ARCHIVE_FORMAT_MTREE, 2, NULL, 0);
204248590Smm}
205248590Smm
206248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_mtree_classic)
207248590Smm{
208248590Smm	test_format_by_name("mtree-classic", NULL, ARCHIVE_FORMAT_MTREE, 1,
209248590Smm	    NULL, 0);
210248590Smm}
211248590Smm
212248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_newc)
213248590Smm{
214248590Smm	test_format_by_name("newc", NULL, ARCHIVE_FORMAT_CPIO_SVR4_NOCRC, 0,
215248590Smm	    NULL, 0);
216248590Smm}
217248590Smm
218248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_odc)
219248590Smm{
220248590Smm	test_format_by_name("odc", NULL, ARCHIVE_FORMAT_CPIO_POSIX, 0, NULL, 0);
221248590Smm}
222248590Smm
223248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_oldtar)
224248590Smm{
225248590Smm	test_format_by_name("oldtar", NULL, ARCHIVE_FORMAT_TAR, 0, NULL, 0);
226248590Smm}
227248590Smm
228248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_pax)
229248590Smm{
230248590Smm	test_format_by_name("pax", NULL, ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE, 0,
231248590Smm	    NULL, 0);
232248590Smm}
233248590Smm
234248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_paxr)
235248590Smm{
236248590Smm	test_format_by_name("paxr", NULL, ARCHIVE_FORMAT_TAR_USTAR, 0, NULL, 0);
237248590Smm}
238248590Smm
239248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_posix)
240248590Smm{
241248590Smm	test_format_by_name("posix", NULL, ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE, 0,
242248590Smm	    NULL, 0);
243248590Smm}
244248590Smm
245248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_rpax)
246248590Smm{
247248590Smm	test_format_by_name("rpax", NULL, ARCHIVE_FORMAT_TAR_USTAR, 0, NULL, 0);
248248590Smm}
249248590Smm
250248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_shar)
251248590Smm{
252248590Smm	test_format_by_name("shar", NULL, -1, 0,
253248590Smm	    "#!/bin/sh\n# This is a shell archive\n", 36);
254248590Smm}
255248590Smm
256248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_shardump)
257248590Smm{
258248590Smm	test_format_by_name("shardump", NULL, -1, 0,
259248590Smm	    "#!/bin/sh\n# This is a shell archive\n", 36);
260248590Smm}
261248590Smm
262248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_ustar)
263248590Smm{
264248590Smm	test_format_by_name("ustar", NULL, ARCHIVE_FORMAT_TAR_USTAR, 0, NULL, 0);
265248590Smm}
266248590Smm
267248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_v7tar)
268248590Smm{
269248590Smm	test_format_by_name("v7tar", NULL, ARCHIVE_FORMAT_TAR, 0, NULL, 0);
270248590Smm}
271248590Smm
272248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_v7)
273248590Smm{
274248590Smm	test_format_by_name("v7", NULL, ARCHIVE_FORMAT_TAR, 0, NULL, 0);
275248590Smm}
276248590Smm
277248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_xar)
278248590Smm{
279248590Smm	test_format_by_name("xar", "gzip", ARCHIVE_FORMAT_XAR, 0, NULL, 0);
280248590Smm}
281248590Smm
282248590SmmDEFINE_TEST(test_archive_write_set_format_by_name_zip)
283248590Smm{
284248590Smm	test_format_by_name("zip", "store", ARCHIVE_FORMAT_ZIP, 0, NULL, 0);
285248590Smm}
286