]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libarchive/libarchive/test/test_write_disk_no_hfs_compression.c
MFC r299529,r299540,r299576,r299896:
[FreeBSD/stable/10.git] / contrib / libarchive / libarchive / test / test_write_disk_no_hfs_compression.c
1 /*-
2  * Copyright (c) 2003-2007 Tim Kientzle
3  * Copyright (c) 2012 Michihiro NAKAJIMA
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 #include "test.h"
27 __FBSDID("$FreeBSD$");
28
29 #ifdef HAVE_SYS_XATTR_H
30 #include <sys/xattr.h>
31 #endif
32
33 #if defined(__APPLE__) && defined(UF_COMPRESSED) && defined(HAVE_SYS_XATTR_H)\
34         && defined(HAVE_ZLIB_H)
35 static int
36 has_xattr(const char *filename, const char *xattrname)
37 {
38         char *nl, *nlp;
39         ssize_t r;
40         int exisiting;
41
42         r = listxattr(filename, NULL, 0, XATTR_SHOWCOMPRESSION);
43         if (r < 0)
44                 return (0);
45         if (r == 0)
46                 return (0);
47
48         assert((nl = malloc(r)) != NULL);
49         if (nl == NULL)
50                 return (0);
51
52         r = listxattr(filename, nl, r, XATTR_SHOWCOMPRESSION);
53         if (r < 0) {
54                 free(nl);
55                 return (0);
56         }
57
58         exisiting = 0;
59         for (nlp = nl; nlp < nl + r; nlp += strlen(nlp) + 1) {
60                 if (strcmp(nlp, xattrname) == 0) {
61                         exisiting = 1;
62                         break;
63                 }
64         }
65         free(nl);
66         return (exisiting);
67 }
68 #endif
69
70 /*
71  * Exercise HFS+ Compression.
72  */
73 DEFINE_TEST(test_write_disk_no_hfs_compression)
74 {
75 #if !defined(__APPLE__) || !defined(UF_COMPRESSED) || !defined(HAVE_SYS_XATTR_H)\
76         || !defined(HAVE_ZLIB_H)
77         skipping("MacOS-specific HFS+ Compression test");
78 #else
79         const char *refname = "test_write_disk_no_hfs_compression.tgz";
80         struct archive *ad, *a;
81         struct archive_entry *ae;
82         struct stat st;
83
84         extract_reference_file(refname);
85
86         /*
87          * Extract an archive to disk with HFS+ Compression
88          * the file was compressed.
89          */
90         assert((ad = archive_write_disk_new()) != NULL);
91         assertEqualIntA(ad, ARCHIVE_OK,
92             archive_write_disk_set_standard_lookup(ad));
93         assertEqualIntA(ad, ARCHIVE_OK,
94             archive_write_disk_set_options(ad,
95                 ARCHIVE_EXTRACT_TIME |
96                 ARCHIVE_EXTRACT_SECURE_SYMLINKS |
97                 ARCHIVE_EXTRACT_SECURE_NODOTDOT));
98
99         assert((a = archive_read_new()) != NULL);
100         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
101         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
102         assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a,
103             refname, 512 * 20));
104
105         assertMakeDir("hfscmp", 0755);
106         assertChdir("hfscmp");
107
108         /* Extract file1. */
109         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
110         assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
111         /* Extract README. */
112         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
113         assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
114         /* Extract NEWS. */
115         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
116         assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
117         /* Extract Makefile. */
118         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
119         assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
120
121         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
122         assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
123         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
124         assertEqualIntA(ad, ARCHIVE_OK, archive_write_free(ad));
125
126         /* Test file1. */
127         assertEqualInt(0, stat("file1", &st));
128         assertEqualInt(0, st.st_flags & UF_COMPRESSED);
129         assertFileSize("file1", 8);
130         assertEqualInt(0, has_xattr("file1", "com.apple.ResourceFork"));
131         assertEqualInt(0, has_xattr("file1", "com.apple.decmpfs"));
132
133         /* Test README. */
134         assertEqualInt(0, stat("README", &st));
135         assertEqualInt(UF_COMPRESSED, st.st_flags & UF_COMPRESSED);
136         assertFileSize("README", 6586);
137         assertEqualInt(0, has_xattr("README", "com.apple.ResourceFork"));
138         assertEqualInt(1, has_xattr("README", "com.apple.decmpfs"));
139
140         /* Test NEWS. */
141         assertEqualInt(0, stat("NEWS", &st));
142         assertEqualInt(0, st.st_flags & UF_COMPRESSED);
143         assertFileSize("NEWS", 28438);
144         assertEqualInt(0, has_xattr("NEWS", "com.apple.ResourceFork"));
145         assertEqualInt(0, has_xattr("NEWS", "com.apple.decmpfs"));
146
147         /* Test Makefile. */
148         assertEqualInt(0, stat("Makefile", &st));
149         assertEqualInt(UF_COMPRESSED, st.st_flags & UF_COMPRESSED);
150         assertFileSize("Makefile", 1238119);
151         assertEqualInt(1, has_xattr("Makefile", "com.apple.ResourceFork"));
152         assertEqualInt(1, has_xattr("Makefile", "com.apple.decmpfs"));
153
154         assertChdir("..");
155
156         /*
157          * Extract an archive to disk without HFS+ Compression.
158          */
159         assert((ad = archive_write_disk_new()) != NULL);
160         assertEqualIntA(ad, ARCHIVE_OK,
161             archive_write_disk_set_standard_lookup(ad));
162         assertEqualIntA(ad, ARCHIVE_OK,
163             archive_write_disk_set_options(ad,
164                 ARCHIVE_EXTRACT_TIME |
165                 ARCHIVE_EXTRACT_SECURE_SYMLINKS |
166                 ARCHIVE_EXTRACT_SECURE_NODOTDOT |
167                 ARCHIVE_EXTRACT_NO_HFS_COMPRESSION));
168
169         assert((a = archive_read_new()) != NULL);
170         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
171         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
172         assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a,
173             refname, 512 * 20));
174
175         assertMakeDir("nocmp", 0755);
176         assertChdir("nocmp");
177
178         /* Extract file1. */
179         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
180         assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
181         /* Extract README. */
182         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
183         assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
184         /* Extract NEWS. */
185         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
186         assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
187         /* Extract Makefile. */
188         assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
189         assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
190
191         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
192         assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
193         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
194         assertEqualIntA(ad, ARCHIVE_OK, archive_write_free(ad));
195
196         /* Test file1. */
197         assertEqualInt(0, stat("file1", &st));
198         assertEqualInt(0, st.st_flags & UF_COMPRESSED);
199         assertFileSize("file1", 8);
200         assertEqualInt(0, has_xattr("file1", "com.apple.ResourceFork"));
201         assertEqualInt(0, has_xattr("file1", "com.apple.decmpfs"));
202
203         /* Test README. */
204         assertEqualInt(0, stat("README", &st));
205         assertEqualInt(0, st.st_flags & UF_COMPRESSED);
206         assertFileSize("README", 6586);
207         assertEqualInt(0, has_xattr("README", "com.apple.ResourceFork"));
208         assertEqualInt(0, has_xattr("README", "com.apple.decmpfs"));
209
210         /* Test NEWS. */
211         assertEqualInt(0, stat("NEWS", &st));
212         assertEqualInt(0, st.st_flags & UF_COMPRESSED);
213         assertFileSize("NEWS", 28438);
214         assertEqualInt(0, has_xattr("NEWS", "com.apple.ResourceFork"));
215         assertEqualInt(0, has_xattr("NEWS", "com.apple.decmpfs"));
216
217         /* Test Makefile. */
218         assertEqualInt(0, stat("Makefile", &st));
219         assertEqualInt(0, st.st_flags & UF_COMPRESSED);
220         assertFileSize("Makefile", 1238119);
221         assertEqualInt(0, has_xattr("Makefile", "com.apple.ResourceFork"));
222         assertEqualInt(0, has_xattr("Makefile", "com.apple.decmpfs"));
223
224         assertChdir("..");
225
226         assertEqualFile("hfscmp/file1", "nocmp/file1");
227         assertEqualFile("hfscmp/README", "nocmp/README");
228         assertEqualFile("hfscmp/NEWS", "nocmp/NEWS");
229         assertEqualFile("hfscmp/Makefile", "nocmp/Makefile");
230 #endif
231 }