1228753Smm/*-
2228753Smm * Copyright (c) 2003-2007 Tim Kientzle
3228753Smm * All rights reserved.
4228753Smm *
5228753Smm * Redistribution and use in source and binary forms, with or without
6228753Smm * modification, are permitted provided that the following conditions
7228753Smm * are met:
8228753Smm * 1. Redistributions of source code must retain the above copyright
9228753Smm *    notice, this list of conditions and the following disclaimer.
10228753Smm * 2. Redistributions in binary form must reproduce the above copyright
11228753Smm *    notice, this list of conditions and the following disclaimer in the
12228753Smm *    documentation and/or other materials provided with the distribution.
13228753Smm *
14228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24228753Smm */
25228753Smm#include "test.h"
26229592Smm__FBSDID("$FreeBSD$");
27228753Smm
28228753Smmstatic void
29228753Smmtest_read_format_mtree1(void)
30228753Smm{
31228753Smm	const char reffile[] = "test_read_format_mtree.mtree";
32228753Smm	char buff[16];
33228753Smm	struct archive_entry *ae;
34228753Smm	struct archive *a;
35228753Smm	FILE *f;
36228753Smm
37228753Smm	extract_reference_file(reffile);
38228753Smm
39228753Smm	/*
40228753Smm	 * An access error occurred on some platform when mtree
41228753Smm	 * format handling open a directory. It is for through
42228753Smm	 * the routine which open a directory that we create
43228753Smm	 * "dir" and "dir2" directories.
44228753Smm	 */
45228753Smm	assertMakeDir("dir", 0775);
46228753Smm	assertMakeDir("dir2", 0775);
47228753Smm
48228753Smm	assert((a = archive_read_new()) != NULL);
49228753Smm	assertEqualIntA(a, ARCHIVE_OK,
50228753Smm	    archive_read_support_compression_all(a));
51228753Smm	assertEqualIntA(a, ARCHIVE_OK,
52228753Smm	    archive_read_support_format_all(a));
53228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_file(a, reffile, 11));
54228753Smm
55228753Smm	/*
56228753Smm	 * Read "file", whose data is available on disk.
57228753Smm	 */
58228753Smm	f = fopen("file", "wb");
59228753Smm	assert(f != NULL);
60228753Smm	assertEqualInt(3, fwrite("hi\n", 1, 3, f));
61228753Smm	fclose(f);
62228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
63228753Smm	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE);
64228753Smm	assertEqualString(archive_entry_pathname(ae), "file");
65228753Smm	assertEqualInt(archive_entry_uid(ae), 18);
66228753Smm	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
67228753Smm	assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123);
68228753Smm	assertEqualInt(archive_entry_size(ae), 3);
69228753Smm	assertEqualInt(3, archive_read_data(a, buff, 3));
70228753Smm	assertEqualMem(buff, "hi\n", 3);
71228753Smm
72228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
73228753Smm	assertEqualString(archive_entry_pathname(ae), "dir");
74228753Smm	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
75228753Smm
76228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
77228753Smm	assertEqualString(archive_entry_pathname(ae), "dir/file with space");
78228753Smm
79228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
80228753Smm	assertEqualString(archive_entry_pathname(ae), "file with space");
81228753Smm
82228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
83228753Smm	assertEqualString(archive_entry_pathname(ae), "dir2");
84228753Smm
85228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
86228753Smm	assertEqualString(archive_entry_pathname(ae), "dir2/dir3a");
87228753Smm
88228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
89228753Smm	assertEqualString(archive_entry_pathname(ae), "dir2/dir3a/indir3a");
90228753Smm
91228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
92228753Smm	assertEqualString(archive_entry_pathname(ae), "dir2/fullindir2");
93228753Smm	assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
94228753Smm
95228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
96228753Smm	assertEqualString(archive_entry_pathname(ae), "dir2/indir2");
97228753Smm
98228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
99228753Smm	assertEqualString(archive_entry_pathname(ae), "dir2/dir3b");
100228753Smm
101228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
102228753Smm	assertEqualString(archive_entry_pathname(ae), "dir2/dir3b/indir3b");
103228753Smm
104228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
105228753Smm	assertEqualString(archive_entry_pathname(ae), "notindir");
106228753Smm
107228753Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
108228753Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
109228753Smm	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
110228753Smm}
111228753Smm
112228753Smmstatic void
113228753Smmtest_read_format_mtree2(void)
114228753Smm{
115228753Smm	static char archive[] =
116228753Smm	    "#mtree\n"
117228753Smm	    "d type=dir content=.\n";
118228753Smm	struct archive_entry *ae;
119228753Smm	struct archive *a;
120228753Smm
121228753Smm	assert((a = archive_read_new()) != NULL);
122228753Smm	assertEqualIntA(a, ARCHIVE_OK,
123228753Smm	    archive_read_support_compression_all(a));
124228753Smm	assertEqualIntA(a, ARCHIVE_OK,
125228753Smm	    archive_read_support_format_all(a));
126228753Smm	assertEqualIntA(a, ARCHIVE_OK,
127228753Smm	    archive_read_open_memory(a, archive, sizeof(archive)));
128228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
129228753Smm	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE);
130228753Smm	assertEqualString(archive_entry_pathname(ae), "d");
131228753Smm	assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
132228753Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
133228753Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
134228753Smm	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
135228753Smm}
136228753Smm
137228753Smm/*
138228753Smm * Reported to libarchive.googlecode.com as Issue 121.
139228753Smm */
140228753Smmstatic void
141228753Smmtest_read_format_mtree3(void)
142228753Smm{
143228753Smm	static char archive[] =
144228753Smm	    "#mtree\n"
145228753Smm	    "a type=file contents=file\n"
146228753Smm	    "b type=link link=a\n"
147228753Smm	    "c type=file contents=file\n";
148228753Smm	struct archive_entry *ae;
149228753Smm	struct archive *a;
150228753Smm
151228753Smm	assertMakeDir("mtree3", 0777);
152228753Smm	assertChdir("mtree3");
153228753Smm	assertMakeFile("file", 0644, "file contents");
154228753Smm
155228753Smm	assert((a = archive_read_new()) != NULL);
156228753Smm	assertEqualIntA(a, ARCHIVE_OK,
157228753Smm	    archive_read_support_compression_all(a));
158228753Smm	assertEqualIntA(a, ARCHIVE_OK,
159228753Smm	    archive_read_support_format_all(a));
160228753Smm	assertEqualIntA(a, ARCHIVE_OK,
161228753Smm	    archive_read_open_memory(a, archive, sizeof(archive)));
162228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
163228753Smm	assertEqualString(archive_entry_pathname(ae), "a");
164228753Smm	assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
165228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
166228753Smm	assertEqualString(archive_entry_pathname(ae), "b");
167228753Smm	assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
168228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
169228753Smm	assertEqualString(archive_entry_pathname(ae), "c");
170228753Smm	assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
171228753Smm
172228753Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
173228753Smm	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
174228753Smm	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
175228753Smm
176228753Smm	assertChdir("..");
177228753Smm}
178228753Smm
179228753Smm
180228753Smm
181228753SmmDEFINE_TEST(test_read_format_mtree)
182228753Smm{
183228753Smm	test_read_format_mtree1();
184228753Smm	test_read_format_mtree2();
185228753Smm	test_read_format_mtree3();
186228753Smm}
187