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
30#include <sys/nv.h>
31
32#include <stdio.h>
33#include <unistd.h>
34
35static int ntest = 1;
36
37#define	CHECK(expr)	do {						\
38	if ((expr))							\
39		printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);	\
40	else								\
41		printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
42	ntest++;							\
43} while (0)
44
45int
46main(void)
47{
48	nvlist_t *nvl;
49
50	printf("1..232\n");
51
52	nvl = nvlist_create(0);
53
54	CHECK(!nvlist_exists(nvl, "nvlist/null"));
55	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
56	CHECK(!nvlist_exists_bool(nvl, "nvlist/null"));
57	CHECK(!nvlist_exists_number(nvl, "nvlist/null"));
58	CHECK(!nvlist_exists_string(nvl, "nvlist/null"));
59	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/null"));
60	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/null"));
61	CHECK(!nvlist_exists_binary(nvl, "nvlist/null"));
62	nvlist_add_null(nvl, "nvlist/null");
63	CHECK(nvlist_error(nvl) == 0);
64	CHECK(nvlist_exists(nvl, "nvlist/null"));
65	CHECK(nvlist_exists_null(nvl, "nvlist/null"));
66	CHECK(!nvlist_exists_bool(nvl, "nvlist/null"));
67	CHECK(!nvlist_exists_number(nvl, "nvlist/null"));
68	CHECK(!nvlist_exists_string(nvl, "nvlist/null"));
69	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/null"));
70	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/null"));
71	CHECK(!nvlist_exists_binary(nvl, "nvlist/null"));
72
73	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
74	CHECK(!nvlist_exists_null(nvl, "nvlist/bool"));
75	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
76	CHECK(!nvlist_exists_number(nvl, "nvlist/bool"));
77	CHECK(!nvlist_exists_string(nvl, "nvlist/bool"));
78	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/bool"));
79	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/bool"));
80	CHECK(!nvlist_exists_binary(nvl, "nvlist/bool"));
81	nvlist_add_bool(nvl, "nvlist/bool", true);
82	CHECK(nvlist_error(nvl) == 0);
83	CHECK(nvlist_exists(nvl, "nvlist/bool"));
84	CHECK(!nvlist_exists_null(nvl, "nvlist/bool"));
85	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
86	CHECK(!nvlist_exists_number(nvl, "nvlist/bool"));
87	CHECK(!nvlist_exists_string(nvl, "nvlist/bool"));
88	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/bool"));
89	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/bool"));
90	CHECK(!nvlist_exists_binary(nvl, "nvlist/bool"));
91
92	CHECK(!nvlist_exists(nvl, "nvlist/number"));
93	CHECK(!nvlist_exists_null(nvl, "nvlist/number"));
94	CHECK(!nvlist_exists_bool(nvl, "nvlist/number"));
95	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
96	CHECK(!nvlist_exists_string(nvl, "nvlist/number"));
97	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/number"));
98	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/number"));
99	CHECK(!nvlist_exists_binary(nvl, "nvlist/number"));
100	nvlist_add_number(nvl, "nvlist/number", 0);
101	CHECK(nvlist_error(nvl) == 0);
102	CHECK(nvlist_exists(nvl, "nvlist/number"));
103	CHECK(!nvlist_exists_null(nvl, "nvlist/number"));
104	CHECK(!nvlist_exists_bool(nvl, "nvlist/number"));
105	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
106	CHECK(!nvlist_exists_string(nvl, "nvlist/number"));
107	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/number"));
108	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/number"));
109	CHECK(!nvlist_exists_binary(nvl, "nvlist/number"));
110
111	CHECK(!nvlist_exists(nvl, "nvlist/string"));
112	CHECK(!nvlist_exists_null(nvl, "nvlist/string"));
113	CHECK(!nvlist_exists_bool(nvl, "nvlist/string"));
114	CHECK(!nvlist_exists_number(nvl, "nvlist/string"));
115	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
116	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/string"));
117	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/string"));
118	CHECK(!nvlist_exists_binary(nvl, "nvlist/string"));
119	nvlist_add_string(nvl, "nvlist/string", "test");
120	CHECK(nvlist_error(nvl) == 0);
121	CHECK(nvlist_exists(nvl, "nvlist/string"));
122	CHECK(!nvlist_exists_null(nvl, "nvlist/string"));
123	CHECK(!nvlist_exists_bool(nvl, "nvlist/string"));
124	CHECK(!nvlist_exists_number(nvl, "nvlist/string"));
125	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
126	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/string"));
127	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/string"));
128	CHECK(!nvlist_exists_binary(nvl, "nvlist/string"));
129
130	CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
131	CHECK(!nvlist_exists_null(nvl, "nvlist/nvlist"));
132	CHECK(!nvlist_exists_bool(nvl, "nvlist/nvlist"));
133	CHECK(!nvlist_exists_number(nvl, "nvlist/nvlist"));
134	CHECK(!nvlist_exists_string(nvl, "nvlist/nvlist"));
135	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
136	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/nvlist"));
137	CHECK(!nvlist_exists_binary(nvl, "nvlist/nvlist"));
138	nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
139	CHECK(nvlist_error(nvl) == 0);
140	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
141	CHECK(!nvlist_exists_null(nvl, "nvlist/nvlist"));
142	CHECK(!nvlist_exists_bool(nvl, "nvlist/nvlist"));
143	CHECK(!nvlist_exists_number(nvl, "nvlist/nvlist"));
144	CHECK(!nvlist_exists_string(nvl, "nvlist/nvlist"));
145	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
146	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/nvlist"));
147	CHECK(!nvlist_exists_binary(nvl, "nvlist/nvlist"));
148
149	CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
150	CHECK(!nvlist_exists_null(nvl, "nvlist/descriptor"));
151	CHECK(!nvlist_exists_bool(nvl, "nvlist/descriptor"));
152	CHECK(!nvlist_exists_number(nvl, "nvlist/descriptor"));
153	CHECK(!nvlist_exists_string(nvl, "nvlist/descriptor"));
154	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/descriptor"));
155	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
156	CHECK(!nvlist_exists_binary(nvl, "nvlist/descriptor"));
157	nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
158	CHECK(nvlist_error(nvl) == 0);
159	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
160	CHECK(!nvlist_exists_null(nvl, "nvlist/descriptor"));
161	CHECK(!nvlist_exists_bool(nvl, "nvlist/descriptor"));
162	CHECK(!nvlist_exists_number(nvl, "nvlist/descriptor"));
163	CHECK(!nvlist_exists_string(nvl, "nvlist/descriptor"));
164	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/descriptor"));
165	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
166	CHECK(!nvlist_exists_binary(nvl, "nvlist/descriptor"));
167
168	CHECK(!nvlist_exists(nvl, "nvlist/binary"));
169	CHECK(!nvlist_exists_null(nvl, "nvlist/binary"));
170	CHECK(!nvlist_exists_bool(nvl, "nvlist/binary"));
171	CHECK(!nvlist_exists_number(nvl, "nvlist/binary"));
172	CHECK(!nvlist_exists_string(nvl, "nvlist/binary"));
173	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/binary"));
174	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/binary"));
175	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
176	nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
177	CHECK(nvlist_error(nvl) == 0);
178	CHECK(nvlist_exists(nvl, "nvlist/binary"));
179	CHECK(!nvlist_exists_null(nvl, "nvlist/binary"));
180	CHECK(!nvlist_exists_bool(nvl, "nvlist/binary"));
181	CHECK(!nvlist_exists_number(nvl, "nvlist/binary"));
182	CHECK(!nvlist_exists_string(nvl, "nvlist/binary"));
183	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/binary"));
184	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/binary"));
185	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
186
187	CHECK(nvlist_exists(nvl, "nvlist/null"));
188	CHECK(nvlist_exists(nvl, "nvlist/bool"));
189	CHECK(nvlist_exists(nvl, "nvlist/number"));
190	CHECK(nvlist_exists(nvl, "nvlist/string"));
191	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
192	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
193	CHECK(nvlist_exists(nvl, "nvlist/binary"));
194	CHECK(nvlist_exists_null(nvl, "nvlist/null"));
195	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
196	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
197	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
198	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
199	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
200	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
201
202	nvlist_free_null(nvl, "nvlist/null");
203	CHECK(!nvlist_exists(nvl, "nvlist/null"));
204	CHECK(nvlist_exists(nvl, "nvlist/bool"));
205	CHECK(nvlist_exists(nvl, "nvlist/number"));
206	CHECK(nvlist_exists(nvl, "nvlist/string"));
207	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
208	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
209	CHECK(nvlist_exists(nvl, "nvlist/binary"));
210	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
211	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
212	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
213	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
214	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
215	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
216	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
217
218	nvlist_free_bool(nvl, "nvlist/bool");
219	CHECK(!nvlist_exists(nvl, "nvlist/null"));
220	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
221	CHECK(nvlist_exists(nvl, "nvlist/number"));
222	CHECK(nvlist_exists(nvl, "nvlist/string"));
223	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
224	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
225	CHECK(nvlist_exists(nvl, "nvlist/binary"));
226	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
227	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
228	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
229	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
230	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
231	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
232	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
233
234	nvlist_free_number(nvl, "nvlist/number");
235	CHECK(!nvlist_exists(nvl, "nvlist/null"));
236	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
237	CHECK(!nvlist_exists(nvl, "nvlist/number"));
238	CHECK(nvlist_exists(nvl, "nvlist/string"));
239	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
240	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
241	CHECK(nvlist_exists(nvl, "nvlist/binary"));
242	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
243	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
244	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
245	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
246	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
247	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
248	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
249
250	nvlist_free_string(nvl, "nvlist/string");
251	CHECK(!nvlist_exists(nvl, "nvlist/null"));
252	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
253	CHECK(!nvlist_exists(nvl, "nvlist/number"));
254	CHECK(!nvlist_exists(nvl, "nvlist/string"));
255	CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
256	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
257	CHECK(nvlist_exists(nvl, "nvlist/binary"));
258	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
259	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
260	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
261	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
262	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
263	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
264	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
265
266	nvlist_free_nvlist(nvl, "nvlist/nvlist");
267	CHECK(!nvlist_exists(nvl, "nvlist/null"));
268	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
269	CHECK(!nvlist_exists(nvl, "nvlist/number"));
270	CHECK(!nvlist_exists(nvl, "nvlist/string"));
271	CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
272	CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
273	CHECK(nvlist_exists(nvl, "nvlist/binary"));
274	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
275	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
276	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
277	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
278	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
279	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
280	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
281
282	nvlist_free_descriptor(nvl, "nvlist/descriptor");
283	CHECK(!nvlist_exists(nvl, "nvlist/null"));
284	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
285	CHECK(!nvlist_exists(nvl, "nvlist/number"));
286	CHECK(!nvlist_exists(nvl, "nvlist/string"));
287	CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
288	CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
289	CHECK(nvlist_exists(nvl, "nvlist/binary"));
290	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
291	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
292	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
293	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
294	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
295	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
296	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
297
298	nvlist_free_binary(nvl, "nvlist/binary");
299	CHECK(!nvlist_exists(nvl, "nvlist/null"));
300	CHECK(!nvlist_exists(nvl, "nvlist/bool"));
301	CHECK(!nvlist_exists(nvl, "nvlist/number"));
302	CHECK(!nvlist_exists(nvl, "nvlist/string"));
303	CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
304	CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
305	CHECK(!nvlist_exists(nvl, "nvlist/binary"));
306	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
307	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
308	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
309	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
310	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
311	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
312	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
313
314	CHECK(nvlist_empty(nvl));
315
316	nvlist_destroy(nvl);
317
318	return (0);
319}
320