1 /*-
2  * Copyright (c) 2003-2010 Tim Kientzle
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 #include "test.h"
26 __FBSDID("$FreeBSD$");
27 
28 #define MAGIC 123456789
29 struct my_data {
30 	int magic;
31 	int read_return;
32 	int read_called;
33 	int write_return;
34 	int write_called;
35 	int open_return;
36 	int open_called;
37 	int close_return;
38 	int close_called;
39 };
40 
41 static ssize_t
42 my_read(struct archive *a, void *_private, const void **buff)
43 {
44 	struct my_data *private = (struct my_data *)_private;
45 	(void)a; /* UNUSED */
46 	(void)buff; /* UNUSED */
47 	assertEqualInt(MAGIC, private->magic);
48 	++private->read_called;
49 	return (private->read_return);
50 }
51 
52 static ssize_t
53 my_write(struct archive *a, void *_private, const void *buff, size_t s)
54 {
55 	struct my_data *private = (struct my_data *)_private;
56 	(void)a; /* UNUSED */
57 	(void)buff; /* UNUSED */
58 	(void)s; /* UNUSED */
59 	assertEqualInt(MAGIC, private->magic);
60 	++private->write_called;
61 	return (private->write_return);
62 }
63 
64 static int
65 my_open(struct archive *a, void *_private)
66 {
67 	struct my_data *private = (struct my_data *)_private;
68 	(void)a; /* UNUSED */
69 	assertEqualInt(MAGIC, private->magic);
70 	++private->open_called;
71 	return (private->open_return);
72 }
73 
74 static int
75 my_close(struct archive *a, void *_private)
76 {
77 	struct my_data *private = (struct my_data *)_private;
78 	(void)a; /* UNUSED */
79 	assertEqualInt(MAGIC, private->magic);
80 	++private->close_called;
81 	return (private->close_return);
82 }
83 
84 
85 DEFINE_TEST(test_open_failure)
86 {
87 	struct archive *a;
88 	struct my_data private;
89 
90 	memset(&private, 0, sizeof(private));
91 	private.magic = MAGIC;
92 	private.open_return = ARCHIVE_FATAL;
93 	a = archive_read_new();
94 	assert(a != NULL);
95 	assertEqualInt(ARCHIVE_FATAL,
96 	    archive_read_open(a, &private, my_open, my_read, my_close));
97 	assertEqualInt(1, private.open_called);
98 	assertEqualInt(0, private.read_called);
99 	assertEqualInt(1, private.close_called);
100 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
101 	assertEqualInt(1, private.open_called);
102 	assertEqualInt(0, private.read_called);
103 	assertEqualInt(1, private.close_called);
104 
105 	memset(&private, 0, sizeof(private));
106 	private.magic = MAGIC;
107 	private.open_return = ARCHIVE_FAILED;
108 	a = archive_read_new();
109 	assert(a != NULL);
110 	assertEqualInt(ARCHIVE_FAILED,
111 	    archive_read_open(a, &private, my_open, my_read, my_close));
112 	assertEqualInt(1, private.open_called);
113 	assertEqualInt(0, private.read_called);
114 	assertEqualInt(1, private.close_called);
115 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
116 	assertEqualInt(1, private.open_called);
117 	assertEqualInt(0, private.read_called);
118 	assertEqualInt(1, private.close_called);
119 
120 	memset(&private, 0, sizeof(private));
121 	private.magic = MAGIC;
122 	private.open_return = ARCHIVE_WARN;
123 	a = archive_read_new();
124 	assert(a != NULL);
125 	assertEqualInt(ARCHIVE_WARN,
126 	    archive_read_open(a, &private, my_open, my_read, my_close));
127 	assertEqualInt(1, private.open_called);
128 	assertEqualInt(0, private.read_called);
129 	assertEqualInt(1, private.close_called);
130 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
131 	assertEqualInt(1, private.open_called);
132 	assertEqualInt(0, private.read_called);
133 	assertEqualInt(1, private.close_called);
134 
135 	memset(&private, 0, sizeof(private));
136 	private.magic = MAGIC;
137 	private.open_return = ARCHIVE_OK;
138 	private.read_return = ARCHIVE_FATAL;
139 	a = archive_read_new();
140 	assert(a != NULL);
141 	assertEqualInt(ARCHIVE_OK,
142 	    archive_read_support_filter_compress(a));
143 	assertEqualInt(ARCHIVE_OK, archive_read_support_format_tar(a));
144 	assertEqualInt(ARCHIVE_FATAL,
145 	    archive_read_open(a, &private, my_open, my_read, my_close));
146 	assertEqualInt(1, private.open_called);
147 	assertEqualInt(1, private.read_called);
148 	assertEqualInt(1, private.close_called);
149 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
150 	assertEqualInt(1, private.open_called);
151 	assertEqualInt(1, private.read_called);
152 	assertEqualInt(1, private.close_called);
153 
154 	memset(&private, 0, sizeof(private));
155 	private.magic = MAGIC;
156 	private.open_return = ARCHIVE_FATAL;
157 	a = archive_write_new();
158 	assert(a != NULL);
159 	assertEqualInt(ARCHIVE_FATAL,
160 	    archive_write_open(a, &private, my_open, my_write, my_close));
161 	assertEqualInt(1, private.open_called);
162 	assertEqualInt(0, private.write_called);
163 	assertEqualInt(0, private.close_called);
164 	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
165 	assertEqualInt(1, private.open_called);
166 	assertEqualInt(0, private.write_called);
167 	assertEqualInt(0, private.close_called);
168 
169 	memset(&private, 0, sizeof(private));
170 	private.magic = MAGIC;
171 	private.open_return = ARCHIVE_FATAL;
172 	a = archive_write_new();
173 	assert(a != NULL);
174 	archive_write_add_filter_compress(a);
175 	archive_write_set_format_ustar(a);
176 	assertEqualInt(ARCHIVE_FATAL,
177 	    archive_write_open(a, &private, my_open, my_write, my_close));
178 	assertEqualInt(1, private.open_called);
179 	assertEqualInt(0, private.write_called);
180 	assertEqualInt(0, private.close_called);
181 	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
182 	assertEqualInt(1, private.open_called);
183 	assertEqualInt(0, private.write_called);
184 	assertEqualInt(0, private.close_called);
185 
186 	memset(&private, 0, sizeof(private));
187 	private.magic = MAGIC;
188 	private.open_return = ARCHIVE_FATAL;
189 	a = archive_write_new();
190 	assert(a != NULL);
191 	archive_write_set_format_zip(a);
192 	assertEqualInt(ARCHIVE_FATAL,
193 	    archive_write_open(a, &private, my_open, my_write, my_close));
194 	assertEqualInt(1, private.open_called);
195 	assertEqualInt(0, private.write_called);
196 	assertEqualInt(0, private.close_called);
197 	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
198 	assertEqualInt(1, private.open_called);
199 	assertEqualInt(0, private.write_called);
200 	assertEqualInt(0, private.close_called);
201 
202 	memset(&private, 0, sizeof(private));
203 	private.magic = MAGIC;
204 	private.open_return = ARCHIVE_FATAL;
205 	a = archive_write_new();
206 	assert(a != NULL);
207 	archive_write_add_filter_gzip(a);
208 	assertEqualInt(ARCHIVE_FATAL,
209 	    archive_write_open(a, &private, my_open, my_write, my_close));
210 	assertEqualInt(1, private.open_called);
211 	assertEqualInt(0, private.write_called);
212 	assertEqualInt(0, private.close_called);
213 	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
214 	assertEqualInt(1, private.open_called);
215 	assertEqualInt(0, private.write_called);
216 	assertEqualInt(0, private.close_called);
217 
218 }
219