xref: /freebsd/lib/libnv/tests/nv_tests.cc (revision bf5d6cf0a970449cac82786a0dbd6c7e31adb181)
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;
57*bf5d6cf0SDimitry 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_existsf(nvl, "%s", key));
813075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
823075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_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);
88*bf5d6cf0SDimitry 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));
1113075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me"));
1123075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
1133075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e'));
1143075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
1153075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true);
1163075c896SRyan Stone 
1173075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1183075c896SRyan Stone 	it = NULL;
1193075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1203075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
121*bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
1223075c896SRyan Stone 
1233075c896SRyan Stone 	nvlist_destroy(nvl);
1243075c896SRyan Stone }
1253075c896SRyan Stone 
1263075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
1273075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
1283075c896SRyan Stone {
1293075c896SRyan Stone 	nvlist_t *nvl;
1303075c896SRyan Stone 	void *it;
1313075c896SRyan Stone 	const char *key;
1323075c896SRyan Stone 	uint64_t value;
1333075c896SRyan Stone 	int type;
1343075c896SRyan Stone 
1353075c896SRyan Stone 	key = "foo123";
1363075c896SRyan Stone 	value = 71965;
1373075c896SRyan Stone 	nvl = nvlist_create(0);
1383075c896SRyan Stone 
1393075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1403075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1413075c896SRyan Stone 
1423075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
1433075c896SRyan Stone 
1443075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1453075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
1463075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123));
1473075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
1483075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key));
1493075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
1503075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value);
1513075c896SRyan Stone 
1523075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1533075c896SRyan Stone 	it = NULL;
1543075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1553075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
156*bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
1573075c896SRyan Stone 
1583075c896SRyan Stone 	nvlist_destroy(nvl);
1593075c896SRyan Stone }
1603075c896SRyan Stone 
1613075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
1623075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
1633075c896SRyan Stone {
1643075c896SRyan Stone 	nvlist_t *nvl;
1653075c896SRyan Stone 	void *it;
1663075c896SRyan Stone 	const char *key;
1673075c896SRyan Stone 	const char *value;
1683075c896SRyan Stone 	int type;
1693075c896SRyan Stone 
1703075c896SRyan Stone 	key = "test";
1713075c896SRyan Stone 	value = "fgjdkgjdk";
1723075c896SRyan Stone 	nvl = nvlist_create(0);
1733075c896SRyan Stone 
1743075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1753075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1763075c896SRyan Stone 
1773075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
1783075c896SRyan Stone 
1793075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1803075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
1813075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
1823075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
1833075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key));
1843075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
1853075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0);
1863075c896SRyan Stone 
1873075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
1883075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
1893075c896SRyan Stone 
1903075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1913075c896SRyan Stone 	it = NULL;
1923075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1933075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
194*bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
1953075c896SRyan Stone 
1963075c896SRyan Stone 	nvlist_destroy(nvl);
1973075c896SRyan Stone }
1983075c896SRyan Stone 
1993075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
2003075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
2013075c896SRyan Stone {
2023075c896SRyan Stone 	nvlist_t *nvl;
2033075c896SRyan Stone 	void *it;
2043075c896SRyan Stone 	const char *key, *subkey;
2053075c896SRyan Stone 	nvlist_t *sublist;
2063075c896SRyan Stone 	const nvlist_t *value;
2073075c896SRyan Stone 	int type;
2083075c896SRyan Stone 
2093075c896SRyan Stone 	key = "test";
2103075c896SRyan Stone 	subkey = "subkey";
2113075c896SRyan Stone 	sublist = nvlist_create(0);
2123075c896SRyan Stone 	nvl = nvlist_create(0);
2133075c896SRyan Stone 
2143075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
2153075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
2163075c896SRyan Stone 
2173075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
2183075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
2193075c896SRyan Stone 
2203075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
2213075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
2223075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
2233075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
2243075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key));
2253075c896SRyan Stone 
2263075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
2273075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
2283075c896SRyan Stone 
2293075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
2303075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
2313075c896SRyan Stone 
2323075c896SRyan Stone 	value = nvlist_getf_nvlist(nvl, "%s", key);
2333075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
2343075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
2353075c896SRyan Stone 
2363075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
2373075c896SRyan Stone 	it = NULL;
2383075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
2393075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
240*bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
2413075c896SRyan Stone 
2423075c896SRyan Stone 	nvlist_destroy(sublist);
2433075c896SRyan Stone 	nvlist_destroy(nvl);
2443075c896SRyan Stone }
2453075c896SRyan Stone 
24619a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error);
24719a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error)
24819a4afb3SRyan Stone {
24919a4afb3SRyan Stone 	nvlist_t *nvl, *parent;
25019a4afb3SRyan Stone 
25119a4afb3SRyan Stone 	nvl = nvlist_create(0);
25219a4afb3SRyan Stone 	parent = nvlist_create(0);
25319a4afb3SRyan Stone 
25419a4afb3SRyan Stone 	nvlist_set_error(nvl, EBADF);
25519a4afb3SRyan Stone 	nvlist_add_nvlist(parent, "test", nvl);
25619a4afb3SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
25719a4afb3SRyan Stone 
25819a4afb3SRyan Stone 	nvlist_destroy(nvl);
25919a4afb3SRyan Stone 	nvlist_destroy(parent);
26019a4afb3SRyan Stone }
26119a4afb3SRyan Stone 
2623075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
2633075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
2643075c896SRyan Stone {
2653075c896SRyan Stone 	nvlist_t *nvl;
2663075c896SRyan Stone 	void *it;
2673075c896SRyan Stone 	const char *key;
2683075c896SRyan Stone 	void *value;
2693075c896SRyan Stone 	const void *ret_value;
2703075c896SRyan Stone 	size_t value_size, ret_size;
2713075c896SRyan Stone 	int type;
2723075c896SRyan Stone 
2733075c896SRyan Stone 	key = "binary";
2743075c896SRyan Stone 	value_size = 13;
2753075c896SRyan Stone 	value = malloc(value_size);
2763075c896SRyan Stone 	memset(value, 0xa5, value_size);
2773075c896SRyan Stone 	nvl = nvlist_create(0);
2783075c896SRyan Stone 
2793075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
2803075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
2813075c896SRyan Stone 
2823075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
2833075c896SRyan Stone 
2843075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
2853075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
2863075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
2873075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
2883075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key));
2893075c896SRyan Stone 
2903075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
2913075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
2923075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
2933075c896SRyan Stone 
2943075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
2953075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
2963075c896SRyan Stone 
2973075c896SRyan Stone 	ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key);
2983075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
2993075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
3003075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
3013075c896SRyan Stone 
3023075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
3033075c896SRyan Stone 	it = NULL;
3043075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
3053075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
306*bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
3073075c896SRyan Stone 
3083075c896SRyan Stone 	nvlist_destroy(nvl);
3093075c896SRyan Stone 	free(value);
3103075c896SRyan Stone }
3113075c896SRyan Stone 
3126e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
3136e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
3146e623ffdSRyan Stone {
3156e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
3166e623ffdSRyan Stone 
3176e623ffdSRyan Stone 	nvl = nvlist_create(0);
3186e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
3196e623ffdSRyan Stone 
3206e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
3216e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
3226e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
3236e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_empty(clone));
3246e623ffdSRyan Stone 
3256e623ffdSRyan Stone 	nvlist_destroy(clone);
3266e623ffdSRyan Stone 	nvlist_destroy(nvl);
3276e623ffdSRyan Stone }
3286e623ffdSRyan Stone 
3296e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
3306e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
3316e623ffdSRyan Stone {
3326e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
3336e623ffdSRyan Stone 	const char *key;
3346e623ffdSRyan Stone 	void *it;
3356e623ffdSRyan Stone 	uint64_t value;
3366e623ffdSRyan Stone 	int type;
3376e623ffdSRyan Stone 
3386e623ffdSRyan Stone 	nvl = nvlist_create(0);
3396e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
3406e623ffdSRyan Stone 
3416e623ffdSRyan Stone 	key = "testkey";
3426e623ffdSRyan Stone 	value = 684874;
3436e623ffdSRyan Stone 	nvlist_add_number(nvl, key, value);
3446e623ffdSRyan Stone 
3456e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
3466e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
3476e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
3486e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_number(clone, key));
3496e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
3506e623ffdSRyan Stone 
3516e623ffdSRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
3526e623ffdSRyan Stone 	it = NULL;
3536e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
3546e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
355*bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL));
3566e623ffdSRyan Stone 
3576e623ffdSRyan Stone 	nvlist_destroy(clone);
3586e623ffdSRyan Stone 	nvlist_destroy(nvl);
3596e623ffdSRyan Stone }
3606e623ffdSRyan Stone 
3616e623ffdSRyan Stone static const char * const test_subnvlist_key = "nvlist";
3626e623ffdSRyan Stone 
3636e623ffdSRyan Stone static const char * const test_string_key = "string";
3646e623ffdSRyan Stone static const char * const test_string_val = "59525";
3656e623ffdSRyan Stone 
3666e623ffdSRyan Stone static nvlist_t*
3676e623ffdSRyan Stone create_test_nvlist(void)
3686e623ffdSRyan Stone {
3696e623ffdSRyan Stone 	nvlist_t *nvl, *sublist;
3706e623ffdSRyan Stone 
3716e623ffdSRyan Stone 	nvl = nvlist_create(0);
3726e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
3736e623ffdSRyan Stone 
3746e623ffdSRyan Stone 	sublist = nvlist_create(0);
3756e623ffdSRyan Stone 	ATF_REQUIRE(sublist != NULL);
3766e623ffdSRyan Stone 
3776e623ffdSRyan Stone 	nvlist_add_string(sublist, test_string_key, test_string_val);
3786e623ffdSRyan Stone 	nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
3796e623ffdSRyan Stone 
3806e623ffdSRyan Stone 	return (nvl);
3816e623ffdSRyan Stone }
3826e623ffdSRyan Stone 
3836e623ffdSRyan Stone static void
3846e623ffdSRyan Stone verify_test_nvlist(const nvlist_t *nvl)
3856e623ffdSRyan Stone {
3866e623ffdSRyan Stone 	void *it;
3876e623ffdSRyan Stone 	const nvlist_t *value;
3886e623ffdSRyan Stone 	int type;
3896e623ffdSRyan Stone 
3906e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
3916e623ffdSRyan Stone 
3926e623ffdSRyan Stone 	value = nvlist_get_nvlist(nvl, test_subnvlist_key);
3936e623ffdSRyan Stone 
3946e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
3956e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
3966e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
3976e623ffdSRyan Stone 
3986e623ffdSRyan Stone 	/* Iterate over both nvlists; ensure that each has only the one key. */
3996e623ffdSRyan Stone 	it = NULL;
4006e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
4016e623ffdSRyan Stone 	    test_string_key), 0);
4026e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
403*bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL));
4046e623ffdSRyan Stone 
4056e623ffdSRyan Stone 	it = NULL;
4066e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
4076e623ffdSRyan Stone 	    test_subnvlist_key), 0);
4086e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
409*bf5d6cf0SDimitry Andric 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
4106e623ffdSRyan Stone }
4116e623ffdSRyan Stone 
4126e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
4136e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
4146e623ffdSRyan Stone {
4156e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
4166e623ffdSRyan Stone 
4176e623ffdSRyan Stone 	nvl = create_test_nvlist();
4186e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
4196e623ffdSRyan Stone 
4206e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
4216e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
4226e623ffdSRyan Stone 	verify_test_nvlist(clone);
4236e623ffdSRyan Stone 
4246e623ffdSRyan Stone 	nvlist_destroy(clone);
4256e623ffdSRyan Stone 	nvlist_destroy(nvl);
4266e623ffdSRyan Stone }
4276e623ffdSRyan Stone 
428a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist);
429a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist)
430a87e5162SRyan Stone {
431a87e5162SRyan Stone 	nvlist_t *nvl, *clone;
432a87e5162SRyan Stone 
433a87e5162SRyan Stone 	nvl = nvlist_create(0);
434a87e5162SRyan Stone 	ATF_REQUIRE(nvl != NULL);
435a87e5162SRyan Stone 
436a87e5162SRyan Stone 	nvlist_set_error(nvl, ENOMEM);
437a87e5162SRyan Stone 
438a87e5162SRyan Stone 	clone = nvlist_clone(nvl);
439a87e5162SRyan Stone 	ATF_REQUIRE(clone == NULL);
440a87e5162SRyan Stone 
441a87e5162SRyan Stone 	nvlist_destroy(nvl);
442a87e5162SRyan Stone }
443a87e5162SRyan Stone 
4446c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist);
4456c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist)
4466c721f82SRyan Stone {
4476c721f82SRyan Stone 	nvlist_t *nvl, *unpacked;
4486c721f82SRyan Stone 	void *packed;
4496c721f82SRyan Stone 	size_t packed_size;
4506c721f82SRyan Stone 
4516c721f82SRyan Stone 	nvl = nvlist_create(0);
4526c721f82SRyan Stone 	ATF_REQUIRE(nvl != NULL);
4536c721f82SRyan Stone 
4546c721f82SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
4556c721f82SRyan Stone 	ATF_REQUIRE(packed != NULL);
4566c721f82SRyan Stone 
4576c721f82SRyan Stone 	unpacked = nvlist_unpack(packed, packed_size);
4586c721f82SRyan Stone 	ATF_REQUIRE(unpacked != NULL);
4596c721f82SRyan Stone 	ATF_REQUIRE(unpacked != nvl);
4606c721f82SRyan Stone 	ATF_REQUIRE(nvlist_empty(unpacked));
4616c721f82SRyan Stone 
4626c721f82SRyan Stone 	nvlist_destroy(unpacked);
4636c721f82SRyan Stone 	nvlist_destroy(nvl);
4646c721f82SRyan Stone 	free(packed);
4656c721f82SRyan Stone }
4666c721f82SRyan Stone 
4676c721f82SRyan Stone static void
4686c721f82SRyan Stone verify_null(const nvlist_t *nvl, int type)
4696c721f82SRyan Stone {
4706c721f82SRyan Stone 
4716c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
4726c721f82SRyan Stone }
4736c721f82SRyan Stone 
4746c721f82SRyan Stone static void
4756c721f82SRyan Stone verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value)
4766c721f82SRyan Stone {
4776c721f82SRyan Stone 
4786c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
4796c721f82SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value);
4806c721f82SRyan Stone }
4816c721f82SRyan Stone 
4826c721f82SRyan Stone static void
4836c721f82SRyan Stone verify_string(const nvlist_t *nvl, const char *name, int type,
4846c721f82SRyan Stone     const char * value)
4856c721f82SRyan Stone {
4866c721f82SRyan Stone 
4876c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
4886c721f82SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0);
4896c721f82SRyan Stone }
4906c721f82SRyan Stone 
4916c721f82SRyan Stone static void
4926c721f82SRyan Stone verify_nvlist(const nvlist_t *nvl, const char *name, int type)
4936c721f82SRyan Stone {
4946c721f82SRyan Stone 
4956c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
4966c721f82SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, name));
4976c721f82SRyan Stone }
4986c721f82SRyan Stone 
4996c721f82SRyan Stone static void
5006c721f82SRyan Stone verify_binary(const nvlist_t *nvl, const char *name, int type,
5016c721f82SRyan Stone     const void * value, size_t size)
5026c721f82SRyan Stone {
5036c721f82SRyan Stone 	const void *actual_value;
5046c721f82SRyan Stone 	size_t actual_size;
5056c721f82SRyan Stone 
5066c721f82SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
5076c721f82SRyan Stone 	actual_value = nvlist_get_binary(nvl, name, &actual_size);
5086c721f82SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
5096c721f82SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0);
5106c721f82SRyan Stone }
5116c721f82SRyan Stone 
5126c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values);
5136c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__multiple_values)
5146c721f82SRyan Stone {
5156c721f82SRyan Stone 	std::ostringstream msg;
5166c721f82SRyan Stone 	std::set<std::string> keys_seen;
5176c721f82SRyan Stone 	nvlist_t *nvl, *unpacked, *nvvalue;
5186c721f82SRyan Stone 	const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name;
5196c721f82SRyan Stone 	int numvalue;
5206c721f82SRyan Stone 	const char * strvalue;
5216c721f82SRyan Stone 	void *binvalue, *packed, *it;
5226c721f82SRyan Stone 	size_t binsize, packed_size;
5236c721f82SRyan Stone 	int type;
5246c721f82SRyan Stone 
5256c721f82SRyan Stone 	nvl = nvlist_create(0);
5266c721f82SRyan Stone 
5276c721f82SRyan Stone 	nullkey = "null";
5286c721f82SRyan Stone 	nvlist_add_null(nvl, nullkey);
5296c721f82SRyan Stone 
5306c721f82SRyan Stone 	numkey = "number";
5316c721f82SRyan Stone 	numvalue = 939853984;
5326c721f82SRyan Stone 	nvlist_add_number(nvl, numkey, numvalue);
5336c721f82SRyan Stone 
5346c721f82SRyan Stone 	strkey = "string";
5356c721f82SRyan Stone 	strvalue = "jfieutijf";
5366c721f82SRyan Stone 	nvlist_add_string(nvl, strkey, strvalue);
5376c721f82SRyan Stone 
5386c721f82SRyan Stone 	nvkey = "nvlist";
5396c721f82SRyan Stone 	nvvalue = create_test_nvlist();
5406c721f82SRyan Stone 	nvlist_move_nvlist(nvl, nvkey, nvvalue);
5416c721f82SRyan Stone 
5426c721f82SRyan Stone 	binkey = "binary";
5436c721f82SRyan Stone 	binsize = 4;
5446c721f82SRyan Stone 	binvalue = malloc(binsize);
5456c721f82SRyan Stone 	memset(binvalue, 'b', binsize);
5466c721f82SRyan Stone 	nvlist_move_binary(nvl, binkey, binvalue, binsize);
5476c721f82SRyan Stone 
5486c721f82SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
5496c721f82SRyan Stone 	ATF_REQUIRE(packed != NULL);
5506c721f82SRyan Stone 
5516c721f82SRyan Stone 	unpacked = nvlist_unpack(packed, packed_size);
5526c721f82SRyan Stone 	ATF_REQUIRE(unpacked != 0);
5536c721f82SRyan Stone 
5546c721f82SRyan Stone 	it = NULL;
5556c721f82SRyan Stone 	while ((name = nvlist_next(unpacked, &type, &it)) != NULL) {
5566c721f82SRyan Stone 		/* Ensure that we see every key only once. */
5576c721f82SRyan Stone 		ATF_REQUIRE_EQ(keys_seen.count(name), 0);
5586c721f82SRyan Stone 
5596c721f82SRyan Stone 		if (strcmp(name, nullkey) == 0)
5606c721f82SRyan Stone 			verify_null(unpacked, type);
5616c721f82SRyan Stone 		else if (strcmp(name, numkey) == 0)
5626c721f82SRyan Stone 			verify_number(unpacked, name, type, numvalue);
5636c721f82SRyan Stone 		else if (strcmp(name, strkey) == 0)
5646c721f82SRyan Stone 			verify_string(unpacked, name, type, strvalue);
5656c721f82SRyan Stone 		else if (strcmp(name, nvkey) == 0)
5666c721f82SRyan Stone 			verify_nvlist(unpacked, name, type);
5676c721f82SRyan Stone 		else if (strcmp(name, binkey) == 0)
5686c721f82SRyan Stone 			verify_binary(unpacked, name, type, binvalue, binsize);
5696c721f82SRyan Stone 		else {
5706c721f82SRyan Stone 			msg << "Unexpected key :'" << name << "'";
5716c721f82SRyan Stone 			ATF_FAIL(msg.str().c_str());
5726c721f82SRyan Stone 		}
5736c721f82SRyan Stone 
5746c721f82SRyan Stone 		keys_seen.insert(name);
5756c721f82SRyan Stone 	}
5766c721f82SRyan Stone 
5776c721f82SRyan Stone 	/* Ensure that we saw every key. */
5786c721f82SRyan Stone 	ATF_REQUIRE_EQ(keys_seen.size(), 5);
5796c721f82SRyan Stone 
5806c721f82SRyan Stone 	nvlist_destroy(nvl);
5816c721f82SRyan Stone 	nvlist_destroy(unpacked);
5826c721f82SRyan Stone 	free(packed);
5836c721f82SRyan Stone }
5846c721f82SRyan Stone 
585a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist);
586a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist)
587a87e5162SRyan Stone {
588a87e5162SRyan Stone 	nvlist_t *nvl;
589a87e5162SRyan Stone 	void *packed;
590a87e5162SRyan Stone 	size_t size;
591a87e5162SRyan Stone 
592a87e5162SRyan Stone 	nvl = nvlist_create(0);
593a87e5162SRyan Stone 	ATF_REQUIRE(nvl != NULL);
594a87e5162SRyan Stone 
595a87e5162SRyan Stone 	nvlist_set_error(nvl, ENOMEM);
596a87e5162SRyan Stone 
597a87e5162SRyan Stone 	packed = nvlist_pack(nvl, &size);
598a87e5162SRyan Stone 	ATF_REQUIRE(packed == NULL);
599a87e5162SRyan Stone 
600a87e5162SRyan Stone 	nvlist_destroy(nvl);
601a87e5162SRyan Stone }
602a87e5162SRyan Stone 
6036c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key);
6046c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key)
6056c721f82SRyan Stone {
6066c721f82SRyan Stone 	nvlist_t *nvl, *unpacked;
6076c721f82SRyan Stone 	const char *key1, *key2;
6086c721f82SRyan Stone 	void *packed, *keypos;
6096c721f82SRyan Stone 	size_t size, keylen;
6106c721f82SRyan Stone 
6116c721f82SRyan Stone 	nvl = nvlist_create(0);
6126c721f82SRyan Stone 
6136c721f82SRyan Stone 	key1 = "key1";
6146c721f82SRyan Stone 	keylen = strlen(key1);
6156c721f82SRyan Stone 	nvlist_add_number(nvl, key1, 5);
6166c721f82SRyan Stone 
6176c721f82SRyan Stone 	key2 = "key2";
6186c721f82SRyan Stone 	ATF_REQUIRE_EQ(keylen, strlen(key2));
6196c721f82SRyan Stone 	nvlist_add_number(nvl, key2, 10);
6206c721f82SRyan Stone 
6216c721f82SRyan Stone 	packed = nvlist_pack(nvl, &size);
6226c721f82SRyan Stone 
6236c721f82SRyan Stone 	/*
6246c721f82SRyan Stone 	 * Mangle the packed nvlist by replacing key1 with key2, creating a
6256c721f82SRyan Stone 	 * packed nvlist with a duplicate key.
6266c721f82SRyan Stone 	 */
6276c721f82SRyan Stone 	keypos = memmem(packed, size, key1, keylen);
6286c721f82SRyan Stone 	ATF_REQUIRE(keypos != NULL);
6296c721f82SRyan Stone 	memcpy(keypos, key2, keylen);
6306c721f82SRyan Stone 
6316c721f82SRyan Stone 	unpacked = nvlist_unpack(packed, size);
6326c721f82SRyan Stone 	ATF_REQUIRE(nvlist_error(unpacked) != 0);
6336c721f82SRyan Stone 
6346c721f82SRyan Stone 	free(packed);
6356c721f82SRyan Stone 	nvlist_destroy(nvl);
6366c721f82SRyan Stone 	nvlist_destroy(unpacked);
6376c721f82SRyan Stone }
6386c721f82SRyan Stone 
63971637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert);
64071637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_string__single_insert)
64171637d76SRyan Stone {
64271637d76SRyan Stone 	nvlist_t *nvl;
64371637d76SRyan Stone 	const char *key;
64471637d76SRyan Stone 	char *value;
64571637d76SRyan Stone 
64671637d76SRyan Stone 	nvl = nvlist_create(0);
64771637d76SRyan Stone 	ATF_REQUIRE(nvl != NULL);
64871637d76SRyan Stone 
64971637d76SRyan Stone 	key = "testkey";
65071637d76SRyan Stone 	value = strdup("testval");
65171637d76SRyan Stone 	ATF_REQUIRE(value != NULL);
65271637d76SRyan Stone 
65371637d76SRyan Stone 	nvlist_move_string(nvl, key, value);
65471637d76SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value);
65571637d76SRyan Stone 
65671637d76SRyan Stone 	nvlist_destroy(nvl);
65771637d76SRyan Stone }
65871637d76SRyan Stone 
65971637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child);
66071637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child)
66171637d76SRyan Stone {
66271637d76SRyan Stone 	nvlist_t *parent;
66371637d76SRyan Stone 
66471637d76SRyan Stone 	parent = nvlist_create(0);
66571637d76SRyan Stone 
66671637d76SRyan Stone 	nvlist_move_nvlist(parent, "test", NULL);
66771637d76SRyan Stone 
66871637d76SRyan Stone 	ATF_REQUIRE(nvlist_error(parent) != 0);
66971637d76SRyan Stone 
67071637d76SRyan Stone 	nvlist_destroy(parent);
67171637d76SRyan Stone }
67271637d76SRyan Stone 
67319a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error);
67419a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error)
67519a4afb3SRyan Stone {
67619a4afb3SRyan Stone 	nvlist_t *nvl, *parent;
67719a4afb3SRyan Stone 
67819a4afb3SRyan Stone 	nvl = nvlist_create(0);
67919a4afb3SRyan Stone 	parent = nvlist_create(0);
68019a4afb3SRyan Stone 
68119a4afb3SRyan Stone 	nvlist_set_error(nvl, EBADF);
68219a4afb3SRyan Stone 	nvlist_move_nvlist(parent, "test", nvl);
68319a4afb3SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
68419a4afb3SRyan Stone 
68519a4afb3SRyan Stone 	nvlist_destroy(parent);
68619a4afb3SRyan Stone }
68719a4afb3SRyan Stone 
68871637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert);
68971637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert)
69071637d76SRyan Stone {
69171637d76SRyan Stone 	nvlist_t *nvl;
69271637d76SRyan Stone 	const char *key;
69371637d76SRyan Stone 	nvlist_t *value;
69471637d76SRyan Stone 
69571637d76SRyan Stone 	nvl = nvlist_create(0);
69671637d76SRyan Stone 	ATF_REQUIRE(nvl != NULL);
69771637d76SRyan Stone 
69871637d76SRyan Stone 	key = "testkey";
69971637d76SRyan Stone 	value = nvlist_create(0);
70071637d76SRyan Stone 	ATF_REQUIRE(value != NULL);
70171637d76SRyan Stone 
70271637d76SRyan Stone 	nvlist_move_nvlist(nvl, key, value);
70371637d76SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value);
70471637d76SRyan Stone 
70571637d76SRyan Stone 	nvlist_destroy(nvl);
70671637d76SRyan Stone }
70771637d76SRyan Stone 
70871637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert);
70971637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert)
71071637d76SRyan Stone {
71171637d76SRyan Stone 	nvlist_t *nvl;
71271637d76SRyan Stone 	const char *key;
71371637d76SRyan Stone 	void *value;
71471637d76SRyan Stone 	size_t size, actual_size;
71571637d76SRyan Stone 
71671637d76SRyan Stone 	nvl = nvlist_create(0);
71771637d76SRyan Stone 	ATF_REQUIRE(nvl != NULL);
71871637d76SRyan Stone 
71971637d76SRyan Stone 	key = "testkey";
72071637d76SRyan Stone 	size = 73;
72171637d76SRyan Stone 	value = malloc(size);
72271637d76SRyan Stone 	ATF_REQUIRE(value != NULL);
72371637d76SRyan Stone 
72471637d76SRyan Stone 	nvlist_move_binary(nvl, key, value, size);
72571637d76SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value);
72671637d76SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
72771637d76SRyan Stone 
72871637d76SRyan Stone 	nvlist_destroy(nvl);
72971637d76SRyan Stone }
73071637d76SRyan Stone 
731fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove);
732fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove)
733fad0a264SRyan Stone {
734fad0a264SRyan Stone 	nvlist_t *nvl;
735fad0a264SRyan Stone 	const char *testkey;
736fad0a264SRyan Stone 	bool testval;
737fad0a264SRyan Stone 
738fad0a264SRyan Stone 	nvl = nvlist_create(0);
739fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
740fad0a264SRyan Stone 
741fad0a264SRyan Stone 	testkey = "boolkey";
742fad0a264SRyan Stone 	testval = false;
743fad0a264SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
744fad0a264SRyan Stone 
745fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
746fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
747fad0a264SRyan Stone 
748fad0a264SRyan Stone 	nvlist_destroy(nvl);
749fad0a264SRyan Stone }
750fad0a264SRyan Stone 
751fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged);
752fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged)
753fad0a264SRyan Stone {
754fad0a264SRyan Stone 	nvlist_t *nvl;
755fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
756fad0a264SRyan Stone 	bool testval, otherval1;
757fad0a264SRyan Stone 	nvlist_t *otherval2;
758fad0a264SRyan Stone 
759fad0a264SRyan Stone 	nvl = nvlist_create(0);
760fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
761fad0a264SRyan Stone 
762fad0a264SRyan Stone 	testkey = "boolkey";
763fad0a264SRyan Stone 	testval = true;
764fad0a264SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
765fad0a264SRyan Stone 
766fad0a264SRyan Stone 	otherkey1 = "key1";
767fad0a264SRyan Stone 	otherval1 = false;
768fad0a264SRyan Stone 	nvlist_add_bool(nvl, otherkey1, otherval1);
769fad0a264SRyan Stone 
770fad0a264SRyan Stone 	otherkey2 = "key2";
771fad0a264SRyan Stone 	otherval2 = create_test_nvlist();
772fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, otherkey2, otherval2);
773fad0a264SRyan Stone 
774fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
775fad0a264SRyan Stone 
776fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1));
777fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1);
778fad0a264SRyan Stone 
779fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2));
780fad0a264SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2));
781fad0a264SRyan Stone 
782fad0a264SRyan Stone 	nvlist_destroy(nvl);
783fad0a264SRyan Stone }
784fad0a264SRyan Stone 
785fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove);
786fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__single_remove)
787fad0a264SRyan Stone {
788fad0a264SRyan Stone 	nvlist_t *nvl;
789fad0a264SRyan Stone 	const char *testkey;
790fad0a264SRyan Stone 	uint64_t testval;
791fad0a264SRyan Stone 
792fad0a264SRyan Stone 	nvl = nvlist_create(0);
793fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
794fad0a264SRyan Stone 
795fad0a264SRyan Stone 	testkey = "numkey";
796fad0a264SRyan Stone 	testval = std::numeric_limits<uint64_t>::max();
797fad0a264SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
798fad0a264SRyan Stone 
799fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
800fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
801fad0a264SRyan Stone 
802fad0a264SRyan Stone 	nvlist_destroy(nvl);
803fad0a264SRyan Stone }
804fad0a264SRyan Stone 
805fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged);
806fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged)
807fad0a264SRyan Stone {
808fad0a264SRyan Stone 	nvlist_t *nvl;
809fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
810fad0a264SRyan Stone 	uint64_t testval, otherval1;
811fad0a264SRyan Stone 	const char *otherval2;
812fad0a264SRyan Stone 
813fad0a264SRyan Stone 	nvl = nvlist_create(0);
814fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
815fad0a264SRyan Stone 
816fad0a264SRyan Stone 	otherkey1 = "key1";
817fad0a264SRyan Stone 	otherval1 = 5;
818fad0a264SRyan Stone 	nvlist_add_number(nvl, otherkey1, otherval1);
819fad0a264SRyan Stone 
820fad0a264SRyan Stone 	testkey = "numkey";
821fad0a264SRyan Stone 	testval = 1654;
822fad0a264SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
823fad0a264SRyan Stone 
824fad0a264SRyan Stone 	otherkey2 = "key2";
825fad0a264SRyan Stone 	otherval2 = "string";
826fad0a264SRyan Stone 	nvlist_add_string(nvl, otherkey2, otherval2);
827fad0a264SRyan Stone 
828fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
829fad0a264SRyan Stone 
830fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1));
831fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1);
832fad0a264SRyan Stone 
833fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2));
834fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0);
835fad0a264SRyan Stone 
836fad0a264SRyan Stone 	nvlist_destroy(nvl);
837fad0a264SRyan Stone }
838fad0a264SRyan Stone 
839fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove);
840fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__single_remove)
841fad0a264SRyan Stone {
842fad0a264SRyan Stone 	nvlist_t *nvl;
843fad0a264SRyan Stone 	const char *testkey;
844fad0a264SRyan Stone 	const char *testval;
845fad0a264SRyan Stone 
846fad0a264SRyan Stone 	nvl = nvlist_create(0);
847fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
848fad0a264SRyan Stone 
849fad0a264SRyan Stone 	testkey = "numkey";
850fad0a264SRyan Stone 	testval = "nvlist";
851fad0a264SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
852fad0a264SRyan Stone 
853fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
854fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
855fad0a264SRyan Stone 
856fad0a264SRyan Stone 	nvlist_destroy(nvl);
857fad0a264SRyan Stone }
858fad0a264SRyan Stone 
859fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged);
860fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged)
861fad0a264SRyan Stone {
862fad0a264SRyan Stone 	nvlist_t *nvl;
863fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
864fad0a264SRyan Stone 	const char *testval, *otherval1;
865fad0a264SRyan Stone 	bool otherval2;
866fad0a264SRyan Stone 
867fad0a264SRyan Stone 	nvl = nvlist_create(0);
868fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
869fad0a264SRyan Stone 
870fad0a264SRyan Stone 	otherkey1 = "key1";
871fad0a264SRyan Stone 	otherval1 = "fjdifjdk";
872fad0a264SRyan Stone 	nvlist_add_string(nvl, otherkey1, otherval1);
873fad0a264SRyan Stone 
874fad0a264SRyan Stone 	otherkey2 = "key2";
875fad0a264SRyan Stone 	otherval2 = true;
876fad0a264SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
877fad0a264SRyan Stone 
878fad0a264SRyan Stone 	testkey = "strkey";
879fad0a264SRyan Stone 	testval = "1654";
880fad0a264SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
881fad0a264SRyan Stone 
882fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
883fad0a264SRyan Stone 
884fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1));
885fad0a264SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0);
886fad0a264SRyan Stone 
887fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
888fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
889fad0a264SRyan Stone 
890fad0a264SRyan Stone 	nvlist_destroy(nvl);
891fad0a264SRyan Stone }
892fad0a264SRyan Stone 
893fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove);
894fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove)
895fad0a264SRyan Stone {
896fad0a264SRyan Stone 	nvlist_t *nvl;
897fad0a264SRyan Stone 	const char *testkey;
898fad0a264SRyan Stone 	nvlist_t *testval;
899fad0a264SRyan Stone 
900fad0a264SRyan Stone 	nvl = nvlist_create(0);
901fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
902fad0a264SRyan Stone 
903fad0a264SRyan Stone 	testkey = "numkey";
904fad0a264SRyan Stone 	testval = create_test_nvlist();
905fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
906fad0a264SRyan Stone 
907fad0a264SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
908fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
909fad0a264SRyan Stone 
910fad0a264SRyan Stone 	nvlist_destroy(nvl);
911fad0a264SRyan Stone }
912fad0a264SRyan Stone 
913fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged);
914fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged)
915fad0a264SRyan Stone {
916fad0a264SRyan Stone 	nvlist_t *nvl;
917fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
918fad0a264SRyan Stone 	nvlist_t *testval, *otherval1;
919fad0a264SRyan Stone 
920fad0a264SRyan Stone 	nvl = nvlist_create(0);
921fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
922fad0a264SRyan Stone 
923fad0a264SRyan Stone 	testkey = "strkey";
924fad0a264SRyan Stone 	testval = create_test_nvlist();
925fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
926fad0a264SRyan Stone 
927fad0a264SRyan Stone 	otherkey1 = "key1";
928fad0a264SRyan Stone 	otherval1 = nvlist_create(0);
929fad0a264SRyan Stone 	nvlist_move_nvlist(nvl, otherkey1, otherval1);
930fad0a264SRyan Stone 
931fad0a264SRyan Stone 	otherkey2 = "key2";
932fad0a264SRyan Stone 	nvlist_add_null(nvl, otherkey2);
933fad0a264SRyan Stone 
934fad0a264SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
935fad0a264SRyan Stone 
936fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1));
937fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1)));
938fad0a264SRyan Stone 
939fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2));
940fad0a264SRyan Stone 
941fad0a264SRyan Stone 	nvlist_destroy(nvl);
942fad0a264SRyan Stone }
943fad0a264SRyan Stone 
944fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove);
945fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove)
946fad0a264SRyan Stone {
947fad0a264SRyan Stone 	nvlist_t *nvl;
948fad0a264SRyan Stone 	const char *testkey;
949fad0a264SRyan Stone 	void *testval;
950fad0a264SRyan Stone 	const void *actual_val;
951fad0a264SRyan Stone 	size_t testsize, actual_size;
952fad0a264SRyan Stone 
953fad0a264SRyan Stone 	nvl = nvlist_create(0);
954fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
955fad0a264SRyan Stone 
956fad0a264SRyan Stone 	testkey = "numkey";
957fad0a264SRyan Stone 	testsize = 457;
958fad0a264SRyan Stone 	testval = malloc(testsize);
959fad0a264SRyan Stone 	memset(testval, '5', testsize);
960fad0a264SRyan Stone 	nvlist_move_binary(nvl, testkey, testval, testsize);
961fad0a264SRyan Stone 
962fad0a264SRyan Stone 	actual_val = nvlist_take_binary(nvl, testkey, &actual_size);
963fad0a264SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
964fad0a264SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0);
965fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
966fad0a264SRyan Stone 
967fad0a264SRyan Stone 	nvlist_destroy(nvl);
968fad0a264SRyan Stone }
969fad0a264SRyan Stone 
970fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged);
971fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged)
972fad0a264SRyan Stone {
973fad0a264SRyan Stone 	nvlist_t *nvl;
974fad0a264SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
975fad0a264SRyan Stone 	const void *actual_value;
976fad0a264SRyan Stone 	char testval[] = "gjiertj";
977fad0a264SRyan Stone 	char otherval1[] = "fdreg";
978fad0a264SRyan Stone 	size_t testsize, othersize, actual_size;
979fad0a264SRyan Stone 	bool otherval2;
980fad0a264SRyan Stone 
981fad0a264SRyan Stone 	nvl = nvlist_create(0);
982fad0a264SRyan Stone 	ATF_REQUIRE(nvl != NULL);
983fad0a264SRyan Stone 
984fad0a264SRyan Stone 	otherkey1 = "key1";
985fad0a264SRyan Stone 	othersize = sizeof(otherval1);
986fad0a264SRyan Stone 	nvlist_add_binary(nvl, otherkey1, otherval1, othersize);
987fad0a264SRyan Stone 
988fad0a264SRyan Stone 	otherkey2 = "key2";
989fad0a264SRyan Stone 	otherval2 = true;
990fad0a264SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
991fad0a264SRyan Stone 
992fad0a264SRyan Stone 	testkey = "strkey";
993fad0a264SRyan Stone 	testsize = sizeof(testval);
994fad0a264SRyan Stone 	nvlist_add_binary(nvl, testkey, testval, testsize);
995fad0a264SRyan Stone 
996fad0a264SRyan Stone 	actual_value = nvlist_take_binary(nvl, testkey, &actual_size);
997fad0a264SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
998fad0a264SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0);
999fad0a264SRyan Stone 
1000fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1));
1001fad0a264SRyan Stone 	actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size);
1002fad0a264SRyan Stone 	ATF_REQUIRE_EQ(othersize, actual_size);
1003fad0a264SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0);
1004fad0a264SRyan Stone 
1005fad0a264SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
1006fad0a264SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
1007fad0a264SRyan Stone 
1008fad0a264SRyan Stone 	nvlist_destroy(nvl);
1009fad0a264SRyan Stone }
1010fad0a264SRyan Stone 
1011339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null);
1012339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_null)
1013339bcfc7SRyan Stone {
1014339bcfc7SRyan Stone 	nvlist_t *nvl;
1015339bcfc7SRyan Stone 	const char *key;
1016339bcfc7SRyan Stone 
1017339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1018339bcfc7SRyan Stone 	key = "test";
1019339bcfc7SRyan Stone 	nvlist_add_null(nvl, key);
1020339bcfc7SRyan Stone 
1021339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1022339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1023339bcfc7SRyan Stone 
1024339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1025339bcfc7SRyan Stone }
1026339bcfc7SRyan Stone 
1027339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool);
1028339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_bool)
1029339bcfc7SRyan Stone {
1030339bcfc7SRyan Stone 	nvlist_t *nvl;
1031339bcfc7SRyan Stone 	const char *key;
1032339bcfc7SRyan Stone 
1033339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1034339bcfc7SRyan Stone 	key = "test";
1035339bcfc7SRyan Stone 	nvlist_add_bool(nvl, key, true);
1036339bcfc7SRyan Stone 
1037339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1038339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1039339bcfc7SRyan Stone 
1040339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1041339bcfc7SRyan Stone }
1042339bcfc7SRyan Stone 
1043339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number);
1044339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_number)
1045339bcfc7SRyan Stone {
1046339bcfc7SRyan Stone 	nvlist_t *nvl;
1047339bcfc7SRyan Stone 	const char *key;
1048339bcfc7SRyan Stone 
1049339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1050339bcfc7SRyan Stone 	key = "test";
1051339bcfc7SRyan Stone 	nvlist_add_number(nvl, key, 584);
1052339bcfc7SRyan Stone 
1053339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1054339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1055339bcfc7SRyan Stone 
1056339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1057339bcfc7SRyan Stone }
1058339bcfc7SRyan Stone 
1059339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string);
1060339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_string)
1061339bcfc7SRyan Stone {
1062339bcfc7SRyan Stone 	nvlist_t *nvl;
1063339bcfc7SRyan Stone 	const char *key;
1064339bcfc7SRyan Stone 
1065339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1066339bcfc7SRyan Stone 	key = "test";
1067339bcfc7SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
1068339bcfc7SRyan Stone 
1069339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1070339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1071339bcfc7SRyan Stone 
1072339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1073339bcfc7SRyan Stone }
1074339bcfc7SRyan Stone 
1075339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist);
1076339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_nvlist)
1077339bcfc7SRyan Stone {
1078339bcfc7SRyan Stone 	nvlist_t *nvl;
1079339bcfc7SRyan Stone 	const char *key;
1080339bcfc7SRyan Stone 
1081339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1082339bcfc7SRyan Stone 	key = "test";
1083339bcfc7SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1084339bcfc7SRyan Stone 
1085339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1086339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1087339bcfc7SRyan Stone 
1088339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1089339bcfc7SRyan Stone }
1090339bcfc7SRyan Stone 
1091339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary);
1092339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_binary)
1093339bcfc7SRyan Stone {
1094339bcfc7SRyan Stone 	nvlist_t *nvl;
1095339bcfc7SRyan Stone 	const char *key;
1096339bcfc7SRyan Stone 
1097339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1098339bcfc7SRyan Stone 	key = "test";
1099339bcfc7SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1100339bcfc7SRyan Stone 
1101339bcfc7SRyan Stone 	nvlist_free(nvl, key);
1102339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1103339bcfc7SRyan Stone 
1104339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1105339bcfc7SRyan Stone }
1106339bcfc7SRyan Stone 
1107339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null);
1108339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_null__single_null)
1109339bcfc7SRyan Stone {
1110339bcfc7SRyan Stone 	nvlist_t *nvl;
1111339bcfc7SRyan Stone 	const char *key;
1112339bcfc7SRyan Stone 
1113339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1114339bcfc7SRyan Stone 	key = "test";
1115339bcfc7SRyan Stone 	nvlist_add_null(nvl, key);
1116339bcfc7SRyan Stone 
1117339bcfc7SRyan Stone 	nvlist_free_null(nvl, key);
1118339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1119339bcfc7SRyan Stone 
1120339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1121339bcfc7SRyan Stone }
1122339bcfc7SRyan Stone 
1123339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool);
1124339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool)
1125339bcfc7SRyan Stone {
1126339bcfc7SRyan Stone 	nvlist_t *nvl;
1127339bcfc7SRyan Stone 	const char *key;
1128339bcfc7SRyan Stone 
1129339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1130339bcfc7SRyan Stone 	key = "test";
1131339bcfc7SRyan Stone 	nvlist_add_bool(nvl, key, true);
1132339bcfc7SRyan Stone 
1133339bcfc7SRyan Stone 	nvlist_free_bool(nvl, key);
1134339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1135339bcfc7SRyan Stone 
1136339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1137339bcfc7SRyan Stone }
1138339bcfc7SRyan Stone 
1139339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number);
1140339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_number__single_number)
1141339bcfc7SRyan Stone {
1142339bcfc7SRyan Stone 	nvlist_t *nvl;
1143339bcfc7SRyan Stone 	const char *key;
1144339bcfc7SRyan Stone 
1145339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1146339bcfc7SRyan Stone 	key = "test";
1147339bcfc7SRyan Stone 	nvlist_add_number(nvl, key, 584);
1148339bcfc7SRyan Stone 
1149339bcfc7SRyan Stone 	nvlist_free_number(nvl, key);
1150339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1151339bcfc7SRyan Stone 
1152339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1153339bcfc7SRyan Stone }
1154339bcfc7SRyan Stone 
1155339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string);
1156339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_string__single_string)
1157339bcfc7SRyan Stone {
1158339bcfc7SRyan Stone 	nvlist_t *nvl;
1159339bcfc7SRyan Stone 	const char *key;
1160339bcfc7SRyan Stone 
1161339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1162339bcfc7SRyan Stone 	key = "test";
1163339bcfc7SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
1164339bcfc7SRyan Stone 
1165339bcfc7SRyan Stone 	nvlist_free_string(nvl, key);
1166339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1167339bcfc7SRyan Stone 
1168339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1169339bcfc7SRyan Stone }
1170339bcfc7SRyan Stone 
1171339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist);
1172339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist)
1173339bcfc7SRyan Stone {
1174339bcfc7SRyan Stone 	nvlist_t *nvl;
1175339bcfc7SRyan Stone 	const char *key;
1176339bcfc7SRyan Stone 
1177339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1178339bcfc7SRyan Stone 	key = "test";
1179339bcfc7SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1180339bcfc7SRyan Stone 
1181339bcfc7SRyan Stone 	nvlist_free_nvlist(nvl, key);
1182339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1183339bcfc7SRyan Stone 
1184339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1185339bcfc7SRyan Stone }
1186339bcfc7SRyan Stone 
1187339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary);
1188339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary)
1189339bcfc7SRyan Stone {
1190339bcfc7SRyan Stone 	nvlist_t *nvl;
1191339bcfc7SRyan Stone 	const char *key;
1192339bcfc7SRyan Stone 
1193339bcfc7SRyan Stone 	nvl = nvlist_create(0);
1194339bcfc7SRyan Stone 	key = "test";
1195339bcfc7SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1196339bcfc7SRyan Stone 
1197339bcfc7SRyan Stone 	nvlist_free_binary(nvl, key);
1198339bcfc7SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
1199339bcfc7SRyan Stone 
1200339bcfc7SRyan Stone 	nvlist_destroy(nvl);
1201339bcfc7SRyan Stone }
1202339bcfc7SRyan Stone 
12033075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
12043075c896SRyan Stone {
12053075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
12063075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
12073075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
12083075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
12093075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
12103075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
121119a4afb3SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error);
12123075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
12136e623ffdSRyan Stone 
12146e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
12156e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
12166e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
1217a87e5162SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist);
12186c721f82SRyan Stone 
12196c721f82SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist);
12206c721f82SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values);
1221a87e5162SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist);
12226c721f82SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key);
122371637d76SRyan Stone 
122471637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert);
122571637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert);
122671637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child);
122719a4afb3SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error);
122871637d76SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert);
1229fad0a264SRyan Stone 
1230fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove);
1231fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged);
1232fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove);
1233fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged);
1234fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove);
1235fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged);
1236fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove);
1237fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged);
1238fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove);
1239fad0a264SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged);
1240339bcfc7SRyan Stone 
1241339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_null);
1242339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool);
1243339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_number);
1244339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_string);
1245339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist);
1246339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary);
1247339bcfc7SRyan Stone 
1248339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null);
1249339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool);
1250339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number);
1251339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string);
1252339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist);
1253339bcfc7SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary);
12543075c896SRyan Stone }
1255