xref: /freebsd/lib/libnv/tests/nv_tests.cc (revision 81ad6265)
1 /*-
2  * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
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 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 AUTHOR 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 
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
29 
30 #include <sys/nv.h>
31 
32 #include <atf-c++.hpp>
33 
34 #include <errno.h>
35 #include <limits>
36 #include <set>
37 #include <sstream>
38 #include <string>
39 
40 /*
41  * Test that a newly created nvlist has no errors, and is empty.
42  */
43 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
44 ATF_TEST_CASE_BODY(nvlist_create__is_empty)
45 {
46 	nvlist_t *nvl;
47 	int type;
48 	void *it;
49 
50 	nvl = nvlist_create(0);
51 
52 	ATF_REQUIRE(nvl != NULL);
53 
54 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
55 	ATF_REQUIRE(nvlist_empty(nvl));
56 
57 	it = NULL;
58 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
59 
60 	nvlist_destroy(nvl);
61 }
62 
63 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
64 ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
65 {
66 	nvlist_t *nvl;
67 	void *it;
68 	const char *key;
69 	int type;
70 
71 	key = "key";
72 	nvl = nvlist_create(0);
73 
74 	ATF_REQUIRE(nvl != NULL);
75 	ATF_REQUIRE(!nvlist_exists(nvl, key));
76 
77 	nvlist_add_null(nvl, key);
78 
79 	ATF_REQUIRE(!nvlist_empty(nvl));
80 	ATF_REQUIRE(nvlist_exists(nvl, key));
81 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
82 	ATF_REQUIRE(nvlist_exists_null(nvl, "key"));
83 
84 	/* Iterate over the nvlist; ensure that it has only our one key. */
85 	it = NULL;
86 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
87 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
88 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
89 
90 	nvlist_destroy(nvl);
91 }
92 
93 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
94 ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
95 {
96 	nvlist_t *nvl;
97 	void *it;
98 	const char *key;
99 	int type;
100 
101 	key = "name";
102 	nvl = nvlist_create(0);
103 
104 	ATF_REQUIRE(nvl != NULL);
105 	ATF_REQUIRE(!nvlist_exists(nvl, key));
106 
107 	nvlist_add_bool(nvl, key, true);
108 
109 	ATF_REQUIRE(!nvlist_empty(nvl));
110 	ATF_REQUIRE(nvlist_exists(nvl, key));
111 	ATF_REQUIRE(nvlist_exists(nvl, "name"));
112 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
113 	ATF_REQUIRE(nvlist_exists_bool(nvl, "name"));
114 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
115 
116 	/* Iterate over the nvlist; ensure that it has only our one key. */
117 	it = NULL;
118 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
119 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
120 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
121 
122 	nvlist_destroy(nvl);
123 }
124 
125 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
126 ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
127 {
128 	nvlist_t *nvl;
129 	void *it;
130 	const char *key;
131 	uint64_t value;
132 	int type;
133 
134 	key = "foo123";
135 	value = 71965;
136 	nvl = nvlist_create(0);
137 
138 	ATF_REQUIRE(nvl != NULL);
139 	ATF_REQUIRE(!nvlist_exists(nvl, key));
140 
141 	nvlist_add_number(nvl, key, value);
142 
143 	ATF_REQUIRE(!nvlist_empty(nvl));
144 	ATF_REQUIRE(nvlist_exists(nvl, key));
145 	ATF_REQUIRE(nvlist_exists(nvl, "foo123"));
146 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
147 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
148 
149 	/* Iterate over the nvlist; ensure that it has only our one key. */
150 	it = NULL;
151 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
152 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
153 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
154 
155 	nvlist_destroy(nvl);
156 }
157 
158 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
159 ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
160 {
161 	nvlist_t *nvl;
162 	void *it;
163 	const char *key;
164 	const char *value;
165 	int type;
166 
167 	key = "test";
168 	value = "fgjdkgjdk";
169 	nvl = nvlist_create(0);
170 
171 	ATF_REQUIRE(nvl != NULL);
172 	ATF_REQUIRE(!nvlist_exists(nvl, key));
173 
174 	nvlist_add_string(nvl, key, value);
175 
176 	ATF_REQUIRE(!nvlist_empty(nvl));
177 	ATF_REQUIRE(nvlist_exists(nvl, key));
178 	ATF_REQUIRE(nvlist_exists(nvl, "test"));
179 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
180 	ATF_REQUIRE(nvlist_exists_string(nvl, "test"));
181 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
182 
183 	/* nvlist_add_* is required to clone the value, so check for that. */
184 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
185 
186 	/* Iterate over the nvlist; ensure that it has only our one key. */
187 	it = NULL;
188 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
189 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
190 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
191 
192 	nvlist_destroy(nvl);
193 }
194 
195 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
196 ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
197 {
198 	nvlist_t *nvl;
199 	void *it;
200 	const char *key, *subkey;
201 	nvlist_t *sublist;
202 	const nvlist_t *value;
203 	int type;
204 
205 	key = "test";
206 	subkey = "subkey";
207 	sublist = nvlist_create(0);
208 	nvl = nvlist_create(0);
209 
210 	ATF_REQUIRE(nvl != NULL);
211 	ATF_REQUIRE(!nvlist_exists(nvl, key));
212 
213 	nvlist_add_null(sublist, subkey);
214 	nvlist_add_nvlist(nvl, key, sublist);
215 
216 	ATF_REQUIRE(!nvlist_empty(nvl));
217 	ATF_REQUIRE(nvlist_exists(nvl, key));
218 	ATF_REQUIRE(nvlist_exists(nvl, "test"));
219 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
220 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, "test"));
221 
222 	value = nvlist_get_nvlist(nvl, key);
223 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
224 
225 	/* nvlist_add_* is required to clone the value, so check for that. */
226 	ATF_REQUIRE(sublist != value);
227 
228 	/* Iterate over the nvlist; ensure that it has only our one key. */
229 	it = NULL;
230 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
231 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
232 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
233 
234 	nvlist_destroy(sublist);
235 	nvlist_destroy(nvl);
236 }
237 
238 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error);
239 ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error)
240 {
241 	nvlist_t *nvl, *parent;
242 
243 	nvl = nvlist_create(0);
244 	parent = nvlist_create(0);
245 
246 	nvlist_set_error(nvl, EBADF);
247 	nvlist_add_nvlist(parent, "test", nvl);
248 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
249 
250 	nvlist_destroy(nvl);
251 	nvlist_destroy(parent);
252 }
253 
254 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
255 ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
256 {
257 	nvlist_t *nvl;
258 	void *it;
259 	const char *key;
260 	void *value;
261 	const void *ret_value;
262 	size_t value_size, ret_size;
263 	int type;
264 
265 	key = "binary";
266 	value_size = 13;
267 	value = malloc(value_size);
268 	memset(value, 0xa5, value_size);
269 	nvl = nvlist_create(0);
270 
271 	ATF_REQUIRE(nvl != NULL);
272 	ATF_REQUIRE(!nvlist_exists(nvl, key));
273 
274 	nvlist_add_binary(nvl, key, value, value_size);
275 
276 	ATF_REQUIRE(!nvlist_empty(nvl));
277 	ATF_REQUIRE(nvlist_exists(nvl, key));
278 	ATF_REQUIRE(nvlist_exists(nvl, "binary"));
279 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
280 	ATF_REQUIRE(nvlist_exists_binary(nvl, "binary"));
281 
282 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
283 	ATF_REQUIRE_EQ(value_size, ret_size);
284 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
285 
286 	/* nvlist_add_* is required to clone the value, so check for that. */
287 	ATF_REQUIRE(value != ret_value);
288 
289 	/* Iterate over the nvlist; ensure that it has only our one key. */
290 	it = NULL;
291 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
292 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
293 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
294 
295 	nvlist_destroy(nvl);
296 	free(value);
297 }
298 
299 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
300 ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
301 {
302 	nvlist_t *nvl, *clone;
303 
304 	nvl = nvlist_create(0);
305 	ATF_REQUIRE(nvl != NULL);
306 
307 	clone = nvlist_clone(nvl);
308 	ATF_REQUIRE(clone != NULL);
309 	ATF_REQUIRE(clone != nvl);
310 	ATF_REQUIRE(nvlist_empty(clone));
311 
312 	nvlist_destroy(clone);
313 	nvlist_destroy(nvl);
314 }
315 
316 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
317 ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
318 {
319 	nvlist_t *nvl, *clone;
320 	const char *key;
321 	void *it;
322 	uint64_t value;
323 	int type;
324 
325 	nvl = nvlist_create(0);
326 	ATF_REQUIRE(nvl != NULL);
327 
328 	key = "testkey";
329 	value = 684874;
330 	nvlist_add_number(nvl, key, value);
331 
332 	clone = nvlist_clone(nvl);
333 	ATF_REQUIRE(clone != NULL);
334 	ATF_REQUIRE(clone != nvl);
335 	ATF_REQUIRE(nvlist_exists_number(clone, key));
336 	ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
337 
338 	/* Iterate over the nvlist; ensure that it has only our one key. */
339 	it = NULL;
340 	ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
341 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
342 	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL));
343 
344 	nvlist_destroy(clone);
345 	nvlist_destroy(nvl);
346 }
347 
348 static const char * const test_subnvlist_key = "nvlist";
349 
350 static const char * const test_string_key = "string";
351 static const char * const test_string_val = "59525";
352 
353 static nvlist_t*
354 create_test_nvlist(void)
355 {
356 	nvlist_t *nvl, *sublist;
357 
358 	nvl = nvlist_create(0);
359 	ATF_REQUIRE(nvl != NULL);
360 
361 	sublist = nvlist_create(0);
362 	ATF_REQUIRE(sublist != NULL);
363 
364 	nvlist_add_string(sublist, test_string_key, test_string_val);
365 	nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
366 
367 	return (nvl);
368 }
369 
370 static void
371 verify_test_nvlist(const nvlist_t *nvl)
372 {
373 	void *it;
374 	const nvlist_t *value;
375 	int type;
376 
377 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
378 
379 	value = nvlist_get_nvlist(nvl, test_subnvlist_key);
380 
381 	ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
382 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
383 	ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
384 
385 	/* Iterate over both nvlists; ensure that each has only the one key. */
386 	it = NULL;
387 	ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
388 	    test_string_key), 0);
389 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
390 	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL));
391 
392 	it = NULL;
393 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
394 	    test_subnvlist_key), 0);
395 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
396 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
397 }
398 
399 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
400 ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
401 {
402 	nvlist_t *nvl, *clone;
403 
404 	nvl = create_test_nvlist();
405 	clone = nvlist_clone(nvl);
406 
407 	ATF_REQUIRE(clone != NULL);
408 	ATF_REQUIRE(clone != nvl);
409 	verify_test_nvlist(clone);
410 
411 	nvlist_destroy(clone);
412 	nvlist_destroy(nvl);
413 }
414 
415 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist);
416 ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist)
417 {
418 	nvlist_t *nvl, *clone;
419 
420 	nvl = nvlist_create(0);
421 	ATF_REQUIRE(nvl != NULL);
422 
423 	nvlist_set_error(nvl, ENOMEM);
424 
425 	clone = nvlist_clone(nvl);
426 	ATF_REQUIRE(clone == NULL);
427 
428 	nvlist_destroy(nvl);
429 }
430 
431 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist);
432 ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist)
433 {
434 	nvlist_t *nvl, *unpacked;
435 	void *packed;
436 	size_t packed_size;
437 
438 	nvl = nvlist_create(0);
439 	ATF_REQUIRE(nvl != NULL);
440 
441 	packed = nvlist_pack(nvl, &packed_size);
442 	ATF_REQUIRE(packed != NULL);
443 
444 	unpacked = nvlist_unpack(packed, packed_size, 0);
445 	ATF_REQUIRE(unpacked != NULL);
446 	ATF_REQUIRE(unpacked != nvl);
447 	ATF_REQUIRE(nvlist_empty(unpacked));
448 
449 	nvlist_destroy(unpacked);
450 	nvlist_destroy(nvl);
451 	free(packed);
452 }
453 
454 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__flags_nvlist);
455 ATF_TEST_CASE_BODY(nvlist_unpack__flags_nvlist)
456 {
457 	nvlist_t *nvl, *unpacked;
458 	void *packed;
459 	size_t packed_size;
460 
461 	nvl = nvlist_create(NV_FLAG_NO_UNIQUE);
462 	ATF_REQUIRE(nvl != NULL);
463 
464 	nvlist_add_bool(nvl, "name", true);
465 	ATF_REQUIRE(!nvlist_empty(nvl));
466 	ATF_REQUIRE(nvlist_exists_bool(nvl, "name"));
467 
468 	packed = nvlist_pack(nvl, &packed_size);
469 	ATF_REQUIRE(packed != NULL);
470 
471 	unpacked = nvlist_unpack(packed, packed_size, 0);
472 	ATF_REQUIRE(unpacked == NULL);
473 
474 	unpacked = nvlist_unpack(packed, packed_size, NV_FLAG_IGNORE_CASE);
475 	ATF_REQUIRE(unpacked == NULL);
476 
477 	unpacked = nvlist_unpack(packed, packed_size, NV_FLAG_NO_UNIQUE);
478 	ATF_REQUIRE(unpacked != NULL);
479 	ATF_REQUIRE(unpacked != nvl);
480 	ATF_REQUIRE(!nvlist_empty(unpacked));
481 	ATF_REQUIRE(nvlist_exists_bool(unpacked, "name"));
482 
483 	nvlist_destroy(unpacked);
484 	nvlist_destroy(nvl);
485 	free(packed);
486 }
487 
488 static void
489 verify_null(const nvlist_t *nvl, int type)
490 {
491 
492 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
493 }
494 
495 static void
496 verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value)
497 {
498 
499 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
500 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value);
501 }
502 
503 static void
504 verify_string(const nvlist_t *nvl, const char *name, int type,
505     const char * value)
506 {
507 
508 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
509 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0);
510 }
511 
512 static void
513 verify_nvlist(const nvlist_t *nvl, const char *name, int type)
514 {
515 
516 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
517 	verify_test_nvlist(nvlist_get_nvlist(nvl, name));
518 }
519 
520 static void
521 verify_binary(const nvlist_t *nvl, const char *name, int type,
522     const void * value, size_t size)
523 {
524 	const void *actual_value;
525 	size_t actual_size;
526 
527 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
528 	actual_value = nvlist_get_binary(nvl, name, &actual_size);
529 	ATF_REQUIRE_EQ(size, actual_size);
530 	ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0);
531 }
532 
533 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values);
534 ATF_TEST_CASE_BODY(nvlist_pack__multiple_values)
535 {
536 	std::ostringstream msg;
537 	std::set<std::string> keys_seen;
538 	nvlist_t *nvl, *unpacked, *nvvalue;
539 	const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name;
540 	int numvalue;
541 	const char * strvalue;
542 	void *binvalue, *packed, *it;
543 	size_t binsize, packed_size;
544 	int type;
545 
546 	nvl = nvlist_create(0);
547 
548 	nullkey = "null";
549 	nvlist_add_null(nvl, nullkey);
550 
551 	numkey = "number";
552 	numvalue = 939853984;
553 	nvlist_add_number(nvl, numkey, numvalue);
554 
555 	strkey = "string";
556 	strvalue = "jfieutijf";
557 	nvlist_add_string(nvl, strkey, strvalue);
558 
559 	nvkey = "nvlist";
560 	nvvalue = create_test_nvlist();
561 	nvlist_move_nvlist(nvl, nvkey, nvvalue);
562 
563 	binkey = "binary";
564 	binsize = 4;
565 	binvalue = malloc(binsize);
566 	memset(binvalue, 'b', binsize);
567 	nvlist_move_binary(nvl, binkey, binvalue, binsize);
568 
569 	packed = nvlist_pack(nvl, &packed_size);
570 	ATF_REQUIRE(packed != NULL);
571 
572 	unpacked = nvlist_unpack(packed, packed_size, 0);
573 	ATF_REQUIRE(unpacked != 0);
574 
575 	it = NULL;
576 	while ((name = nvlist_next(unpacked, &type, &it)) != NULL) {
577 		/* Ensure that we see every key only once. */
578 		ATF_REQUIRE_EQ(keys_seen.count(name), 0);
579 
580 		if (strcmp(name, nullkey) == 0)
581 			verify_null(unpacked, type);
582 		else if (strcmp(name, numkey) == 0)
583 			verify_number(unpacked, name, type, numvalue);
584 		else if (strcmp(name, strkey) == 0)
585 			verify_string(unpacked, name, type, strvalue);
586 		else if (strcmp(name, nvkey) == 0)
587 			verify_nvlist(unpacked, name, type);
588 		else if (strcmp(name, binkey) == 0)
589 			verify_binary(unpacked, name, type, binvalue, binsize);
590 		else {
591 			msg << "Unexpected key :'" << name << "'";
592 			ATF_FAIL(msg.str().c_str());
593 		}
594 
595 		keys_seen.insert(name);
596 	}
597 
598 	/* Ensure that we saw every key. */
599 	ATF_REQUIRE_EQ(keys_seen.size(), 5);
600 
601 	nvlist_destroy(nvl);
602 	nvlist_destroy(unpacked);
603 	free(packed);
604 }
605 
606 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist);
607 ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist)
608 {
609 	nvlist_t *nvl;
610 	void *packed;
611 	size_t size;
612 
613 	nvl = nvlist_create(0);
614 	ATF_REQUIRE(nvl != NULL);
615 
616 	nvlist_set_error(nvl, ENOMEM);
617 
618 	packed = nvlist_pack(nvl, &size);
619 	ATF_REQUIRE(packed == NULL);
620 
621 	nvlist_destroy(nvl);
622 }
623 
624 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key);
625 ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key)
626 {
627 	nvlist_t *nvl, *unpacked;
628 	const char *key1, *key2;
629 	void *packed, *keypos;
630 	size_t size, keylen;
631 
632 	nvl = nvlist_create(0);
633 
634 	key1 = "key1";
635 	keylen = strlen(key1);
636 	nvlist_add_number(nvl, key1, 5);
637 
638 	key2 = "key2";
639 	ATF_REQUIRE_EQ(keylen, strlen(key2));
640 	nvlist_add_number(nvl, key2, 10);
641 
642 	packed = nvlist_pack(nvl, &size);
643 	ATF_REQUIRE(packed != NULL);
644 
645 	/*
646 	 * Mangle the packed nvlist by replacing key1 with key2, creating a
647 	 * packed nvlist with a duplicate key.
648 	 */
649 	keypos = memmem(packed, size, key1, keylen);
650 	ATF_REQUIRE(keypos != NULL);
651 	memcpy(keypos, key2, keylen);
652 
653 	unpacked = nvlist_unpack(packed, size, 0);
654 	ATF_REQUIRE(nvlist_error(unpacked) != 0);
655 
656 	free(packed);
657 	nvlist_destroy(nvl);
658 	nvlist_destroy(unpacked);
659 }
660 
661 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert);
662 ATF_TEST_CASE_BODY(nvlist_move_string__single_insert)
663 {
664 	nvlist_t *nvl;
665 	const char *key;
666 	char *value;
667 
668 	nvl = nvlist_create(0);
669 	ATF_REQUIRE(nvl != NULL);
670 
671 	key = "testkey";
672 	value = strdup("testval");
673 	ATF_REQUIRE(value != NULL);
674 
675 	nvlist_move_string(nvl, key, value);
676 	ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value);
677 
678 	nvlist_destroy(nvl);
679 }
680 
681 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child);
682 ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child)
683 {
684 	nvlist_t *parent;
685 
686 	parent = nvlist_create(0);
687 
688 	nvlist_move_nvlist(parent, "test", NULL);
689 
690 	ATF_REQUIRE(nvlist_error(parent) != 0);
691 
692 	nvlist_destroy(parent);
693 }
694 
695 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error);
696 ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error)
697 {
698 	nvlist_t *nvl, *parent;
699 
700 	nvl = nvlist_create(0);
701 	parent = nvlist_create(0);
702 
703 	nvlist_set_error(nvl, EBADF);
704 	nvlist_move_nvlist(parent, "test", nvl);
705 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
706 
707 	nvlist_destroy(parent);
708 }
709 
710 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert);
711 ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert)
712 {
713 	nvlist_t *nvl;
714 	const char *key;
715 	nvlist_t *value;
716 
717 	nvl = nvlist_create(0);
718 	ATF_REQUIRE(nvl != NULL);
719 
720 	key = "testkey";
721 	value = nvlist_create(0);
722 	ATF_REQUIRE(value != NULL);
723 
724 	nvlist_move_nvlist(nvl, key, value);
725 	ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value);
726 
727 	nvlist_destroy(nvl);
728 }
729 
730 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert);
731 ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert)
732 {
733 	nvlist_t *nvl;
734 	const char *key;
735 	void *value;
736 	size_t size, actual_size;
737 
738 	nvl = nvlist_create(0);
739 	ATF_REQUIRE(nvl != NULL);
740 
741 	key = "testkey";
742 	size = 73;
743 	value = malloc(size);
744 	ATF_REQUIRE(value != NULL);
745 
746 	nvlist_move_binary(nvl, key, value, size);
747 	ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value);
748 	ATF_REQUIRE_EQ(size, actual_size);
749 
750 	nvlist_destroy(nvl);
751 }
752 
753 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove);
754 ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove)
755 {
756 	nvlist_t *nvl;
757 	const char *testkey;
758 	bool testval;
759 
760 	nvl = nvlist_create(0);
761 	ATF_REQUIRE(nvl != NULL);
762 
763 	testkey = "boolkey";
764 	testval = false;
765 	nvlist_add_bool(nvl, testkey, testval);
766 
767 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
768 	ATF_REQUIRE(nvlist_empty(nvl));
769 
770 	nvlist_destroy(nvl);
771 }
772 
773 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged);
774 ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged)
775 {
776 	nvlist_t *nvl;
777 	const char *testkey, *otherkey1, *otherkey2;
778 	bool testval, otherval1;
779 	nvlist_t *otherval2;
780 
781 	nvl = nvlist_create(0);
782 	ATF_REQUIRE(nvl != NULL);
783 
784 	testkey = "boolkey";
785 	testval = true;
786 	nvlist_add_bool(nvl, testkey, testval);
787 
788 	otherkey1 = "key1";
789 	otherval1 = false;
790 	nvlist_add_bool(nvl, otherkey1, otherval1);
791 
792 	otherkey2 = "key2";
793 	otherval2 = create_test_nvlist();
794 	nvlist_move_nvlist(nvl, otherkey2, otherval2);
795 
796 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
797 
798 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1));
799 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1);
800 
801 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2));
802 	verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2));
803 
804 	nvlist_destroy(nvl);
805 }
806 
807 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove);
808 ATF_TEST_CASE_BODY(nvlist_take_number__single_remove)
809 {
810 	nvlist_t *nvl;
811 	const char *testkey;
812 	uint64_t testval;
813 
814 	nvl = nvlist_create(0);
815 	ATF_REQUIRE(nvl != NULL);
816 
817 	testkey = "numkey";
818 	testval = std::numeric_limits<uint64_t>::max();
819 	nvlist_add_number(nvl, testkey, testval);
820 
821 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
822 	ATF_REQUIRE(nvlist_empty(nvl));
823 
824 	nvlist_destroy(nvl);
825 }
826 
827 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged);
828 ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged)
829 {
830 	nvlist_t *nvl;
831 	const char *testkey, *otherkey1, *otherkey2;
832 	uint64_t testval, otherval1;
833 	const char *otherval2;
834 
835 	nvl = nvlist_create(0);
836 	ATF_REQUIRE(nvl != NULL);
837 
838 	otherkey1 = "key1";
839 	otherval1 = 5;
840 	nvlist_add_number(nvl, otherkey1, otherval1);
841 
842 	testkey = "numkey";
843 	testval = 1654;
844 	nvlist_add_number(nvl, testkey, testval);
845 
846 	otherkey2 = "key2";
847 	otherval2 = "string";
848 	nvlist_add_string(nvl, otherkey2, otherval2);
849 
850 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
851 
852 	ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1));
853 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1);
854 
855 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2));
856 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0);
857 
858 	nvlist_destroy(nvl);
859 }
860 
861 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove);
862 ATF_TEST_CASE_BODY(nvlist_take_string__single_remove)
863 {
864 	nvlist_t *nvl;
865 	const char *testkey;
866 	const char *testval;
867 
868 	nvl = nvlist_create(0);
869 	ATF_REQUIRE(nvl != NULL);
870 
871 	testkey = "numkey";
872 	testval = "nvlist";
873 	nvlist_add_string(nvl, testkey, testval);
874 
875 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
876 	ATF_REQUIRE(nvlist_empty(nvl));
877 
878 	nvlist_destroy(nvl);
879 }
880 
881 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged);
882 ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged)
883 {
884 	nvlist_t *nvl;
885 	const char *testkey, *otherkey1, *otherkey2;
886 	const char *testval, *otherval1;
887 	bool otherval2;
888 
889 	nvl = nvlist_create(0);
890 	ATF_REQUIRE(nvl != NULL);
891 
892 	otherkey1 = "key1";
893 	otherval1 = "fjdifjdk";
894 	nvlist_add_string(nvl, otherkey1, otherval1);
895 
896 	otherkey2 = "key2";
897 	otherval2 = true;
898 	nvlist_add_bool(nvl, otherkey2, otherval2);
899 
900 	testkey = "strkey";
901 	testval = "1654";
902 	nvlist_add_string(nvl, testkey, testval);
903 
904 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
905 
906 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1));
907 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0);
908 
909 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
910 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
911 
912 	nvlist_destroy(nvl);
913 }
914 
915 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove);
916 ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove)
917 {
918 	nvlist_t *nvl;
919 	const char *testkey;
920 	nvlist_t *testval;
921 
922 	nvl = nvlist_create(0);
923 	ATF_REQUIRE(nvl != NULL);
924 
925 	testkey = "numkey";
926 	testval = create_test_nvlist();
927 	nvlist_move_nvlist(nvl, testkey, testval);
928 
929 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
930 	ATF_REQUIRE(nvlist_empty(nvl));
931 
932 	nvlist_destroy(nvl);
933 }
934 
935 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged);
936 ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged)
937 {
938 	nvlist_t *nvl;
939 	const char *testkey, *otherkey1, *otherkey2;
940 	nvlist_t *testval, *otherval1;
941 
942 	nvl = nvlist_create(0);
943 	ATF_REQUIRE(nvl != NULL);
944 
945 	testkey = "strkey";
946 	testval = create_test_nvlist();
947 	nvlist_move_nvlist(nvl, testkey, testval);
948 
949 	otherkey1 = "key1";
950 	otherval1 = nvlist_create(0);
951 	nvlist_move_nvlist(nvl, otherkey1, otherval1);
952 
953 	otherkey2 = "key2";
954 	nvlist_add_null(nvl, otherkey2);
955 
956 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
957 
958 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1));
959 	ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1)));
960 
961 	ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2));
962 
963 	nvlist_destroy(nvl);
964 }
965 
966 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove);
967 ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove)
968 {
969 	nvlist_t *nvl;
970 	const char *testkey;
971 	void *testval;
972 	const void *actual_val;
973 	size_t testsize, actual_size;
974 
975 	nvl = nvlist_create(0);
976 	ATF_REQUIRE(nvl != NULL);
977 
978 	testkey = "numkey";
979 	testsize = 457;
980 	testval = malloc(testsize);
981 	memset(testval, '5', testsize);
982 	nvlist_move_binary(nvl, testkey, testval, testsize);
983 
984 	actual_val = nvlist_take_binary(nvl, testkey, &actual_size);
985 	ATF_REQUIRE_EQ(testsize, actual_size);
986 	ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0);
987 	ATF_REQUIRE(nvlist_empty(nvl));
988 
989 	nvlist_destroy(nvl);
990 }
991 
992 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged);
993 ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged)
994 {
995 	nvlist_t *nvl;
996 	const char *testkey, *otherkey1, *otherkey2;
997 	const void *actual_value;
998 	char testval[] = "gjiertj";
999 	char otherval1[] = "fdreg";
1000 	size_t testsize, othersize, actual_size;
1001 	bool otherval2;
1002 
1003 	nvl = nvlist_create(0);
1004 	ATF_REQUIRE(nvl != NULL);
1005 
1006 	otherkey1 = "key1";
1007 	othersize = sizeof(otherval1);
1008 	nvlist_add_binary(nvl, otherkey1, otherval1, othersize);
1009 
1010 	otherkey2 = "key2";
1011 	otherval2 = true;
1012 	nvlist_add_bool(nvl, otherkey2, otherval2);
1013 
1014 	testkey = "strkey";
1015 	testsize = sizeof(testval);
1016 	nvlist_add_binary(nvl, testkey, testval, testsize);
1017 
1018 	actual_value = nvlist_take_binary(nvl, testkey, &actual_size);
1019 	ATF_REQUIRE_EQ(testsize, actual_size);
1020 	ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0);
1021 
1022 	ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1));
1023 	actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size);
1024 	ATF_REQUIRE_EQ(othersize, actual_size);
1025 	ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0);
1026 
1027 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
1028 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
1029 
1030 	nvlist_destroy(nvl);
1031 }
1032 
1033 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null);
1034 ATF_TEST_CASE_BODY(nvlist_free__single_null)
1035 {
1036 	nvlist_t *nvl;
1037 	const char *key;
1038 
1039 	nvl = nvlist_create(0);
1040 	key = "test";
1041 	nvlist_add_null(nvl, key);
1042 
1043 	nvlist_free(nvl, key);
1044 	ATF_REQUIRE(nvlist_empty(nvl));
1045 
1046 	nvlist_destroy(nvl);
1047 }
1048 
1049 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool);
1050 ATF_TEST_CASE_BODY(nvlist_free__single_bool)
1051 {
1052 	nvlist_t *nvl;
1053 	const char *key;
1054 
1055 	nvl = nvlist_create(0);
1056 	key = "test";
1057 	nvlist_add_bool(nvl, key, true);
1058 
1059 	nvlist_free(nvl, key);
1060 	ATF_REQUIRE(nvlist_empty(nvl));
1061 
1062 	nvlist_destroy(nvl);
1063 }
1064 
1065 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number);
1066 ATF_TEST_CASE_BODY(nvlist_free__single_number)
1067 {
1068 	nvlist_t *nvl;
1069 	const char *key;
1070 
1071 	nvl = nvlist_create(0);
1072 	key = "test";
1073 	nvlist_add_number(nvl, key, 584);
1074 
1075 	nvlist_free(nvl, key);
1076 	ATF_REQUIRE(nvlist_empty(nvl));
1077 
1078 	nvlist_destroy(nvl);
1079 }
1080 
1081 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string);
1082 ATF_TEST_CASE_BODY(nvlist_free__single_string)
1083 {
1084 	nvlist_t *nvl;
1085 	const char *key;
1086 
1087 	nvl = nvlist_create(0);
1088 	key = "test";
1089 	nvlist_add_string(nvl, key, "gjkfkjd");
1090 
1091 	nvlist_free(nvl, key);
1092 	ATF_REQUIRE(nvlist_empty(nvl));
1093 
1094 	nvlist_destroy(nvl);
1095 }
1096 
1097 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist);
1098 ATF_TEST_CASE_BODY(nvlist_free__single_nvlist)
1099 {
1100 	nvlist_t *nvl;
1101 	const char *key;
1102 
1103 	nvl = nvlist_create(0);
1104 	key = "test";
1105 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1106 
1107 	nvlist_free(nvl, key);
1108 	ATF_REQUIRE(nvlist_empty(nvl));
1109 
1110 	nvlist_destroy(nvl);
1111 }
1112 
1113 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary);
1114 ATF_TEST_CASE_BODY(nvlist_free__single_binary)
1115 {
1116 	nvlist_t *nvl;
1117 	const char *key;
1118 
1119 	nvl = nvlist_create(0);
1120 	key = "test";
1121 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1122 
1123 	nvlist_free(nvl, key);
1124 	ATF_REQUIRE(nvlist_empty(nvl));
1125 
1126 	nvlist_destroy(nvl);
1127 }
1128 
1129 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null);
1130 ATF_TEST_CASE_BODY(nvlist_free_null__single_null)
1131 {
1132 	nvlist_t *nvl;
1133 	const char *key;
1134 
1135 	nvl = nvlist_create(0);
1136 	key = "test";
1137 	nvlist_add_null(nvl, key);
1138 
1139 	nvlist_free_null(nvl, key);
1140 	ATF_REQUIRE(nvlist_empty(nvl));
1141 
1142 	nvlist_destroy(nvl);
1143 }
1144 
1145 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool);
1146 ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool)
1147 {
1148 	nvlist_t *nvl;
1149 	const char *key;
1150 
1151 	nvl = nvlist_create(0);
1152 	key = "test";
1153 	nvlist_add_bool(nvl, key, true);
1154 
1155 	nvlist_free_bool(nvl, key);
1156 	ATF_REQUIRE(nvlist_empty(nvl));
1157 
1158 	nvlist_destroy(nvl);
1159 }
1160 
1161 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number);
1162 ATF_TEST_CASE_BODY(nvlist_free_number__single_number)
1163 {
1164 	nvlist_t *nvl;
1165 	const char *key;
1166 
1167 	nvl = nvlist_create(0);
1168 	key = "test";
1169 	nvlist_add_number(nvl, key, 584);
1170 
1171 	nvlist_free_number(nvl, key);
1172 	ATF_REQUIRE(nvlist_empty(nvl));
1173 
1174 	nvlist_destroy(nvl);
1175 }
1176 
1177 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string);
1178 ATF_TEST_CASE_BODY(nvlist_free_string__single_string)
1179 {
1180 	nvlist_t *nvl;
1181 	const char *key;
1182 
1183 	nvl = nvlist_create(0);
1184 	key = "test";
1185 	nvlist_add_string(nvl, key, "gjkfkjd");
1186 
1187 	nvlist_free_string(nvl, key);
1188 	ATF_REQUIRE(nvlist_empty(nvl));
1189 
1190 	nvlist_destroy(nvl);
1191 }
1192 
1193 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist);
1194 ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist)
1195 {
1196 	nvlist_t *nvl;
1197 	const char *key;
1198 
1199 	nvl = nvlist_create(0);
1200 	key = "test";
1201 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1202 
1203 	nvlist_free_nvlist(nvl, key);
1204 	ATF_REQUIRE(nvlist_empty(nvl));
1205 
1206 	nvlist_destroy(nvl);
1207 }
1208 
1209 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary);
1210 ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary)
1211 {
1212 	nvlist_t *nvl;
1213 	const char *key;
1214 
1215 	nvl = nvlist_create(0);
1216 	key = "test";
1217 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1218 
1219 	nvlist_free_binary(nvl, key);
1220 	ATF_REQUIRE(nvlist_empty(nvl));
1221 
1222 	nvlist_destroy(nvl);
1223 }
1224 
1225 ATF_INIT_TEST_CASES(tp)
1226 {
1227 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
1228 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
1229 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
1230 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
1231 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
1232 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
1233 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error);
1234 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
1235 
1236 	ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
1237 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
1238 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
1239 	ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist);
1240 
1241 	ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist);
1242 	ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values);
1243 	ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist);
1244 	ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key);
1245 	ATF_ADD_TEST_CASE(tp, nvlist_unpack__flags_nvlist);
1246 
1247 	ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert);
1248 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert);
1249 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child);
1250 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error);
1251 	ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert);
1252 
1253 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove);
1254 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged);
1255 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove);
1256 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged);
1257 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove);
1258 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged);
1259 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove);
1260 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged);
1261 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove);
1262 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged);
1263 
1264 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_null);
1265 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool);
1266 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_number);
1267 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_string);
1268 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist);
1269 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary);
1270 
1271 	ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null);
1272 	ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool);
1273 	ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number);
1274 	ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string);
1275 	ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist);
1276 	ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary);
1277 }
1278