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