xref: /freebsd/lib/libnv/tests/nv_tests.cc (revision 19a4afb3e66774321eb597d10a3eeedba8565a97)
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;
573075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), 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);
883075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), 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);
1213075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), 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);
1563075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), 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);
1943075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), 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);
2403075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
2413075c896SRyan Stone 
2423075c896SRyan Stone 	nvlist_destroy(sublist);
2433075c896SRyan Stone 	nvlist_destroy(nvl);
2443075c896SRyan Stone }
2453075c896SRyan Stone 
246*19a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error);
247*19a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error)
248*19a4afb3SRyan Stone {
249*19a4afb3SRyan Stone 	nvlist_t *nvl, *parent;
250*19a4afb3SRyan Stone 
251*19a4afb3SRyan Stone 	nvl = nvlist_create(0);
252*19a4afb3SRyan Stone 	parent = nvlist_create(0);
253*19a4afb3SRyan Stone 
254*19a4afb3SRyan Stone 	nvlist_set_error(nvl, EBADF);
255*19a4afb3SRyan Stone 	nvlist_add_nvlist(parent, "test", nvl);
256*19a4afb3SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
257*19a4afb3SRyan Stone 
258*19a4afb3SRyan Stone 	nvlist_destroy(nvl);
259*19a4afb3SRyan Stone 	nvlist_destroy(parent);
260*19a4afb3SRyan Stone }
261*19a4afb3SRyan 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);
3063075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), 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);
3556e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), 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);
4036e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), 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);
4096e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), 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 
673*19a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error);
674*19a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error)
675*19a4afb3SRyan Stone {
676*19a4afb3SRyan Stone 	nvlist_t *nvl, *parent;
677*19a4afb3SRyan Stone 
678*19a4afb3SRyan Stone 	nvl = nvlist_create(0);
679*19a4afb3SRyan Stone 	parent = nvlist_create(0);
680*19a4afb3SRyan Stone 
681*19a4afb3SRyan Stone 	nvlist_set_error(nvl, EBADF);
682*19a4afb3SRyan Stone 	nvlist_move_nvlist(parent, "test", nvl);
683*19a4afb3SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
684*19a4afb3SRyan Stone 
685*19a4afb3SRyan Stone 	nvlist_destroy(parent);
686*19a4afb3SRyan Stone }
687*19a4afb3SRyan 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);
1211*19a4afb3SRyan 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);
1227*19a4afb3SRyan 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 }
12553075c896SRyan Stone /*-
12563075c896SRyan Stone  * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
12573075c896SRyan Stone  * All rights reserved.
12583075c896SRyan Stone  *
12593075c896SRyan Stone  * Redistribution and use in source and binary forms, with or without
12603075c896SRyan Stone  * modification, are permitted provided that the following conditions
12613075c896SRyan Stone  * are met:
12623075c896SRyan Stone  * 1. Redistributions of source code must retain the above copyright
12633075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer.
12643075c896SRyan Stone  * 2. Redistributions in binary form must reproduce the above copyright
12653075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer in the
12663075c896SRyan Stone  *    documentation and/or other materials provided with the distribution.
12673075c896SRyan Stone  *
12683075c896SRyan Stone  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
12693075c896SRyan Stone  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
12703075c896SRyan Stone  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
12713075c896SRyan Stone  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
12723075c896SRyan Stone  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
12733075c896SRyan Stone  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
12743075c896SRyan Stone  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
12753075c896SRyan Stone  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
12763075c896SRyan Stone  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
12773075c896SRyan Stone  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
12783075c896SRyan Stone  * SUCH DAMAGE.
12793075c896SRyan Stone  */
12803075c896SRyan Stone 
12813075c896SRyan Stone #include <atf-c++.hpp>
12823075c896SRyan Stone #include <nv.h>
12833075c896SRyan Stone 
12843075c896SRyan Stone #include <errno.h>
12853075c896SRyan Stone /*
12863075c896SRyan Stone  * Test that a newly created nvlist has no errors, and is empty.
12873075c896SRyan Stone  */
12883075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
12893075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty)
12903075c896SRyan Stone {
12913075c896SRyan Stone 	nvlist_t *nvl;
12923075c896SRyan Stone 	int type;
12933075c896SRyan Stone 	void *it;
12943075c896SRyan Stone 
12953075c896SRyan Stone 	nvl = nvlist_create(0);
12963075c896SRyan Stone 
12973075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
12983075c896SRyan Stone 
12993075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
13003075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
13013075c896SRyan Stone 
13023075c896SRyan Stone 	it = NULL;
13033075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
13043075c896SRyan Stone 
13053075c896SRyan Stone 	nvlist_destroy(nvl);
13063075c896SRyan Stone }
13073075c896SRyan Stone 
13083075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
13093075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
13103075c896SRyan Stone {
13113075c896SRyan Stone 	nvlist_t *nvl;
13123075c896SRyan Stone 	void *it;
13133075c896SRyan Stone 	const char *key;
13143075c896SRyan Stone 	int type;
13153075c896SRyan Stone 
13163075c896SRyan Stone 	key = "key";
13173075c896SRyan Stone 	nvl = nvlist_create(0);
13183075c896SRyan Stone 
13193075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
13203075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
13213075c896SRyan Stone 
13223075c896SRyan Stone 	nvlist_add_null(nvl, key);
13233075c896SRyan Stone 
13243075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
13253075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
13263075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
13273075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
13283075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_null(nvl, "key"));
13293075c896SRyan Stone 
13303075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
13313075c896SRyan Stone 	it = NULL;
13323075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
13333075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
13343075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
13353075c896SRyan Stone 
13363075c896SRyan Stone 	nvlist_destroy(nvl);
13373075c896SRyan Stone }
13383075c896SRyan Stone 
13393075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
13403075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
13413075c896SRyan Stone {
13423075c896SRyan Stone 	nvlist_t *nvl;
13433075c896SRyan Stone 	void *it;
13443075c896SRyan Stone 	const char *key;
13453075c896SRyan Stone 	int type;
13463075c896SRyan Stone 
13473075c896SRyan Stone 	key = "name";
13483075c896SRyan Stone 	nvl = nvlist_create(0);
13493075c896SRyan Stone 
13503075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
13513075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
13523075c896SRyan Stone 
13533075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
13543075c896SRyan Stone 
13553075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
13563075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
13573075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me"));
13583075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
13593075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e'));
13603075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
13613075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true);
13623075c896SRyan Stone 
13633075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
13643075c896SRyan Stone 	it = NULL;
13653075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
13663075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
13673075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
13683075c896SRyan Stone 
13693075c896SRyan Stone 	nvlist_destroy(nvl);
13703075c896SRyan Stone }
13713075c896SRyan Stone 
13723075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
13733075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
13743075c896SRyan Stone {
13753075c896SRyan Stone 	nvlist_t *nvl;
13763075c896SRyan Stone 	void *it;
13773075c896SRyan Stone 	const char *key;
13783075c896SRyan Stone 	uint64_t value;
13793075c896SRyan Stone 	int type;
13803075c896SRyan Stone 
13813075c896SRyan Stone 	key = "foo123";
13823075c896SRyan Stone 	value = 71965;
13833075c896SRyan Stone 	nvl = nvlist_create(0);
13843075c896SRyan Stone 
13853075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
13863075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
13873075c896SRyan Stone 
13883075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
13893075c896SRyan Stone 
13903075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
13913075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
13923075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123));
13933075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
13943075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key));
13953075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
13963075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value);
13973075c896SRyan Stone 
13983075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
13993075c896SRyan Stone 	it = NULL;
14003075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
14013075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
14023075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
14033075c896SRyan Stone 
14043075c896SRyan Stone 	nvlist_destroy(nvl);
14053075c896SRyan Stone }
14063075c896SRyan Stone 
14073075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
14083075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
14093075c896SRyan Stone {
14103075c896SRyan Stone 	nvlist_t *nvl;
14113075c896SRyan Stone 	void *it;
14123075c896SRyan Stone 	const char *key;
14133075c896SRyan Stone 	const char *value;
14143075c896SRyan Stone 	int type;
14153075c896SRyan Stone 
14163075c896SRyan Stone 	key = "test";
14173075c896SRyan Stone 	value = "fgjdkgjdk";
14183075c896SRyan Stone 	nvl = nvlist_create(0);
14193075c896SRyan Stone 
14203075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
14213075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
14223075c896SRyan Stone 
14233075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
14243075c896SRyan Stone 
14253075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
14263075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
14273075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
14283075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
14293075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key));
14303075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
14313075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0);
14323075c896SRyan Stone 
14333075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
14343075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
14353075c896SRyan Stone 
14363075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
14373075c896SRyan Stone 	it = NULL;
14383075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
14393075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
14403075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
14413075c896SRyan Stone 
14423075c896SRyan Stone 	nvlist_destroy(nvl);
14433075c896SRyan Stone }
14443075c896SRyan Stone 
14453075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
14463075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
14473075c896SRyan Stone {
14483075c896SRyan Stone 	nvlist_t *nvl;
14493075c896SRyan Stone 	void *it;
14503075c896SRyan Stone 	const char *key, *subkey;
14513075c896SRyan Stone 	nvlist_t *sublist;
14523075c896SRyan Stone 	const nvlist_t *value;
14533075c896SRyan Stone 	int type;
14543075c896SRyan Stone 
14553075c896SRyan Stone 	key = "test";
14563075c896SRyan Stone 	subkey = "subkey";
14573075c896SRyan Stone 	sublist = nvlist_create(0);
14583075c896SRyan Stone 	nvl = nvlist_create(0);
14593075c896SRyan Stone 
14603075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
14613075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
14623075c896SRyan Stone 
14633075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
14643075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
14653075c896SRyan Stone 
14663075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
14673075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
14683075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
14693075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
14703075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key));
14713075c896SRyan Stone 
14723075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
14733075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
14743075c896SRyan Stone 
14753075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
14763075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
14773075c896SRyan Stone 
14783075c896SRyan Stone 	value = nvlist_getf_nvlist(nvl, "%s", key);
14793075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
14803075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
14813075c896SRyan Stone 
14823075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
14833075c896SRyan Stone 	it = NULL;
14843075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
14853075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
14863075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
14873075c896SRyan Stone 
14883075c896SRyan Stone 	nvlist_destroy(sublist);
14893075c896SRyan Stone 	nvlist_destroy(nvl);
14903075c896SRyan Stone }
14913075c896SRyan Stone 
14923075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
14933075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
14943075c896SRyan Stone {
14953075c896SRyan Stone 	nvlist_t *nvl;
14963075c896SRyan Stone 	void *it;
14973075c896SRyan Stone 	const char *key;
14983075c896SRyan Stone 	void *value;
14993075c896SRyan Stone 	const void *ret_value;
15003075c896SRyan Stone 	size_t value_size, ret_size;
15013075c896SRyan Stone 	int type;
15023075c896SRyan Stone 
15033075c896SRyan Stone 	key = "binary";
15043075c896SRyan Stone 	value_size = 13;
15053075c896SRyan Stone 	value = malloc(value_size);
15063075c896SRyan Stone 	memset(value, 0xa5, value_size);
15073075c896SRyan Stone 	nvl = nvlist_create(0);
15083075c896SRyan Stone 
15093075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
15103075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
15113075c896SRyan Stone 
15123075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
15133075c896SRyan Stone 
15143075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
15153075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
15163075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
15173075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
15183075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key));
15193075c896SRyan Stone 
15203075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
15213075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
15223075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
15233075c896SRyan Stone 
15243075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
15253075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
15263075c896SRyan Stone 
15273075c896SRyan Stone 	ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key);
15283075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
15293075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
15303075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
15313075c896SRyan Stone 
15323075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
15333075c896SRyan Stone 	it = NULL;
15343075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
15353075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
15363075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
15373075c896SRyan Stone 
15383075c896SRyan Stone 	nvlist_destroy(nvl);
15393075c896SRyan Stone 	free(value);
15403075c896SRyan Stone }
15413075c896SRyan Stone 
15423075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
15433075c896SRyan Stone {
15443075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
15453075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
15463075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
15473075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
15483075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
15493075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
15503075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
15513075c896SRyan Stone }
15523075c896SRyan Stone /*-
15533075c896SRyan Stone  * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
15543075c896SRyan Stone  * All rights reserved.
15553075c896SRyan Stone  *
15563075c896SRyan Stone  * Redistribution and use in source and binary forms, with or without
15573075c896SRyan Stone  * modification, are permitted provided that the following conditions
15583075c896SRyan Stone  * are met:
15593075c896SRyan Stone  * 1. Redistributions of source code must retain the above copyright
15603075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer.
15613075c896SRyan Stone  * 2. Redistributions in binary form must reproduce the above copyright
15623075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer in the
15633075c896SRyan Stone  *    documentation and/or other materials provided with the distribution.
15643075c896SRyan Stone  *
15653075c896SRyan Stone  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15663075c896SRyan Stone  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15673075c896SRyan Stone  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15683075c896SRyan Stone  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15693075c896SRyan Stone  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
15703075c896SRyan Stone  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
15713075c896SRyan Stone  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
15723075c896SRyan Stone  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
15733075c896SRyan Stone  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
15743075c896SRyan Stone  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
15753075c896SRyan Stone  * SUCH DAMAGE.
15763075c896SRyan Stone  */
15773075c896SRyan Stone 
15783075c896SRyan Stone #include <atf-c++.hpp>
15793075c896SRyan Stone #include <nv.h>
15803075c896SRyan Stone 
15813075c896SRyan Stone #include <errno.h>
15823075c896SRyan Stone /*
15833075c896SRyan Stone  * Test that a newly created nvlist has no errors, and is empty.
15843075c896SRyan Stone  */
15853075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
15863075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty)
15873075c896SRyan Stone {
15883075c896SRyan Stone 	nvlist_t *nvl;
15893075c896SRyan Stone 	int type;
15903075c896SRyan Stone 	void *it;
15913075c896SRyan Stone 
15923075c896SRyan Stone 	nvl = nvlist_create(0);
15933075c896SRyan Stone 
15943075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
15953075c896SRyan Stone 
15963075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
15973075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
15983075c896SRyan Stone 
15993075c896SRyan Stone 	it = NULL;
16003075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
16013075c896SRyan Stone 
16023075c896SRyan Stone 	nvlist_destroy(nvl);
16033075c896SRyan Stone }
16043075c896SRyan Stone 
16053075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
16063075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
16073075c896SRyan Stone {
16083075c896SRyan Stone 	nvlist_t *nvl;
16093075c896SRyan Stone 	void *it;
16103075c896SRyan Stone 	const char *key;
16113075c896SRyan Stone 	int type;
16123075c896SRyan Stone 
16133075c896SRyan Stone 	key = "key";
16143075c896SRyan Stone 	nvl = nvlist_create(0);
16153075c896SRyan Stone 
16163075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
16173075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
16183075c896SRyan Stone 
16193075c896SRyan Stone 	nvlist_add_null(nvl, key);
16203075c896SRyan Stone 
16213075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
16223075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
16233075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
16243075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
16253075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_null(nvl, "key"));
16263075c896SRyan Stone 
16273075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
16283075c896SRyan Stone 	it = NULL;
16293075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
16303075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
16313075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
16323075c896SRyan Stone 
16333075c896SRyan Stone 	nvlist_destroy(nvl);
16343075c896SRyan Stone }
16353075c896SRyan Stone 
16363075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
16373075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
16383075c896SRyan Stone {
16393075c896SRyan Stone 	nvlist_t *nvl;
16403075c896SRyan Stone 	void *it;
16413075c896SRyan Stone 	const char *key;
16423075c896SRyan Stone 	int type;
16433075c896SRyan Stone 
16443075c896SRyan Stone 	key = "name";
16453075c896SRyan Stone 	nvl = nvlist_create(0);
16463075c896SRyan Stone 
16473075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
16483075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
16493075c896SRyan Stone 
16503075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
16513075c896SRyan Stone 
16523075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
16533075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
16543075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me"));
16553075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
16563075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e'));
16573075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
16583075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true);
16593075c896SRyan Stone 
16603075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
16613075c896SRyan Stone 	it = NULL;
16623075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
16633075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
16643075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
16653075c896SRyan Stone 
16663075c896SRyan Stone 	nvlist_destroy(nvl);
16673075c896SRyan Stone }
16683075c896SRyan Stone 
16693075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
16703075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
16713075c896SRyan Stone {
16723075c896SRyan Stone 	nvlist_t *nvl;
16733075c896SRyan Stone 	void *it;
16743075c896SRyan Stone 	const char *key;
16753075c896SRyan Stone 	uint64_t value;
16763075c896SRyan Stone 	int type;
16773075c896SRyan Stone 
16783075c896SRyan Stone 	key = "foo123";
16793075c896SRyan Stone 	value = 71965;
16803075c896SRyan Stone 	nvl = nvlist_create(0);
16813075c896SRyan Stone 
16823075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
16833075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
16843075c896SRyan Stone 
16853075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
16863075c896SRyan Stone 
16873075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
16883075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
16893075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123));
16903075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
16913075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key));
16923075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
16933075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value);
16943075c896SRyan Stone 
16953075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
16963075c896SRyan Stone 	it = NULL;
16973075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
16983075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
16993075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
17003075c896SRyan Stone 
17013075c896SRyan Stone 	nvlist_destroy(nvl);
17023075c896SRyan Stone }
17033075c896SRyan Stone 
17043075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
17053075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
17063075c896SRyan Stone {
17073075c896SRyan Stone 	nvlist_t *nvl;
17083075c896SRyan Stone 	void *it;
17093075c896SRyan Stone 	const char *key;
17103075c896SRyan Stone 	const char *value;
17113075c896SRyan Stone 	int type;
17123075c896SRyan Stone 
17133075c896SRyan Stone 	key = "test";
17143075c896SRyan Stone 	value = "fgjdkgjdk";
17153075c896SRyan Stone 	nvl = nvlist_create(0);
17163075c896SRyan Stone 
17173075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
17183075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
17193075c896SRyan Stone 
17203075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
17213075c896SRyan Stone 
17223075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
17233075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
17243075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
17253075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
17263075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key));
17273075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
17283075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0);
17293075c896SRyan Stone 
17303075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
17313075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
17323075c896SRyan Stone 
17333075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
17343075c896SRyan Stone 	it = NULL;
17353075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
17363075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
17373075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
17383075c896SRyan Stone 
17393075c896SRyan Stone 	nvlist_destroy(nvl);
17403075c896SRyan Stone }
17413075c896SRyan Stone 
17423075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
17433075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
17443075c896SRyan Stone {
17453075c896SRyan Stone 	nvlist_t *nvl;
17463075c896SRyan Stone 	void *it;
17473075c896SRyan Stone 	const char *key, *subkey;
17483075c896SRyan Stone 	nvlist_t *sublist;
17493075c896SRyan Stone 	const nvlist_t *value;
17503075c896SRyan Stone 	int type;
17513075c896SRyan Stone 
17523075c896SRyan Stone 	key = "test";
17533075c896SRyan Stone 	subkey = "subkey";
17543075c896SRyan Stone 	sublist = nvlist_create(0);
17553075c896SRyan Stone 	nvl = nvlist_create(0);
17563075c896SRyan Stone 
17573075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
17583075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
17593075c896SRyan Stone 
17603075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
17613075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
17623075c896SRyan Stone 
17633075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
17643075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
17653075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
17663075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
17673075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key));
17683075c896SRyan Stone 
17693075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
17703075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
17713075c896SRyan Stone 
17723075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
17733075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
17743075c896SRyan Stone 
17753075c896SRyan Stone 	value = nvlist_getf_nvlist(nvl, "%s", key);
17763075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
17773075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
17783075c896SRyan Stone 
17793075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
17803075c896SRyan Stone 	it = NULL;
17813075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
17823075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
17833075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
17843075c896SRyan Stone 
17853075c896SRyan Stone 	nvlist_destroy(sublist);
17863075c896SRyan Stone 	nvlist_destroy(nvl);
17873075c896SRyan Stone }
17883075c896SRyan Stone 
17893075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
17903075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
17913075c896SRyan Stone {
17923075c896SRyan Stone 	nvlist_t *nvl;
17933075c896SRyan Stone 	void *it;
17943075c896SRyan Stone 	const char *key;
17953075c896SRyan Stone 	void *value;
17963075c896SRyan Stone 	const void *ret_value;
17973075c896SRyan Stone 	size_t value_size, ret_size;
17983075c896SRyan Stone 	int type;
17993075c896SRyan Stone 
18003075c896SRyan Stone 	key = "binary";
18013075c896SRyan Stone 	value_size = 13;
18023075c896SRyan Stone 	value = malloc(value_size);
18033075c896SRyan Stone 	memset(value, 0xa5, value_size);
18043075c896SRyan Stone 	nvl = nvlist_create(0);
18053075c896SRyan Stone 
18063075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
18073075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
18083075c896SRyan Stone 
18093075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
18103075c896SRyan Stone 
18113075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
18123075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
18133075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
18143075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
18153075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key));
18163075c896SRyan Stone 
18173075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
18183075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
18193075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
18203075c896SRyan Stone 
18213075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
18223075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
18233075c896SRyan Stone 
18243075c896SRyan Stone 	ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key);
18253075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
18263075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
18273075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
18283075c896SRyan Stone 
18293075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
18303075c896SRyan Stone 	it = NULL;
18313075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
18323075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
18333075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
18343075c896SRyan Stone 
18353075c896SRyan Stone 	nvlist_destroy(nvl);
18363075c896SRyan Stone 	free(value);
18373075c896SRyan Stone }
18383075c896SRyan Stone 
18393075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
18403075c896SRyan Stone {
18413075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
18423075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
18433075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
18443075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
18453075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
18463075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
18473075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
18483075c896SRyan Stone }
18493075c896SRyan Stone /*-
18503075c896SRyan Stone  * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
18513075c896SRyan Stone  * All rights reserved.
18523075c896SRyan Stone  *
18533075c896SRyan Stone  * Redistribution and use in source and binary forms, with or without
18543075c896SRyan Stone  * modification, are permitted provided that the following conditions
18553075c896SRyan Stone  * are met:
18563075c896SRyan Stone  * 1. Redistributions of source code must retain the above copyright
18573075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer.
18583075c896SRyan Stone  * 2. Redistributions in binary form must reproduce the above copyright
18593075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer in the
18603075c896SRyan Stone  *    documentation and/or other materials provided with the distribution.
18613075c896SRyan Stone  *
18623075c896SRyan Stone  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18633075c896SRyan Stone  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18643075c896SRyan Stone  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18653075c896SRyan Stone  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18663075c896SRyan Stone  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18673075c896SRyan Stone  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18683075c896SRyan Stone  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
18693075c896SRyan Stone  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18703075c896SRyan Stone  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
18713075c896SRyan Stone  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
18723075c896SRyan Stone  * SUCH DAMAGE.
18733075c896SRyan Stone  */
18743075c896SRyan Stone 
18753075c896SRyan Stone #include <atf-c++.hpp>
18763075c896SRyan Stone #include <nv.h>
18773075c896SRyan Stone 
18783075c896SRyan Stone #include <errno.h>
18793075c896SRyan Stone #include <limits>
18803075c896SRyan Stone #include <set>
18813075c896SRyan Stone #include <sstream>
18823075c896SRyan Stone #include <string>
18833075c896SRyan Stone 
18843075c896SRyan Stone /*
18853075c896SRyan Stone  * Test that a newly created nvlist has no errors, and is empty.
18863075c896SRyan Stone  */
18873075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
18883075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty)
18893075c896SRyan Stone {
18903075c896SRyan Stone 	nvlist_t *nvl;
18913075c896SRyan Stone 	int type;
18923075c896SRyan Stone 	void *it;
18933075c896SRyan Stone 
18943075c896SRyan Stone 	nvl = nvlist_create(0);
18953075c896SRyan Stone 
18963075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
18973075c896SRyan Stone 
18983075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
18993075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
19003075c896SRyan Stone 
19013075c896SRyan Stone 	it = NULL;
19023075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
19033075c896SRyan Stone 
19043075c896SRyan Stone 	nvlist_destroy(nvl);
19053075c896SRyan Stone }
19063075c896SRyan Stone 
19073075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
19083075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
19093075c896SRyan Stone {
19103075c896SRyan Stone 	nvlist_t *nvl;
19113075c896SRyan Stone 	void *it;
19123075c896SRyan Stone 	const char *key;
19133075c896SRyan Stone 	int type;
19143075c896SRyan Stone 
19153075c896SRyan Stone 	key = "key";
19163075c896SRyan Stone 	nvl = nvlist_create(0);
19173075c896SRyan Stone 
19183075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
19193075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
19203075c896SRyan Stone 
19213075c896SRyan Stone 	nvlist_add_null(nvl, key);
19223075c896SRyan Stone 
19233075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
19243075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
19253075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
19263075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
19273075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_null(nvl, "key"));
19283075c896SRyan Stone 
19293075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
19303075c896SRyan Stone 	it = NULL;
19313075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
19323075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
19333075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
19343075c896SRyan Stone 
19353075c896SRyan Stone 	nvlist_destroy(nvl);
19363075c896SRyan Stone }
19373075c896SRyan Stone 
19383075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
19393075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
19403075c896SRyan Stone {
19413075c896SRyan Stone 	nvlist_t *nvl;
19423075c896SRyan Stone 	void *it;
19433075c896SRyan Stone 	const char *key;
19443075c896SRyan Stone 	int type;
19453075c896SRyan Stone 
19463075c896SRyan Stone 	key = "name";
19473075c896SRyan Stone 	nvl = nvlist_create(0);
19483075c896SRyan Stone 
19493075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
19503075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
19513075c896SRyan Stone 
19523075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
19533075c896SRyan Stone 
19543075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
19553075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
19563075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me"));
19573075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
19583075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e'));
19593075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
19603075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true);
19613075c896SRyan Stone 
19623075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
19633075c896SRyan Stone 	it = NULL;
19643075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
19653075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
19663075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
19673075c896SRyan Stone 
19683075c896SRyan Stone 	nvlist_destroy(nvl);
19693075c896SRyan Stone }
19703075c896SRyan Stone 
19713075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
19723075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
19733075c896SRyan Stone {
19743075c896SRyan Stone 	nvlist_t *nvl;
19753075c896SRyan Stone 	void *it;
19763075c896SRyan Stone 	const char *key;
19773075c896SRyan Stone 	uint64_t value;
19783075c896SRyan Stone 	int type;
19793075c896SRyan Stone 
19803075c896SRyan Stone 	key = "foo123";
19813075c896SRyan Stone 	value = 71965;
19823075c896SRyan Stone 	nvl = nvlist_create(0);
19833075c896SRyan Stone 
19843075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
19853075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
19863075c896SRyan Stone 
19873075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
19883075c896SRyan Stone 
19893075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
19903075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
19913075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123));
19923075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
19933075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key));
19943075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
19953075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value);
19963075c896SRyan Stone 
19973075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
19983075c896SRyan Stone 	it = NULL;
19993075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
20003075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
20013075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
20023075c896SRyan Stone 
20033075c896SRyan Stone 	nvlist_destroy(nvl);
20043075c896SRyan Stone }
20053075c896SRyan Stone 
20063075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
20073075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
20083075c896SRyan Stone {
20093075c896SRyan Stone 	nvlist_t *nvl;
20103075c896SRyan Stone 	void *it;
20113075c896SRyan Stone 	const char *key;
20123075c896SRyan Stone 	const char *value;
20133075c896SRyan Stone 	int type;
20143075c896SRyan Stone 
20153075c896SRyan Stone 	key = "test";
20163075c896SRyan Stone 	value = "fgjdkgjdk";
20173075c896SRyan Stone 	nvl = nvlist_create(0);
20183075c896SRyan Stone 
20193075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
20203075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
20213075c896SRyan Stone 
20223075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
20233075c896SRyan Stone 
20243075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
20253075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
20263075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
20273075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
20283075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key));
20293075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
20303075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0);
20313075c896SRyan Stone 
20323075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
20333075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
20343075c896SRyan Stone 
20353075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
20363075c896SRyan Stone 	it = NULL;
20373075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
20383075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
20393075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
20403075c896SRyan Stone 
20413075c896SRyan Stone 	nvlist_destroy(nvl);
20423075c896SRyan Stone }
20433075c896SRyan Stone 
20443075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
20453075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
20463075c896SRyan Stone {
20473075c896SRyan Stone 	nvlist_t *nvl;
20483075c896SRyan Stone 	void *it;
20493075c896SRyan Stone 	const char *key, *subkey;
20503075c896SRyan Stone 	nvlist_t *sublist;
20513075c896SRyan Stone 	const nvlist_t *value;
20523075c896SRyan Stone 	int type;
20533075c896SRyan Stone 
20543075c896SRyan Stone 	key = "test";
20553075c896SRyan Stone 	subkey = "subkey";
20563075c896SRyan Stone 	sublist = nvlist_create(0);
20573075c896SRyan Stone 	nvl = nvlist_create(0);
20583075c896SRyan Stone 
20593075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
20603075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
20613075c896SRyan Stone 
20623075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
20633075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
20643075c896SRyan Stone 
20653075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
20663075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
20673075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
20683075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
20693075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key));
20703075c896SRyan Stone 
20713075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
20723075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
20733075c896SRyan Stone 
20743075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
20753075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
20763075c896SRyan Stone 
20773075c896SRyan Stone 	value = nvlist_getf_nvlist(nvl, "%s", key);
20783075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
20793075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
20803075c896SRyan Stone 
20813075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
20823075c896SRyan Stone 	it = NULL;
20833075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
20843075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
20853075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
20863075c896SRyan Stone 
20873075c896SRyan Stone 	nvlist_destroy(sublist);
20883075c896SRyan Stone 	nvlist_destroy(nvl);
20893075c896SRyan Stone }
20903075c896SRyan Stone 
20913075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
20923075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
20933075c896SRyan Stone {
20943075c896SRyan Stone 	nvlist_t *nvl;
20953075c896SRyan Stone 	void *it;
20963075c896SRyan Stone 	const char *key;
20973075c896SRyan Stone 	void *value;
20983075c896SRyan Stone 	const void *ret_value;
20993075c896SRyan Stone 	size_t value_size, ret_size;
21003075c896SRyan Stone 	int type;
21013075c896SRyan Stone 
21023075c896SRyan Stone 	key = "binary";
21033075c896SRyan Stone 	value_size = 13;
21043075c896SRyan Stone 	value = malloc(value_size);
21053075c896SRyan Stone 	memset(value, 0xa5, value_size);
21063075c896SRyan Stone 	nvl = nvlist_create(0);
21073075c896SRyan Stone 
21083075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
21093075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
21103075c896SRyan Stone 
21113075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
21123075c896SRyan Stone 
21133075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
21143075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
21153075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
21163075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
21173075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key));
21183075c896SRyan Stone 
21193075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
21203075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
21213075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
21223075c896SRyan Stone 
21233075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
21243075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
21253075c896SRyan Stone 
21263075c896SRyan Stone 	ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key);
21273075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
21283075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
21293075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
21303075c896SRyan Stone 
21313075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
21323075c896SRyan Stone 	it = NULL;
21333075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
21343075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
21353075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
21363075c896SRyan Stone 
21373075c896SRyan Stone 	nvlist_destroy(nvl);
21383075c896SRyan Stone 	free(value);
21393075c896SRyan Stone }
21403075c896SRyan Stone 
21413075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
21423075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
21433075c896SRyan Stone {
21443075c896SRyan Stone 	nvlist_t *nvl, *clone;
21453075c896SRyan Stone 
21463075c896SRyan Stone 	nvl = nvlist_create(0);
21473075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
21483075c896SRyan Stone 
21493075c896SRyan Stone 	clone = nvlist_clone(nvl);
21503075c896SRyan Stone 	ATF_REQUIRE(clone != NULL);
21513075c896SRyan Stone 	ATF_REQUIRE(clone != nvl);
21523075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(clone));
21533075c896SRyan Stone 
21543075c896SRyan Stone 	nvlist_destroy(clone);
21553075c896SRyan Stone 	nvlist_destroy(nvl);
21563075c896SRyan Stone }
21573075c896SRyan Stone 
21583075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
21593075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
21603075c896SRyan Stone {
21613075c896SRyan Stone 	nvlist_t *nvl, *clone;
21623075c896SRyan Stone 	const char *key;
21633075c896SRyan Stone 	void *it;
21643075c896SRyan Stone 	uint64_t value;
21653075c896SRyan Stone 	int type;
21663075c896SRyan Stone 
21673075c896SRyan Stone 	nvl = nvlist_create(0);
21683075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
21693075c896SRyan Stone 
21703075c896SRyan Stone 	key = "testkey";
21713075c896SRyan Stone 	value = 684874;
21723075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
21733075c896SRyan Stone 
21743075c896SRyan Stone 	clone = nvlist_clone(nvl);
21753075c896SRyan Stone 	ATF_REQUIRE(clone != NULL);
21763075c896SRyan Stone 	ATF_REQUIRE(clone != nvl);
21773075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(clone, key));
21783075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
21793075c896SRyan Stone 
21803075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
21813075c896SRyan Stone 	it = NULL;
21823075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
21833075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
21843075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), NULL);
21853075c896SRyan Stone 
21863075c896SRyan Stone 	nvlist_destroy(clone);
21873075c896SRyan Stone 	nvlist_destroy(nvl);
21883075c896SRyan Stone }
21893075c896SRyan Stone 
21903075c896SRyan Stone static const char * const test_subnvlist_key = "nvlist";
21913075c896SRyan Stone 
21923075c896SRyan Stone static const char * const test_string_key = "string";
21933075c896SRyan Stone static const char * const test_string_val = "59525";
21943075c896SRyan Stone 
21953075c896SRyan Stone static nvlist_t*
21963075c896SRyan Stone create_test_nvlist(void)
21973075c896SRyan Stone {
21983075c896SRyan Stone 	nvlist_t *nvl, *sublist;
21993075c896SRyan Stone 
22003075c896SRyan Stone 	nvl = nvlist_create(0);
22013075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
22023075c896SRyan Stone 
22033075c896SRyan Stone 	sublist = nvlist_create(0);
22043075c896SRyan Stone 	ATF_REQUIRE(sublist != NULL);
22053075c896SRyan Stone 
22063075c896SRyan Stone 	nvlist_add_string(sublist, test_string_key, test_string_val);
22073075c896SRyan Stone 	nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
22083075c896SRyan Stone 
22093075c896SRyan Stone 	return (nvl);
22103075c896SRyan Stone }
22113075c896SRyan Stone 
22123075c896SRyan Stone static void
22133075c896SRyan Stone verify_test_nvlist(const nvlist_t *nvl)
22143075c896SRyan Stone {
22153075c896SRyan Stone 	void *it;
22163075c896SRyan Stone 	const nvlist_t *value;
22173075c896SRyan Stone 	int type;
22183075c896SRyan Stone 
22193075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
22203075c896SRyan Stone 
22213075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, test_subnvlist_key);
22223075c896SRyan Stone 
22233075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
22243075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
22253075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
22263075c896SRyan Stone 
22273075c896SRyan Stone 	/* Iterate over both nvlists; ensure that each has only the one key. */
22283075c896SRyan Stone 	it = NULL;
22293075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
22303075c896SRyan Stone 	    test_string_key), 0);
22313075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
22323075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), NULL);
22333075c896SRyan Stone 
22343075c896SRyan Stone 	it = NULL;
22353075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
22363075c896SRyan Stone 	    test_subnvlist_key), 0);
22373075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
22383075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
22393075c896SRyan Stone }
22403075c896SRyan Stone 
22413075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
22423075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
22433075c896SRyan Stone {
22443075c896SRyan Stone 	nvlist_t *nvl, *clone;
22453075c896SRyan Stone 
22463075c896SRyan Stone 	nvl = create_test_nvlist();
22473075c896SRyan Stone 	clone = nvlist_clone(nvl);
22483075c896SRyan Stone 
22493075c896SRyan Stone 	ATF_REQUIRE(clone != NULL);
22503075c896SRyan Stone 	ATF_REQUIRE(clone != nvl);
22513075c896SRyan Stone 	verify_test_nvlist(clone);
22523075c896SRyan Stone 
22533075c896SRyan Stone 	nvlist_destroy(clone);
22543075c896SRyan Stone 	nvlist_destroy(nvl);
22553075c896SRyan Stone }
22563075c896SRyan Stone 
22573075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist);
22583075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist)
22593075c896SRyan Stone {
22603075c896SRyan Stone 	nvlist_t *nvl, *unpacked;
22613075c896SRyan Stone 	void *packed;
22623075c896SRyan Stone 	size_t packed_size;
22633075c896SRyan Stone 
22643075c896SRyan Stone 	nvl = nvlist_create(0);
22653075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
22663075c896SRyan Stone 
22673075c896SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
22683075c896SRyan Stone 	ATF_REQUIRE(packed != NULL);
22693075c896SRyan Stone 
22703075c896SRyan Stone 	unpacked = nvlist_unpack(packed, packed_size);
22713075c896SRyan Stone 	ATF_REQUIRE(unpacked != NULL);
22723075c896SRyan Stone 	ATF_REQUIRE(unpacked != nvl);
22733075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(unpacked));
22743075c896SRyan Stone 
22753075c896SRyan Stone 	nvlist_destroy(unpacked);
22763075c896SRyan Stone 	nvlist_destroy(nvl);
22773075c896SRyan Stone 	free(packed);
22783075c896SRyan Stone }
22793075c896SRyan Stone 
22803075c896SRyan Stone static void
22813075c896SRyan Stone verify_null(const nvlist_t *nvl, int type)
22823075c896SRyan Stone {
22833075c896SRyan Stone 
22843075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
22853075c896SRyan Stone }
22863075c896SRyan Stone 
22873075c896SRyan Stone static void
22883075c896SRyan Stone verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value)
22893075c896SRyan Stone {
22903075c896SRyan Stone 
22913075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
22923075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value);
22933075c896SRyan Stone }
22943075c896SRyan Stone 
22953075c896SRyan Stone static void
22963075c896SRyan Stone verify_string(const nvlist_t *nvl, const char *name, int type,
22973075c896SRyan Stone     const char * value)
22983075c896SRyan Stone {
22993075c896SRyan Stone 
23003075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
23013075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0);
23023075c896SRyan Stone }
23033075c896SRyan Stone 
23043075c896SRyan Stone static void
23053075c896SRyan Stone verify_nvlist(const nvlist_t *nvl, const char *name, int type)
23063075c896SRyan Stone {
23073075c896SRyan Stone 
23083075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
23093075c896SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, name));
23103075c896SRyan Stone }
23113075c896SRyan Stone 
23123075c896SRyan Stone static void
23133075c896SRyan Stone verify_binary(const nvlist_t *nvl, const char *name, int type,
23143075c896SRyan Stone     const void * value, size_t size)
23153075c896SRyan Stone {
23163075c896SRyan Stone 	const void *actual_value;
23173075c896SRyan Stone 	size_t actual_size;
23183075c896SRyan Stone 
23193075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
23203075c896SRyan Stone 	actual_value = nvlist_get_binary(nvl, name, &actual_size);
23213075c896SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
23223075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0);
23233075c896SRyan Stone }
23243075c896SRyan Stone 
23253075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values);
23263075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__multiple_values)
23273075c896SRyan Stone {
23283075c896SRyan Stone 	std::ostringstream msg;
23293075c896SRyan Stone 	std::set<std::string> keys_seen;
23303075c896SRyan Stone 	nvlist_t *nvl, *unpacked, *nvvalue;
23313075c896SRyan Stone 	const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name;
23323075c896SRyan Stone 	int numvalue;
23333075c896SRyan Stone 	const char * strvalue;
23343075c896SRyan Stone 	void *binvalue, *packed, *it;
23353075c896SRyan Stone 	size_t binsize, packed_size;
23363075c896SRyan Stone 	int type;
23373075c896SRyan Stone 
23383075c896SRyan Stone 	nvl = nvlist_create(0);
23393075c896SRyan Stone 
23403075c896SRyan Stone 	nullkey = "null";
23413075c896SRyan Stone 	nvlist_add_null(nvl, nullkey);
23423075c896SRyan Stone 
23433075c896SRyan Stone 	numkey = "number";
23443075c896SRyan Stone 	numvalue = 939853984;
23453075c896SRyan Stone 	nvlist_add_number(nvl, numkey, numvalue);
23463075c896SRyan Stone 
23473075c896SRyan Stone 	strkey = "string";
23483075c896SRyan Stone 	strvalue = "jfieutijf";
23493075c896SRyan Stone 	nvlist_add_string(nvl, strkey, strvalue);
23503075c896SRyan Stone 
23513075c896SRyan Stone 	nvkey = "nvlist";
23523075c896SRyan Stone 	nvvalue = create_test_nvlist();
23533075c896SRyan Stone 	nvlist_move_nvlist(nvl, nvkey, nvvalue);
23543075c896SRyan Stone 
23553075c896SRyan Stone 	binkey = "binary";
23563075c896SRyan Stone 	binsize = 4;
23573075c896SRyan Stone 	binvalue = malloc(binsize);
23583075c896SRyan Stone 	memset(binvalue, 'b', binsize);
23593075c896SRyan Stone 	nvlist_move_binary(nvl, binkey, binvalue, binsize);
23603075c896SRyan Stone 
23613075c896SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
23623075c896SRyan Stone 	ATF_REQUIRE(packed != NULL);
23633075c896SRyan Stone 
23643075c896SRyan Stone 	unpacked = nvlist_unpack(packed, packed_size);
23653075c896SRyan Stone 	ATF_REQUIRE(unpacked != 0);
23663075c896SRyan Stone 
23673075c896SRyan Stone 	it = NULL;
23683075c896SRyan Stone 	while ((name = nvlist_next(unpacked, &type, &it)) != NULL) {
23693075c896SRyan Stone 		/* Ensure that we see every key only once. */
23703075c896SRyan Stone 		ATF_REQUIRE_EQ(keys_seen.count(name), 0);
23713075c896SRyan Stone 
23723075c896SRyan Stone 		if (strcmp(name, nullkey) == 0)
23733075c896SRyan Stone 			verify_null(unpacked, type);
23743075c896SRyan Stone 		else if (strcmp(name, numkey) == 0)
23753075c896SRyan Stone 			verify_number(unpacked, name, type, numvalue);
23763075c896SRyan Stone 		else if (strcmp(name, strkey) == 0)
23773075c896SRyan Stone 			verify_string(unpacked, name, type, strvalue);
23783075c896SRyan Stone 		else if (strcmp(name, nvkey) == 0)
23793075c896SRyan Stone 			verify_nvlist(unpacked, name, type);
23803075c896SRyan Stone 		else if (strcmp(name, binkey) == 0)
23813075c896SRyan Stone 			verify_binary(unpacked, name, type, binvalue, binsize);
23823075c896SRyan Stone 		else {
23833075c896SRyan Stone 			msg << "Unexpected key :'" << name << "'";
23843075c896SRyan Stone 			ATF_FAIL(msg.str().c_str());
23853075c896SRyan Stone 		}
23863075c896SRyan Stone 
23873075c896SRyan Stone 		keys_seen.insert(name);
23883075c896SRyan Stone 	}
23893075c896SRyan Stone 
23903075c896SRyan Stone 	/* Ensure that we saw every key. */
23913075c896SRyan Stone 	ATF_REQUIRE_EQ(keys_seen.size(), 5);
23923075c896SRyan Stone 
23933075c896SRyan Stone 	nvlist_destroy(nvl);
23943075c896SRyan Stone 	nvlist_destroy(unpacked);
23953075c896SRyan Stone 	free(packed);
23963075c896SRyan Stone }
23973075c896SRyan Stone 
23983075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key);
23993075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key)
24003075c896SRyan Stone {
24013075c896SRyan Stone 	nvlist_t *nvl, *unpacked;
24023075c896SRyan Stone 	const char *key1, *key2;
24033075c896SRyan Stone 	void *packed, *keypos;
24043075c896SRyan Stone 	size_t size, keylen;
24053075c896SRyan Stone 
24063075c896SRyan Stone 	nvl = nvlist_create(0);
24073075c896SRyan Stone 
24083075c896SRyan Stone 	key1 = "key1";
24093075c896SRyan Stone 	keylen = strlen(key1);
24103075c896SRyan Stone 	nvlist_add_number(nvl, key1, 5);
24113075c896SRyan Stone 
24123075c896SRyan Stone 	key2 = "key2";
24133075c896SRyan Stone 	ATF_REQUIRE_EQ(keylen, strlen(key2));
24143075c896SRyan Stone 	nvlist_add_number(nvl, key2, 10);
24153075c896SRyan Stone 
24163075c896SRyan Stone 	packed = nvlist_pack(nvl, &size);
24173075c896SRyan Stone 
24183075c896SRyan Stone 	/*
24193075c896SRyan Stone 	 * Mangle the packed nvlist by replacing key1 with key2, creating a
24203075c896SRyan Stone 	 * packed nvlist with a duplicate key.
24213075c896SRyan Stone 	 */
24223075c896SRyan Stone 	keypos = memmem(packed, size, key1, keylen);
24233075c896SRyan Stone 	ATF_REQUIRE(keypos != NULL);
24243075c896SRyan Stone 	memcpy(keypos, key2, keylen);
24253075c896SRyan Stone 
24263075c896SRyan Stone 	unpacked = nvlist_unpack(packed, size);
24273075c896SRyan Stone 	ATF_REQUIRE(nvlist_error(unpacked) != 0);
24283075c896SRyan Stone 
24293075c896SRyan Stone 	free(packed);
24303075c896SRyan Stone 	nvlist_destroy(nvl);
24313075c896SRyan Stone 	nvlist_destroy(unpacked);
24323075c896SRyan Stone }
24333075c896SRyan Stone 
24343075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert);
24353075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_string__single_insert)
24363075c896SRyan Stone {
24373075c896SRyan Stone 	nvlist_t *nvl;
24383075c896SRyan Stone 	const char *key;
24393075c896SRyan Stone 	char *value;
24403075c896SRyan Stone 
24413075c896SRyan Stone 	nvl = nvlist_create(0);
24423075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
24433075c896SRyan Stone 
24443075c896SRyan Stone 	key = "testkey";
24453075c896SRyan Stone 	value = strdup("testval");
24463075c896SRyan Stone 	ATF_REQUIRE(value != NULL);
24473075c896SRyan Stone 
24483075c896SRyan Stone 	nvlist_move_string(nvl, key, value);
24493075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value);
24503075c896SRyan Stone 
24513075c896SRyan Stone 	nvlist_destroy(nvl);
24523075c896SRyan Stone }
24533075c896SRyan Stone 
24543075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child);
24553075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child)
24563075c896SRyan Stone {
24573075c896SRyan Stone 	nvlist_t *parent;
24583075c896SRyan Stone 
24593075c896SRyan Stone 	parent = nvlist_create(0);
24603075c896SRyan Stone 
24613075c896SRyan Stone 	nvlist_move_nvlist(parent, "test", NULL);
24623075c896SRyan Stone 
24633075c896SRyan Stone 	ATF_REQUIRE(nvlist_error(parent) != 0);
24643075c896SRyan Stone 
24653075c896SRyan Stone 	nvlist_destroy(parent);
24663075c896SRyan Stone }
24673075c896SRyan Stone 
24683075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert);
24693075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert)
24703075c896SRyan Stone {
24713075c896SRyan Stone 	nvlist_t *nvl;
24723075c896SRyan Stone 	const char *key;
24733075c896SRyan Stone 	nvlist_t *value;
24743075c896SRyan Stone 
24753075c896SRyan Stone 	nvl = nvlist_create(0);
24763075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
24773075c896SRyan Stone 
24783075c896SRyan Stone 	key = "testkey";
24793075c896SRyan Stone 	value = nvlist_create(0);
24803075c896SRyan Stone 	ATF_REQUIRE(value != NULL);
24813075c896SRyan Stone 
24823075c896SRyan Stone 	nvlist_move_nvlist(nvl, key, value);
24833075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value);
24843075c896SRyan Stone 
24853075c896SRyan Stone 	nvlist_destroy(nvl);
24863075c896SRyan Stone }
24873075c896SRyan Stone 
24883075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert);
24893075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert)
24903075c896SRyan Stone {
24913075c896SRyan Stone 	nvlist_t *nvl;
24923075c896SRyan Stone 	const char *key;
24933075c896SRyan Stone 	void *value;
24943075c896SRyan Stone 	size_t size, actual_size;
24953075c896SRyan Stone 
24963075c896SRyan Stone 	nvl = nvlist_create(0);
24973075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
24983075c896SRyan Stone 
24993075c896SRyan Stone 	key = "testkey";
25003075c896SRyan Stone 	size = 73;
25013075c896SRyan Stone 	value = malloc(size);
25023075c896SRyan Stone 	ATF_REQUIRE(value != NULL);
25033075c896SRyan Stone 
25043075c896SRyan Stone 	nvlist_move_binary(nvl, key, value, size);
25053075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value);
25063075c896SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
25073075c896SRyan Stone 
25083075c896SRyan Stone 	nvlist_destroy(nvl);
25093075c896SRyan Stone }
25103075c896SRyan Stone 
25113075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove);
25123075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove)
25133075c896SRyan Stone {
25143075c896SRyan Stone 	nvlist_t *nvl;
25153075c896SRyan Stone 	const char *testkey;
25163075c896SRyan Stone 	bool testval;
25173075c896SRyan Stone 
25183075c896SRyan Stone 	nvl = nvlist_create(0);
25193075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
25203075c896SRyan Stone 
25213075c896SRyan Stone 	testkey = "boolkey";
25223075c896SRyan Stone 	testval = false;
25233075c896SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
25243075c896SRyan Stone 
25253075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
25263075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
25273075c896SRyan Stone 
25283075c896SRyan Stone 	nvlist_destroy(nvl);
25293075c896SRyan Stone }
25303075c896SRyan Stone 
25313075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged);
25323075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged)
25333075c896SRyan Stone {
25343075c896SRyan Stone 	nvlist_t *nvl;
25353075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
25363075c896SRyan Stone 	bool testval, otherval1;
25373075c896SRyan Stone 	nvlist_t *otherval2;
25383075c896SRyan Stone 
25393075c896SRyan Stone 	nvl = nvlist_create(0);
25403075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
25413075c896SRyan Stone 
25423075c896SRyan Stone 	testkey = "boolkey";
25433075c896SRyan Stone 	testval = true;
25443075c896SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
25453075c896SRyan Stone 
25463075c896SRyan Stone 	otherkey1 = "key1";
25473075c896SRyan Stone 	otherval1 = false;
25483075c896SRyan Stone 	nvlist_add_bool(nvl, otherkey1, otherval1);
25493075c896SRyan Stone 
25503075c896SRyan Stone 	otherkey2 = "key2";
25513075c896SRyan Stone 	otherval2 = create_test_nvlist();
25523075c896SRyan Stone 	nvlist_move_nvlist(nvl, otherkey2, otherval2);
25533075c896SRyan Stone 
25543075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
25553075c896SRyan Stone 
25563075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1));
25573075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1);
25583075c896SRyan Stone 
25593075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2));
25603075c896SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2));
25613075c896SRyan Stone 
25623075c896SRyan Stone 	nvlist_destroy(nvl);
25633075c896SRyan Stone }
25643075c896SRyan Stone 
25653075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove);
25663075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__single_remove)
25673075c896SRyan Stone {
25683075c896SRyan Stone 	nvlist_t *nvl;
25693075c896SRyan Stone 	const char *testkey;
25703075c896SRyan Stone 	uint64_t testval;
25713075c896SRyan Stone 
25723075c896SRyan Stone 	nvl = nvlist_create(0);
25733075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
25743075c896SRyan Stone 
25753075c896SRyan Stone 	testkey = "numkey";
25763075c896SRyan Stone 	testval = std::numeric_limits<uint64_t>::max();
25773075c896SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
25783075c896SRyan Stone 
25793075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
25803075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
25813075c896SRyan Stone 
25823075c896SRyan Stone 	nvlist_destroy(nvl);
25833075c896SRyan Stone }
25843075c896SRyan Stone 
25853075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged);
25863075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged)
25873075c896SRyan Stone {
25883075c896SRyan Stone 	nvlist_t *nvl;
25893075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
25903075c896SRyan Stone 	uint64_t testval, otherval1;
25913075c896SRyan Stone 	const char *otherval2;
25923075c896SRyan Stone 
25933075c896SRyan Stone 	nvl = nvlist_create(0);
25943075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
25953075c896SRyan Stone 
25963075c896SRyan Stone 	otherkey1 = "key1";
25973075c896SRyan Stone 	otherval1 = 5;
25983075c896SRyan Stone 	nvlist_add_number(nvl, otherkey1, otherval1);
25993075c896SRyan Stone 
26003075c896SRyan Stone 	testkey = "numkey";
26013075c896SRyan Stone 	testval = 1654;
26023075c896SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
26033075c896SRyan Stone 
26043075c896SRyan Stone 	otherkey2 = "key2";
26053075c896SRyan Stone 	otherval2 = "string";
26063075c896SRyan Stone 	nvlist_add_string(nvl, otherkey2, otherval2);
26073075c896SRyan Stone 
26083075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
26093075c896SRyan Stone 
26103075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1));
26113075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1);
26123075c896SRyan Stone 
26133075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2));
26143075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0);
26153075c896SRyan Stone 
26163075c896SRyan Stone 	nvlist_destroy(nvl);
26173075c896SRyan Stone }
26183075c896SRyan Stone 
26193075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove);
26203075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__single_remove)
26213075c896SRyan Stone {
26223075c896SRyan Stone 	nvlist_t *nvl;
26233075c896SRyan Stone 	const char *testkey;
26243075c896SRyan Stone 	const char *testval;
26253075c896SRyan Stone 
26263075c896SRyan Stone 	nvl = nvlist_create(0);
26273075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
26283075c896SRyan Stone 
26293075c896SRyan Stone 	testkey = "numkey";
26303075c896SRyan Stone 	testval = "nvlist";
26313075c896SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
26323075c896SRyan Stone 
26333075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
26343075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
26353075c896SRyan Stone 
26363075c896SRyan Stone 	nvlist_destroy(nvl);
26373075c896SRyan Stone }
26383075c896SRyan Stone 
26393075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged);
26403075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged)
26413075c896SRyan Stone {
26423075c896SRyan Stone 	nvlist_t *nvl;
26433075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
26443075c896SRyan Stone 	const char *testval, *otherval1;
26453075c896SRyan Stone 	bool otherval2;
26463075c896SRyan Stone 
26473075c896SRyan Stone 	nvl = nvlist_create(0);
26483075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
26493075c896SRyan Stone 
26503075c896SRyan Stone 	otherkey1 = "key1";
26513075c896SRyan Stone 	otherval1 = "fjdifjdk";
26523075c896SRyan Stone 	nvlist_add_string(nvl, otherkey1, otherval1);
26533075c896SRyan Stone 
26543075c896SRyan Stone 	otherkey2 = "key2";
26553075c896SRyan Stone 	otherval2 = true;
26563075c896SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
26573075c896SRyan Stone 
26583075c896SRyan Stone 	testkey = "strkey";
26593075c896SRyan Stone 	testval = "1654";
26603075c896SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
26613075c896SRyan Stone 
26623075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
26633075c896SRyan Stone 
26643075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1));
26653075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0);
26663075c896SRyan Stone 
26673075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
26683075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
26693075c896SRyan Stone 
26703075c896SRyan Stone 	nvlist_destroy(nvl);
26713075c896SRyan Stone }
26723075c896SRyan Stone 
26733075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove);
26743075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove)
26753075c896SRyan Stone {
26763075c896SRyan Stone 	nvlist_t *nvl;
26773075c896SRyan Stone 	const char *testkey;
26783075c896SRyan Stone 	nvlist_t *testval;
26793075c896SRyan Stone 
26803075c896SRyan Stone 	nvl = nvlist_create(0);
26813075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
26823075c896SRyan Stone 
26833075c896SRyan Stone 	testkey = "numkey";
26843075c896SRyan Stone 	testval = create_test_nvlist();
26853075c896SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
26863075c896SRyan Stone 
26873075c896SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
26883075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
26893075c896SRyan Stone 
26903075c896SRyan Stone 	nvlist_destroy(nvl);
26913075c896SRyan Stone }
26923075c896SRyan Stone 
26933075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged);
26943075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged)
26953075c896SRyan Stone {
26963075c896SRyan Stone 	nvlist_t *nvl;
26973075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
26983075c896SRyan Stone 	nvlist_t *testval, *otherval1;
26993075c896SRyan Stone 
27003075c896SRyan Stone 	nvl = nvlist_create(0);
27013075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
27023075c896SRyan Stone 
27033075c896SRyan Stone 	testkey = "strkey";
27043075c896SRyan Stone 	testval = create_test_nvlist();
27053075c896SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
27063075c896SRyan Stone 
27073075c896SRyan Stone 	otherkey1 = "key1";
27083075c896SRyan Stone 	otherval1 = nvlist_create(0);
27093075c896SRyan Stone 	nvlist_move_nvlist(nvl, otherkey1, otherval1);
27103075c896SRyan Stone 
27113075c896SRyan Stone 	otherkey2 = "key2";
27123075c896SRyan Stone 	nvlist_add_null(nvl, otherkey2);
27133075c896SRyan Stone 
27143075c896SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
27153075c896SRyan Stone 
27163075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1));
27173075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1)));
27183075c896SRyan Stone 
27193075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2));
27203075c896SRyan Stone 
27213075c896SRyan Stone 	nvlist_destroy(nvl);
27223075c896SRyan Stone }
27233075c896SRyan Stone 
27243075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove);
27253075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove)
27263075c896SRyan Stone {
27273075c896SRyan Stone 	nvlist_t *nvl;
27283075c896SRyan Stone 	const char *testkey;
27293075c896SRyan Stone 	void *testval;
27303075c896SRyan Stone 	const void *actual_val;
27313075c896SRyan Stone 	size_t testsize, actual_size;
27323075c896SRyan Stone 
27333075c896SRyan Stone 	nvl = nvlist_create(0);
27343075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
27353075c896SRyan Stone 
27363075c896SRyan Stone 	testkey = "numkey";
27373075c896SRyan Stone 	testsize = 457;
27383075c896SRyan Stone 	testval = malloc(testsize);
27393075c896SRyan Stone 	memset(testval, '5', testsize);
27403075c896SRyan Stone 	nvlist_move_binary(nvl, testkey, testval, testsize);
27413075c896SRyan Stone 
27423075c896SRyan Stone 	actual_val = nvlist_take_binary(nvl, testkey, &actual_size);
27433075c896SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
27443075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0);
27453075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
27463075c896SRyan Stone 
27473075c896SRyan Stone 	nvlist_destroy(nvl);
27483075c896SRyan Stone }
27493075c896SRyan Stone 
27503075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged);
27513075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged)
27523075c896SRyan Stone {
27533075c896SRyan Stone 	nvlist_t *nvl;
27543075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
27553075c896SRyan Stone 	const void *actual_value;
27563075c896SRyan Stone 	char testval[] = "gjiertj";
27573075c896SRyan Stone 	char otherval1[] = "fdreg";
27583075c896SRyan Stone 	size_t testsize, othersize, actual_size;
27593075c896SRyan Stone 	bool otherval2;
27603075c896SRyan Stone 
27613075c896SRyan Stone 	nvl = nvlist_create(0);
27623075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
27633075c896SRyan Stone 
27643075c896SRyan Stone 	otherkey1 = "key1";
27653075c896SRyan Stone 	othersize = sizeof(otherval1);
27663075c896SRyan Stone 	nvlist_add_binary(nvl, otherkey1, otherval1, othersize);
27673075c896SRyan Stone 
27683075c896SRyan Stone 	otherkey2 = "key2";
27693075c896SRyan Stone 	otherval2 = true;
27703075c896SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
27713075c896SRyan Stone 
27723075c896SRyan Stone 	testkey = "strkey";
27733075c896SRyan Stone 	testsize = sizeof(testval);
27743075c896SRyan Stone 	nvlist_add_binary(nvl, testkey, testval, testsize);
27753075c896SRyan Stone 
27763075c896SRyan Stone 	actual_value = nvlist_take_binary(nvl, testkey, &actual_size);
27773075c896SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
27783075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0);
27793075c896SRyan Stone 
27803075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1));
27813075c896SRyan Stone 	actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size);
27823075c896SRyan Stone 	ATF_REQUIRE_EQ(othersize, actual_size);
27833075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0);
27843075c896SRyan Stone 
27853075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
27863075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
27873075c896SRyan Stone 
27883075c896SRyan Stone 	nvlist_destroy(nvl);
27893075c896SRyan Stone }
27903075c896SRyan Stone 
27913075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null);
27923075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_null)
27933075c896SRyan Stone {
27943075c896SRyan Stone 	nvlist_t *nvl;
27953075c896SRyan Stone 	const char *key;
27963075c896SRyan Stone 
27973075c896SRyan Stone 	nvl = nvlist_create(0);
27983075c896SRyan Stone 	key = "test";
27993075c896SRyan Stone 	nvlist_add_null(nvl, key);
28003075c896SRyan Stone 
28013075c896SRyan Stone 	nvlist_free(nvl, key);
28023075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
28033075c896SRyan Stone 
28043075c896SRyan Stone 	nvlist_destroy(nvl);
28053075c896SRyan Stone }
28063075c896SRyan Stone 
28073075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool);
28083075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_bool)
28093075c896SRyan Stone {
28103075c896SRyan Stone 	nvlist_t *nvl;
28113075c896SRyan Stone 	const char *key;
28123075c896SRyan Stone 
28133075c896SRyan Stone 	nvl = nvlist_create(0);
28143075c896SRyan Stone 	key = "test";
28153075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
28163075c896SRyan Stone 
28173075c896SRyan Stone 	nvlist_free(nvl, key);
28183075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
28193075c896SRyan Stone 
28203075c896SRyan Stone 	nvlist_destroy(nvl);
28213075c896SRyan Stone }
28223075c896SRyan Stone 
28233075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number);
28243075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_number)
28253075c896SRyan Stone {
28263075c896SRyan Stone 	nvlist_t *nvl;
28273075c896SRyan Stone 	const char *key;
28283075c896SRyan Stone 
28293075c896SRyan Stone 	nvl = nvlist_create(0);
28303075c896SRyan Stone 	key = "test";
28313075c896SRyan Stone 	nvlist_add_number(nvl, key, 584);
28323075c896SRyan Stone 
28333075c896SRyan Stone 	nvlist_free(nvl, key);
28343075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
28353075c896SRyan Stone 
28363075c896SRyan Stone 	nvlist_destroy(nvl);
28373075c896SRyan Stone }
28383075c896SRyan Stone 
28393075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string);
28403075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_string)
28413075c896SRyan Stone {
28423075c896SRyan Stone 	nvlist_t *nvl;
28433075c896SRyan Stone 	const char *key;
28443075c896SRyan Stone 
28453075c896SRyan Stone 	nvl = nvlist_create(0);
28463075c896SRyan Stone 	key = "test";
28473075c896SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
28483075c896SRyan Stone 
28493075c896SRyan Stone 	nvlist_free(nvl, key);
28503075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
28513075c896SRyan Stone 
28523075c896SRyan Stone 	nvlist_destroy(nvl);
28533075c896SRyan Stone }
28543075c896SRyan Stone 
28553075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist);
28563075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_nvlist)
28573075c896SRyan Stone {
28583075c896SRyan Stone 	nvlist_t *nvl;
28593075c896SRyan Stone 	const char *key;
28603075c896SRyan Stone 
28613075c896SRyan Stone 	nvl = nvlist_create(0);
28623075c896SRyan Stone 	key = "test";
28633075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
28643075c896SRyan Stone 
28653075c896SRyan Stone 	nvlist_free(nvl, key);
28663075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
28673075c896SRyan Stone 
28683075c896SRyan Stone 	nvlist_destroy(nvl);
28693075c896SRyan Stone }
28703075c896SRyan Stone 
28713075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary);
28723075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_binary)
28733075c896SRyan Stone {
28743075c896SRyan Stone 	nvlist_t *nvl;
28753075c896SRyan Stone 	const char *key;
28763075c896SRyan Stone 
28773075c896SRyan Stone 	nvl = nvlist_create(0);
28783075c896SRyan Stone 	key = "test";
28793075c896SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
28803075c896SRyan Stone 
28813075c896SRyan Stone 	nvlist_free(nvl, key);
28823075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
28833075c896SRyan Stone 
28843075c896SRyan Stone 	nvlist_destroy(nvl);
28853075c896SRyan Stone }
28863075c896SRyan Stone 
28873075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null);
28883075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_null__single_null)
28893075c896SRyan Stone {
28903075c896SRyan Stone 	nvlist_t *nvl;
28913075c896SRyan Stone 	const char *key;
28923075c896SRyan Stone 
28933075c896SRyan Stone 	nvl = nvlist_create(0);
28943075c896SRyan Stone 	key = "test";
28953075c896SRyan Stone 	nvlist_add_null(nvl, key);
28963075c896SRyan Stone 
28973075c896SRyan Stone 	nvlist_free_null(nvl, key);
28983075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
28993075c896SRyan Stone 
29003075c896SRyan Stone 	nvlist_destroy(nvl);
29013075c896SRyan Stone }
29023075c896SRyan Stone 
29033075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool);
29043075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool)
29053075c896SRyan Stone {
29063075c896SRyan Stone 	nvlist_t *nvl;
29073075c896SRyan Stone 	const char *key;
29083075c896SRyan Stone 
29093075c896SRyan Stone 	nvl = nvlist_create(0);
29103075c896SRyan Stone 	key = "test";
29113075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
29123075c896SRyan Stone 
29133075c896SRyan Stone 	nvlist_free_bool(nvl, key);
29143075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
29153075c896SRyan Stone 
29163075c896SRyan Stone 	nvlist_destroy(nvl);
29173075c896SRyan Stone }
29183075c896SRyan Stone 
29193075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number);
29203075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_number__single_number)
29213075c896SRyan Stone {
29223075c896SRyan Stone 	nvlist_t *nvl;
29233075c896SRyan Stone 	const char *key;
29243075c896SRyan Stone 
29253075c896SRyan Stone 	nvl = nvlist_create(0);
29263075c896SRyan Stone 	key = "test";
29273075c896SRyan Stone 	nvlist_add_number(nvl, key, 584);
29283075c896SRyan Stone 
29293075c896SRyan Stone 	nvlist_free_number(nvl, key);
29303075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
29313075c896SRyan Stone 
29323075c896SRyan Stone 	nvlist_destroy(nvl);
29333075c896SRyan Stone }
29343075c896SRyan Stone 
29353075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string);
29363075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_string__single_string)
29373075c896SRyan Stone {
29383075c896SRyan Stone 	nvlist_t *nvl;
29393075c896SRyan Stone 	const char *key;
29403075c896SRyan Stone 
29413075c896SRyan Stone 	nvl = nvlist_create(0);
29423075c896SRyan Stone 	key = "test";
29433075c896SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
29443075c896SRyan Stone 
29453075c896SRyan Stone 	nvlist_free_string(nvl, key);
29463075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
29473075c896SRyan Stone 
29483075c896SRyan Stone 	nvlist_destroy(nvl);
29493075c896SRyan Stone }
29503075c896SRyan Stone 
29513075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist);
29523075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist)
29533075c896SRyan Stone {
29543075c896SRyan Stone 	nvlist_t *nvl;
29553075c896SRyan Stone 	const char *key;
29563075c896SRyan Stone 
29573075c896SRyan Stone 	nvl = nvlist_create(0);
29583075c896SRyan Stone 	key = "test";
29593075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
29603075c896SRyan Stone 
29613075c896SRyan Stone 	nvlist_free_nvlist(nvl, key);
29623075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
29633075c896SRyan Stone 
29643075c896SRyan Stone 	nvlist_destroy(nvl);
29653075c896SRyan Stone }
29663075c896SRyan Stone 
29673075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary);
29683075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary)
29693075c896SRyan Stone {
29703075c896SRyan Stone 	nvlist_t *nvl;
29713075c896SRyan Stone 	const char *key;
29723075c896SRyan Stone 
29733075c896SRyan Stone 	nvl = nvlist_create(0);
29743075c896SRyan Stone 	key = "test";
29753075c896SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
29763075c896SRyan Stone 
29773075c896SRyan Stone 	nvlist_free_binary(nvl, key);
29783075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
29793075c896SRyan Stone 
29803075c896SRyan Stone 	nvlist_destroy(nvl);
29813075c896SRyan Stone }
29823075c896SRyan Stone 
29833075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
29843075c896SRyan Stone {
29853075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
29863075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
29873075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
29883075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
29893075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
29903075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
29913075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
29923075c896SRyan Stone 
29933075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
29943075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
29953075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
29963075c896SRyan Stone 
29973075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist);
29983075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values);
29993075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key);
30003075c896SRyan Stone 
30013075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert);
30023075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert);
30033075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child);
30043075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert);
30053075c896SRyan Stone 
30063075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove);
30073075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged);
30083075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove);
30093075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged);
30103075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove);
30113075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged);
30123075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove);
30133075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged);
30143075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove);
30153075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged);
30163075c896SRyan Stone 
30173075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_null);
30183075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool);
30193075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_number);
30203075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_string);
30213075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist);
30223075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary);
30233075c896SRyan Stone 
30243075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null);
30253075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool);
30263075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number);
30273075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string);
30283075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist);
30293075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary);
30303075c896SRyan Stone }
3031