]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libarchive/libarchive/test/test_write_filter_lzip.c
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / libarchive / libarchive / test / test_write_filter_lzip.c
1 /*-
2  * Copyright (c) 2010 Michihiro NAKAJIMA
3  * Copyright (c) 2007-2009 Tim Kientzle
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  *    in this position and unchanged.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include "test.h"
29 __FBSDID("$FreeBSD$");
30
31 /*
32  * A basic exercise of lzip reading and writing.
33  *
34  */
35
36 DEFINE_TEST(test_write_filter_lzip)
37 {
38         struct archive_entry *ae;
39         struct archive* a;
40         char *buff, *data;
41         size_t buffsize, datasize;
42         char path[16];
43         size_t used1, used2;
44         int i, r;
45
46         buffsize = 2000000;
47         assert(NULL != (buff = (char *)malloc(buffsize)));
48         if (buff == NULL)
49                 return;
50
51         datasize = 10000;
52         assert(NULL != (data = (char *)malloc(datasize)));
53         if (data == NULL) {
54                 free(buff);
55                 return;
56         }
57         memset(data, 0, datasize);
58
59         /*
60          * Write a 100 files and read them all back.
61          */
62         assert((a = archive_write_new()) != NULL);
63         assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a));
64         r = archive_write_add_filter_lzip(a);
65         if (r == ARCHIVE_FATAL) {
66                 skipping("lzip writing not supported on this platform");
67                 assertEqualInt(ARCHIVE_OK, archive_write_free(a));
68                 free(buff);
69                 free(data);
70                 return;
71         }
72         assertEqualIntA(a, ARCHIVE_OK,
73             archive_write_set_bytes_per_block(a, 10));
74         assertEqualInt(ARCHIVE_FILTER_LZIP, archive_filter_code(a, 0));
75         assertEqualString("lzip", archive_filter_name(a, 0));
76         assertEqualIntA(a, ARCHIVE_OK,
77             archive_write_open_memory(a, buff, buffsize, &used1));
78         assertEqualInt(ARCHIVE_FILTER_LZIP, archive_filter_code(a, 0));
79         assertEqualString("lzip", archive_filter_name(a, 0));
80         assert((ae = archive_entry_new()) != NULL);
81         archive_entry_set_filetype(ae, AE_IFREG);
82         archive_entry_set_size(ae, datasize);
83         for (i = 0; i < 100; i++) {
84                 sprintf(path, "file%03d", i);
85                 archive_entry_copy_pathname(ae, path);
86                 assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
87                 assertA(datasize
88                     == (size_t)archive_write_data(a, data, datasize));
89         }
90         archive_entry_free(ae);
91         assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
92         assertEqualInt(ARCHIVE_OK, archive_write_free(a));
93
94         assert((a = archive_read_new()) != NULL);
95         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
96         r = archive_read_support_filter_lzip(a);
97         if (r == ARCHIVE_WARN) {
98                 skipping("Can't verify lzip writing by reading back;"
99                     " lzip reading not fully supported on this platform");
100         } else {
101                 assertEqualIntA(a, ARCHIVE_OK,
102                     archive_read_support_filter_all(a));
103                 assertEqualIntA(a, ARCHIVE_OK,
104                     archive_read_open_memory(a, buff, used1));
105                 for (i = 0; i < 100; i++) {
106                         sprintf(path, "file%03d", i);
107                         if (!assertEqualInt(ARCHIVE_OK,
108                                 archive_read_next_header(a, &ae)))
109                                 break;
110                         assertEqualString(path, archive_entry_pathname(ae));
111                         assertEqualInt((int)datasize, archive_entry_size(ae));
112                 }
113                 assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
114         }
115         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
116
117         /*
118          * Repeat the cycle again, this time setting some compression
119          * options.
120          */
121         assert((a = archive_write_new()) != NULL);
122         assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a));
123         assertEqualIntA(a, ARCHIVE_OK,
124             archive_write_set_bytes_per_block(a, 10));
125         assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a));
126         assertEqualIntA(a, ARCHIVE_FAILED,
127             archive_write_set_filter_option(a, NULL, "nonexistent-option", "0"));
128         assertEqualIntA(a, ARCHIVE_FAILED,
129             archive_write_set_filter_option(a, NULL, "compression-level", "abc"));
130         assertEqualIntA(a, ARCHIVE_FAILED,
131             archive_write_set_filter_option(a, NULL, "compression-level", "99"));
132         assertEqualIntA(a, ARCHIVE_OK,
133             archive_write_set_filter_option(a, NULL, "compression-level", "9"));
134         assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2));
135         for (i = 0; i < 100; i++) {
136                 sprintf(path, "file%03d", i);
137                 assert((ae = archive_entry_new()) != NULL);
138                 archive_entry_copy_pathname(ae, path);
139                 archive_entry_set_size(ae, datasize);
140                 archive_entry_set_filetype(ae, AE_IFREG);
141                 assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
142                 assertA(datasize == (size_t)archive_write_data(a, data, datasize));
143                 archive_entry_free(ae);
144         }
145         assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
146         assertEqualInt(ARCHIVE_OK, archive_write_free(a));
147
148
149         assert((a = archive_read_new()) != NULL);
150         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
151         r = archive_read_support_filter_lzip(a);
152         if (r == ARCHIVE_WARN) {
153                 skipping("lzip reading not fully supported on this platform");
154         } else {
155                 assertEqualIntA(a, ARCHIVE_OK,
156                     archive_read_support_filter_all(a));
157                 assertEqualIntA(a, ARCHIVE_OK,
158                     archive_read_open_memory(a, buff, used2));
159                 for (i = 0; i < 100; i++) {
160                         sprintf(path, "file%03d", i);
161                         failure("Trying to read %s", path);
162                         if (!assertEqualIntA(a, ARCHIVE_OK,
163                                 archive_read_next_header(a, &ae)))
164                                 break;
165                         assertEqualString(path, archive_entry_pathname(ae));
166                         assertEqualInt((int)datasize, archive_entry_size(ae));
167                 }
168                 assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
169         }
170         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
171
172         /*
173          * Repeat again, with much lower compression.
174          */
175         assert((a = archive_write_new()) != NULL);
176         assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a));
177         assertEqualIntA(a, ARCHIVE_OK,
178             archive_write_set_bytes_per_block(a, 10));
179         assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a));
180         assertEqualIntA(a, ARCHIVE_OK,
181             archive_write_set_filter_option(a, NULL, "compression-level", "0"));
182         assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2));
183         for (i = 0; i < 100; i++) {
184                 sprintf(path, "file%03d", i);
185                 assert((ae = archive_entry_new()) != NULL);
186                 archive_entry_copy_pathname(ae, path);
187                 archive_entry_set_size(ae, datasize);
188                 archive_entry_set_filetype(ae, AE_IFREG);
189                 assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
190                 failure("Writing file %s", path);
191                 assertEqualIntA(a, datasize,
192                     (size_t)archive_write_data(a, data, datasize));
193                 archive_entry_free(ae);
194         }
195         assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
196         assertEqualInt(ARCHIVE_OK, archive_write_free(a));
197
198         /* Level 0 really does result in larger data. */
199         failure("Compression-level=0 wrote %d bytes; default wrote %d bytes",
200             (int)used2, (int)used1);
201         assert(used2 > used1);
202
203         assert((a = archive_read_new()) != NULL);
204         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
205         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
206         r = archive_read_support_filter_lzip(a);
207         if (r == ARCHIVE_WARN) {
208                 skipping("lzip reading not fully supported on this platform");
209         } else {
210                 assertEqualIntA(a, ARCHIVE_OK,
211                     archive_read_open_memory(a, buff, used2));
212                 for (i = 0; i < 100; i++) {
213                         sprintf(path, "file%03d", i);
214                         if (!assertEqualInt(ARCHIVE_OK,
215                                 archive_read_next_header(a, &ae)))
216                                 break;
217                         assertEqualString(path, archive_entry_pathname(ae));
218                         assertEqualInt((int)datasize, archive_entry_size(ae));
219                 }
220                 assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
221         }
222         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
223
224         /*
225          * Test various premature shutdown scenarios to make sure we
226          * don't crash or leak memory.
227          */
228         assert((a = archive_write_new()) != NULL);
229         assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a));
230         assertEqualInt(ARCHIVE_OK, archive_write_free(a));
231
232         assert((a = archive_write_new()) != NULL);
233         assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a));
234         assertEqualInt(ARCHIVE_OK, archive_write_close(a));
235         assertEqualInt(ARCHIVE_OK, archive_write_free(a));
236
237         assert((a = archive_write_new()) != NULL);
238         assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a));
239         assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a));
240         assertEqualInt(ARCHIVE_OK, archive_write_close(a));
241         assertEqualInt(ARCHIVE_OK, archive_write_free(a));
242
243         assert((a = archive_write_new()) != NULL);
244         assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a));
245         assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_lzip(a));
246         assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2));
247         assertEqualInt(ARCHIVE_OK, archive_write_close(a));
248         assertEqualInt(ARCHIVE_OK, archive_write_free(a));
249
250         /*
251          * Clean up.
252          */
253         free(data);
254         free(buff);
255 }