1248590Smm/*-
2248590Smm * Copyright (c) 2011-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
30248590Smm/*
31248590Smm * Test writing an empty archive.
32248590Smm */
33248590SmmDEFINE_TEST(test_write_format_7zip_empty_archive)
34248590Smm{
35248590Smm	struct archive *a;
36248590Smm	size_t buffsize = 1000;
37248590Smm	char *buff;
38248590Smm	size_t used;
39248590Smm
40248590Smm	buff = malloc(buffsize);
41248590Smm
42248590Smm	/* Create a new archive in memory. */
43248590Smm	assert((a = archive_write_new()) != NULL);
44248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_7zip(a));
45248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
46248590Smm	assertEqualIntA(a, ARCHIVE_OK,
47248590Smm	    archive_write_open_memory(a, buff, buffsize, &used));
48248590Smm
49248590Smm	/* Close out the archive. */
50248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_close(a));
51248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
52248590Smm
53248590Smm	/* Verify the archive file size. */
54248590Smm	assertEqualInt(32, used);
55248590Smm
56248590Smm	/* Verify the initial header. */
57248590Smm	assertEqualMem(buff,
58248590Smm		"\x37\x7a\xbc\xaf\x27\x1c\x00\x03"
59248590Smm		"\x8d\x9b\xd5\x0f\x00\x00\x00\x00"
60248590Smm		"\x00\x00\x00\x00\x00\x00\x00\x00"
61248590Smm		"\x00\x00\x00\x00\x00\x00\x00\x00", 32);
62248590Smm
63248590Smm	free(buff);
64248590Smm}
65248590Smm
66248590Smm/*
67248590Smm * Test writing an empty file.
68248590Smm */
69248590Smmstatic void
70248590Smmtest_only_empty_file(void)
71248590Smm{
72248590Smm	struct archive *a;
73248590Smm	struct archive_entry *ae;
74248590Smm	size_t buffsize = 1000;
75248590Smm	char *buff;
76248590Smm	size_t used;
77248590Smm
78248590Smm	buff = malloc(buffsize);
79248590Smm
80248590Smm	/* Create a new archive in memory. */
81248590Smm	assert((a = archive_write_new()) != NULL);
82248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_7zip(a));
83248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
84248590Smm	assertEqualIntA(a, ARCHIVE_OK,
85248590Smm	    archive_write_open_memory(a, buff, buffsize, &used));
86248590Smm
87248590Smm	/*
88248590Smm	 * Write an empty file to it.
89248590Smm	 */
90248590Smm	assert((ae = archive_entry_new()) != NULL);
91248590Smm	archive_entry_set_mtime(ae, 1, 10);
92248590Smm	assertEqualInt(1, archive_entry_mtime(ae));
93248590Smm	assertEqualInt(10, archive_entry_mtime_nsec(ae));
94248590Smm	archive_entry_set_atime(ae, 2, 20);
95248590Smm	assertEqualInt(2, archive_entry_atime(ae));
96248590Smm	assertEqualInt(20, archive_entry_atime_nsec(ae));
97248590Smm	archive_entry_set_ctime(ae, 0, 100);
98248590Smm	assertEqualInt(0, archive_entry_ctime(ae));
99248590Smm	assertEqualInt(100, archive_entry_ctime_nsec(ae));
100248590Smm	archive_entry_copy_pathname(ae, "empty");
101248590Smm	assertEqualString("empty", archive_entry_pathname(ae));
102248590Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
103248590Smm	assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae));
104248590Smm
105248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
106248590Smm	archive_entry_free(ae);
107248590Smm
108248590Smm	/* Close out the archive. */
109248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_close(a));
110248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
111248590Smm
112248590Smm	/* Verify the archive file size. */
113248590Smm	assertEqualInt(102, used);
114248590Smm
115248590Smm	/* Verify the initial header. */
116248590Smm	assertEqualMem(buff,
117248590Smm		"\x37\x7a\xbc\xaf\x27\x1c\x00\x03"
118248590Smm		"\x00\x5b\x58\x25\x00\x00\x00\x00"
119248590Smm		"\x00\x00\x00\x00\x46\x00\x00\x00"
120248590Smm		"\x00\x00\x00\x00\x8f\xce\x1d\xf3", 32);
121248590Smm
122248590Smm	/*
123248590Smm	 * Now, read the data back.
124248590Smm	 */
125248590Smm	/* With the test memory reader -- seeking mode. */
126248590Smm	assert((a = archive_read_new()) != NULL);
127248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
128248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
129248590Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
130248590Smm
131248590Smm	/*
132248590Smm	 * Read and verify an empty file.
133248590Smm	 */
134248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
135248590Smm	assertEqualInt(1, archive_entry_mtime(ae));
136248590Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
137248590Smm	assertEqualInt(2, archive_entry_atime(ae));
138248590Smm	assertEqualInt(0, archive_entry_atime_nsec(ae));
139248590Smm	assertEqualInt(0, archive_entry_ctime(ae));
140248590Smm	assertEqualInt(100, archive_entry_ctime_nsec(ae));
141248590Smm	assertEqualString("empty", archive_entry_pathname(ae));
142248590Smm	assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
143248590Smm	assertEqualInt(0, archive_entry_size(ae));
144248590Smm
145248590Smm	/* Verify the end of the archive. */
146248590Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
147248590Smm
148248590Smm	/* Verify archive format. */
149248590Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
150248590Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
151248590Smm
152248590Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
153248590Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
154248590Smm
155248590Smm	free(buff);
156248590Smm}
157248590Smm
158248590Smmstatic void
159248590Smmtest_only_empty_files(void)
160248590Smm{
161248590Smm	struct archive *a;
162248590Smm	struct archive_entry *ae;
163248590Smm	size_t buffsize = 1000;
164248590Smm	char *buff;
165248590Smm	size_t used;
166248590Smm
167248590Smm	buff = malloc(buffsize);
168248590Smm
169248590Smm	/* Create a new archive in memory. */
170248590Smm	assert((a = archive_write_new()) != NULL);
171248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_7zip(a));
172248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
173248590Smm	assertEqualIntA(a, ARCHIVE_OK,
174248590Smm	    archive_write_open_memory(a, buff, buffsize, &used));
175248590Smm
176248590Smm	/*
177248590Smm	 * Write an empty file to it.
178248590Smm	 */
179248590Smm	assert((ae = archive_entry_new()) != NULL);
180248590Smm	archive_entry_set_mtime(ae, 1, 10);
181248590Smm	assertEqualInt(1, archive_entry_mtime(ae));
182248590Smm	assertEqualInt(10, archive_entry_mtime_nsec(ae));
183248590Smm	archive_entry_set_atime(ae, 2, 20);
184248590Smm	assertEqualInt(2, archive_entry_atime(ae));
185248590Smm	assertEqualInt(20, archive_entry_atime_nsec(ae));
186248590Smm	archive_entry_copy_pathname(ae, "empty");
187248590Smm	assertEqualString("empty", archive_entry_pathname(ae));
188248590Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
189248590Smm	assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae));
190248590Smm
191248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
192248590Smm	archive_entry_free(ae);
193248590Smm
194248590Smm	/*
195248590Smm	 * Write second empty file to it.
196248590Smm	 */
197248590Smm	assert((ae = archive_entry_new()) != NULL);
198248590Smm	archive_entry_set_mtime(ae, 2, 10);
199248590Smm	assertEqualInt(2, archive_entry_mtime(ae));
200248590Smm	assertEqualInt(10, archive_entry_mtime_nsec(ae));
201248590Smm	archive_entry_set_ctime(ae, 2, 10);
202248590Smm	assertEqualInt(2, archive_entry_ctime(ae));
203248590Smm	assertEqualInt(10, archive_entry_ctime_nsec(ae));
204248590Smm	archive_entry_copy_pathname(ae, "empty2");
205248590Smm	assertEqualString("empty2", archive_entry_pathname(ae));
206248590Smm	archive_entry_set_mode(ae, AE_IFREG | 0644);
207248590Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
208248590Smm
209248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
210248590Smm	archive_entry_free(ae);
211248590Smm
212248590Smm	/*
213248590Smm	 * Write third empty file to it.
214248590Smm	 */
215248590Smm	assert((ae = archive_entry_new()) != NULL);
216248590Smm	archive_entry_set_mtime(ae, 3, 10);
217248590Smm	assertEqualInt(3, archive_entry_mtime(ae));
218248590Smm	assertEqualInt(10, archive_entry_mtime_nsec(ae));
219248590Smm	archive_entry_copy_pathname(ae, "empty3");
220248590Smm	assertEqualString("empty3", archive_entry_pathname(ae));
221248590Smm	archive_entry_set_mode(ae, AE_IFREG | 0644);
222248590Smm	assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae));
223248590Smm
224248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
225248590Smm	archive_entry_free(ae);
226248590Smm
227248590Smm	/* Close out the archive. */
228248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_close(a));
229248590Smm	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
230248590Smm
231248590Smm	/* Verify the initial header. */
232248590Smm	assertEqualMem(buff, "\x37\x7a\xbc\xaf\x27\x1c\x00\x03", 8);
233248590Smm
234248590Smm	/*
235248590Smm	 * Now, read the data back.
236248590Smm	 */
237248590Smm	/* With the test memory reader -- seeking mode. */
238248590Smm	assert((a = archive_read_new()) != NULL);
239248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
240248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
241248590Smm	assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7));
242248590Smm
243248590Smm	/*
244248590Smm	 * Read and verify an empty file.
245248590Smm	 */
246248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
247248590Smm	assertEqualInt(1, archive_entry_mtime(ae));
248248590Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
249248590Smm	assertEqualInt(2, archive_entry_atime(ae));
250248590Smm	assertEqualInt(0, archive_entry_atime_nsec(ae));
251248590Smm	assertEqualInt(0, archive_entry_ctime(ae));
252248590Smm	assertEqualString("empty", archive_entry_pathname(ae));
253248590Smm	assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae));
254248590Smm	assertEqualInt(0, archive_entry_size(ae));
255248590Smm
256248590Smm	/*
257248590Smm	 * Read and verify second empty file.
258248590Smm	 */
259248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
260248590Smm	assertEqualInt(2, archive_entry_mtime(ae));
261248590Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
262248590Smm	assertEqualInt(0, archive_entry_atime(ae));
263248590Smm	assertEqualInt(2, archive_entry_ctime(ae));
264248590Smm	assertEqualInt(0, archive_entry_ctime_nsec(ae));
265248590Smm	assertEqualString("empty2", archive_entry_pathname(ae));
266248590Smm	assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae));
267248590Smm	assertEqualInt(0, archive_entry_size(ae));
268248590Smm
269248590Smm	/*
270248590Smm	 * Read and verify third empty file.
271248590Smm	 */
272248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
273248590Smm	assertEqualInt(3, archive_entry_mtime(ae));
274248590Smm	assertEqualInt(0, archive_entry_mtime_nsec(ae));
275248590Smm	assertEqualInt(0, archive_entry_atime(ae));
276248590Smm	assertEqualInt(0, archive_entry_ctime(ae));
277248590Smm	assertEqualString("empty3", archive_entry_pathname(ae));
278248590Smm	assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae));
279248590Smm	assertEqualInt(0, archive_entry_size(ae));
280248590Smm
281248590Smm	/* Verify the end of the archive. */
282248590Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
283248590Smm
284248590Smm	/* Verify archive format. */
285248590Smm	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
286248590Smm	assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a));
287248590Smm
288248590Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
289248590Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
290248590Smm
291248590Smm	free(buff);
292248590Smm}
293248590Smm
294248590SmmDEFINE_TEST(test_write_format_7zip_empty_files)
295248590Smm{
296248590Smm	/* Test that write an empty file. */
297248590Smm	test_only_empty_file();
298248590Smm	test_only_empty_files();
299248590Smm}
300