xref: /freebsd/lib/libnv/tests/nv_tests.cc (revision 37c6848ce6a7f0204d125fe2860621d98c20d61c)
13075c896SRyan Stone /*-
23075c896SRyan Stone  * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
33075c896SRyan Stone  * All rights reserved.
43075c896SRyan Stone  *
53075c896SRyan Stone  * Redistribution and use in source and binary forms, with or without
63075c896SRyan Stone  * modification, are permitted provided that the following conditions
73075c896SRyan Stone  * are met:
83075c896SRyan Stone  * 1. Redistributions of source code must retain the above copyright
93075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer.
103075c896SRyan Stone  * 2. Redistributions in binary form must reproduce the above copyright
113075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer in the
123075c896SRyan Stone  *    documentation and/or other materials provided with the distribution.
133075c896SRyan Stone  *
143075c896SRyan Stone  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
153075c896SRyan Stone  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
163075c896SRyan Stone  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
173075c896SRyan Stone  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
183075c896SRyan Stone  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
193075c896SRyan Stone  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
203075c896SRyan Stone  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
213075c896SRyan Stone  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
223075c896SRyan Stone  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
233075c896SRyan Stone  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
243075c896SRyan Stone  * SUCH DAMAGE.
253075c896SRyan Stone  */
263075c896SRyan Stone 
273075c896SRyan Stone #include <sys/cdefs.h>
283075c896SRyan Stone __FBSDID("$FreeBSD$");
293075c896SRyan Stone 
303075c896SRyan Stone #include <atf-c++.hpp>
313075c896SRyan Stone #include <nv.h>
323075c896SRyan Stone 
333075c896SRyan Stone #include <errno.h>
34fad0a264SRyan Stone #include <limits>
356c721f82SRyan Stone #include <set>
366c721f82SRyan Stone #include <sstream>
376c721f82SRyan Stone #include <string>
386c721f82SRyan Stone 
393075c896SRyan Stone /*
403075c896SRyan Stone  * Test that a newly created nvlist has no errors, and is empty.
413075c896SRyan Stone  */
423075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
433075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty)
443075c896SRyan Stone {
453075c896SRyan Stone 	nvlist_t *nvl;
463075c896SRyan Stone 	int type;
473075c896SRyan Stone 	void *it;
483075c896SRyan Stone 
493075c896SRyan Stone 	nvl = nvlist_create(0);
503075c896SRyan Stone 
513075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
523075c896SRyan Stone 
533075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
543075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
553075c896SRyan Stone 
563075c896SRyan Stone 	it = NULL;
57bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
583075c896SRyan Stone 
593075c896SRyan Stone 	nvlist_destroy(nvl);
603075c896SRyan Stone }
613075c896SRyan Stone 
623075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
633075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
643075c896SRyan Stone {
653075c896SRyan Stone 	nvlist_t *nvl;
663075c896SRyan Stone 	void *it;
673075c896SRyan Stone 	const char *key;
683075c896SRyan Stone 	int type;
693075c896SRyan Stone 
703075c896SRyan Stone 	key = "key";
713075c896SRyan Stone 	nvl = nvlist_create(0);
723075c896SRyan Stone 
733075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
743075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
753075c896SRyan Stone 
763075c896SRyan Stone 	nvlist_add_null(nvl, key);
773075c896SRyan Stone 
783075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
793075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
803075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
81*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_null(nvl, "key"));
823075c896SRyan Stone 
833075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
843075c896SRyan Stone 	it = NULL;
853075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
863075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
87bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
883075c896SRyan Stone 
893075c896SRyan Stone 	nvlist_destroy(nvl);
903075c896SRyan Stone }
913075c896SRyan Stone 
923075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
933075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
943075c896SRyan Stone {
953075c896SRyan Stone 	nvlist_t *nvl;
963075c896SRyan Stone 	void *it;
973075c896SRyan Stone 	const char *key;
983075c896SRyan Stone 	int type;
993075c896SRyan Stone 
1003075c896SRyan Stone 	key = "name";
1013075c896SRyan Stone 	nvl = nvlist_create(0);
1023075c896SRyan Stone 
1033075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1043075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1053075c896SRyan Stone 
1063075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
1073075c896SRyan Stone 
1083075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1093075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
110*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "name"));
1113075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
112*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool(nvl, "name"));
1133075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
1143075c896SRyan Stone 
1153075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1163075c896SRyan Stone 	it = NULL;
1173075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1183075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
119bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
1203075c896SRyan Stone 
1213075c896SRyan Stone 	nvlist_destroy(nvl);
1223075c896SRyan Stone }
1233075c896SRyan Stone 
1243075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
1253075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
1263075c896SRyan Stone {
1273075c896SRyan Stone 	nvlist_t *nvl;
1283075c896SRyan Stone 	void *it;
1293075c896SRyan Stone 	const char *key;
1303075c896SRyan Stone 	uint64_t value;
1313075c896SRyan Stone 	int type;
1323075c896SRyan Stone 
1333075c896SRyan Stone 	key = "foo123";
1343075c896SRyan Stone 	value = 71965;
1353075c896SRyan Stone 	nvl = nvlist_create(0);
1363075c896SRyan Stone 
1373075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1383075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1393075c896SRyan Stone 
1403075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
1413075c896SRyan Stone 
1423075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1433075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
144*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "foo123"));
1453075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
1463075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
1473075c896SRyan Stone 
1483075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1493075c896SRyan Stone 	it = NULL;
1503075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1513075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
152bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
1533075c896SRyan Stone 
1543075c896SRyan Stone 	nvlist_destroy(nvl);
1553075c896SRyan Stone }
1563075c896SRyan Stone 
1573075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
1583075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
1593075c896SRyan Stone {
1603075c896SRyan Stone 	nvlist_t *nvl;
1613075c896SRyan Stone 	void *it;
1623075c896SRyan Stone 	const char *key;
1633075c896SRyan Stone 	const char *value;
1643075c896SRyan Stone 	int type;
1653075c896SRyan Stone 
1663075c896SRyan Stone 	key = "test";
1673075c896SRyan Stone 	value = "fgjdkgjdk";
1683075c896SRyan Stone 	nvl = nvlist_create(0);
1693075c896SRyan Stone 
1703075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1713075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1723075c896SRyan Stone 
1733075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
1743075c896SRyan Stone 
1753075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1763075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
177*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "test"));
1783075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
179*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_string(nvl, "test"));
1803075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
1813075c896SRyan Stone 
1823075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
1833075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
1843075c896SRyan Stone 
1853075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1863075c896SRyan Stone 	it = NULL;
1873075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1883075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
189bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
1903075c896SRyan Stone 
1913075c896SRyan Stone 	nvlist_destroy(nvl);
1923075c896SRyan Stone }
1933075c896SRyan Stone 
1943075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
1953075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
1963075c896SRyan Stone {
1973075c896SRyan Stone 	nvlist_t *nvl;
1983075c896SRyan Stone 	void *it;
1993075c896SRyan Stone 	const char *key, *subkey;
2003075c896SRyan Stone 	nvlist_t *sublist;
2013075c896SRyan Stone 	const nvlist_t *value;
2023075c896SRyan Stone 	int type;
2033075c896SRyan Stone 
2043075c896SRyan Stone 	key = "test";
2053075c896SRyan Stone 	subkey = "subkey";
2063075c896SRyan Stone 	sublist = nvlist_create(0);
2073075c896SRyan Stone 	nvl = nvlist_create(0);
2083075c896SRyan Stone 
2093075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
2103075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
2113075c896SRyan Stone 
2123075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
2133075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
2143075c896SRyan Stone 
2153075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
2163075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
217*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "test"));
2183075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
219*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, "test"));
2203075c896SRyan Stone 
2213075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
2223075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
2233075c896SRyan Stone 
2243075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
2253075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
2263075c896SRyan Stone 
2273075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
2283075c896SRyan Stone 	it = NULL;
2293075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
2303075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
231bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
2323075c896SRyan Stone 
2333075c896SRyan Stone 	nvlist_destroy(sublist);
2343075c896SRyan Stone 	nvlist_destroy(nvl);
2353075c896SRyan Stone }
2363075c896SRyan Stone 
23719a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error);
23819a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error)
23919a4afb3SRyan Stone {
24019a4afb3SRyan Stone 	nvlist_t *nvl, *parent;
24119a4afb3SRyan Stone 
24219a4afb3SRyan Stone 	nvl = nvlist_create(0);
24319a4afb3SRyan Stone 	parent = nvlist_create(0);
24419a4afb3SRyan Stone 
24519a4afb3SRyan Stone 	nvlist_set_error(nvl, EBADF);
24619a4afb3SRyan Stone 	nvlist_add_nvlist(parent, "test", nvl);
24719a4afb3SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
24819a4afb3SRyan Stone 
24919a4afb3SRyan Stone 	nvlist_destroy(nvl);
25019a4afb3SRyan Stone 	nvlist_destroy(parent);
25119a4afb3SRyan Stone }
25219a4afb3SRyan Stone 
2533075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
2543075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
2553075c896SRyan Stone {
2563075c896SRyan Stone 	nvlist_t *nvl;
2573075c896SRyan Stone 	void *it;
2583075c896SRyan Stone 	const char *key;
2593075c896SRyan Stone 	void *value;
2603075c896SRyan Stone 	const void *ret_value;
2613075c896SRyan Stone 	size_t value_size, ret_size;
2623075c896SRyan Stone 	int type;
2633075c896SRyan Stone 
2643075c896SRyan Stone 	key = "binary";
2653075c896SRyan Stone 	value_size = 13;
2663075c896SRyan Stone 	value = malloc(value_size);
2673075c896SRyan Stone 	memset(value, 0xa5, value_size);
2683075c896SRyan Stone 	nvl = nvlist_create(0);
2693075c896SRyan Stone 
2703075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
2713075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
2723075c896SRyan Stone 
2733075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
2743075c896SRyan Stone 
2753075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
2763075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
277*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "binary"));
2783075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
279*37c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_binary(nvl, "binary"));
2803075c896SRyan Stone 
2813075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
2823075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
2833075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
2843075c896SRyan Stone 
2853075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
2863075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
2873075c896SRyan Stone 
2883075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
2893075c896SRyan Stone 	it = NULL;
2903075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
2913075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
292bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
2933075c896SRyan Stone 
2943075c896SRyan Stone 	nvlist_destroy(nvl);
2953075c896SRyan Stone 	free(value);
2963075c896SRyan Stone }
2973075c896SRyan Stone 
2986e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
2996e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
3006e623ffdSRyan Stone {
3016e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
3026e623ffdSRyan Stone 
3036e623ffdSRyan Stone 	nvl = nvlist_create(0);
3046e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
3056e623ffdSRyan Stone 
3066e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
3076e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
3086e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
3096e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_empty(clone));
3106e623ffdSRyan Stone 
3116e623ffdSRyan Stone 	nvlist_destroy(clone);
3126e623ffdSRyan Stone 	nvlist_destroy(nvl);
3136e623ffdSRyan Stone }
3146e623ffdSRyan Stone 
3156e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
3166e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
3176e623ffdSRyan Stone {
3186e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
3196e623ffdSRyan Stone 	const char *key;
3206e623ffdSRyan Stone 	void *it;
3216e623ffdSRyan Stone 	uint64_t value;
3226e623ffdSRyan Stone 	int type;
3236e623ffdSRyan Stone 
3246e623ffdSRyan Stone 	nvl = nvlist_create(0);
3256e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
3266e623ffdSRyan Stone 
3276e623ffdSRyan Stone 	key = "testkey";
3286e623ffdSRyan Stone 	value = 684874;
3296e623ffdSRyan Stone 	nvlist_add_number(nvl, key, value);
3306e623ffdSRyan Stone 
3316e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
3326e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
3336e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
3346e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_number(clone, key));
3356e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
3366e623ffdSRyan Stone 
3376e623ffdSRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
3386e623ffdSRyan Stone 	it = NULL;
3396e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
3406e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
341bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL));
3426e623ffdSRyan Stone 
3436e623ffdSRyan Stone 	nvlist_destroy(clone);
3446e623ffdSRyan Stone 	nvlist_destroy(nvl);
3456e623ffdSRyan Stone }
3466e623ffdSRyan Stone 
3476e623ffdSRyan Stone static const char * const test_subnvlist_key = "nvlist";
3486e623ffdSRyan Stone 
3496e623ffdSRyan Stone static const char * const test_string_key = "string";
3506e623ffdSRyan Stone static const char * const test_string_val = "59525";
3516e623ffdSRyan Stone 
3526e623ffdSRyan Stone static nvlist_t*
3536e623ffdSRyan Stone create_test_nvlist(void)
3546e623ffdSRyan Stone {
3556e623ffdSRyan Stone 	nvlist_t *nvl, *sublist;
3566e623ffdSRyan Stone 
3576e623ffdSRyan Stone 	nvl = nvlist_create(0);
3586e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
3596e623ffdSRyan Stone 
3606e623ffdSRyan Stone 	sublist = nvlist_create(0);
3616e623ffdSRyan Stone 	ATF_REQUIRE(sublist != NULL);
3626e623ffdSRyan Stone 
3636e623ffdSRyan Stone 	nvlist_add_string(sublist, test_string_key, test_string_val);
3646e623ffdSRyan Stone 	nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
3656e623ffdSRyan Stone 
3666e623ffdSRyan Stone 	return (nvl);
3676e623ffdSRyan Stone }
3686e623ffdSRyan Stone 
3696e623ffdSRyan Stone static void
3706e623ffdSRyan Stone verify_test_nvlist(const nvlist_t *nvl)
3716e623ffdSRyan Stone {
3726e623ffdSRyan Stone 	void *it;
3736e623ffdSRyan Stone 	const nvlist_t *value;
3746e623ffdSRyan Stone 	int type;
3756e623ffdSRyan Stone 
3766e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
3776e623ffdSRyan Stone 
3786e623ffdSRyan Stone 	value = nvlist_get_nvlist(nvl, test_subnvlist_key);
3796e623ffdSRyan Stone 
3806e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
3816e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
3826e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
3836e623ffdSRyan Stone 
3846e623ffdSRyan Stone 	/* Iterate over both nvlists; ensure that each has only the one key. */
3856e623ffdSRyan Stone 	it = NULL;
3866e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
3876e623ffdSRyan Stone 	    test_string_key), 0);
3886e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
389bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL));
3906e623ffdSRyan Stone 
3916e623ffdSRyan Stone 	it = NULL;
3926e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
3936e623ffdSRyan Stone 	    test_subnvlist_key), 0);
3946e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
395bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
3966e623ffdSRyan Stone }
3976e623ffdSRyan Stone 
3986e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
3996e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
4006e623ffdSRyan Stone {
4016e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
4026e623ffdSRyan Stone 
4036e623ffdSRyan Stone 	nvl = create_test_nvlist();
4046e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
4056e623ffdSRyan Stone 
4066e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
4076e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
4086e623ffdSRyan Stone 	verify_test_nvlist(clone);
4096e623ffdSRyan Stone 
4106e623ffdSRyan Stone 	nvlist_destroy(clone);
4116e623ffdSRyan Stone 	nvlist_destroy(nvl);
4126e623ffdSRyan Stone }
4136e623ffdSRyan Stone 
414a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist);
415a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist)
416a87e5162SRyan Stone {
417a87e5162SRyan Stone 	nvlist_t *nvl, *clone;
418a87e5162SRyan Stone 
419a87e5162SRyan Stone 	nvl = nvlist_create(0);
420a87e5162SRyan Stone 	ATF_REQUIRE(nvl != NULL);
421a87e5162SRyan Stone 
422a87e5162SRyan Stone 	nvlist_set_error(nvl, ENOMEM);
423a87e5162SRyan Stone 
424a87e5162SRyan Stone 	clone = nvlist_clone(nvl);
425a87e5162SRyan Stone 	ATF_REQUIRE(clone == NULL);
426a87e5162SRyan Stone 
427a87e5162SRyan Stone 	nvlist_destroy(nvl);
428a87e5162SRyan Stone }
429a87e5162SRyan Stone 
4306c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist);
4316c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist)
4326c721f82SRyan Stone {
4336c721f82SRyan Stone 	nvlist_t *nvl, *unpacked;
4346c721f82SRyan Stone 	void *packed;
4356c721f82SRyan Stone 	size_t packed_size;
4366c721f82SRyan Stone 
4376c721f82SRyan Stone 	nvl = nvlist_create(0);
4386c721f82SRyan Stone 	ATF_REQUIRE(nvl != NULL);
4396c721f82SRyan Stone 
4406c721f82SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
4416c721f82SRyan Stone 	ATF_REQUIRE(packed != NULL);
4426c721f82SRyan Stone 
4436c721f82SRyan Stone 	unpacked = nvlist_unpack(packed, packed_size);
4446c721f82SRyan Stone 	ATF_REQUIRE(unpacked != NULL);
4456c721f82SRyan Stone 	ATF_REQUIRE(unpacked != nvl);
4466c721f82SRyan Stone 	ATF_REQUIRE(nvlist_empty(unpacked));
4476c721f82SRyan Stone 
4486c721f82SRyan Stone 	nvlist_destroy(unpacked);
4496c721f82SRyan Stone 	nvlist_destroy(nvl);
4506c721f82SRyan Stone 	free(packed);
4516c721f82SRyan Stone }
4526c721f82SRyan Stone 
4536c721f82SRyan Stone static void
4546c721f82SRyan Stone verify_null(const nvlist_t *nvl, int type)
4556c721f82SRyan Stone {
4566c721f82SRyan Stone 
4576c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
4586c721f82SRyan Stone }
4596c721f82SRyan Stone 
4606c721f82SRyan Stone static void
4616c721f82SRyan Stone verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value)
4626c721f82SRyan Stone {
4636c721f82SRyan Stone 
4646c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
4656c721f82SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value);
4666c721f82SRyan Stone }
4676c721f82SRyan Stone 
4686c721f82SRyan Stone static void
4696c721f82SRyan Stone verify_string(const nvlist_t *nvl, const char *name, int type,
4706c721f82SRyan Stone     const char * value)
4716c721f82SRyan Stone {
4726c721f82SRyan Stone 
4736c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
4746c721f82SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0);
4756c721f82SRyan Stone }
4766c721f82SRyan Stone 
4776c721f82SRyan Stone static void
4786c721f82SRyan Stone verify_nvlist(const nvlist_t *nvl, const char *name, int type)
4796c721f82SRyan Stone {
4806c721f82SRyan Stone 
4816c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
4826c721f82SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, name));
4836c721f82SRyan Stone }
4846c721f82SRyan Stone 
4856c721f82SRyan Stone static void
4866c721f82SRyan Stone verify_binary(const nvlist_t *nvl, const char *name, int type,
4876c721f82SRyan Stone     const void * value, size_t size)
4886c721f82SRyan Stone {
4896c721f82SRyan Stone 	const void *actual_value;
4906c721f82SRyan Stone 	size_t actual_size;
4916c721f82SRyan Stone 
4926c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
4936c721f82SRyan Stone 	actual_value = nvlist_get_binary(nvl, name, &actual_size);
4946c721f82SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
4956c721f82SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0);
4966c721f82SRyan Stone }
4976c721f82SRyan Stone 
4986c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values);
4996c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__multiple_values)
5006c721f82SRyan Stone {
5016c721f82SRyan Stone 	std::ostringstream msg;
5026c721f82SRyan Stone 	std::set<std::string> keys_seen;
5036c721f82SRyan Stone 	nvlist_t *nvl, *unpacked, *nvvalue;
5046c721f82SRyan Stone 	const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name;
5056c721f82SRyan Stone 	int numvalue;
5066c721f82SRyan Stone 	const char * strvalue;
5076c721f82SRyan Stone 	void *binvalue, *packed, *it;
5086c721f82SRyan Stone 	size_t binsize, packed_size;
5096c721f82SRyan Stone 	int type;
5106c721f82SRyan Stone 
5116c721f82SRyan Stone 	nvl = nvlist_create(0);
5126c721f82SRyan Stone 
5136c721f82SRyan Stone 	nullkey = "null";
5146c721f82SRyan Stone 	nvlist_add_null(nvl, nullkey);
5156c721f82SRyan Stone 
5166c721f82SRyan Stone 	numkey = "number";
5176c721f82SRyan Stone 	numvalue = 939853984;
5186c721f82SRyan Stone 	nvlist_add_number(nvl, numkey, numvalue);
5196c721f82SRyan Stone 
5206c721f82SRyan Stone 	strkey = "string";
5216c721f82SRyan Stone 	strvalue = "jfieutijf";
5226c721f82SRyan Stone 	nvlist_add_string(nvl, strkey, strvalue);
5236c721f82SRyan Stone 
5246c721f82SRyan Stone 	nvkey = "nvlist";
5256c721f82SRyan Stone 	nvvalue = create_test_nvlist();
5266c721f82SRyan Stone 	nvlist_move_nvlist(nvl, nvkey, nvvalue);
5276c721f82SRyan Stone 
5286c721f82SRyan Stone 	binkey = "binary";
5296c721f82SRyan Stone 	binsize = 4;
5306c721f82SRyan Stone 	binvalue = malloc(binsize);
5316c721f82SRyan Stone 	memset(binvalue, 'b', binsize);
5326c721f82SRyan Stone 	nvlist_move_binary(nvl, binkey, binvalue, binsize);
5336c721f82SRyan Stone 
5346c721f82SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
5356c721f82SRyan Stone 	ATF_REQUIRE(packed != NULL);
5366c721f82SRyan Stone 
5376c721f82SRyan Stone 	unpacked = nvlist_unpack(packed, packed_size);
5386c721f82SRyan Stone 	ATF_REQUIRE(unpacked != 0);
5396c721f82SRyan Stone 
5406c721f82SRyan Stone 	it = NULL;
5416c721f82SRyan Stone 	while ((name = nvlist_next(unpacked, &type, &it)) != NULL) {
5426c721f82SRyan Stone 		/* Ensure that we see every key only once. */
5436c721f82SRyan Stone 		ATF_REQUIRE_EQ(keys_seen.count(name), 0);
5446c721f82SRyan Stone 
5456c721f82SRyan Stone 		if (strcmp(name, nullkey) == 0)
5466c721f82SRyan Stone 			verify_null(unpacked, type);
5476c721f82SRyan Stone 		else if (strcmp(name, numkey) == 0)
5486c721f82SRyan Stone 			verify_number(unpacked, name, type, numvalue);
5496c721f82SRyan Stone 		else if (strcmp(name, strkey) == 0)
5506c721f82SRyan Stone 			verify_string(unpacked, name, type, strvalue);
5516c721f82SRyan Stone 		else if (strcmp(name, nvkey) == 0)
5526c721f82SRyan Stone 			verify_nvlist(unpacked, name, type);
5536c721f82SRyan Stone 		else if (strcmp(name, binkey) == 0)
5546c721f82SRyan Stone 			verify_binary(unpacked, name, type, binvalue, binsize);
5556c721f82SRyan Stone 		else {
5566c721f82SRyan Stone 			msg << "Unexpected key :'" << name << "'";
5576c721f82SRyan Stone 			ATF_FAIL(msg.str().c_str());
5586c721f82SRyan Stone 		}
5596c721f82SRyan Stone 
5606c721f82SRyan Stone 		keys_seen.insert(name);
5616c721f82SRyan Stone 	}
5626c721f82SRyan Stone 
5636c721f82SRyan Stone 	/* Ensure that we saw every key. */
5646c721f82SRyan Stone 	ATF_REQUIRE_EQ(keys_seen.size(), 5);
5656c721f82SRyan Stone 
5666c721f82SRyan Stone 	nvlist_destroy(nvl);
5676c721f82SRyan Stone 	nvlist_destroy(unpacked);
5686c721f82SRyan Stone 	free(packed);
5696c721f82SRyan Stone }
5706c721f82SRyan Stone 
571a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist);
572a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist)
573a87e5162SRyan Stone {
574a87e5162SRyan Stone 	nvlist_t *nvl;
575a87e5162SRyan Stone 	void *packed;
576a87e5162SRyan Stone 	size_t size;
577a87e5162SRyan Stone 
578a87e5162SRyan Stone 	nvl = nvlist_create(0);
579a87e5162SRyan Stone 	ATF_REQUIRE(nvl != NULL);
580a87e5162SRyan Stone 
581a87e5162SRyan Stone 	nvlist_set_error(nvl, ENOMEM);
582a87e5162SRyan Stone 
583a87e5162SRyan Stone 	packed = nvlist_pack(nvl, &size);
584a87e5162SRyan Stone 	ATF_REQUIRE(packed == NULL);
585a87e5162SRyan Stone 
586a87e5162SRyan Stone 	nvlist_destroy(nvl);
587a87e5162SRyan Stone }
588a87e5162SRyan Stone 
5896c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key);
5906c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key)
5916c721f82SRyan Stone {
5926c721f82SRyan Stone 	nvlist_t *nvl, *unpacked;
5936c721f82SRyan Stone 	const char *key1, *key2;
5946c721f82SRyan Stone 	void *packed, *keypos;
5956c721f82SRyan Stone 	size_t size, keylen;
5966c721f82SRyan Stone 
5976c721f82SRyan Stone 	nvl = nvlist_create(0);
5986c721f82SRyan Stone 
5996c721f82SRyan Stone 	key1 = "key1";
6006c721f82SRyan Stone 	keylen = strlen(key1);
6016c721f82SRyan Stone 	nvlist_add_number(nvl, key1, 5);
6026c721f82SRyan Stone 
6036c721f82SRyan Stone 	key2 = "key2";
6046c721f82SRyan Stone 	ATF_REQUIRE_EQ(keylen, strlen(key2));
6056c721f82SRyan Stone 	nvlist_add_number(nvl, key2, 10);
6066c721f82SRyan Stone 
6076c721f82SRyan Stone 	packed = nvlist_pack(nvl, &size);
6086c721f82SRyan Stone 
6096c721f82SRyan Stone 	/*
6106c721f82SRyan Stone 	 * Mangle the packed nvlist by replacing key1 with key2, creating a
6116c721f82SRyan Stone 	 * packed nvlist with a duplicate key.
6126c721f82SRyan Stone 	 */
6136c721f82SRyan Stone 	keypos = memmem(packed, size, key1, keylen);
6146c721f82SRyan Stone 	ATF_REQUIRE(keypos != NULL);
6156c721f82SRyan Stone 	memcpy(keypos, key2, keylen);
6166c721f82SRyan Stone 
6176c721f82SRyan Stone 	unpacked = nvlist_unpack(packed, size);
6186c721f82SRyan Stone 	ATF_REQUIRE(nvlist_error(unpacked) != 0);
6196c721f82SRyan Stone 
6206c721f82SRyan Stone 	free(packed);
6216c721f82SRyan Stone 	nvlist_destroy(nvl);
6226c721f82SRyan Stone 	nvlist_destroy(unpacked);
6236c721f82SRyan Stone }
6246c721f82SRyan Stone 
62571637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert);
62671637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_string__single_insert)
62771637d76SRyan Stone {
62871637d76SRyan Stone 	nvlist_t *nvl;
62971637d76SRyan Stone 	const char *key;
63071637d76SRyan Stone 	char *value;
63171637d76SRyan Stone 
63271637d76SRyan Stone 	nvl = nvlist_create(0);
63371637d76SRyan Stone 	ATF_REQUIRE(nvl != NULL);
63471637d76SRyan Stone 
63571637d76SRyan Stone 	key = "testkey";
63671637d76SRyan Stone 	value = strdup("testval");
63771637d76SRyan Stone 	ATF_REQUIRE(value != NULL);
63871637d76SRyan Stone 
63971637d76SRyan Stone 	nvlist_move_string(nvl, key, value);
64071637d76SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value);
64171637d76SRyan Stone 
64271637d76SRyan Stone 	nvlist_destroy(nvl);
64371637d76SRyan Stone }
64471637d76SRyan Stone 
64571637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child);
64671637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child)
64771637d76SRyan Stone {
64871637d76SRyan Stone 	nvlist_t *parent;
64971637d76SRyan Stone 
65071637d76SRyan Stone 	parent = nvlist_create(0);
65171637d76SRyan Stone 
65271637d76SRyan Stone 	nvlist_move_nvlist(parent, "test", NULL);
65371637d76SRyan Stone 
65471637d76SRyan Stone 	ATF_REQUIRE(nvlist_error(parent) != 0);
65571637d76SRyan Stone 
65671637d76SRyan Stone 	nvlist_destroy(parent);
65771637d76SRyan Stone }
65871637d76SRyan Stone 
65919a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error);
66019a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error)
66119a4afb3SRyan Stone {
66219a4afb3SRyan Stone 	nvlist_t *nvl, *parent;
66319a4afb3SRyan Stone 
66419a4afb3SRyan Stone 	nvl = nvlist_create(0);
66519a4afb3SRyan Stone 	parent = nvlist_create(0);
66619a4afb3SRyan Stone 
66719a4afb3SRyan Stone 	nvlist_set_error(nvl, EBADF);
66819a4afb3SRyan Stone 	nvlist_move_nvlist(parent, "test", nvl);
66919a4afb3SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
67019a4afb3SRyan Stone 
67119a4afb3SRyan Stone 	nvlist_destroy(parent);
67219a4afb3SRyan Stone }
67319a4afb3SRyan Stone 
67471637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert);
67571637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert)
67671637d76SRyan Stone {
67771637d76SRyan Stone 	nvlist_t *nvl;
67871637d76SRyan Stone 	const char *key;
67971637d76SRyan Stone 	nvlist_t *value;
68071637d76SRyan Stone 
68171637d76SRyan Stone 	nvl = nvlist_create(0);
68271637d76SRyan Stone 	ATF_REQUIRE(nvl != NULL);
68371637d76SRyan Stone 
68471637d76SRyan Stone 	key = "testkey";
68571637d76SRyan Stone 	value = nvlist_create(0);
68671637d76SRyan Stone 	ATF_REQUIRE(value != NULL);
68771637d76SRyan Stone 
68871637d76SRyan Stone 	nvlist_move_nvlist(nvl, key, value);
68971637d76SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value);
69071637d76SRyan Stone 
69171637d76SRyan Stone 	nvlist_destroy(nvl);
69271637d76SRyan Stone }
69371637d76SRyan Stone 
69471637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert);
69571637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert)
69671637d76SRyan Stone {
69771637d76SRyan Stone 	nvlist_t *nvl;
69871637d76SRyan Stone 	const char *key;
69971637d76SRyan Stone 	void *value;
70071637d76SRyan Stone 	size_t size, actual_size;
70171637d76SRyan Stone 
70271637d76SRyan Stone 	nvl = nvlist_create(0);
70371637d76SRyan Stone 	ATF_REQUIRE(nvl != NULL);
70471637d76SRyan Stone 
70571637d76SRyan Stone 	key = "testkey";
70671637d76SRyan Stone 	size = 73;
70771637d76SRyan Stone 	value = malloc(size);
70871637d76SRyan Stone 	ATF_REQUIRE(value != NULL);
70971637d76SRyan Stone 
71071637d76SRyan Stone 	nvlist_move_binary(nvl, key, value, size);
71171637d76SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value);
71271637d76SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
71371637d76SRyan Stone 
71471637d76SRyan Stone 	nvlist_destroy(nvl);
71571637d76SRyan Stone }
71671637d76SRyan Stone 
717fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove);
718fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove)
719fad0a264SRyan Stone {
720fad0a264SRyan Stone 	nvlist_t *nvl;
721fad0a264SRyan Stone 	const char *testkey;
722fad0a264SRyan Stone 	bool testval;
723fad0a264SRyan Stone 
724fad0a264SRyan Stone 	nvl = nvlist_create(0);
725fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
726fad0a264SRyan Stone 
727fad0a264SRyan Stone 	testkey = "boolkey";
728fad0a264SRyan Stone 	testval = false;
729fad0a264SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
730fad0a264SRyan Stone 
731fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
732fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
733fad0a264SRyan Stone 
734fad0a264SRyan Stone 	nvlist_destroy(nvl);
735fad0a264SRyan Stone }
736fad0a264SRyan Stone 
737fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged);
738fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged)
739fad0a264SRyan Stone {
740fad0a264SRyan Stone 	nvlist_t *nvl;
741fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
742fad0a264SRyan Stone 	bool testval, otherval1;
743fad0a264SRyan Stone 	nvlist_t *otherval2;
744fad0a264SRyan Stone 
745fad0a264SRyan Stone 	nvl = nvlist_create(0);
746fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
747fad0a264SRyan Stone 
748fad0a264SRyan Stone 	testkey = "boolkey";
749fad0a264SRyan Stone 	testval = true;
750fad0a264SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
751fad0a264SRyan Stone 
752fad0a264SRyan Stone 	otherkey1 = "key1";
753fad0a264SRyan Stone 	otherval1 = false;
754fad0a264SRyan Stone 	nvlist_add_bool(nvl, otherkey1, otherval1);
755fad0a264SRyan Stone 
756fad0a264SRyan Stone 	otherkey2 = "key2";
757fad0a264SRyan Stone 	otherval2 = create_test_nvlist();
758fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, otherkey2, otherval2);
759fad0a264SRyan Stone 
760fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
761fad0a264SRyan Stone 
762fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1));
763fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1);
764fad0a264SRyan Stone 
765fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2));
766fad0a264SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2));
767fad0a264SRyan Stone 
768fad0a264SRyan Stone 	nvlist_destroy(nvl);
769fad0a264SRyan Stone }
770fad0a264SRyan Stone 
771fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove);
772fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__single_remove)
773fad0a264SRyan Stone {
774fad0a264SRyan Stone 	nvlist_t *nvl;
775fad0a264SRyan Stone 	const char *testkey;
776fad0a264SRyan Stone 	uint64_t testval;
777fad0a264SRyan Stone 
778fad0a264SRyan Stone 	nvl = nvlist_create(0);
779fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
780fad0a264SRyan Stone 
781fad0a264SRyan Stone 	testkey = "numkey";
782fad0a264SRyan Stone 	testval = std::numeric_limits<uint64_t>::max();
783fad0a264SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
784fad0a264SRyan Stone 
785fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
786fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
787fad0a264SRyan Stone 
788fad0a264SRyan Stone 	nvlist_destroy(nvl);
789fad0a264SRyan Stone }
790fad0a264SRyan Stone 
791fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged);
792fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged)
793fad0a264SRyan Stone {
794fad0a264SRyan Stone 	nvlist_t *nvl;
795fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
796fad0a264SRyan Stone 	uint64_t testval, otherval1;
797fad0a264SRyan Stone 	const char *otherval2;
798fad0a264SRyan Stone 
799fad0a264SRyan Stone 	nvl = nvlist_create(0);
800fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
801fad0a264SRyan Stone 
802fad0a264SRyan Stone 	otherkey1 = "key1";
803fad0a264SRyan Stone 	otherval1 = 5;
804fad0a264SRyan Stone 	nvlist_add_number(nvl, otherkey1, otherval1);
805fad0a264SRyan Stone 
806fad0a264SRyan Stone 	testkey = "numkey";
807fad0a264SRyan Stone 	testval = 1654;
808fad0a264SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
809fad0a264SRyan Stone 
810fad0a264SRyan Stone 	otherkey2 = "key2";
811fad0a264SRyan Stone 	otherval2 = "string";
812fad0a264SRyan Stone 	nvlist_add_string(nvl, otherkey2, otherval2);
813fad0a264SRyan Stone 
814fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
815fad0a264SRyan Stone 
816fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1));
817fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1);
818fad0a264SRyan Stone 
819fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2));
820fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0);
821fad0a264SRyan Stone 
822fad0a264SRyan Stone 	nvlist_destroy(nvl);
823fad0a264SRyan Stone }
824fad0a264SRyan Stone 
825fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove);
826fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__single_remove)
827fad0a264SRyan Stone {
828fad0a264SRyan Stone 	nvlist_t *nvl;
829fad0a264SRyan Stone 	const char *testkey;
830fad0a264SRyan Stone 	const char *testval;
831fad0a264SRyan Stone 
832fad0a264SRyan Stone 	nvl = nvlist_create(0);
833fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
834fad0a264SRyan Stone 
835fad0a264SRyan Stone 	testkey = "numkey";
836fad0a264SRyan Stone 	testval = "nvlist";
837fad0a264SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
838fad0a264SRyan Stone 
839fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
840fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
841fad0a264SRyan Stone 
842fad0a264SRyan Stone 	nvlist_destroy(nvl);
843fad0a264SRyan Stone }
844fad0a264SRyan Stone 
845fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged);
846fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged)
847fad0a264SRyan Stone {
848fad0a264SRyan Stone 	nvlist_t *nvl;
849fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
850fad0a264SRyan Stone 	const char *testval, *otherval1;
851fad0a264SRyan Stone 	bool otherval2;
852fad0a264SRyan Stone 
853fad0a264SRyan Stone 	nvl = nvlist_create(0);
854fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
855fad0a264SRyan Stone 
856fad0a264SRyan Stone 	otherkey1 = "key1";
857fad0a264SRyan Stone 	otherval1 = "fjdifjdk";
858fad0a264SRyan Stone 	nvlist_add_string(nvl, otherkey1, otherval1);
859fad0a264SRyan Stone 
860fad0a264SRyan Stone 	otherkey2 = "key2";
861fad0a264SRyan Stone 	otherval2 = true;
862fad0a264SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
863fad0a264SRyan Stone 
864fad0a264SRyan Stone 	testkey = "strkey";
865fad0a264SRyan Stone 	testval = "1654";
866fad0a264SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
867fad0a264SRyan Stone 
868fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
869fad0a264SRyan Stone 
870fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1));
871fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0);
872fad0a264SRyan Stone 
873fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
874fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
875fad0a264SRyan Stone 
876fad0a264SRyan Stone 	nvlist_destroy(nvl);
877fad0a264SRyan Stone }
878fad0a264SRyan Stone 
879fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove);
880fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove)
881fad0a264SRyan Stone {
882fad0a264SRyan Stone 	nvlist_t *nvl;
883fad0a264SRyan Stone 	const char *testkey;
884fad0a264SRyan Stone 	nvlist_t *testval;
885fad0a264SRyan Stone 
886fad0a264SRyan Stone 	nvl = nvlist_create(0);
887fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
888fad0a264SRyan Stone 
889fad0a264SRyan Stone 	testkey = "numkey";
890fad0a264SRyan Stone 	testval = create_test_nvlist();
891fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
892fad0a264SRyan Stone 
893fad0a264SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
894fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
895fad0a264SRyan Stone 
896fad0a264SRyan Stone 	nvlist_destroy(nvl);
897fad0a264SRyan Stone }
898fad0a264SRyan Stone 
899fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged);
900fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged)
901fad0a264SRyan Stone {
902fad0a264SRyan Stone 	nvlist_t *nvl;
903fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
904fad0a264SRyan Stone 	nvlist_t *testval, *otherval1;
905fad0a264SRyan Stone 
906fad0a264SRyan Stone 	nvl = nvlist_create(0);
907fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
908fad0a264SRyan Stone 
909fad0a264SRyan Stone 	testkey = "strkey";
910fad0a264SRyan Stone 	testval = create_test_nvlist();
911fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
912fad0a264SRyan Stone 
913fad0a264SRyan Stone 	otherkey1 = "key1";
914fad0a264SRyan Stone 	otherval1 = nvlist_create(0);
915fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, otherkey1, otherval1);
916fad0a264SRyan Stone 
917fad0a264SRyan Stone 	otherkey2 = "key2";
918fad0a264SRyan Stone 	nvlist_add_null(nvl, otherkey2);
919fad0a264SRyan Stone 
920fad0a264SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
921fad0a264SRyan Stone 
922fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1));
923fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1)));
924fad0a264SRyan Stone 
925fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2));
926fad0a264SRyan Stone 
927fad0a264SRyan Stone 	nvlist_destroy(nvl);
928fad0a264SRyan Stone }
929fad0a264SRyan Stone 
930fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove);
931fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove)
932fad0a264SRyan Stone {
933fad0a264SRyan Stone 	nvlist_t *nvl;
934fad0a264SRyan Stone 	const char *testkey;
935fad0a264SRyan Stone 	void *testval;
936fad0a264SRyan Stone 	const void *actual_val;
937fad0a264SRyan Stone 	size_t testsize, actual_size;
938fad0a264SRyan Stone 
939fad0a264SRyan Stone 	nvl = nvlist_create(0);
940fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
941fad0a264SRyan Stone 
942fad0a264SRyan Stone 	testkey = "numkey";
943fad0a264SRyan Stone 	testsize = 457;
944fad0a264SRyan Stone 	testval = malloc(testsize);
945fad0a264SRyan Stone 	memset(testval, '5', testsize);
946fad0a264SRyan Stone 	nvlist_move_binary(nvl, testkey, testval, testsize);
947fad0a264SRyan Stone 
948fad0a264SRyan Stone 	actual_val = nvlist_take_binary(nvl, testkey, &actual_size);
949fad0a264SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
950fad0a264SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0);
951fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
952fad0a264SRyan Stone 
953fad0a264SRyan Stone 	nvlist_destroy(nvl);
954fad0a264SRyan Stone }
955fad0a264SRyan Stone 
956fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged);
957fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged)
958fad0a264SRyan Stone {
959fad0a264SRyan Stone 	nvlist_t *nvl;
960fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
961fad0a264SRyan Stone 	const void *actual_value;
962fad0a264SRyan Stone 	char testval[] = "gjiertj";
963fad0a264SRyan Stone 	char otherval1[] = "fdreg";
964fad0a264SRyan Stone 	size_t testsize, othersize, actual_size;
965fad0a264SRyan Stone 	bool otherval2;
966fad0a264SRyan Stone 
967fad0a264SRyan Stone 	nvl = nvlist_create(0);
968fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
969fad0a264SRyan Stone 
970fad0a264SRyan Stone 	otherkey1 = "key1";
971fad0a264SRyan Stone 	othersize = sizeof(otherval1);
972fad0a264SRyan Stone 	nvlist_add_binary(nvl, otherkey1, otherval1, othersize);
973fad0a264SRyan Stone 
974fad0a264SRyan Stone 	otherkey2 = "key2";
975fad0a264SRyan Stone 	otherval2 = true;
976fad0a264SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
977fad0a264SRyan Stone 
978fad0a264SRyan Stone 	testkey = "strkey";
979fad0a264SRyan Stone 	testsize = sizeof(testval);
980fad0a264SRyan Stone 	nvlist_add_binary(nvl, testkey, testval, testsize);
981fad0a264SRyan Stone 
982fad0a264SRyan Stone 	actual_value = nvlist_take_binary(nvl, testkey, &actual_size);
983fad0a264SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
984fad0a264SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0);
985fad0a264SRyan Stone 
986fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1));
987fad0a264SRyan Stone 	actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size);
988fad0a264SRyan Stone 	ATF_REQUIRE_EQ(othersize, actual_size);
989fad0a264SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0);
990fad0a264SRyan Stone 
991fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
992fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
993fad0a264SRyan Stone 
994fad0a264SRyan Stone 	nvlist_destroy(nvl);
995fad0a264SRyan Stone }
996fad0a264SRyan Stone 
997339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null);
998339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_null)
999339bcfc7SRyan Stone {
1000339bcfc7SRyan Stone 	nvlist_t *nvl;
1001339bcfc7SRyan Stone 	const char *key;
1002339bcfc7SRyan Stone 
1003339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1004339bcfc7SRyan Stone 	key = "test";
1005339bcfc7SRyan Stone 	nvlist_add_null(nvl, key);
1006339bcfc7SRyan Stone 
1007339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1008339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1009339bcfc7SRyan Stone 
1010339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1011339bcfc7SRyan Stone }
1012339bcfc7SRyan Stone 
1013339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool);
1014339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_bool)
1015339bcfc7SRyan Stone {
1016339bcfc7SRyan Stone 	nvlist_t *nvl;
1017339bcfc7SRyan Stone 	const char *key;
1018339bcfc7SRyan Stone 
1019339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1020339bcfc7SRyan Stone 	key = "test";
1021339bcfc7SRyan Stone 	nvlist_add_bool(nvl, key, true);
1022339bcfc7SRyan Stone 
1023339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1024339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1025339bcfc7SRyan Stone 
1026339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1027339bcfc7SRyan Stone }
1028339bcfc7SRyan Stone 
1029339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number);
1030339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_number)
1031339bcfc7SRyan Stone {
1032339bcfc7SRyan Stone 	nvlist_t *nvl;
1033339bcfc7SRyan Stone 	const char *key;
1034339bcfc7SRyan Stone 
1035339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1036339bcfc7SRyan Stone 	key = "test";
1037339bcfc7SRyan Stone 	nvlist_add_number(nvl, key, 584);
1038339bcfc7SRyan Stone 
1039339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1040339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1041339bcfc7SRyan Stone 
1042339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1043339bcfc7SRyan Stone }
1044339bcfc7SRyan Stone 
1045339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string);
1046339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_string)
1047339bcfc7SRyan Stone {
1048339bcfc7SRyan Stone 	nvlist_t *nvl;
1049339bcfc7SRyan Stone 	const char *key;
1050339bcfc7SRyan Stone 
1051339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1052339bcfc7SRyan Stone 	key = "test";
1053339bcfc7SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
1054339bcfc7SRyan Stone 
1055339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1056339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1057339bcfc7SRyan Stone 
1058339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1059339bcfc7SRyan Stone }
1060339bcfc7SRyan Stone 
1061339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist);
1062339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_nvlist)
1063339bcfc7SRyan Stone {
1064339bcfc7SRyan Stone 	nvlist_t *nvl;
1065339bcfc7SRyan Stone 	const char *key;
1066339bcfc7SRyan Stone 
1067339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1068339bcfc7SRyan Stone 	key = "test";
1069339bcfc7SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1070339bcfc7SRyan Stone 
1071339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1072339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1073339bcfc7SRyan Stone 
1074339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1075339bcfc7SRyan Stone }
1076339bcfc7SRyan Stone 
1077339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary);
1078339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_binary)
1079339bcfc7SRyan Stone {
1080339bcfc7SRyan Stone 	nvlist_t *nvl;
1081339bcfc7SRyan Stone 	const char *key;
1082339bcfc7SRyan Stone 
1083339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1084339bcfc7SRyan Stone 	key = "test";
1085339bcfc7SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1086339bcfc7SRyan Stone 
1087339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1088339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1089339bcfc7SRyan Stone 
1090339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1091339bcfc7SRyan Stone }
1092339bcfc7SRyan Stone 
1093339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null);
1094339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_null__single_null)
1095339bcfc7SRyan Stone {
1096339bcfc7SRyan Stone 	nvlist_t *nvl;
1097339bcfc7SRyan Stone 	const char *key;
1098339bcfc7SRyan Stone 
1099339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1100339bcfc7SRyan Stone 	key = "test";
1101339bcfc7SRyan Stone 	nvlist_add_null(nvl, key);
1102339bcfc7SRyan Stone 
1103339bcfc7SRyan Stone 	nvlist_free_null(nvl, key);
1104339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1105339bcfc7SRyan Stone 
1106339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1107339bcfc7SRyan Stone }
1108339bcfc7SRyan Stone 
1109339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool);
1110339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool)
1111339bcfc7SRyan Stone {
1112339bcfc7SRyan Stone 	nvlist_t *nvl;
1113339bcfc7SRyan Stone 	const char *key;
1114339bcfc7SRyan Stone 
1115339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1116339bcfc7SRyan Stone 	key = "test";
1117339bcfc7SRyan Stone 	nvlist_add_bool(nvl, key, true);
1118339bcfc7SRyan Stone 
1119339bcfc7SRyan Stone 	nvlist_free_bool(nvl, key);
1120339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1121339bcfc7SRyan Stone 
1122339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1123339bcfc7SRyan Stone }
1124339bcfc7SRyan Stone 
1125339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number);
1126339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_number__single_number)
1127339bcfc7SRyan Stone {
1128339bcfc7SRyan Stone 	nvlist_t *nvl;
1129339bcfc7SRyan Stone 	const char *key;
1130339bcfc7SRyan Stone 
1131339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1132339bcfc7SRyan Stone 	key = "test";
1133339bcfc7SRyan Stone 	nvlist_add_number(nvl, key, 584);
1134339bcfc7SRyan Stone 
1135339bcfc7SRyan Stone 	nvlist_free_number(nvl, key);
1136339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1137339bcfc7SRyan Stone 
1138339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1139339bcfc7SRyan Stone }
1140339bcfc7SRyan Stone 
1141339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string);
1142339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_string__single_string)
1143339bcfc7SRyan Stone {
1144339bcfc7SRyan Stone 	nvlist_t *nvl;
1145339bcfc7SRyan Stone 	const char *key;
1146339bcfc7SRyan Stone 
1147339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1148339bcfc7SRyan Stone 	key = "test";
1149339bcfc7SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
1150339bcfc7SRyan Stone 
1151339bcfc7SRyan Stone 	nvlist_free_string(nvl, key);
1152339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1153339bcfc7SRyan Stone 
1154339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1155339bcfc7SRyan Stone }
1156339bcfc7SRyan Stone 
1157339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist);
1158339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist)
1159339bcfc7SRyan Stone {
1160339bcfc7SRyan Stone 	nvlist_t *nvl;
1161339bcfc7SRyan Stone 	const char *key;
1162339bcfc7SRyan Stone 
1163339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1164339bcfc7SRyan Stone 	key = "test";
1165339bcfc7SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1166339bcfc7SRyan Stone 
1167339bcfc7SRyan Stone 	nvlist_free_nvlist(nvl, key);
1168339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1169339bcfc7SRyan Stone 
1170339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1171339bcfc7SRyan Stone }
1172339bcfc7SRyan Stone 
1173339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary);
1174339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary)
1175339bcfc7SRyan Stone {
1176339bcfc7SRyan Stone 	nvlist_t *nvl;
1177339bcfc7SRyan Stone 	const char *key;
1178339bcfc7SRyan Stone 
1179339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1180339bcfc7SRyan Stone 	key = "test";
1181339bcfc7SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1182339bcfc7SRyan Stone 
1183339bcfc7SRyan Stone 	nvlist_free_binary(nvl, key);
1184339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1185339bcfc7SRyan Stone 
1186339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1187339bcfc7SRyan Stone }
1188339bcfc7SRyan Stone 
11893075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
11903075c896SRyan Stone {
11913075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
11923075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
11933075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
11943075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
11953075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
11963075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
119719a4afb3SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error);
11983075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
11996e623ffdSRyan Stone 
12006e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
12016e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
12026e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
1203a87e5162SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist);
12046c721f82SRyan Stone 
12056c721f82SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist);
12066c721f82SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values);
1207a87e5162SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist);
12086c721f82SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key);
120971637d76SRyan Stone 
121071637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert);
121171637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert);
121271637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child);
121319a4afb3SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error);
121471637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert);
1215fad0a264SRyan Stone 
1216fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove);
1217fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged);
1218fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove);
1219fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged);
1220fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove);
1221fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged);
1222fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove);
1223fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged);
1224fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove);
1225fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged);
1226339bcfc7SRyan Stone 
1227339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_null);
1228339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool);
1229339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_number);
1230339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_string);
1231339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist);
1232339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary);
1233339bcfc7SRyan Stone 
1234339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null);
1235339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool);
1236339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number);
1237339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string);
1238339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist);
1239339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary);
12403075c896SRyan Stone }
1241