1 /*-
2  * Copyright (c) 2013 The FreeBSD Foundation
3  * All rights reserved.
4  *
5  * This software was developed by Pawel Jakub Dawidek under sponsorship from
6  * the FreeBSD Foundation.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * $FreeBSD$
30  */
31 
32 #include <sys/nv.h>
33 
34 #include <stdio.h>
35 #include <unistd.h>
36 
37 static int ntest = 1;
38 
39 #define	CHECK(expr)	do {						\
40 	if ((expr))							\
41 		printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);	\
42 	else								\
43 		printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
44 	ntest++;							\
45 } while (0)
46 
47 int
48 main(void)
49 {
50 	nvlist_t *nvl;
51 
52 	printf("1..232\n");
53 
54 	nvl = nvlist_create(0);
55 
56 	CHECK(!nvlist_exists(nvl, "nvlist/null"));
57 	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
58 	CHECK(!nvlist_exists_bool(nvl, "nvlist/null"));
59 	CHECK(!nvlist_exists_number(nvl, "nvlist/null"));
60 	CHECK(!nvlist_exists_string(nvl, "nvlist/null"));
61 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/null"));
62 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/null"));
63 	CHECK(!nvlist_exists_binary(nvl, "nvlist/null"));
64 	nvlist_add_null(nvl, "nvlist/null");
65 	CHECK(nvlist_error(nvl) == 0);
66 	CHECK(nvlist_exists(nvl, "nvlist/null"));
67 	CHECK(nvlist_exists_null(nvl, "nvlist/null"));
68 	CHECK(!nvlist_exists_bool(nvl, "nvlist/null"));
69 	CHECK(!nvlist_exists_number(nvl, "nvlist/null"));
70 	CHECK(!nvlist_exists_string(nvl, "nvlist/null"));
71 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/null"));
72 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/null"));
73 	CHECK(!nvlist_exists_binary(nvl, "nvlist/null"));
74 
75 	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
76 	CHECK(!nvlist_exists_null(nvl, "nvlist/bool"));
77 	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
78 	CHECK(!nvlist_exists_number(nvl, "nvlist/bool"));
79 	CHECK(!nvlist_exists_string(nvl, "nvlist/bool"));
80 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/bool"));
81 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/bool"));
82 	CHECK(!nvlist_exists_binary(nvl, "nvlist/bool"));
83 	nvlist_add_bool(nvl, "nvlist/bool", true);
84 	CHECK(nvlist_error(nvl) == 0);
85 	CHECK(nvlist_exists(nvl, "nvlist/bool"));
86 	CHECK(!nvlist_exists_null(nvl, "nvlist/bool"));
87 	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
88 	CHECK(!nvlist_exists_number(nvl, "nvlist/bool"));
89 	CHECK(!nvlist_exists_string(nvl, "nvlist/bool"));
90 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/bool"));
91 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/bool"));
92 	CHECK(!nvlist_exists_binary(nvl, "nvlist/bool"));
93 
94 	CHECK(!nvlist_exists(nvl, "nvlist/number"));
95 	CHECK(!nvlist_exists_null(nvl, "nvlist/number"));
96 	CHECK(!nvlist_exists_bool(nvl, "nvlist/number"));
97 	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
98 	CHECK(!nvlist_exists_string(nvl, "nvlist/number"));
99 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/number"));
100 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/number"));
101 	CHECK(!nvlist_exists_binary(nvl, "nvlist/number"));
102 	nvlist_add_number(nvl, "nvlist/number", 0);
103 	CHECK(nvlist_error(nvl) == 0);
104 	CHECK(nvlist_exists(nvl, "nvlist/number"));
105 	CHECK(!nvlist_exists_null(nvl, "nvlist/number"));
106 	CHECK(!nvlist_exists_bool(nvl, "nvlist/number"));
107 	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
108 	CHECK(!nvlist_exists_string(nvl, "nvlist/number"));
109 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/number"));
110 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/number"));
111 	CHECK(!nvlist_exists_binary(nvl, "nvlist/number"));
112 
113 	CHECK(!nvlist_exists(nvl, "nvlist/string"));
114 	CHECK(!nvlist_exists_null(nvl, "nvlist/string"));
115 	CHECK(!nvlist_exists_bool(nvl, "nvlist/string"));
116 	CHECK(!nvlist_exists_number(nvl, "nvlist/string"));
117 	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
118 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/string"));
119 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/string"));
120 	CHECK(!nvlist_exists_binary(nvl, "nvlist/string"));
121 	nvlist_add_string(nvl, "nvlist/string", "test");
122 	CHECK(nvlist_error(nvl) == 0);
123 	CHECK(nvlist_exists(nvl, "nvlist/string"));
124 	CHECK(!nvlist_exists_null(nvl, "nvlist/string"));
125 	CHECK(!nvlist_exists_bool(nvl, "nvlist/string"));
126 	CHECK(!nvlist_exists_number(nvl, "nvlist/string"));
127 	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
128 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/string"));
129 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/string"));
130 	CHECK(!nvlist_exists_binary(nvl, "nvlist/string"));
131 
132 	CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
133 	CHECK(!nvlist_exists_null(nvl, "nvlist/nvlist"));
134 	CHECK(!nvlist_exists_bool(nvl, "nvlist/nvlist"));
135 	CHECK(!nvlist_exists_number(nvl, "nvlist/nvlist"));
136 	CHECK(!nvlist_exists_string(nvl, "nvlist/nvlist"));
137 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
138 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/nvlist"));
139 	CHECK(!nvlist_exists_binary(nvl, "nvlist/nvlist"));
140 	nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
141 	CHECK(nvlist_error(nvl) == 0);
142 	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
143 	CHECK(!nvlist_exists_null(nvl, "nvlist/nvlist"));
144 	CHECK(!nvlist_exists_bool(nvl, "nvlist/nvlist"));
145 	CHECK(!nvlist_exists_number(nvl, "nvlist/nvlist"));
146 	CHECK(!nvlist_exists_string(nvl, "nvlist/nvlist"));
147 	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
148 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/nvlist"));
149 	CHECK(!nvlist_exists_binary(nvl, "nvlist/nvlist"));
150 
151 	CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
152 	CHECK(!nvlist_exists_null(nvl, "nvlist/descriptor"));
153 	CHECK(!nvlist_exists_bool(nvl, "nvlist/descriptor"));
154 	CHECK(!nvlist_exists_number(nvl, "nvlist/descriptor"));
155 	CHECK(!nvlist_exists_string(nvl, "nvlist/descriptor"));
156 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/descriptor"));
157 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
158 	CHECK(!nvlist_exists_binary(nvl, "nvlist/descriptor"));
159 	nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
160 	CHECK(nvlist_error(nvl) == 0);
161 	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
162 	CHECK(!nvlist_exists_null(nvl, "nvlist/descriptor"));
163 	CHECK(!nvlist_exists_bool(nvl, "nvlist/descriptor"));
164 	CHECK(!nvlist_exists_number(nvl, "nvlist/descriptor"));
165 	CHECK(!nvlist_exists_string(nvl, "nvlist/descriptor"));
166 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/descriptor"));
167 	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
168 	CHECK(!nvlist_exists_binary(nvl, "nvlist/descriptor"));
169 
170 	CHECK(!nvlist_exists(nvl, "nvlist/binary"));
171 	CHECK(!nvlist_exists_null(nvl, "nvlist/binary"));
172 	CHECK(!nvlist_exists_bool(nvl, "nvlist/binary"));
173 	CHECK(!nvlist_exists_number(nvl, "nvlist/binary"));
174 	CHECK(!nvlist_exists_string(nvl, "nvlist/binary"));
175 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/binary"));
176 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/binary"));
177 	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
178 	nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
179 	CHECK(nvlist_error(nvl) == 0);
180 	CHECK(nvlist_exists(nvl, "nvlist/binary"));
181 	CHECK(!nvlist_exists_null(nvl, "nvlist/binary"));
182 	CHECK(!nvlist_exists_bool(nvl, "nvlist/binary"));
183 	CHECK(!nvlist_exists_number(nvl, "nvlist/binary"));
184 	CHECK(!nvlist_exists_string(nvl, "nvlist/binary"));
185 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/binary"));
186 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/binary"));
187 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
188 
189 	CHECK(nvlist_exists(nvl, "nvlist/null"));
190 	CHECK(nvlist_exists(nvl, "nvlist/bool"));
191 	CHECK(nvlist_exists(nvl, "nvlist/number"));
192 	CHECK(nvlist_exists(nvl, "nvlist/string"));
193 	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
194 	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
195 	CHECK(nvlist_exists(nvl, "nvlist/binary"));
196 	CHECK(nvlist_exists_null(nvl, "nvlist/null"));
197 	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
198 	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
199 	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
200 	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
201 	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
202 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
203 
204 	nvlist_free_null(nvl, "nvlist/null");
205 	CHECK(!nvlist_exists(nvl, "nvlist/null"));
206 	CHECK(nvlist_exists(nvl, "nvlist/bool"));
207 	CHECK(nvlist_exists(nvl, "nvlist/number"));
208 	CHECK(nvlist_exists(nvl, "nvlist/string"));
209 	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
210 	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
211 	CHECK(nvlist_exists(nvl, "nvlist/binary"));
212 	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
213 	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
214 	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
215 	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
216 	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
217 	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
218 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
219 
220 	nvlist_free_bool(nvl, "nvlist/bool");
221 	CHECK(!nvlist_exists(nvl, "nvlist/null"));
222 	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
223 	CHECK(nvlist_exists(nvl, "nvlist/number"));
224 	CHECK(nvlist_exists(nvl, "nvlist/string"));
225 	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
226 	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
227 	CHECK(nvlist_exists(nvl, "nvlist/binary"));
228 	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
229 	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
230 	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
231 	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
232 	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
233 	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
234 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
235 
236 	nvlist_free_number(nvl, "nvlist/number");
237 	CHECK(!nvlist_exists(nvl, "nvlist/null"));
238 	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
239 	CHECK(!nvlist_exists(nvl, "nvlist/number"));
240 	CHECK(nvlist_exists(nvl, "nvlist/string"));
241 	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
242 	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
243 	CHECK(nvlist_exists(nvl, "nvlist/binary"));
244 	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
245 	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
246 	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
247 	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
248 	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
249 	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
250 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
251 
252 	nvlist_free_string(nvl, "nvlist/string");
253 	CHECK(!nvlist_exists(nvl, "nvlist/null"));
254 	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
255 	CHECK(!nvlist_exists(nvl, "nvlist/number"));
256 	CHECK(!nvlist_exists(nvl, "nvlist/string"));
257 	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
258 	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
259 	CHECK(nvlist_exists(nvl, "nvlist/binary"));
260 	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
261 	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
262 	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
263 	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
264 	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
265 	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
266 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
267 
268 	nvlist_free_nvlist(nvl, "nvlist/nvlist");
269 	CHECK(!nvlist_exists(nvl, "nvlist/null"));
270 	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
271 	CHECK(!nvlist_exists(nvl, "nvlist/number"));
272 	CHECK(!nvlist_exists(nvl, "nvlist/string"));
273 	CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
274 	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
275 	CHECK(nvlist_exists(nvl, "nvlist/binary"));
276 	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
277 	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
278 	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
279 	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
280 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
281 	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
282 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
283 
284 	nvlist_free_descriptor(nvl, "nvlist/descriptor");
285 	CHECK(!nvlist_exists(nvl, "nvlist/null"));
286 	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
287 	CHECK(!nvlist_exists(nvl, "nvlist/number"));
288 	CHECK(!nvlist_exists(nvl, "nvlist/string"));
289 	CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
290 	CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
291 	CHECK(nvlist_exists(nvl, "nvlist/binary"));
292 	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
293 	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
294 	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
295 	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
296 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
297 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
298 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
299 
300 	nvlist_free_binary(nvl, "nvlist/binary");
301 	CHECK(!nvlist_exists(nvl, "nvlist/null"));
302 	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
303 	CHECK(!nvlist_exists(nvl, "nvlist/number"));
304 	CHECK(!nvlist_exists(nvl, "nvlist/string"));
305 	CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
306 	CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
307 	CHECK(!nvlist_exists(nvl, "nvlist/binary"));
308 	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
309 	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
310 	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
311 	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
312 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
313 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
314 	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
315 
316 	CHECK(nvlist_empty(nvl));
317 
318 	nvlist_destroy(nvl);
319 
320 	return (0);
321 }
322