xref: /freebsd/lib/libnv/tests/nv_tests.cc (revision c36e54bb328697af1e6113812caecbd3bac89fe0)
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 
30*c36e54bbSMariusz Zaborski #include <sys/nv.h>
31*c36e54bbSMariusz Zaborski 
323075c896SRyan Stone #include <atf-c++.hpp>
333075c896SRyan Stone 
343075c896SRyan Stone #include <errno.h>
35fad0a264SRyan Stone #include <limits>
366c721f82SRyan Stone #include <set>
376c721f82SRyan Stone #include <sstream>
386c721f82SRyan Stone #include <string>
396c721f82SRyan Stone 
403075c896SRyan Stone /*
413075c896SRyan Stone  * Test that a newly created nvlist has no errors, and is empty.
423075c896SRyan Stone  */
433075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
443075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty)
453075c896SRyan Stone {
463075c896SRyan Stone 	nvlist_t *nvl;
473075c896SRyan Stone 	int type;
483075c896SRyan Stone 	void *it;
493075c896SRyan Stone 
503075c896SRyan Stone 	nvl = nvlist_create(0);
513075c896SRyan Stone 
523075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
533075c896SRyan Stone 
543075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
553075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
563075c896SRyan Stone 
573075c896SRyan Stone 	it = NULL;
58bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
593075c896SRyan Stone 
603075c896SRyan Stone 	nvlist_destroy(nvl);
613075c896SRyan Stone }
623075c896SRyan Stone 
633075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
643075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
653075c896SRyan Stone {
663075c896SRyan Stone 	nvlist_t *nvl;
673075c896SRyan Stone 	void *it;
683075c896SRyan Stone 	const char *key;
693075c896SRyan Stone 	int type;
703075c896SRyan Stone 
713075c896SRyan Stone 	key = "key";
723075c896SRyan Stone 	nvl = nvlist_create(0);
733075c896SRyan Stone 
743075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
753075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
763075c896SRyan Stone 
773075c896SRyan Stone 	nvlist_add_null(nvl, key);
783075c896SRyan Stone 
793075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
803075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
813075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
8237c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_null(nvl, "key"));
833075c896SRyan Stone 
843075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
853075c896SRyan Stone 	it = NULL;
863075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
873075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
88bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
893075c896SRyan Stone 
903075c896SRyan Stone 	nvlist_destroy(nvl);
913075c896SRyan Stone }
923075c896SRyan Stone 
933075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
943075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
953075c896SRyan Stone {
963075c896SRyan Stone 	nvlist_t *nvl;
973075c896SRyan Stone 	void *it;
983075c896SRyan Stone 	const char *key;
993075c896SRyan Stone 	int type;
1003075c896SRyan Stone 
1013075c896SRyan Stone 	key = "name";
1023075c896SRyan Stone 	nvl = nvlist_create(0);
1033075c896SRyan Stone 
1043075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1053075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1063075c896SRyan Stone 
1073075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
1083075c896SRyan Stone 
1093075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1103075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
11137c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "name"));
1123075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
11337c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool(nvl, "name"));
1143075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
1153075c896SRyan Stone 
1163075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1173075c896SRyan Stone 	it = NULL;
1183075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1193075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
120bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
1213075c896SRyan Stone 
1223075c896SRyan Stone 	nvlist_destroy(nvl);
1233075c896SRyan Stone }
1243075c896SRyan Stone 
1253075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
1263075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
1273075c896SRyan Stone {
1283075c896SRyan Stone 	nvlist_t *nvl;
1293075c896SRyan Stone 	void *it;
1303075c896SRyan Stone 	const char *key;
1313075c896SRyan Stone 	uint64_t value;
1323075c896SRyan Stone 	int type;
1333075c896SRyan Stone 
1343075c896SRyan Stone 	key = "foo123";
1353075c896SRyan Stone 	value = 71965;
1363075c896SRyan Stone 	nvl = nvlist_create(0);
1373075c896SRyan Stone 
1383075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1393075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1403075c896SRyan Stone 
1413075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
1423075c896SRyan Stone 
1433075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1443075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
14537c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "foo123"));
1463075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
1473075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
1483075c896SRyan Stone 
1493075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1503075c896SRyan Stone 	it = NULL;
1513075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1523075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
153bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
1543075c896SRyan Stone 
1553075c896SRyan Stone 	nvlist_destroy(nvl);
1563075c896SRyan Stone }
1573075c896SRyan Stone 
1583075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
1593075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
1603075c896SRyan Stone {
1613075c896SRyan Stone 	nvlist_t *nvl;
1623075c896SRyan Stone 	void *it;
1633075c896SRyan Stone 	const char *key;
1643075c896SRyan Stone 	const char *value;
1653075c896SRyan Stone 	int type;
1663075c896SRyan Stone 
1673075c896SRyan Stone 	key = "test";
1683075c896SRyan Stone 	value = "fgjdkgjdk";
1693075c896SRyan Stone 	nvl = nvlist_create(0);
1703075c896SRyan Stone 
1713075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1723075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1733075c896SRyan Stone 
1743075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
1753075c896SRyan Stone 
1763075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1773075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
17837c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "test"));
1793075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
18037c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_string(nvl, "test"));
1813075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
1823075c896SRyan Stone 
1833075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
1843075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
1853075c896SRyan Stone 
1863075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1873075c896SRyan Stone 	it = NULL;
1883075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1893075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
190bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
1913075c896SRyan Stone 
1923075c896SRyan Stone 	nvlist_destroy(nvl);
1933075c896SRyan Stone }
1943075c896SRyan Stone 
1953075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
1963075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
1973075c896SRyan Stone {
1983075c896SRyan Stone 	nvlist_t *nvl;
1993075c896SRyan Stone 	void *it;
2003075c896SRyan Stone 	const char *key, *subkey;
2013075c896SRyan Stone 	nvlist_t *sublist;
2023075c896SRyan Stone 	const nvlist_t *value;
2033075c896SRyan Stone 	int type;
2043075c896SRyan Stone 
2053075c896SRyan Stone 	key = "test";
2063075c896SRyan Stone 	subkey = "subkey";
2073075c896SRyan Stone 	sublist = nvlist_create(0);
2083075c896SRyan Stone 	nvl = nvlist_create(0);
2093075c896SRyan Stone 
2103075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
2113075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
2123075c896SRyan Stone 
2133075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
2143075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
2153075c896SRyan Stone 
2163075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
2173075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
21837c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "test"));
2193075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
22037c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, "test"));
2213075c896SRyan Stone 
2223075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
2233075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
2243075c896SRyan Stone 
2253075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
2263075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
2273075c896SRyan Stone 
2283075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
2293075c896SRyan Stone 	it = NULL;
2303075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
2313075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
232bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
2333075c896SRyan Stone 
2343075c896SRyan Stone 	nvlist_destroy(sublist);
2353075c896SRyan Stone 	nvlist_destroy(nvl);
2363075c896SRyan Stone }
2373075c896SRyan Stone 
23819a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error);
23919a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error)
24019a4afb3SRyan Stone {
24119a4afb3SRyan Stone 	nvlist_t *nvl, *parent;
24219a4afb3SRyan Stone 
24319a4afb3SRyan Stone 	nvl = nvlist_create(0);
24419a4afb3SRyan Stone 	parent = nvlist_create(0);
24519a4afb3SRyan Stone 
24619a4afb3SRyan Stone 	nvlist_set_error(nvl, EBADF);
24719a4afb3SRyan Stone 	nvlist_add_nvlist(parent, "test", nvl);
24819a4afb3SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
24919a4afb3SRyan Stone 
25019a4afb3SRyan Stone 	nvlist_destroy(nvl);
25119a4afb3SRyan Stone 	nvlist_destroy(parent);
25219a4afb3SRyan Stone }
25319a4afb3SRyan Stone 
2543075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
2553075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
2563075c896SRyan Stone {
2573075c896SRyan Stone 	nvlist_t *nvl;
2583075c896SRyan Stone 	void *it;
2593075c896SRyan Stone 	const char *key;
2603075c896SRyan Stone 	void *value;
2613075c896SRyan Stone 	const void *ret_value;
2623075c896SRyan Stone 	size_t value_size, ret_size;
2633075c896SRyan Stone 	int type;
2643075c896SRyan Stone 
2653075c896SRyan Stone 	key = "binary";
2663075c896SRyan Stone 	value_size = 13;
2673075c896SRyan Stone 	value = malloc(value_size);
2683075c896SRyan Stone 	memset(value, 0xa5, value_size);
2693075c896SRyan Stone 	nvl = nvlist_create(0);
2703075c896SRyan Stone 
2713075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
2723075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
2733075c896SRyan Stone 
2743075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
2753075c896SRyan Stone 
2763075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
2773075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
27837c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists(nvl, "binary"));
2793075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
28037c6848cSMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_binary(nvl, "binary"));
2813075c896SRyan Stone 
2823075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
2833075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
2843075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
2853075c896SRyan Stone 
2863075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
2873075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
2883075c896SRyan Stone 
2893075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
2903075c896SRyan Stone 	it = NULL;
2913075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
2923075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
293bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
2943075c896SRyan Stone 
2953075c896SRyan Stone 	nvlist_destroy(nvl);
2963075c896SRyan Stone 	free(value);
2973075c896SRyan Stone }
2983075c896SRyan Stone 
2996e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
3006e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
3016e623ffdSRyan Stone {
3026e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
3036e623ffdSRyan Stone 
3046e623ffdSRyan Stone 	nvl = nvlist_create(0);
3056e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
3066e623ffdSRyan Stone 
3076e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
3086e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
3096e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
3106e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_empty(clone));
3116e623ffdSRyan Stone 
3126e623ffdSRyan Stone 	nvlist_destroy(clone);
3136e623ffdSRyan Stone 	nvlist_destroy(nvl);
3146e623ffdSRyan Stone }
3156e623ffdSRyan Stone 
3166e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
3176e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
3186e623ffdSRyan Stone {
3196e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
3206e623ffdSRyan Stone 	const char *key;
3216e623ffdSRyan Stone 	void *it;
3226e623ffdSRyan Stone 	uint64_t value;
3236e623ffdSRyan Stone 	int type;
3246e623ffdSRyan Stone 
3256e623ffdSRyan Stone 	nvl = nvlist_create(0);
3266e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
3276e623ffdSRyan Stone 
3286e623ffdSRyan Stone 	key = "testkey";
3296e623ffdSRyan Stone 	value = 684874;
3306e623ffdSRyan Stone 	nvlist_add_number(nvl, key, value);
3316e623ffdSRyan Stone 
3326e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
3336e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
3346e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
3356e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_number(clone, key));
3366e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
3376e623ffdSRyan Stone 
3386e623ffdSRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
3396e623ffdSRyan Stone 	it = NULL;
3406e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
3416e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
342bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL));
3436e623ffdSRyan Stone 
3446e623ffdSRyan Stone 	nvlist_destroy(clone);
3456e623ffdSRyan Stone 	nvlist_destroy(nvl);
3466e623ffdSRyan Stone }
3476e623ffdSRyan Stone 
3486e623ffdSRyan Stone static const char * const test_subnvlist_key = "nvlist";
3496e623ffdSRyan Stone 
3506e623ffdSRyan Stone static const char * const test_string_key = "string";
3516e623ffdSRyan Stone static const char * const test_string_val = "59525";
3526e623ffdSRyan Stone 
3536e623ffdSRyan Stone static nvlist_t*
3546e623ffdSRyan Stone create_test_nvlist(void)
3556e623ffdSRyan Stone {
3566e623ffdSRyan Stone 	nvlist_t *nvl, *sublist;
3576e623ffdSRyan Stone 
3586e623ffdSRyan Stone 	nvl = nvlist_create(0);
3596e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
3606e623ffdSRyan Stone 
3616e623ffdSRyan Stone 	sublist = nvlist_create(0);
3626e623ffdSRyan Stone 	ATF_REQUIRE(sublist != NULL);
3636e623ffdSRyan Stone 
3646e623ffdSRyan Stone 	nvlist_add_string(sublist, test_string_key, test_string_val);
3656e623ffdSRyan Stone 	nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
3666e623ffdSRyan Stone 
3676e623ffdSRyan Stone 	return (nvl);
3686e623ffdSRyan Stone }
3696e623ffdSRyan Stone 
3706e623ffdSRyan Stone static void
3716e623ffdSRyan Stone verify_test_nvlist(const nvlist_t *nvl)
3726e623ffdSRyan Stone {
3736e623ffdSRyan Stone 	void *it;
3746e623ffdSRyan Stone 	const nvlist_t *value;
3756e623ffdSRyan Stone 	int type;
3766e623ffdSRyan Stone 
3776e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
3786e623ffdSRyan Stone 
3796e623ffdSRyan Stone 	value = nvlist_get_nvlist(nvl, test_subnvlist_key);
3806e623ffdSRyan Stone 
3816e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
3826e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
3836e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
3846e623ffdSRyan Stone 
3856e623ffdSRyan Stone 	/* Iterate over both nvlists; ensure that each has only the one key. */
3866e623ffdSRyan Stone 	it = NULL;
3876e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
3886e623ffdSRyan Stone 	    test_string_key), 0);
3896e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
390bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL));
3916e623ffdSRyan Stone 
3926e623ffdSRyan Stone 	it = NULL;
3936e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
3946e623ffdSRyan Stone 	    test_subnvlist_key), 0);
3956e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
396bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
3976e623ffdSRyan Stone }
3986e623ffdSRyan Stone 
3996e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
4006e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
4016e623ffdSRyan Stone {
4026e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
4036e623ffdSRyan Stone 
4046e623ffdSRyan Stone 	nvl = create_test_nvlist();
4056e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
4066e623ffdSRyan Stone 
4076e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
4086e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
4096e623ffdSRyan Stone 	verify_test_nvlist(clone);
4106e623ffdSRyan Stone 
4116e623ffdSRyan Stone 	nvlist_destroy(clone);
4126e623ffdSRyan Stone 	nvlist_destroy(nvl);
4136e623ffdSRyan Stone }
4146e623ffdSRyan Stone 
415a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist);
416a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist)
417a87e5162SRyan Stone {
418a87e5162SRyan Stone 	nvlist_t *nvl, *clone;
419a87e5162SRyan Stone 
420a87e5162SRyan Stone 	nvl = nvlist_create(0);
421a87e5162SRyan Stone 	ATF_REQUIRE(nvl != NULL);
422a87e5162SRyan Stone 
423a87e5162SRyan Stone 	nvlist_set_error(nvl, ENOMEM);
424a87e5162SRyan Stone 
425a87e5162SRyan Stone 	clone = nvlist_clone(nvl);
426a87e5162SRyan Stone 	ATF_REQUIRE(clone == NULL);
427a87e5162SRyan Stone 
428a87e5162SRyan Stone 	nvlist_destroy(nvl);
429a87e5162SRyan Stone }
430a87e5162SRyan Stone 
4316c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist);
4326c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist)
4336c721f82SRyan Stone {
4346c721f82SRyan Stone 	nvlist_t *nvl, *unpacked;
4356c721f82SRyan Stone 	void *packed;
4366c721f82SRyan Stone 	size_t packed_size;
4376c721f82SRyan Stone 
4386c721f82SRyan Stone 	nvl = nvlist_create(0);
4396c721f82SRyan Stone 	ATF_REQUIRE(nvl != NULL);
4406c721f82SRyan Stone 
4416c721f82SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
4426c721f82SRyan Stone 	ATF_REQUIRE(packed != NULL);
4436c721f82SRyan Stone 
444bd1da0a0SMariusz Zaborski 	unpacked = nvlist_unpack(packed, packed_size, 0);
4456c721f82SRyan Stone 	ATF_REQUIRE(unpacked != NULL);
4466c721f82SRyan Stone 	ATF_REQUIRE(unpacked != nvl);
4476c721f82SRyan Stone 	ATF_REQUIRE(nvlist_empty(unpacked));
4486c721f82SRyan Stone 
4496c721f82SRyan Stone 	nvlist_destroy(unpacked);
4506c721f82SRyan Stone 	nvlist_destroy(nvl);
4516c721f82SRyan Stone 	free(packed);
4526c721f82SRyan Stone }
4536c721f82SRyan Stone 
45400173c09SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__flags_nvlist);
45500173c09SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_unpack__flags_nvlist)
45600173c09SMariusz Zaborski {
45700173c09SMariusz Zaborski 	nvlist_t *nvl, *unpacked;
45800173c09SMariusz Zaborski 	void *packed;
45900173c09SMariusz Zaborski 	size_t packed_size;
46000173c09SMariusz Zaborski 
46100173c09SMariusz Zaborski 	nvl = nvlist_create(NV_FLAG_NO_UNIQUE);
46200173c09SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
46300173c09SMariusz Zaborski 
46400173c09SMariusz Zaborski 	nvlist_add_bool(nvl, "name", true);
46500173c09SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
46600173c09SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool(nvl, "name"));
46700173c09SMariusz Zaborski 
46800173c09SMariusz Zaborski 	packed = nvlist_pack(nvl, &packed_size);
46900173c09SMariusz Zaborski 	ATF_REQUIRE(packed != NULL);
47000173c09SMariusz Zaborski 
47100173c09SMariusz Zaborski 	unpacked = nvlist_unpack(packed, packed_size, 0);
47200173c09SMariusz Zaborski 	ATF_REQUIRE(unpacked == NULL);
47300173c09SMariusz Zaborski 
47400173c09SMariusz Zaborski 	unpacked = nvlist_unpack(packed, packed_size, NV_FLAG_IGNORE_CASE);
47500173c09SMariusz Zaborski 	ATF_REQUIRE(unpacked == NULL);
47600173c09SMariusz Zaborski 
47700173c09SMariusz Zaborski 	unpacked = nvlist_unpack(packed, packed_size, NV_FLAG_NO_UNIQUE);
47800173c09SMariusz Zaborski 	ATF_REQUIRE(unpacked != NULL);
47900173c09SMariusz Zaborski 	ATF_REQUIRE(unpacked != nvl);
48000173c09SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(unpacked));
48100173c09SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool(unpacked, "name"));
48200173c09SMariusz Zaborski 
48300173c09SMariusz Zaborski 	nvlist_destroy(unpacked);
48400173c09SMariusz Zaborski 	nvlist_destroy(nvl);
48500173c09SMariusz Zaborski 	free(packed);
48600173c09SMariusz Zaborski }
48700173c09SMariusz Zaborski 
4886c721f82SRyan Stone static void
4896c721f82SRyan Stone verify_null(const nvlist_t *nvl, int type)
4906c721f82SRyan Stone {
4916c721f82SRyan Stone 
4926c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
4936c721f82SRyan Stone }
4946c721f82SRyan Stone 
4956c721f82SRyan Stone static void
4966c721f82SRyan Stone verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value)
4976c721f82SRyan Stone {
4986c721f82SRyan Stone 
4996c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
5006c721f82SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value);
5016c721f82SRyan Stone }
5026c721f82SRyan Stone 
5036c721f82SRyan Stone static void
5046c721f82SRyan Stone verify_string(const nvlist_t *nvl, const char *name, int type,
5056c721f82SRyan Stone     const char * value)
5066c721f82SRyan Stone {
5076c721f82SRyan Stone 
5086c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
5096c721f82SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0);
5106c721f82SRyan Stone }
5116c721f82SRyan Stone 
5126c721f82SRyan Stone static void
5136c721f82SRyan Stone verify_nvlist(const nvlist_t *nvl, const char *name, int type)
5146c721f82SRyan Stone {
5156c721f82SRyan Stone 
5166c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
5176c721f82SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, name));
5186c721f82SRyan Stone }
5196c721f82SRyan Stone 
5206c721f82SRyan Stone static void
5216c721f82SRyan Stone verify_binary(const nvlist_t *nvl, const char *name, int type,
5226c721f82SRyan Stone     const void * value, size_t size)
5236c721f82SRyan Stone {
5246c721f82SRyan Stone 	const void *actual_value;
5256c721f82SRyan Stone 	size_t actual_size;
5266c721f82SRyan Stone 
5276c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
5286c721f82SRyan Stone 	actual_value = nvlist_get_binary(nvl, name, &actual_size);
5296c721f82SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
5306c721f82SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0);
5316c721f82SRyan Stone }
5326c721f82SRyan Stone 
5336c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values);
5346c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__multiple_values)
5356c721f82SRyan Stone {
5366c721f82SRyan Stone 	std::ostringstream msg;
5376c721f82SRyan Stone 	std::set<std::string> keys_seen;
5386c721f82SRyan Stone 	nvlist_t *nvl, *unpacked, *nvvalue;
5396c721f82SRyan Stone 	const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name;
5406c721f82SRyan Stone 	int numvalue;
5416c721f82SRyan Stone 	const char * strvalue;
5426c721f82SRyan Stone 	void *binvalue, *packed, *it;
5436c721f82SRyan Stone 	size_t binsize, packed_size;
5446c721f82SRyan Stone 	int type;
5456c721f82SRyan Stone 
5466c721f82SRyan Stone 	nvl = nvlist_create(0);
5476c721f82SRyan Stone 
5486c721f82SRyan Stone 	nullkey = "null";
5496c721f82SRyan Stone 	nvlist_add_null(nvl, nullkey);
5506c721f82SRyan Stone 
5516c721f82SRyan Stone 	numkey = "number";
5526c721f82SRyan Stone 	numvalue = 939853984;
5536c721f82SRyan Stone 	nvlist_add_number(nvl, numkey, numvalue);
5546c721f82SRyan Stone 
5556c721f82SRyan Stone 	strkey = "string";
5566c721f82SRyan Stone 	strvalue = "jfieutijf";
5576c721f82SRyan Stone 	nvlist_add_string(nvl, strkey, strvalue);
5586c721f82SRyan Stone 
5596c721f82SRyan Stone 	nvkey = "nvlist";
5606c721f82SRyan Stone 	nvvalue = create_test_nvlist();
5616c721f82SRyan Stone 	nvlist_move_nvlist(nvl, nvkey, nvvalue);
5626c721f82SRyan Stone 
5636c721f82SRyan Stone 	binkey = "binary";
5646c721f82SRyan Stone 	binsize = 4;
5656c721f82SRyan Stone 	binvalue = malloc(binsize);
5666c721f82SRyan Stone 	memset(binvalue, 'b', binsize);
5676c721f82SRyan Stone 	nvlist_move_binary(nvl, binkey, binvalue, binsize);
5686c721f82SRyan Stone 
5696c721f82SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
5706c721f82SRyan Stone 	ATF_REQUIRE(packed != NULL);
5716c721f82SRyan Stone 
572bd1da0a0SMariusz Zaborski 	unpacked = nvlist_unpack(packed, packed_size, 0);
5736c721f82SRyan Stone 	ATF_REQUIRE(unpacked != 0);
5746c721f82SRyan Stone 
5756c721f82SRyan Stone 	it = NULL;
5766c721f82SRyan Stone 	while ((name = nvlist_next(unpacked, &type, &it)) != NULL) {
5776c721f82SRyan Stone 		/* Ensure that we see every key only once. */
5786c721f82SRyan Stone 		ATF_REQUIRE_EQ(keys_seen.count(name), 0);
5796c721f82SRyan Stone 
5806c721f82SRyan Stone 		if (strcmp(name, nullkey) == 0)
5816c721f82SRyan Stone 			verify_null(unpacked, type);
5826c721f82SRyan Stone 		else if (strcmp(name, numkey) == 0)
5836c721f82SRyan Stone 			verify_number(unpacked, name, type, numvalue);
5846c721f82SRyan Stone 		else if (strcmp(name, strkey) == 0)
5856c721f82SRyan Stone 			verify_string(unpacked, name, type, strvalue);
5866c721f82SRyan Stone 		else if (strcmp(name, nvkey) == 0)
5876c721f82SRyan Stone 			verify_nvlist(unpacked, name, type);
5886c721f82SRyan Stone 		else if (strcmp(name, binkey) == 0)
5896c721f82SRyan Stone 			verify_binary(unpacked, name, type, binvalue, binsize);
5906c721f82SRyan Stone 		else {
5916c721f82SRyan Stone 			msg << "Unexpected key :'" << name << "'";
5926c721f82SRyan Stone 			ATF_FAIL(msg.str().c_str());
5936c721f82SRyan Stone 		}
5946c721f82SRyan Stone 
5956c721f82SRyan Stone 		keys_seen.insert(name);
5966c721f82SRyan Stone 	}
5976c721f82SRyan Stone 
5986c721f82SRyan Stone 	/* Ensure that we saw every key. */
5996c721f82SRyan Stone 	ATF_REQUIRE_EQ(keys_seen.size(), 5);
6006c721f82SRyan Stone 
6016c721f82SRyan Stone 	nvlist_destroy(nvl);
6026c721f82SRyan Stone 	nvlist_destroy(unpacked);
6036c721f82SRyan Stone 	free(packed);
6046c721f82SRyan Stone }
6056c721f82SRyan Stone 
606a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist);
607a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist)
608a87e5162SRyan Stone {
609a87e5162SRyan Stone 	nvlist_t *nvl;
610a87e5162SRyan Stone 	void *packed;
611a87e5162SRyan Stone 	size_t size;
612a87e5162SRyan Stone 
613a87e5162SRyan Stone 	nvl = nvlist_create(0);
614a87e5162SRyan Stone 	ATF_REQUIRE(nvl != NULL);
615a87e5162SRyan Stone 
616a87e5162SRyan Stone 	nvlist_set_error(nvl, ENOMEM);
617a87e5162SRyan Stone 
618a87e5162SRyan Stone 	packed = nvlist_pack(nvl, &size);
619a87e5162SRyan Stone 	ATF_REQUIRE(packed == NULL);
620a87e5162SRyan Stone 
621a87e5162SRyan Stone 	nvlist_destroy(nvl);
622a87e5162SRyan Stone }
623a87e5162SRyan Stone 
6246c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key);
6256c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key)
6266c721f82SRyan Stone {
6276c721f82SRyan Stone 	nvlist_t *nvl, *unpacked;
6286c721f82SRyan Stone 	const char *key1, *key2;
6296c721f82SRyan Stone 	void *packed, *keypos;
6306c721f82SRyan Stone 	size_t size, keylen;
6316c721f82SRyan Stone 
6326c721f82SRyan Stone 	nvl = nvlist_create(0);
6336c721f82SRyan Stone 
6346c721f82SRyan Stone 	key1 = "key1";
6356c721f82SRyan Stone 	keylen = strlen(key1);
6366c721f82SRyan Stone 	nvlist_add_number(nvl, key1, 5);
6376c721f82SRyan Stone 
6386c721f82SRyan Stone 	key2 = "key2";
6396c721f82SRyan Stone 	ATF_REQUIRE_EQ(keylen, strlen(key2));
6406c721f82SRyan Stone 	nvlist_add_number(nvl, key2, 10);
6416c721f82SRyan Stone 
6426c721f82SRyan Stone 	packed = nvlist_pack(nvl, &size);
6436c721f82SRyan Stone 
6446c721f82SRyan Stone 	/*
6456c721f82SRyan Stone 	 * Mangle the packed nvlist by replacing key1 with key2, creating a
6466c721f82SRyan Stone 	 * packed nvlist with a duplicate key.
6476c721f82SRyan Stone 	 */
6486c721f82SRyan Stone 	keypos = memmem(packed, size, key1, keylen);
6496c721f82SRyan Stone 	ATF_REQUIRE(keypos != NULL);
6506c721f82SRyan Stone 	memcpy(keypos, key2, keylen);
6516c721f82SRyan Stone 
652bd1da0a0SMariusz Zaborski 	unpacked = nvlist_unpack(packed, size, 0);
6536c721f82SRyan Stone 	ATF_REQUIRE(nvlist_error(unpacked) != 0);
6546c721f82SRyan Stone 
6556c721f82SRyan Stone 	free(packed);
6566c721f82SRyan Stone 	nvlist_destroy(nvl);
6576c721f82SRyan Stone 	nvlist_destroy(unpacked);
6586c721f82SRyan Stone }
6596c721f82SRyan Stone 
66071637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert);
66171637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_string__single_insert)
66271637d76SRyan Stone {
66371637d76SRyan Stone 	nvlist_t *nvl;
66471637d76SRyan Stone 	const char *key;
66571637d76SRyan Stone 	char *value;
66671637d76SRyan Stone 
66771637d76SRyan Stone 	nvl = nvlist_create(0);
66871637d76SRyan Stone 	ATF_REQUIRE(nvl != NULL);
66971637d76SRyan Stone 
67071637d76SRyan Stone 	key = "testkey";
67171637d76SRyan Stone 	value = strdup("testval");
67271637d76SRyan Stone 	ATF_REQUIRE(value != NULL);
67371637d76SRyan Stone 
67471637d76SRyan Stone 	nvlist_move_string(nvl, key, value);
67571637d76SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value);
67671637d76SRyan Stone 
67771637d76SRyan Stone 	nvlist_destroy(nvl);
67871637d76SRyan Stone }
67971637d76SRyan Stone 
68071637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child);
68171637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child)
68271637d76SRyan Stone {
68371637d76SRyan Stone 	nvlist_t *parent;
68471637d76SRyan Stone 
68571637d76SRyan Stone 	parent = nvlist_create(0);
68671637d76SRyan Stone 
68771637d76SRyan Stone 	nvlist_move_nvlist(parent, "test", NULL);
68871637d76SRyan Stone 
68971637d76SRyan Stone 	ATF_REQUIRE(nvlist_error(parent) != 0);
69071637d76SRyan Stone 
69171637d76SRyan Stone 	nvlist_destroy(parent);
69271637d76SRyan Stone }
69371637d76SRyan Stone 
69419a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error);
69519a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error)
69619a4afb3SRyan Stone {
69719a4afb3SRyan Stone 	nvlist_t *nvl, *parent;
69819a4afb3SRyan Stone 
69919a4afb3SRyan Stone 	nvl = nvlist_create(0);
70019a4afb3SRyan Stone 	parent = nvlist_create(0);
70119a4afb3SRyan Stone 
70219a4afb3SRyan Stone 	nvlist_set_error(nvl, EBADF);
70319a4afb3SRyan Stone 	nvlist_move_nvlist(parent, "test", nvl);
70419a4afb3SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
70519a4afb3SRyan Stone 
70619a4afb3SRyan Stone 	nvlist_destroy(parent);
70719a4afb3SRyan Stone }
70819a4afb3SRyan Stone 
70971637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert);
71071637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert)
71171637d76SRyan Stone {
71271637d76SRyan Stone 	nvlist_t *nvl;
71371637d76SRyan Stone 	const char *key;
71471637d76SRyan Stone 	nvlist_t *value;
71571637d76SRyan Stone 
71671637d76SRyan Stone 	nvl = nvlist_create(0);
71771637d76SRyan Stone 	ATF_REQUIRE(nvl != NULL);
71871637d76SRyan Stone 
71971637d76SRyan Stone 	key = "testkey";
72071637d76SRyan Stone 	value = nvlist_create(0);
72171637d76SRyan Stone 	ATF_REQUIRE(value != NULL);
72271637d76SRyan Stone 
72371637d76SRyan Stone 	nvlist_move_nvlist(nvl, key, value);
72471637d76SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value);
72571637d76SRyan Stone 
72671637d76SRyan Stone 	nvlist_destroy(nvl);
72771637d76SRyan Stone }
72871637d76SRyan Stone 
72971637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert);
73071637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert)
73171637d76SRyan Stone {
73271637d76SRyan Stone 	nvlist_t *nvl;
73371637d76SRyan Stone 	const char *key;
73471637d76SRyan Stone 	void *value;
73571637d76SRyan Stone 	size_t size, actual_size;
73671637d76SRyan Stone 
73771637d76SRyan Stone 	nvl = nvlist_create(0);
73871637d76SRyan Stone 	ATF_REQUIRE(nvl != NULL);
73971637d76SRyan Stone 
74071637d76SRyan Stone 	key = "testkey";
74171637d76SRyan Stone 	size = 73;
74271637d76SRyan Stone 	value = malloc(size);
74371637d76SRyan Stone 	ATF_REQUIRE(value != NULL);
74471637d76SRyan Stone 
74571637d76SRyan Stone 	nvlist_move_binary(nvl, key, value, size);
74671637d76SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value);
74771637d76SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
74871637d76SRyan Stone 
74971637d76SRyan Stone 	nvlist_destroy(nvl);
75071637d76SRyan Stone }
75171637d76SRyan Stone 
752fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove);
753fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove)
754fad0a264SRyan Stone {
755fad0a264SRyan Stone 	nvlist_t *nvl;
756fad0a264SRyan Stone 	const char *testkey;
757fad0a264SRyan Stone 	bool testval;
758fad0a264SRyan Stone 
759fad0a264SRyan Stone 	nvl = nvlist_create(0);
760fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
761fad0a264SRyan Stone 
762fad0a264SRyan Stone 	testkey = "boolkey";
763fad0a264SRyan Stone 	testval = false;
764fad0a264SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
765fad0a264SRyan Stone 
766fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
767fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
768fad0a264SRyan Stone 
769fad0a264SRyan Stone 	nvlist_destroy(nvl);
770fad0a264SRyan Stone }
771fad0a264SRyan Stone 
772fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged);
773fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged)
774fad0a264SRyan Stone {
775fad0a264SRyan Stone 	nvlist_t *nvl;
776fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
777fad0a264SRyan Stone 	bool testval, otherval1;
778fad0a264SRyan Stone 	nvlist_t *otherval2;
779fad0a264SRyan Stone 
780fad0a264SRyan Stone 	nvl = nvlist_create(0);
781fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
782fad0a264SRyan Stone 
783fad0a264SRyan Stone 	testkey = "boolkey";
784fad0a264SRyan Stone 	testval = true;
785fad0a264SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
786fad0a264SRyan Stone 
787fad0a264SRyan Stone 	otherkey1 = "key1";
788fad0a264SRyan Stone 	otherval1 = false;
789fad0a264SRyan Stone 	nvlist_add_bool(nvl, otherkey1, otherval1);
790fad0a264SRyan Stone 
791fad0a264SRyan Stone 	otherkey2 = "key2";
792fad0a264SRyan Stone 	otherval2 = create_test_nvlist();
793fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, otherkey2, otherval2);
794fad0a264SRyan Stone 
795fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
796fad0a264SRyan Stone 
797fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1));
798fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1);
799fad0a264SRyan Stone 
800fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2));
801fad0a264SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2));
802fad0a264SRyan Stone 
803fad0a264SRyan Stone 	nvlist_destroy(nvl);
804fad0a264SRyan Stone }
805fad0a264SRyan Stone 
806fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove);
807fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__single_remove)
808fad0a264SRyan Stone {
809fad0a264SRyan Stone 	nvlist_t *nvl;
810fad0a264SRyan Stone 	const char *testkey;
811fad0a264SRyan Stone 	uint64_t testval;
812fad0a264SRyan Stone 
813fad0a264SRyan Stone 	nvl = nvlist_create(0);
814fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
815fad0a264SRyan Stone 
816fad0a264SRyan Stone 	testkey = "numkey";
817fad0a264SRyan Stone 	testval = std::numeric_limits<uint64_t>::max();
818fad0a264SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
819fad0a264SRyan Stone 
820fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
821fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
822fad0a264SRyan Stone 
823fad0a264SRyan Stone 	nvlist_destroy(nvl);
824fad0a264SRyan Stone }
825fad0a264SRyan Stone 
826fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged);
827fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged)
828fad0a264SRyan Stone {
829fad0a264SRyan Stone 	nvlist_t *nvl;
830fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
831fad0a264SRyan Stone 	uint64_t testval, otherval1;
832fad0a264SRyan Stone 	const char *otherval2;
833fad0a264SRyan Stone 
834fad0a264SRyan Stone 	nvl = nvlist_create(0);
835fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
836fad0a264SRyan Stone 
837fad0a264SRyan Stone 	otherkey1 = "key1";
838fad0a264SRyan Stone 	otherval1 = 5;
839fad0a264SRyan Stone 	nvlist_add_number(nvl, otherkey1, otherval1);
840fad0a264SRyan Stone 
841fad0a264SRyan Stone 	testkey = "numkey";
842fad0a264SRyan Stone 	testval = 1654;
843fad0a264SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
844fad0a264SRyan Stone 
845fad0a264SRyan Stone 	otherkey2 = "key2";
846fad0a264SRyan Stone 	otherval2 = "string";
847fad0a264SRyan Stone 	nvlist_add_string(nvl, otherkey2, otherval2);
848fad0a264SRyan Stone 
849fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
850fad0a264SRyan Stone 
851fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1));
852fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1);
853fad0a264SRyan Stone 
854fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2));
855fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0);
856fad0a264SRyan Stone 
857fad0a264SRyan Stone 	nvlist_destroy(nvl);
858fad0a264SRyan Stone }
859fad0a264SRyan Stone 
860fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove);
861fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__single_remove)
862fad0a264SRyan Stone {
863fad0a264SRyan Stone 	nvlist_t *nvl;
864fad0a264SRyan Stone 	const char *testkey;
865fad0a264SRyan Stone 	const char *testval;
866fad0a264SRyan Stone 
867fad0a264SRyan Stone 	nvl = nvlist_create(0);
868fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
869fad0a264SRyan Stone 
870fad0a264SRyan Stone 	testkey = "numkey";
871fad0a264SRyan Stone 	testval = "nvlist";
872fad0a264SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
873fad0a264SRyan Stone 
874fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
875fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
876fad0a264SRyan Stone 
877fad0a264SRyan Stone 	nvlist_destroy(nvl);
878fad0a264SRyan Stone }
879fad0a264SRyan Stone 
880fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged);
881fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged)
882fad0a264SRyan Stone {
883fad0a264SRyan Stone 	nvlist_t *nvl;
884fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
885fad0a264SRyan Stone 	const char *testval, *otherval1;
886fad0a264SRyan Stone 	bool otherval2;
887fad0a264SRyan Stone 
888fad0a264SRyan Stone 	nvl = nvlist_create(0);
889fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
890fad0a264SRyan Stone 
891fad0a264SRyan Stone 	otherkey1 = "key1";
892fad0a264SRyan Stone 	otherval1 = "fjdifjdk";
893fad0a264SRyan Stone 	nvlist_add_string(nvl, otherkey1, otherval1);
894fad0a264SRyan Stone 
895fad0a264SRyan Stone 	otherkey2 = "key2";
896fad0a264SRyan Stone 	otherval2 = true;
897fad0a264SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
898fad0a264SRyan Stone 
899fad0a264SRyan Stone 	testkey = "strkey";
900fad0a264SRyan Stone 	testval = "1654";
901fad0a264SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
902fad0a264SRyan Stone 
903fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
904fad0a264SRyan Stone 
905fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1));
906fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0);
907fad0a264SRyan Stone 
908fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
909fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
910fad0a264SRyan Stone 
911fad0a264SRyan Stone 	nvlist_destroy(nvl);
912fad0a264SRyan Stone }
913fad0a264SRyan Stone 
914fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove);
915fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove)
916fad0a264SRyan Stone {
917fad0a264SRyan Stone 	nvlist_t *nvl;
918fad0a264SRyan Stone 	const char *testkey;
919fad0a264SRyan Stone 	nvlist_t *testval;
920fad0a264SRyan Stone 
921fad0a264SRyan Stone 	nvl = nvlist_create(0);
922fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
923fad0a264SRyan Stone 
924fad0a264SRyan Stone 	testkey = "numkey";
925fad0a264SRyan Stone 	testval = create_test_nvlist();
926fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
927fad0a264SRyan Stone 
928fad0a264SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
929fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
930fad0a264SRyan Stone 
931fad0a264SRyan Stone 	nvlist_destroy(nvl);
932fad0a264SRyan Stone }
933fad0a264SRyan Stone 
934fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged);
935fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged)
936fad0a264SRyan Stone {
937fad0a264SRyan Stone 	nvlist_t *nvl;
938fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
939fad0a264SRyan Stone 	nvlist_t *testval, *otherval1;
940fad0a264SRyan Stone 
941fad0a264SRyan Stone 	nvl = nvlist_create(0);
942fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
943fad0a264SRyan Stone 
944fad0a264SRyan Stone 	testkey = "strkey";
945fad0a264SRyan Stone 	testval = create_test_nvlist();
946fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
947fad0a264SRyan Stone 
948fad0a264SRyan Stone 	otherkey1 = "key1";
949fad0a264SRyan Stone 	otherval1 = nvlist_create(0);
950fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, otherkey1, otherval1);
951fad0a264SRyan Stone 
952fad0a264SRyan Stone 	otherkey2 = "key2";
953fad0a264SRyan Stone 	nvlist_add_null(nvl, otherkey2);
954fad0a264SRyan Stone 
955fad0a264SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
956fad0a264SRyan Stone 
957fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1));
958fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1)));
959fad0a264SRyan Stone 
960fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2));
961fad0a264SRyan Stone 
962fad0a264SRyan Stone 	nvlist_destroy(nvl);
963fad0a264SRyan Stone }
964fad0a264SRyan Stone 
965fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove);
966fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove)
967fad0a264SRyan Stone {
968fad0a264SRyan Stone 	nvlist_t *nvl;
969fad0a264SRyan Stone 	const char *testkey;
970fad0a264SRyan Stone 	void *testval;
971fad0a264SRyan Stone 	const void *actual_val;
972fad0a264SRyan Stone 	size_t testsize, actual_size;
973fad0a264SRyan Stone 
974fad0a264SRyan Stone 	nvl = nvlist_create(0);
975fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
976fad0a264SRyan Stone 
977fad0a264SRyan Stone 	testkey = "numkey";
978fad0a264SRyan Stone 	testsize = 457;
979fad0a264SRyan Stone 	testval = malloc(testsize);
980fad0a264SRyan Stone 	memset(testval, '5', testsize);
981fad0a264SRyan Stone 	nvlist_move_binary(nvl, testkey, testval, testsize);
982fad0a264SRyan Stone 
983fad0a264SRyan Stone 	actual_val = nvlist_take_binary(nvl, testkey, &actual_size);
984fad0a264SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
985fad0a264SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0);
986fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
987fad0a264SRyan Stone 
988fad0a264SRyan Stone 	nvlist_destroy(nvl);
989fad0a264SRyan Stone }
990fad0a264SRyan Stone 
991fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged);
992fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged)
993fad0a264SRyan Stone {
994fad0a264SRyan Stone 	nvlist_t *nvl;
995fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
996fad0a264SRyan Stone 	const void *actual_value;
997fad0a264SRyan Stone 	char testval[] = "gjiertj";
998fad0a264SRyan Stone 	char otherval1[] = "fdreg";
999fad0a264SRyan Stone 	size_t testsize, othersize, actual_size;
1000fad0a264SRyan Stone 	bool otherval2;
1001fad0a264SRyan Stone 
1002fad0a264SRyan Stone 	nvl = nvlist_create(0);
1003fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1004fad0a264SRyan Stone 
1005fad0a264SRyan Stone 	otherkey1 = "key1";
1006fad0a264SRyan Stone 	othersize = sizeof(otherval1);
1007fad0a264SRyan Stone 	nvlist_add_binary(nvl, otherkey1, otherval1, othersize);
1008fad0a264SRyan Stone 
1009fad0a264SRyan Stone 	otherkey2 = "key2";
1010fad0a264SRyan Stone 	otherval2 = true;
1011fad0a264SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
1012fad0a264SRyan Stone 
1013fad0a264SRyan Stone 	testkey = "strkey";
1014fad0a264SRyan Stone 	testsize = sizeof(testval);
1015fad0a264SRyan Stone 	nvlist_add_binary(nvl, testkey, testval, testsize);
1016fad0a264SRyan Stone 
1017fad0a264SRyan Stone 	actual_value = nvlist_take_binary(nvl, testkey, &actual_size);
1018fad0a264SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
1019fad0a264SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0);
1020fad0a264SRyan Stone 
1021fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1));
1022fad0a264SRyan Stone 	actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size);
1023fad0a264SRyan Stone 	ATF_REQUIRE_EQ(othersize, actual_size);
1024fad0a264SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0);
1025fad0a264SRyan Stone 
1026fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
1027fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
1028fad0a264SRyan Stone 
1029fad0a264SRyan Stone 	nvlist_destroy(nvl);
1030fad0a264SRyan Stone }
1031fad0a264SRyan Stone 
1032339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null);
1033339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_null)
1034339bcfc7SRyan Stone {
1035339bcfc7SRyan Stone 	nvlist_t *nvl;
1036339bcfc7SRyan Stone 	const char *key;
1037339bcfc7SRyan Stone 
1038339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1039339bcfc7SRyan Stone 	key = "test";
1040339bcfc7SRyan Stone 	nvlist_add_null(nvl, key);
1041339bcfc7SRyan Stone 
1042339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1043339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1044339bcfc7SRyan Stone 
1045339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1046339bcfc7SRyan Stone }
1047339bcfc7SRyan Stone 
1048339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool);
1049339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_bool)
1050339bcfc7SRyan Stone {
1051339bcfc7SRyan Stone 	nvlist_t *nvl;
1052339bcfc7SRyan Stone 	const char *key;
1053339bcfc7SRyan Stone 
1054339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1055339bcfc7SRyan Stone 	key = "test";
1056339bcfc7SRyan Stone 	nvlist_add_bool(nvl, key, true);
1057339bcfc7SRyan Stone 
1058339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1059339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1060339bcfc7SRyan Stone 
1061339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1062339bcfc7SRyan Stone }
1063339bcfc7SRyan Stone 
1064339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number);
1065339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_number)
1066339bcfc7SRyan Stone {
1067339bcfc7SRyan Stone 	nvlist_t *nvl;
1068339bcfc7SRyan Stone 	const char *key;
1069339bcfc7SRyan Stone 
1070339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1071339bcfc7SRyan Stone 	key = "test";
1072339bcfc7SRyan Stone 	nvlist_add_number(nvl, key, 584);
1073339bcfc7SRyan Stone 
1074339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1075339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1076339bcfc7SRyan Stone 
1077339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1078339bcfc7SRyan Stone }
1079339bcfc7SRyan Stone 
1080339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string);
1081339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_string)
1082339bcfc7SRyan Stone {
1083339bcfc7SRyan Stone 	nvlist_t *nvl;
1084339bcfc7SRyan Stone 	const char *key;
1085339bcfc7SRyan Stone 
1086339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1087339bcfc7SRyan Stone 	key = "test";
1088339bcfc7SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
1089339bcfc7SRyan Stone 
1090339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1091339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1092339bcfc7SRyan Stone 
1093339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1094339bcfc7SRyan Stone }
1095339bcfc7SRyan Stone 
1096339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist);
1097339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_nvlist)
1098339bcfc7SRyan Stone {
1099339bcfc7SRyan Stone 	nvlist_t *nvl;
1100339bcfc7SRyan Stone 	const char *key;
1101339bcfc7SRyan Stone 
1102339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1103339bcfc7SRyan Stone 	key = "test";
1104339bcfc7SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1105339bcfc7SRyan Stone 
1106339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1107339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1108339bcfc7SRyan Stone 
1109339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1110339bcfc7SRyan Stone }
1111339bcfc7SRyan Stone 
1112339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary);
1113339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_binary)
1114339bcfc7SRyan Stone {
1115339bcfc7SRyan Stone 	nvlist_t *nvl;
1116339bcfc7SRyan Stone 	const char *key;
1117339bcfc7SRyan Stone 
1118339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1119339bcfc7SRyan Stone 	key = "test";
1120339bcfc7SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1121339bcfc7SRyan Stone 
1122339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1123339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1124339bcfc7SRyan Stone 
1125339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1126339bcfc7SRyan Stone }
1127339bcfc7SRyan Stone 
1128339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null);
1129339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_null__single_null)
1130339bcfc7SRyan Stone {
1131339bcfc7SRyan Stone 	nvlist_t *nvl;
1132339bcfc7SRyan Stone 	const char *key;
1133339bcfc7SRyan Stone 
1134339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1135339bcfc7SRyan Stone 	key = "test";
1136339bcfc7SRyan Stone 	nvlist_add_null(nvl, key);
1137339bcfc7SRyan Stone 
1138339bcfc7SRyan Stone 	nvlist_free_null(nvl, key);
1139339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1140339bcfc7SRyan Stone 
1141339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1142339bcfc7SRyan Stone }
1143339bcfc7SRyan Stone 
1144339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool);
1145339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool)
1146339bcfc7SRyan Stone {
1147339bcfc7SRyan Stone 	nvlist_t *nvl;
1148339bcfc7SRyan Stone 	const char *key;
1149339bcfc7SRyan Stone 
1150339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1151339bcfc7SRyan Stone 	key = "test";
1152339bcfc7SRyan Stone 	nvlist_add_bool(nvl, key, true);
1153339bcfc7SRyan Stone 
1154339bcfc7SRyan Stone 	nvlist_free_bool(nvl, key);
1155339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1156339bcfc7SRyan Stone 
1157339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1158339bcfc7SRyan Stone }
1159339bcfc7SRyan Stone 
1160339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number);
1161339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_number__single_number)
1162339bcfc7SRyan Stone {
1163339bcfc7SRyan Stone 	nvlist_t *nvl;
1164339bcfc7SRyan Stone 	const char *key;
1165339bcfc7SRyan Stone 
1166339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1167339bcfc7SRyan Stone 	key = "test";
1168339bcfc7SRyan Stone 	nvlist_add_number(nvl, key, 584);
1169339bcfc7SRyan Stone 
1170339bcfc7SRyan Stone 	nvlist_free_number(nvl, key);
1171339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1172339bcfc7SRyan Stone 
1173339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1174339bcfc7SRyan Stone }
1175339bcfc7SRyan Stone 
1176339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string);
1177339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_string__single_string)
1178339bcfc7SRyan Stone {
1179339bcfc7SRyan Stone 	nvlist_t *nvl;
1180339bcfc7SRyan Stone 	const char *key;
1181339bcfc7SRyan Stone 
1182339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1183339bcfc7SRyan Stone 	key = "test";
1184339bcfc7SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
1185339bcfc7SRyan Stone 
1186339bcfc7SRyan Stone 	nvlist_free_string(nvl, key);
1187339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1188339bcfc7SRyan Stone 
1189339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1190339bcfc7SRyan Stone }
1191339bcfc7SRyan Stone 
1192339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist);
1193339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist)
1194339bcfc7SRyan Stone {
1195339bcfc7SRyan Stone 	nvlist_t *nvl;
1196339bcfc7SRyan Stone 	const char *key;
1197339bcfc7SRyan Stone 
1198339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1199339bcfc7SRyan Stone 	key = "test";
1200339bcfc7SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1201339bcfc7SRyan Stone 
1202339bcfc7SRyan Stone 	nvlist_free_nvlist(nvl, key);
1203339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1204339bcfc7SRyan Stone 
1205339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1206339bcfc7SRyan Stone }
1207339bcfc7SRyan Stone 
1208339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary);
1209339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary)
1210339bcfc7SRyan Stone {
1211339bcfc7SRyan Stone 	nvlist_t *nvl;
1212339bcfc7SRyan Stone 	const char *key;
1213339bcfc7SRyan Stone 
1214339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1215339bcfc7SRyan Stone 	key = "test";
1216339bcfc7SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1217339bcfc7SRyan Stone 
1218339bcfc7SRyan Stone 	nvlist_free_binary(nvl, key);
1219339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1220339bcfc7SRyan Stone 
1221339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1222339bcfc7SRyan Stone }
1223339bcfc7SRyan Stone 
12243075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
12253075c896SRyan Stone {
12263075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
12273075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
12283075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
12293075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
12303075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
12313075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
123219a4afb3SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error);
12333075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
12346e623ffdSRyan Stone 
12356e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
12366e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
12376e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
1238a87e5162SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist);
12396c721f82SRyan Stone 
12406c721f82SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist);
12416c721f82SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values);
1242a87e5162SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist);
12436c721f82SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key);
124400173c09SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_unpack__flags_nvlist);
124571637d76SRyan Stone 
124671637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert);
124771637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert);
124871637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child);
124919a4afb3SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error);
125071637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert);
1251fad0a264SRyan Stone 
1252fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove);
1253fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged);
1254fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove);
1255fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged);
1256fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove);
1257fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged);
1258fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove);
1259fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged);
1260fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove);
1261fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged);
1262339bcfc7SRyan Stone 
1263339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_null);
1264339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool);
1265339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_number);
1266339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_string);
1267339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist);
1268339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary);
1269339bcfc7SRyan Stone 
1270339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null);
1271339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool);
1272339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number);
1273339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string);
1274339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist);
1275339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary);
12763075c896SRyan Stone }
1277