]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libnv/tests/cnv_tests.cc
sys/{x86,amd64}: remove one of doubled ;s
[FreeBSD/FreeBSD.git] / lib / libnv / tests / cnv_tests.cc
1 /*-
2  * Copyright (c) 2016 Adam Starak <starak.adam@gmail.com>
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 AUTHORS AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31
32 #include <sys/cnv.h>
33 #include <sys/nv.h>
34 #include <sys/types.h>
35
36 #include <atf-c++.hpp>
37 #include <fcntl.h>
38 #include <errno.h>
39
40 #define fd_is_valid(fd) (fcntl((fd), F_GETFL) != -1 || errno != EBADF)
41
42 /* ATF cnvlist_get tests. */
43
44 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_bool);
45 ATF_TEST_CASE_BODY(cnvlist_get_bool)
46 {
47         nvlist_t *nvl;
48         const char *key;
49         bool value;
50         void *cookie;
51         int type;
52
53         nvl = nvlist_create(0);
54         ATF_REQUIRE(nvl != NULL);
55         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
56         ATF_REQUIRE(nvlist_empty(nvl));
57
58         cookie = NULL;
59         key = "name";
60         value = true;
61
62         nvlist_add_bool(nvl, key, value);
63         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
64         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
65         ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
66         ATF_REQUIRE(!nvlist_empty(nvl));
67         ATF_REQUIRE(nvlist_exists(nvl, key));
68         ATF_REQUIRE(nvlist_exists_bool(nvl, key));
69
70         ATF_REQUIRE_EQ(cnvlist_get_bool(cookie), value);
71
72         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
73             static_cast<const char *>(NULL));
74
75         nvlist_destroy(nvl);
76 }
77
78 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_number);
79 ATF_TEST_CASE_BODY(cnvlist_get_number)
80 {
81         nvlist_t *nvl;
82         const char *key;
83         uint64_t value;
84         void *cookie;
85         int type;
86
87         nvl = nvlist_create(0);
88         ATF_REQUIRE(nvl != NULL);
89         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
90         ATF_REQUIRE(nvlist_empty(nvl));
91
92         cookie = NULL;
93         key = "name";
94         value = 420;
95
96         nvlist_add_number(nvl, key, value);
97         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
98         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
99         ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
100         ATF_REQUIRE(!nvlist_empty(nvl));
101         ATF_REQUIRE(nvlist_exists(nvl, key));
102         ATF_REQUIRE(nvlist_exists_number(nvl, key));
103
104         ATF_REQUIRE_EQ(cnvlist_get_number(cookie), value);
105
106         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
107             static_cast<const char *>(NULL));
108
109         nvlist_destroy(nvl);
110 }
111
112
113 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_string);
114 ATF_TEST_CASE_BODY(cnvlist_get_string)
115 {
116         nvlist_t *nvl;
117         const char *key;
118         const char *value;
119         void *cookie;
120         int type;
121
122         nvl = nvlist_create(0);
123         ATF_REQUIRE(nvl != NULL);
124         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
125         ATF_REQUIRE(nvlist_empty(nvl));
126
127         cookie = NULL;
128         key = "name";
129         value = "text";
130
131         nvlist_add_string(nvl, key, value);
132         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
133         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
134         ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
135         ATF_REQUIRE(!nvlist_empty(nvl));
136         ATF_REQUIRE(nvlist_exists(nvl, key));
137         ATF_REQUIRE(nvlist_exists_string(nvl, key));
138
139         ATF_REQUIRE_EQ(strcmp(cnvlist_get_string(cookie), value), 0);
140
141         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
142             static_cast<const char *>(NULL));
143
144         nvlist_destroy(nvl);
145 }
146
147 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_nvlist);
148 ATF_TEST_CASE_BODY(cnvlist_get_nvlist)
149 {
150         nvlist_t *nvl, *value;
151         const nvlist_t *result;
152         const char *key, *subkey;
153         void *cookie;
154         int type;
155
156         nvl = nvlist_create(0);
157         ATF_REQUIRE(nvl != NULL);
158         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
159         ATF_REQUIRE(nvlist_empty(nvl));
160
161         value = nvlist_create(0);
162         ATF_REQUIRE(nvl != NULL);
163         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
164         ATF_REQUIRE(nvlist_empty(nvl));
165
166         key = "name";
167         subkey = "subname";
168         cookie = NULL;
169
170         /* Add null to 'value' nvlist. */
171         nvlist_add_null(value, subkey);
172         ATF_REQUIRE_EQ(strcmp(subkey, nvlist_next(value, &type, &cookie)), 0);
173         ATF_REQUIRE_EQ(nvlist_error(value), 0);
174         ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
175         ATF_REQUIRE(!nvlist_empty(value));
176         ATF_REQUIRE(nvlist_exists(value, subkey));
177         ATF_REQUIRE(nvlist_exists_null(value, subkey));
178         ATF_REQUIRE_EQ(nvlist_next(value, &type, &cookie),
179                        static_cast<const char *>(NULL));
180
181         /* Add 'value' nvlist. */
182         cookie = NULL;
183         nvlist_add_nvlist(nvl, key, value);
184         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
185         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
186         ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
187         ATF_REQUIRE(!nvlist_empty(nvl));
188         ATF_REQUIRE(nvlist_exists(nvl, key));
189         ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
190
191         /*
192          * Assuming nvlist_get_nvlist() is correct check if cnvlist returns
193          * the same pointer.
194          */
195         result = cnvlist_get_nvlist(cookie);
196         ATF_REQUIRE_EQ(result, nvlist_get_nvlist(nvl, key));
197         ATF_REQUIRE(result != value);
198         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
199                        static_cast<const char *>(NULL));
200
201         /* Validate data inside nvlist. */
202         cookie = NULL;
203         ATF_REQUIRE_EQ(strcmp(subkey, nvlist_next(result, &type, &cookie)), 0);
204         ATF_REQUIRE_EQ(nvlist_error(result), 0);
205         ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
206         ATF_REQUIRE(!nvlist_empty(result));
207         ATF_REQUIRE(nvlist_exists(result, subkey));
208         ATF_REQUIRE(nvlist_exists_null(result, subkey));
209         ATF_REQUIRE_EQ(nvlist_next(result, &type, &cookie),
210                        static_cast<const char *>(NULL));
211
212         nvlist_destroy(nvl);
213         nvlist_destroy(value);
214 }
215
216 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_descriptor);
217 ATF_TEST_CASE_BODY(cnvlist_get_descriptor)
218 {
219         nvlist_t *nvl;
220         const char *key;
221         void *cookie;
222         int type;
223
224         nvl = nvlist_create(0);
225         ATF_REQUIRE(nvl != NULL);
226         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
227         ATF_REQUIRE(nvlist_empty(nvl));
228
229         cookie = NULL;
230         key = "name";
231
232         nvlist_add_descriptor(nvl, key, STDERR_FILENO);
233         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
234         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
235         ATF_REQUIRE_EQ(type, NV_TYPE_DESCRIPTOR);
236         ATF_REQUIRE(!nvlist_empty(nvl));
237         ATF_REQUIRE(nvlist_exists(nvl, key));
238         ATF_REQUIRE(nvlist_exists_descriptor(nvl, key));
239
240         ATF_REQUIRE_EQ(fd_is_valid(cnvlist_get_descriptor(cookie)), 1);
241
242         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
243             static_cast<const char *>(NULL));
244
245         nvlist_destroy(nvl);
246 }
247
248 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_binary);
249 ATF_TEST_CASE_BODY(cnvlist_get_binary)
250 {
251         nvlist_t *nvl;
252         const char *key;
253         void *in_binary;
254         const void *out_binary;
255         void *cookie;
256         int type;
257         size_t in_size, out_size;
258
259         nvl = nvlist_create(0);
260         ATF_REQUIRE(nvl != NULL);
261         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
262         ATF_REQUIRE(nvlist_empty(nvl));
263
264         cookie = NULL;
265         key = "name";
266         in_size = 13;
267
268         in_binary = malloc(in_size);
269         ATF_REQUIRE(in_binary != NULL);
270         memset(in_binary, 0xa5, in_size);
271
272         nvlist_add_binary(nvl, key, in_binary, in_size);
273         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
274         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
275         ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
276         ATF_REQUIRE(!nvlist_empty(nvl));
277         ATF_REQUIRE(nvlist_exists(nvl, key));
278         ATF_REQUIRE(nvlist_exists_binary(nvl, key));
279
280         out_binary = cnvlist_get_binary(cookie, &out_size);
281         ATF_REQUIRE_EQ(out_size, in_size);
282         ATF_REQUIRE_EQ(memcmp(in_binary, out_binary, out_size), 0);
283
284         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
285             static_cast<const char *>(NULL));
286
287         nvlist_destroy(nvl);
288 }
289
290 /* ATF cnvlist_get array tests. */
291
292 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_bool_array);
293 ATF_TEST_CASE_BODY(cnvlist_get_bool_array)
294 {
295         nvlist_t *nvl;
296         bool in_array[16];
297         const bool *out_array;
298         const char *key;
299         void *cookie;
300         int type, i;
301         size_t nitems;
302
303         for (i = 0; i < 16; i++)
304                 in_array[i] = (i % 2 == 0);
305
306         nvl = nvlist_create(0);
307         ATF_REQUIRE(nvl != NULL);
308         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
309         ATF_REQUIRE(nvlist_empty(nvl));
310
311         cookie = NULL;
312         key = "name";
313
314         nvlist_add_bool_array(nvl, key, in_array, 16);
315         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
316         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
317         ATF_REQUIRE_EQ(type, NV_TYPE_BOOL_ARRAY);
318         ATF_REQUIRE(!nvlist_empty(nvl));
319         ATF_REQUIRE(nvlist_exists(nvl, key));
320         ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
321
322         out_array = cnvlist_get_bool_array(cookie, &nitems);
323         ATF_REQUIRE_EQ(nitems, 16);
324         ATF_REQUIRE(out_array != NULL);
325         for (i = 0; i < 16; i++)
326                 ATF_REQUIRE_EQ(out_array[i], in_array[i]);
327
328         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
329             static_cast<const char *>(NULL));
330
331         nvlist_destroy(nvl);
332 }
333
334 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_number_array);
335 ATF_TEST_CASE_BODY(cnvlist_get_number_array)
336 {
337         nvlist_t *nvl;
338         uint64_t in_array[16];
339         const uint64_t *out_array;
340         const char *key;
341         void *cookie;
342         int type, i;
343         size_t nitems;
344
345         for (i = 0; i < 16; i++)
346                 in_array[i] = i;
347
348         nvl = nvlist_create(0);
349         ATF_REQUIRE(nvl != NULL);
350         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
351         ATF_REQUIRE(nvlist_empty(nvl));
352
353         cookie = NULL;
354         key = "name";
355
356         nvlist_add_number_array(nvl, key, in_array, 16);
357         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
358         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
359         ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER_ARRAY);
360         ATF_REQUIRE(!nvlist_empty(nvl));
361         ATF_REQUIRE(nvlist_exists(nvl, key));
362         ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
363
364         out_array = cnvlist_get_number_array(cookie, &nitems);
365         ATF_REQUIRE(out_array != NULL);
366         ATF_REQUIRE_EQ(nitems, 16);
367         for (i = 0; i < 16; i++)
368                 ATF_REQUIRE_EQ(out_array[i], in_array[i]);
369
370         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
371             static_cast<const char *>(NULL));
372
373         nvlist_destroy(nvl);
374 }
375
376 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_string_array);
377 ATF_TEST_CASE_BODY(cnvlist_get_string_array)
378 {
379         nvlist_t *nvl;
380         const char *in_array[4] = {"inequality", "sucks", ".", ""};
381         const char * const *out_array;
382         const char *key;
383         void *cookie;
384         int type, i;
385         size_t nitems;
386
387         nvl = nvlist_create(0);
388         ATF_REQUIRE(nvl != NULL);
389         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
390         ATF_REQUIRE(nvlist_empty(nvl));
391
392         cookie = NULL;
393         key = "name";
394
395         nvlist_add_string_array(nvl, key, in_array, 4);
396         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
397         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
398         ATF_REQUIRE_EQ(type, NV_TYPE_STRING_ARRAY);
399         ATF_REQUIRE(!nvlist_empty(nvl));
400         ATF_REQUIRE(nvlist_exists(nvl, key));
401         ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
402
403         out_array = cnvlist_get_string_array(cookie, &nitems);
404         ATF_REQUIRE_EQ(nitems, 4);
405         ATF_REQUIRE(out_array != NULL);
406         for (i = 0; i < 4; i++) {
407                 ATF_REQUIRE(out_array[i] != NULL);
408                 ATF_REQUIRE_EQ(strcmp(out_array[i], in_array[i]), 0);
409         }
410
411         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
412             static_cast<const char *>(NULL));
413
414         nvlist_destroy(nvl);
415 }
416
417 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_nvlist_array);
418 ATF_TEST_CASE_BODY(cnvlist_get_nvlist_array)
419 {
420         nvlist_t *nvl;
421         nvlist_t *in_array[6];
422         const nvlist_t * const *out_array;
423         const nvlist_t * const *out_result;
424         void *cookie;
425         const char *key;
426         const char *subkeys;
427         int type, i;
428         size_t nitems;
429
430         nvl = nvlist_create(0);
431         ATF_REQUIRE(nvl != NULL);
432         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
433         ATF_REQUIRE(nvlist_empty(nvl));
434
435         subkeys = "123456";
436         for (i = 0; i < 6; i++) {
437                 in_array[i] = nvlist_create(0);
438                 ATF_REQUIRE(in_array[i] != NULL);
439                 ATF_REQUIRE_EQ(nvlist_error(in_array[i]), 0);
440                 ATF_REQUIRE(nvlist_empty(in_array[i]));
441
442                 cookie = NULL;
443
444                 nvlist_add_null(in_array[i], subkeys+i);
445                 ATF_REQUIRE_EQ(strcmp(subkeys+i, nvlist_next(in_array[i],
446                     &type, &cookie)),0);
447                 ATF_REQUIRE_EQ(nvlist_error(in_array[i]), 0);
448                 ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
449                 ATF_REQUIRE(!nvlist_empty(in_array[i]));
450                 ATF_REQUIRE(nvlist_exists(in_array[i], subkeys+i));
451                 ATF_REQUIRE(nvlist_exists_null(in_array[i], subkeys+i));
452                 ATF_REQUIRE_EQ(nvlist_next(in_array[i], &type, &cookie),
453                     static_cast<const char *>(NULL));
454         }
455
456         cookie = NULL;
457         key = "name";
458
459         nvlist_add_nvlist_array(nvl, key, in_array, 6);
460         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
461         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
462         ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST_ARRAY);
463         ATF_REQUIRE(!nvlist_empty(nvl));
464         ATF_REQUIRE(nvlist_exists(nvl, key));
465         ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
466
467         /* Get nvlist array by cnvlist function. */
468         out_array = cnvlist_get_nvlist_array(cookie, &nitems);
469         ATF_REQUIRE(out_array != NULL);
470         ATF_REQUIRE_EQ(nitems, 6);
471         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
472             static_cast<const char *>(NULL));
473
474         /* Get nvlist array by nvlist function. */
475         out_result = nvlist_get_nvlist_array(nvl, key, &nitems);
476         ATF_REQUIRE(out_result != NULL);
477         ATF_REQUIRE_EQ(nitems, 6);
478
479         /* Validate assuming that nvlist returned a proper pointer */
480         for (i = 0; i < 6; i++) {
481                 ATF_REQUIRE_EQ(out_result[i], out_array[i]);
482                 ATF_REQUIRE(out_array[i] != in_array[i]);
483
484                 /* Validate data inside nvlist. */
485                 cookie = NULL;
486                 ATF_REQUIRE_EQ(strcmp(subkeys+i, nvlist_next(out_array[i],
487                     &type, &cookie)), 0);
488                 ATF_REQUIRE_EQ(nvlist_error(out_array[i]), 0);
489                 ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
490                 ATF_REQUIRE(!nvlist_empty(out_array[i]));
491                 ATF_REQUIRE(nvlist_exists(out_array[i], subkeys+i));
492                 ATF_REQUIRE(nvlist_exists_null(out_array[i], subkeys+i));
493                 ATF_REQUIRE_EQ(nvlist_next(out_array[i], &type, &cookie),
494                     static_cast<const char *>(NULL));
495         }
496
497         nvlist_destroy(nvl);
498 }
499
500 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_get_descriptor_array);
501 ATF_TEST_CASE_BODY(cnvlist_get_descriptor_array)
502 {
503         nvlist_t *nvl;
504         size_t count, i, nitems;
505         const int *out_array;
506         int *in_array, type;
507         const char *key;
508         void *cookie;
509
510         nvl = nvlist_create(0);
511         ATF_REQUIRE(nvl != NULL);
512         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
513         ATF_REQUIRE(nvlist_empty(nvl));
514
515         cookie = NULL;
516         key = "name";
517         count = 50;
518
519         in_array = static_cast<int *>(malloc(sizeof(*in_array)*count));
520         ATF_REQUIRE(in_array != NULL);
521         for (i = 0; i < count; i++) {
522                 in_array[i] = dup(STDERR_FILENO);
523                 ATF_REQUIRE(fd_is_valid(in_array[i]));
524         }
525
526         nvlist_add_descriptor_array(nvl, key, in_array, count);
527         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
528         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
529         ATF_REQUIRE_EQ(type, NV_TYPE_DESCRIPTOR_ARRAY);
530         ATF_REQUIRE(!nvlist_empty(nvl));
531         ATF_REQUIRE(nvlist_exists(nvl, key));
532         ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
533
534         out_array = cnvlist_get_descriptor_array(cookie, &nitems);
535         ATF_REQUIRE_EQ(nitems, count);
536         ATF_REQUIRE(out_array != NULL);
537         for (i = 0; i < count; i++)
538                 ATF_REQUIRE_EQ(fd_is_valid(out_array[i]), 1);
539
540         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
541             static_cast<const char *>(NULL));
542
543         nvlist_destroy(nvl);
544 }
545
546 /* ATF cnvlist_take tests. */
547
548 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_take_bool);
549 ATF_TEST_CASE_BODY(cnvlist_take_bool)
550 {
551         nvlist_t *nvl;
552         const char *key;
553         bool value;
554         void *cookie;
555         int type;
556
557         nvl = nvlist_create(0);
558         ATF_REQUIRE(nvl != NULL);
559         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
560         ATF_REQUIRE(nvlist_empty(nvl));
561
562         cookie = NULL;
563         key = "name";
564         value = true;
565
566         nvlist_add_bool(nvl, key, value);
567         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
568         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
569         ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
570         ATF_REQUIRE(!nvlist_empty(nvl));
571         ATF_REQUIRE(nvlist_exists(nvl, key));
572         ATF_REQUIRE(nvlist_exists_bool(nvl, key));
573         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
574             static_cast<const char *>(NULL));
575
576         cookie = NULL;
577         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
578         ATF_REQUIRE_EQ(cnvlist_take_bool(cookie), value);
579
580         cookie = NULL;
581         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
582         ATF_REQUIRE(nvlist_empty(nvl));
583         ATF_REQUIRE(!nvlist_exists(nvl, key));
584         ATF_REQUIRE(!nvlist_exists_bool(nvl, key));
585         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
586             static_cast<const char *>(NULL));
587
588         nvlist_destroy(nvl);
589 }
590
591 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_take_number);
592 ATF_TEST_CASE_BODY(cnvlist_take_number)
593 {
594         nvlist_t *nvl;
595         const char *key;
596         uint64_t value;
597         void *cookie;
598         int type;
599
600         nvl = nvlist_create(0);
601         ATF_REQUIRE(nvl != NULL);
602         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
603         ATF_REQUIRE(nvlist_empty(nvl));
604
605         cookie = NULL;
606         key = "name";
607         value = 69;
608
609         nvlist_add_number(nvl, key, value);
610         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
611         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
612         ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
613         ATF_REQUIRE(!nvlist_empty(nvl));
614         ATF_REQUIRE(nvlist_exists(nvl, key));
615         ATF_REQUIRE(nvlist_exists_number(nvl, key));
616         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
617             static_cast<const char *>(NULL));
618
619         cookie = NULL;
620         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
621         ATF_REQUIRE_EQ(cnvlist_take_number(cookie), value);
622
623         cookie = NULL;
624         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
625         ATF_REQUIRE(nvlist_empty(nvl));
626         ATF_REQUIRE(!nvlist_exists(nvl, key));
627         ATF_REQUIRE(!nvlist_exists_number(nvl, key));
628         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
629             static_cast<const char *>(NULL));
630
631         nvlist_destroy(nvl);
632 }
633
634 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_take_string);
635 ATF_TEST_CASE_BODY(cnvlist_take_string)
636 {
637         nvlist_t *nvl;
638         const char *key;
639         const char *value;
640         char *out_string;
641         void *cookie;
642         int type;
643
644         nvl = nvlist_create(0);
645         ATF_REQUIRE(nvl != NULL);
646         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
647         ATF_REQUIRE(nvlist_empty(nvl));
648
649         cookie = NULL;
650         key = "name";
651         value = "text";
652
653         nvlist_add_string(nvl, key, value);
654         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
655         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
656         ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
657         ATF_REQUIRE(!nvlist_empty(nvl));
658         ATF_REQUIRE(nvlist_exists(nvl, key));
659         ATF_REQUIRE(nvlist_exists_string(nvl, key));
660         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
661             static_cast<const char *>(NULL));
662
663         cookie = NULL;
664         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
665         out_string = cnvlist_take_string(cookie);
666         ATF_REQUIRE(out_string != NULL);
667         ATF_REQUIRE_EQ(strcmp(out_string, value), 0);
668
669         cookie = NULL;
670         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
671         ATF_REQUIRE(nvlist_empty(nvl));
672         ATF_REQUIRE(!nvlist_exists(nvl, key));
673         ATF_REQUIRE(!nvlist_exists_string(nvl, key));
674         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
675             static_cast<const char *>(NULL));
676
677         free(out_string);
678         nvlist_destroy(nvl);
679 }
680
681 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_take_nvlist);
682 ATF_TEST_CASE_BODY(cnvlist_take_nvlist)
683 {
684         nvlist_t *nvl, *value, *result;
685         const char *key, *subkey;
686         void *cookie;
687         int type;
688
689         nvl = nvlist_create(0);
690         ATF_REQUIRE(nvl != NULL);
691         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
692         ATF_REQUIRE(nvlist_empty(nvl));
693
694         value = nvlist_create(0);
695         ATF_REQUIRE(value != NULL);
696         ATF_REQUIRE_EQ(nvlist_error(value), 0);
697         ATF_REQUIRE(nvlist_empty(value));
698
699         key = "name";
700         subkey = "subname";
701         cookie = NULL;
702
703         /* Add null to 'value' nvlist. */
704         nvlist_add_null(value, subkey);
705         ATF_REQUIRE_EQ(strcmp(subkey, nvlist_next(value, &type, &cookie)), 0);
706         ATF_REQUIRE_EQ(nvlist_error(value), 0);
707         ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
708         ATF_REQUIRE(!nvlist_empty(value));
709         ATF_REQUIRE(nvlist_exists(value, subkey));
710         ATF_REQUIRE(nvlist_exists_null(value, subkey));
711         ATF_REQUIRE_EQ(nvlist_next(value, &type, &cookie),
712             static_cast<const char *>(NULL));
713
714         /* Add 'value' nvlist. */
715         cookie = NULL;
716         nvlist_move_nvlist(nvl, key, value);
717         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
718         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
719         ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
720         ATF_REQUIRE(!nvlist_empty(nvl));
721         ATF_REQUIRE(nvlist_exists(nvl, key));
722         ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
723         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
724             static_cast<const char *>(NULL));
725
726         cookie = NULL;
727         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
728         result = cnvlist_take_nvlist(cookie);
729         ATF_REQUIRE(!nvlist_exists_nvlist(nvl, key));
730         ATF_REQUIRE(result == value);
731
732         /* Validate data inside nvlist. */
733         cookie = NULL;
734         ATF_REQUIRE_EQ(strcmp(subkey, nvlist_next(result, &type, &cookie)), 0);
735         ATF_REQUIRE_EQ(nvlist_error(value), 0);
736         ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
737         ATF_REQUIRE(!nvlist_empty(value));
738         ATF_REQUIRE(nvlist_exists(value, subkey));
739         ATF_REQUIRE(nvlist_exists_null(value, subkey));
740         ATF_REQUIRE_EQ(nvlist_next(value, &type, &cookie),
741             static_cast<const char *>(NULL));
742
743         cookie = NULL;
744         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
745             static_cast<const char *>(NULL));
746
747         nvlist_destroy(nvl);
748         nvlist_destroy(value);
749 }
750
751 /* ATF cnvlist_take array tests */
752
753 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_take_bool_array);
754 ATF_TEST_CASE_BODY(cnvlist_take_bool_array)
755 {
756         nvlist_t *nvl;
757         bool in_array[16];
758         const bool *out_array;
759         const char *key;
760         void *cookie;
761         int type, i;
762         size_t nitems;
763
764         for (i = 0; i < 16; i++)
765                 in_array[i] = (i % 2 == 0);
766
767         nvl = nvlist_create(0);
768         ATF_REQUIRE(nvl != NULL);
769         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
770         ATF_REQUIRE(nvlist_empty(nvl));
771
772         cookie = NULL;
773         key = "name";
774
775         nvlist_add_bool_array(nvl, key, in_array, 16);
776         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
777         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
778         ATF_REQUIRE_EQ(type, NV_TYPE_BOOL_ARRAY);
779         ATF_REQUIRE(!nvlist_empty(nvl));
780         ATF_REQUIRE(nvlist_exists(nvl, key));
781         ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
782         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
783             static_cast<const char *>(NULL));
784
785         cookie = NULL;
786         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
787         out_array = cnvlist_take_bool_array(cookie, &nitems);
788         ATF_REQUIRE_EQ(nitems, 16);
789         ATF_REQUIRE(out_array != NULL);
790         for (i = 0; i < 16; i++)
791                 ATF_REQUIRE_EQ(out_array[i], in_array[i]);
792
793         cookie = NULL;
794         ATF_REQUIRE(!nvlist_exists_bool_array(nvl, key));
795         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
796         ATF_REQUIRE(nvlist_empty(nvl));
797         ATF_REQUIRE(!nvlist_exists(nvl, key));
798         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
799             static_cast<const char *>(NULL));
800
801
802         nvlist_destroy(nvl);
803 }
804
805 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_take_number_array);
806 ATF_TEST_CASE_BODY(cnvlist_take_number_array)
807 {
808         nvlist_t *nvl;
809         uint64_t in_array[16];
810         const uint64_t *out_array;
811         const char *key;
812         void *cookie;
813         int type, i;
814         size_t nitems;
815
816         for (i = 0; i < 16; i++)
817                 in_array[i] = i;
818
819         nvl = nvlist_create(0);
820         ATF_REQUIRE(nvl != NULL);
821         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
822         ATF_REQUIRE(nvlist_empty(nvl));
823
824         cookie = NULL;
825         key = "name";
826
827         nvlist_add_number_array(nvl, key, in_array, 16);
828         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
829         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
830         ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER_ARRAY);
831         ATF_REQUIRE(!nvlist_empty(nvl));
832         ATF_REQUIRE(nvlist_exists(nvl, key));
833         ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
834         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
835             static_cast<const char *>(NULL));
836
837         cookie = NULL;
838         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
839         out_array = cnvlist_take_number_array(cookie, &nitems);
840
841         ATF_REQUIRE(out_array != NULL);
842         ATF_REQUIRE_EQ(nitems, 16);
843         for (i = 0; i < 16; i++)
844                 ATF_REQUIRE_EQ(out_array[i], in_array[i]);
845
846         cookie = NULL;
847         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
848         ATF_REQUIRE(nvlist_empty(nvl));
849         ATF_REQUIRE(!nvlist_exists(nvl, key));
850         ATF_REQUIRE(!nvlist_exists_number_array(nvl, key));
851         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
852             static_cast<const char *>(NULL));
853
854         nvlist_destroy(nvl);
855 }
856
857 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_take_string_array);
858 ATF_TEST_CASE_BODY(cnvlist_take_string_array)
859 {
860         nvlist_t *nvl;
861         const char *in_array[4] = {"inequality", "sks", ".", ""};
862         char **out_array;
863         const char *key;
864         void *cookie;
865         int type, i;
866         size_t nitems;
867
868         nvl = nvlist_create(0);
869         ATF_REQUIRE(nvl != NULL);
870         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
871         ATF_REQUIRE(nvlist_empty(nvl));
872
873         cookie = NULL;
874         key = "name";
875
876         nvlist_add_string_array(nvl, key, in_array, 4);
877         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
878         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
879         ATF_REQUIRE_EQ(type, NV_TYPE_STRING_ARRAY);
880         ATF_REQUIRE(!nvlist_empty(nvl));
881         ATF_REQUIRE(nvlist_exists(nvl, key));
882         ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
883         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
884             static_cast<const char *>(NULL));
885
886         cookie = NULL;
887         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
888         out_array = cnvlist_take_string_array(cookie, &nitems);
889         ATF_REQUIRE_EQ(nitems, 4);
890         for (i = 0; i < 4; i++) {
891                 ATF_REQUIRE(out_array[i] != NULL);
892                 ATF_REQUIRE_EQ(strcmp(out_array[i], in_array[i]), 0);
893         }
894         ATF_REQUIRE(nvlist_empty(nvl));
895
896         cookie = NULL;
897         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
898         ATF_REQUIRE(nvlist_empty(nvl));
899         ATF_REQUIRE(!nvlist_exists(nvl, key));
900         ATF_REQUIRE(!nvlist_exists_number_array(nvl, key));
901         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
902             static_cast<const char *>(NULL));
903
904         free(out_array);
905         nvlist_destroy(nvl);
906 }
907
908 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_take_nvlist_array);
909 ATF_TEST_CASE_BODY(cnvlist_take_nvlist_array)
910 {
911         nvlist_t *testnvl[8];
912         nvlist_t **result;
913         nvlist_t *nvl;
914         void *cookie;
915         size_t num_items;
916         unsigned int i;
917         int type;
918         const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
919         const char *key;
920
921         for (i = 0; i < 8; i++) {
922                 testnvl[i] = nvlist_create(0);
923                 ATF_REQUIRE(testnvl[i] != NULL);
924                 ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
925                 ATF_REQUIRE(nvlist_empty(testnvl[i]));
926                 nvlist_add_string(testnvl[i], "nvl/string", somestr[i]);
927
928                 cookie = NULL;
929                 ATF_REQUIRE_EQ(strcmp("nvl/string", nvlist_next(testnvl[i],
930                     &type, &cookie)), 0);
931                 ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
932                 ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
933                 ATF_REQUIRE(!nvlist_empty(testnvl[i]));
934                 ATF_REQUIRE(nvlist_exists(testnvl[i], "nvl/string"));
935                 ATF_REQUIRE(nvlist_exists_string(testnvl[i], "nvl/string"));
936                 ATF_REQUIRE_EQ(nvlist_next(testnvl[i], &type, &cookie),
937                     static_cast<const char *>(NULL));
938         }
939
940         nvl = nvlist_create(0);
941         ATF_REQUIRE(nvl != NULL);
942         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
943         ATF_REQUIRE(nvlist_empty(nvl));
944
945         key = "nvl/nvlist";
946         cookie = NULL;
947
948         nvlist_add_nvlist_array(nvl, key, (const nvlist_t * const *)testnvl, 8);
949         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
950         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
951         ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST_ARRAY);
952         ATF_REQUIRE(!nvlist_empty(nvl));
953         ATF_REQUIRE(nvlist_exists(nvl, key));
954         ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
955         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
956             static_cast<const char *>(NULL));
957
958         cookie = NULL;
959         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
960         result = cnvlist_take_nvlist_array(cookie, &num_items);
961
962         ATF_REQUIRE(result != NULL);
963         ATF_REQUIRE_EQ(num_items, 8);
964         for (i = 0; i < num_items; i++) {
965                 ATF_REQUIRE_EQ(nvlist_error(result[i]), 0);
966                 ATF_REQUIRE(nvlist_get_array_next(result[i]) == NULL);
967         }
968
969         ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
970         ATF_REQUIRE(nvlist_empty(nvl));
971         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
972
973         cookie = NULL;
974         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
975         ATF_REQUIRE(nvlist_empty(nvl));
976         ATF_REQUIRE(!nvlist_exists(nvl, key));
977         ATF_REQUIRE(!nvlist_exists_nvlist_array(nvl, key));
978         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
979             static_cast<const char *>(NULL));
980
981         for (i = 0; i < 8; i++) {
982                 nvlist_destroy(result[i]);
983                 nvlist_destroy(testnvl[i]);
984         }
985
986         free(result);
987         nvlist_destroy(nvl);
988 }
989
990 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_take_binary);
991 ATF_TEST_CASE_BODY(cnvlist_take_binary)
992 {
993         nvlist_t *nvl;
994         const char *key;
995         void *in_binary;
996         const void *out_binary;
997         void *cookie;
998         int type;
999         size_t in_size, out_size;
1000
1001         nvl = nvlist_create(0);
1002         ATF_REQUIRE(nvl != NULL);
1003         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1004         ATF_REQUIRE(nvlist_empty(nvl));
1005
1006         cookie = NULL;
1007         key = "name";
1008         in_size = 13;
1009         in_binary = malloc(in_size);
1010         ATF_REQUIRE(in_binary != NULL);
1011         memset(in_binary, 0xa5, in_size);
1012
1013         nvlist_add_binary(nvl, key, in_binary, in_size);
1014         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1015         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1016         ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
1017         ATF_REQUIRE(!nvlist_empty(nvl));
1018         ATF_REQUIRE(nvlist_exists(nvl, key));
1019         ATF_REQUIRE(nvlist_exists_binary(nvl, key));
1020         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1021             static_cast<const char *>(NULL));
1022
1023         cookie = NULL;
1024         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1025         out_binary = cnvlist_take_binary(cookie, &out_size);
1026         ATF_REQUIRE_EQ(out_size, in_size);
1027         ATF_REQUIRE_EQ(memcmp(in_binary, out_binary, out_size), 0);
1028
1029         cookie = NULL;
1030         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1031         ATF_REQUIRE(nvlist_empty(nvl));
1032         ATF_REQUIRE(!nvlist_exists(nvl, key));
1033         ATF_REQUIRE(!nvlist_exists_binary(nvl, key));
1034         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1035             static_cast<const char *>(NULL));
1036
1037         nvlist_destroy(nvl);
1038 }
1039
1040 /* ATF cnvlist_free tests. */
1041
1042 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_free_bool);
1043 ATF_TEST_CASE_BODY(cnvlist_free_bool)
1044 {
1045         nvlist_t *nvl;
1046         const char *key;
1047         bool value;
1048         void *cookie;
1049         int type;
1050
1051         nvl = nvlist_create(0);
1052         ATF_REQUIRE(nvl != NULL);
1053         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1054         ATF_REQUIRE(nvlist_empty(nvl));
1055
1056         cookie = NULL;
1057         key = "name";
1058         value = true;
1059
1060         nvlist_add_bool(nvl, key, value);
1061         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1062         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1063         ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
1064         ATF_REQUIRE(!nvlist_empty(nvl));
1065         ATF_REQUIRE(nvlist_exists(nvl, key));
1066         ATF_REQUIRE(nvlist_exists_bool(nvl, key));
1067         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1068             static_cast<const char *>(NULL));
1069
1070         cookie = NULL;
1071         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1072         cnvlist_free_bool(cookie);
1073
1074         cookie = NULL;
1075         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1076         ATF_REQUIRE(nvlist_empty(nvl));
1077         ATF_REQUIRE(!nvlist_exists(nvl, key));
1078         ATF_REQUIRE(!nvlist_exists_bool(nvl, key));
1079         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1080             static_cast<const char *>(NULL));
1081
1082         nvlist_destroy(nvl);
1083 }
1084
1085 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_free_number);
1086 ATF_TEST_CASE_BODY(cnvlist_free_number)
1087 {
1088         nvlist_t *nvl;
1089         const char *key;
1090         uint64_t value;
1091         void *cookie;
1092         int type;
1093
1094         nvl = nvlist_create(0);
1095         ATF_REQUIRE(nvl != NULL);
1096         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1097         ATF_REQUIRE(nvlist_empty(nvl));
1098
1099         cookie = NULL;
1100         key = "name";
1101         value = 69;
1102
1103         nvlist_add_number(nvl, key, value);
1104         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1105         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1106         ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
1107         ATF_REQUIRE(!nvlist_empty(nvl));
1108         ATF_REQUIRE(nvlist_exists(nvl, key));
1109         ATF_REQUIRE(nvlist_exists_number(nvl, key));
1110         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1111             static_cast<const char *>(NULL));
1112
1113         cookie = NULL;
1114         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1115         cnvlist_free_number(cookie);
1116
1117         cookie = NULL;
1118         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1119         ATF_REQUIRE(nvlist_empty(nvl));
1120         ATF_REQUIRE(!nvlist_exists(nvl, key));
1121         ATF_REQUIRE(!nvlist_exists_number(nvl, key));
1122         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1123             static_cast<const char *>(NULL));
1124
1125         nvlist_destroy(nvl);
1126 }
1127
1128 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_free_string);
1129 ATF_TEST_CASE_BODY(cnvlist_free_string)
1130 {
1131         nvlist_t *nvl;
1132         const char *key;
1133         const char *value;
1134         void *cookie;
1135         int type;
1136
1137         nvl = nvlist_create(0);
1138         ATF_REQUIRE(nvl != NULL);
1139         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1140         ATF_REQUIRE(nvlist_empty(nvl));
1141
1142         cookie = NULL;
1143         key = "name";
1144         value = "text";
1145
1146         nvlist_add_string(nvl, key, value);
1147         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1148         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1149         ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
1150         ATF_REQUIRE(!nvlist_empty(nvl));
1151         ATF_REQUIRE(nvlist_exists(nvl, key));
1152         ATF_REQUIRE(nvlist_exists_string(nvl, key));
1153         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1154             static_cast<const char *>(NULL));
1155
1156         cookie = NULL;
1157         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1158         cnvlist_free_string(cookie);
1159
1160         cookie = NULL;
1161         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1162         ATF_REQUIRE(nvlist_empty(nvl));
1163         ATF_REQUIRE(!nvlist_exists(nvl, key));
1164         ATF_REQUIRE(!nvlist_exists_string(nvl, key));
1165         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1166             static_cast<const char *>(NULL));
1167
1168         nvlist_destroy(nvl);
1169 }
1170
1171 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_free_nvlist);
1172 ATF_TEST_CASE_BODY(cnvlist_free_nvlist)
1173 {
1174         nvlist_t *nvl, *value;
1175         const char *key, *subkey;
1176         void *cookie;
1177         int type;
1178
1179         nvl = nvlist_create(0);
1180         ATF_REQUIRE(nvl != NULL);
1181         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1182         ATF_REQUIRE(nvlist_empty(nvl));
1183
1184         value = nvlist_create(0);
1185         ATF_REQUIRE(nvl != NULL);
1186         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1187         ATF_REQUIRE(nvlist_empty(nvl));
1188
1189         key = "name";
1190         subkey = "subname";
1191         cookie = NULL;
1192
1193         /* Add null to 'value' nvlist. */
1194         nvlist_add_null(value, subkey);
1195         ATF_REQUIRE_EQ(strcmp(subkey, nvlist_next(value, &type, &cookie)), 0);
1196         ATF_REQUIRE_EQ(nvlist_error(value), 0);
1197         ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
1198         ATF_REQUIRE(!nvlist_empty(value));
1199         ATF_REQUIRE(nvlist_exists(value, subkey));
1200         ATF_REQUIRE(nvlist_exists_null(value, subkey));
1201         ATF_REQUIRE_EQ(nvlist_next(value, &type, &cookie),
1202             static_cast<const char *>(NULL));
1203
1204         /* Add 'value' nvlist. */
1205         cookie = NULL;
1206         nvlist_move_nvlist(nvl, key, value);
1207         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1208         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1209         ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
1210         ATF_REQUIRE(!nvlist_empty(nvl));
1211         ATF_REQUIRE(nvlist_exists(nvl, key));
1212         ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
1213         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1214             static_cast<const char *>(NULL));
1215
1216         cookie = NULL;
1217         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1218         cnvlist_free_nvlist(cookie);
1219
1220         cookie = NULL;
1221         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1222         ATF_REQUIRE(nvlist_empty(nvl));
1223         ATF_REQUIRE(!nvlist_exists(nvl, key));
1224         ATF_REQUIRE(!nvlist_exists_nvlist(nvl, key));
1225         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1226             static_cast<const char *>(NULL));
1227
1228         nvlist_destroy(nvl);
1229 }
1230
1231 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_free_binary);
1232 ATF_TEST_CASE_BODY(cnvlist_free_binary)
1233 {
1234         nvlist_t *nvl;
1235         const char *key;
1236         void *in_binary;
1237         void *cookie;
1238         int type;
1239         size_t in_size;
1240
1241         nvl = nvlist_create(0);
1242         ATF_REQUIRE(nvl != NULL);
1243         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1244         ATF_REQUIRE(nvlist_empty(nvl));
1245
1246         cookie = NULL;
1247         key = "name";
1248         in_size = 13;
1249         in_binary = malloc(in_size);
1250         ATF_REQUIRE(in_binary != NULL);
1251         memset(in_binary, 0xa5, in_size);
1252
1253         nvlist_add_binary(nvl, key, in_binary, in_size);
1254         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1255         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1256         ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
1257         ATF_REQUIRE(!nvlist_empty(nvl));
1258         ATF_REQUIRE(nvlist_exists(nvl, key));
1259         ATF_REQUIRE(nvlist_exists_binary(nvl, key));
1260         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1261             static_cast<const char *>(NULL));
1262
1263         cookie = NULL;
1264         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1265         cnvlist_free_binary(cookie);
1266
1267         cookie = NULL;
1268         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1269         ATF_REQUIRE(nvlist_empty(nvl));
1270         ATF_REQUIRE(!nvlist_exists(nvl, key));
1271         ATF_REQUIRE(!nvlist_exists_nvlist(nvl, key));
1272         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1273             static_cast<const char *>(NULL));
1274
1275         nvlist_destroy(nvl);
1276 }
1277
1278 /* ATF cnvlist_free array tests. */
1279
1280 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_free_bool_array);
1281 ATF_TEST_CASE_BODY(cnvlist_free_bool_array)
1282 {
1283         nvlist_t *nvl;
1284         bool in_array[16];
1285         const char *key;
1286         void *cookie;
1287         int type, i;
1288
1289         for (i = 0; i < 16; i++)
1290                 in_array[i] = (i % 2 == 0);
1291
1292         nvl = nvlist_create(0);
1293         ATF_REQUIRE(nvl != NULL);
1294         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1295         ATF_REQUIRE(nvlist_empty(nvl));
1296
1297         cookie = NULL;
1298         key = "name";
1299
1300         nvlist_add_bool_array(nvl, key, in_array, 16);
1301         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1302         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1303         ATF_REQUIRE_EQ(type, NV_TYPE_BOOL_ARRAY);
1304         ATF_REQUIRE(!nvlist_empty(nvl));
1305         ATF_REQUIRE(nvlist_exists(nvl, key));
1306         ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
1307         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1308             static_cast<const char *>(NULL));
1309
1310         cookie = NULL;
1311         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1312         cnvlist_free_bool_array(cookie);
1313
1314         cookie = NULL;
1315         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1316         ATF_REQUIRE(nvlist_empty(nvl));
1317         ATF_REQUIRE(!nvlist_exists(nvl, key));
1318         ATF_REQUIRE(!nvlist_exists_bool(nvl, key));
1319         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1320             static_cast<const char *>(NULL));
1321
1322         nvlist_destroy(nvl);
1323 }
1324
1325 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_free_number_array);
1326 ATF_TEST_CASE_BODY(cnvlist_free_number_array)
1327 {
1328         nvlist_t *nvl;
1329         uint64_t in_array[16];
1330         const char *key;
1331         void *cookie;
1332         int type, i;
1333
1334         for (i = 0; i < 16; i++)
1335                 in_array[i] = i;
1336
1337         nvl = nvlist_create(0);
1338         ATF_REQUIRE(nvl != NULL);
1339         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1340         ATF_REQUIRE(nvlist_empty(nvl));
1341
1342         cookie = NULL;
1343         key = "name";
1344
1345         nvlist_add_number_array(nvl, key, in_array, 16);
1346         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1347         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1348         ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER_ARRAY);
1349         ATF_REQUIRE(!nvlist_empty(nvl));
1350         ATF_REQUIRE(nvlist_exists(nvl, key));
1351         ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
1352         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1353             static_cast<const char *>(NULL));
1354
1355         cookie = NULL;
1356         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1357         cnvlist_free_number_array(cookie);
1358
1359         cookie = NULL;
1360         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1361         ATF_REQUIRE(nvlist_empty(nvl));
1362         ATF_REQUIRE(!nvlist_exists(nvl, key));
1363         ATF_REQUIRE(!nvlist_exists_number_array(nvl, key));
1364         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1365             static_cast<const char *>(NULL));
1366
1367         nvlist_destroy(nvl);
1368 }
1369
1370 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_free_string_array);
1371 ATF_TEST_CASE_BODY(cnvlist_free_string_array)
1372 {
1373         nvlist_t *nvl;
1374         const char *in_array[4] = {"inequality", "sucks", ".", ""};
1375         const char *key;
1376         void *cookie;
1377         int type;
1378
1379         nvl = nvlist_create(0);
1380         ATF_REQUIRE(nvl != NULL);
1381         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1382         ATF_REQUIRE(nvlist_empty(nvl));
1383
1384         cookie = NULL;
1385         key = "name";
1386
1387         nvlist_add_string_array(nvl, key, in_array, 4);
1388         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1389         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1390         ATF_REQUIRE_EQ(type, NV_TYPE_STRING_ARRAY);
1391         ATF_REQUIRE(!nvlist_empty(nvl));
1392         ATF_REQUIRE(nvlist_exists(nvl, key));
1393         ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
1394         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1395             static_cast<const char *>(NULL));
1396
1397         cookie = NULL;
1398         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1399         cnvlist_free_string_array(cookie);
1400
1401         cookie = NULL;
1402         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1403         ATF_REQUIRE(nvlist_empty(nvl));
1404         ATF_REQUIRE(!nvlist_exists(nvl, key));
1405         ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
1406         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1407             static_cast<const char *>(NULL));
1408
1409         nvlist_destroy(nvl);
1410 }
1411
1412 ATF_TEST_CASE_WITHOUT_HEAD(cnvlist_free_nvlist_array);
1413 ATF_TEST_CASE_BODY(cnvlist_free_nvlist_array)
1414 {
1415         nvlist_t *testnvl[8];
1416         nvlist_t *nvl;
1417         void *cookie;
1418         unsigned int i;
1419         int type;
1420         const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
1421         const char *key;
1422
1423         for (i = 0; i < 8; i++) {
1424                 testnvl[i] = nvlist_create(0);
1425                 ATF_REQUIRE(testnvl[i] != NULL);
1426                 ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
1427                 ATF_REQUIRE(nvlist_empty(testnvl[i]));
1428                 nvlist_add_string(testnvl[i], "nvl/string", somestr[i]);
1429
1430                 cookie = NULL;
1431                 ATF_REQUIRE_EQ(strcmp("nvl/string", nvlist_next(testnvl[i],
1432                     &type, &cookie)), 0);
1433                 ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
1434                 ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
1435                 ATF_REQUIRE(!nvlist_empty(testnvl[i]));
1436                 ATF_REQUIRE(nvlist_exists(testnvl[i], "nvl/string"));
1437                 ATF_REQUIRE(nvlist_exists_string(testnvl[i], "nvl/string"));
1438                 ATF_REQUIRE_EQ(nvlist_next(testnvl[i], &type, &cookie),
1439                     static_cast<const char *>(NULL));
1440         }
1441
1442         nvl = nvlist_create(0);
1443         ATF_REQUIRE(nvl != NULL);
1444         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1445         ATF_REQUIRE(nvlist_empty(nvl));
1446
1447         key = "nvl/nvlist";
1448         cookie = NULL;
1449
1450         nvlist_add_nvlist_array(nvl, key, (const nvlist_t * const *)testnvl, 8);
1451         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1452         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1453         ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST_ARRAY);
1454         ATF_REQUIRE(!nvlist_empty(nvl));
1455         ATF_REQUIRE(nvlist_exists(nvl, key));
1456         ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
1457         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1458             static_cast<const char *>(NULL));
1459
1460         cookie = NULL;
1461         ATF_REQUIRE_EQ(strcmp(key, nvlist_next(nvl, &type, &cookie)), 0);
1462         cnvlist_free_nvlist_array(cookie);
1463
1464         cookie = NULL;
1465         ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1466         ATF_REQUIRE(nvlist_empty(nvl));
1467         ATF_REQUIRE(!nvlist_exists(nvl, key));
1468         ATF_REQUIRE(!nvlist_exists_nvlist_array(nvl, key));
1469         ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &cookie),
1470             static_cast<const char *>(NULL));
1471
1472         for (i = 0; i < 8; i++)
1473                 nvlist_destroy(testnvl[i]);
1474         nvlist_destroy(nvl);
1475 }
1476
1477 ATF_INIT_TEST_CASES(tp)
1478 {
1479         ATF_ADD_TEST_CASE(tp, cnvlist_get_bool);
1480         ATF_ADD_TEST_CASE(tp, cnvlist_get_bool_array);
1481         ATF_ADD_TEST_CASE(tp, cnvlist_get_number);
1482         ATF_ADD_TEST_CASE(tp, cnvlist_get_string);
1483         ATF_ADD_TEST_CASE(tp, cnvlist_get_nvlist);
1484         ATF_ADD_TEST_CASE(tp, cnvlist_get_descriptor);
1485         ATF_ADD_TEST_CASE(tp, cnvlist_get_binary);
1486         ATF_ADD_TEST_CASE(tp, cnvlist_get_number_array);
1487         ATF_ADD_TEST_CASE(tp, cnvlist_get_string_array);
1488         ATF_ADD_TEST_CASE(tp, cnvlist_get_nvlist_array);
1489         ATF_ADD_TEST_CASE(tp, cnvlist_get_descriptor_array);
1490         ATF_ADD_TEST_CASE(tp, cnvlist_take_bool);
1491         ATF_ADD_TEST_CASE(tp, cnvlist_take_number);
1492         ATF_ADD_TEST_CASE(tp, cnvlist_take_string);
1493         ATF_ADD_TEST_CASE(tp, cnvlist_take_nvlist);
1494         ATF_ADD_TEST_CASE(tp, cnvlist_take_binary);
1495         ATF_ADD_TEST_CASE(tp, cnvlist_take_bool_array);
1496         ATF_ADD_TEST_CASE(tp, cnvlist_take_number_array);
1497         ATF_ADD_TEST_CASE(tp, cnvlist_take_string_array);
1498         ATF_ADD_TEST_CASE(tp, cnvlist_take_nvlist_array);
1499         ATF_ADD_TEST_CASE(tp, cnvlist_free_bool);
1500         ATF_ADD_TEST_CASE(tp, cnvlist_free_number);
1501         ATF_ADD_TEST_CASE(tp, cnvlist_free_string);
1502         ATF_ADD_TEST_CASE(tp, cnvlist_free_nvlist);
1503         ATF_ADD_TEST_CASE(tp, cnvlist_free_binary);
1504         ATF_ADD_TEST_CASE(tp, cnvlist_free_bool_array);
1505         ATF_ADD_TEST_CASE(tp, cnvlist_free_number_array);
1506         ATF_ADD_TEST_CASE(tp, cnvlist_free_string_array);
1507         ATF_ADD_TEST_CASE(tp, cnvlist_free_nvlist_array);
1508 }