xref: /freebsd/lib/libnv/tests/nv_tests.cc (revision 6e623ffd778e00bc38e2c0259926d0c7930d637b)
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>
343075c896SRyan Stone /*
353075c896SRyan Stone  * Test that a newly created nvlist has no errors, and is empty.
363075c896SRyan Stone  */
373075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
383075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty)
393075c896SRyan Stone {
403075c896SRyan Stone 	nvlist_t *nvl;
413075c896SRyan Stone 	int type;
423075c896SRyan Stone 	void *it;
433075c896SRyan Stone 
443075c896SRyan Stone 	nvl = nvlist_create(0);
453075c896SRyan Stone 
463075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
473075c896SRyan Stone 
483075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
493075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
503075c896SRyan Stone 
513075c896SRyan Stone 	it = NULL;
523075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
533075c896SRyan Stone 
543075c896SRyan Stone 	nvlist_destroy(nvl);
553075c896SRyan Stone }
563075c896SRyan Stone 
573075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
583075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
593075c896SRyan Stone {
603075c896SRyan Stone 	nvlist_t *nvl;
613075c896SRyan Stone 	void *it;
623075c896SRyan Stone 	const char *key;
633075c896SRyan Stone 	int type;
643075c896SRyan Stone 
653075c896SRyan Stone 	key = "key";
663075c896SRyan Stone 	nvl = nvlist_create(0);
673075c896SRyan Stone 
683075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
693075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
703075c896SRyan Stone 
713075c896SRyan Stone 	nvlist_add_null(nvl, key);
723075c896SRyan Stone 
733075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
743075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
753075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
763075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
773075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_null(nvl, "key"));
783075c896SRyan Stone 
793075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
803075c896SRyan Stone 	it = NULL;
813075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
823075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
833075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
843075c896SRyan Stone 
853075c896SRyan Stone 	nvlist_destroy(nvl);
863075c896SRyan Stone }
873075c896SRyan Stone 
883075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
893075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
903075c896SRyan Stone {
913075c896SRyan Stone 	nvlist_t *nvl;
923075c896SRyan Stone 	void *it;
933075c896SRyan Stone 	const char *key;
943075c896SRyan Stone 	int type;
953075c896SRyan Stone 
963075c896SRyan Stone 	key = "name";
973075c896SRyan Stone 	nvl = nvlist_create(0);
983075c896SRyan Stone 
993075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1003075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1013075c896SRyan Stone 
1023075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
1033075c896SRyan Stone 
1043075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1053075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
1063075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me"));
1073075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
1083075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e'));
1093075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
1103075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true);
1113075c896SRyan Stone 
1123075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1133075c896SRyan Stone 	it = NULL;
1143075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1153075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
1163075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
1173075c896SRyan Stone 
1183075c896SRyan Stone 	nvlist_destroy(nvl);
1193075c896SRyan Stone }
1203075c896SRyan Stone 
1213075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
1223075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
1233075c896SRyan Stone {
1243075c896SRyan Stone 	nvlist_t *nvl;
1253075c896SRyan Stone 	void *it;
1263075c896SRyan Stone 	const char *key;
1273075c896SRyan Stone 	uint64_t value;
1283075c896SRyan Stone 	int type;
1293075c896SRyan Stone 
1303075c896SRyan Stone 	key = "foo123";
1313075c896SRyan Stone 	value = 71965;
1323075c896SRyan Stone 	nvl = nvlist_create(0);
1333075c896SRyan Stone 
1343075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1353075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1363075c896SRyan Stone 
1373075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
1383075c896SRyan Stone 
1393075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1403075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
1413075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123));
1423075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
1433075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key));
1443075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
1453075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value);
1463075c896SRyan Stone 
1473075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1483075c896SRyan Stone 	it = NULL;
1493075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1503075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
1513075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
1523075c896SRyan Stone 
1533075c896SRyan Stone 	nvlist_destroy(nvl);
1543075c896SRyan Stone }
1553075c896SRyan Stone 
1563075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
1573075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
1583075c896SRyan Stone {
1593075c896SRyan Stone 	nvlist_t *nvl;
1603075c896SRyan Stone 	void *it;
1613075c896SRyan Stone 	const char *key;
1623075c896SRyan Stone 	const char *value;
1633075c896SRyan Stone 	int type;
1643075c896SRyan Stone 
1653075c896SRyan Stone 	key = "test";
1663075c896SRyan Stone 	value = "fgjdkgjdk";
1673075c896SRyan Stone 	nvl = nvlist_create(0);
1683075c896SRyan Stone 
1693075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
1703075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
1713075c896SRyan Stone 
1723075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
1733075c896SRyan Stone 
1743075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
1753075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
1763075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
1773075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
1783075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key));
1793075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
1803075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0);
1813075c896SRyan Stone 
1823075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
1833075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
1843075c896SRyan Stone 
1853075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
1863075c896SRyan Stone 	it = NULL;
1873075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
1883075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
1893075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
1903075c896SRyan Stone 
1913075c896SRyan Stone 	nvlist_destroy(nvl);
1923075c896SRyan Stone }
1933075c896SRyan Stone 
1943075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
1953075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
1963075c896SRyan Stone {
1973075c896SRyan Stone 	nvlist_t *nvl;
1983075c896SRyan Stone 	void *it;
1993075c896SRyan Stone 	const char *key, *subkey;
2003075c896SRyan Stone 	nvlist_t *sublist;
2013075c896SRyan Stone 	const nvlist_t *value;
2023075c896SRyan Stone 	int type;
2033075c896SRyan Stone 
2043075c896SRyan Stone 	key = "test";
2053075c896SRyan Stone 	subkey = "subkey";
2063075c896SRyan Stone 	sublist = nvlist_create(0);
2073075c896SRyan Stone 	nvl = nvlist_create(0);
2083075c896SRyan Stone 
2093075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
2103075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
2113075c896SRyan Stone 
2123075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
2133075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
2143075c896SRyan Stone 
2153075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
2163075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
2173075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
2183075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
2193075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key));
2203075c896SRyan Stone 
2213075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
2223075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
2233075c896SRyan Stone 
2243075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
2253075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
2263075c896SRyan Stone 
2273075c896SRyan Stone 	value = nvlist_getf_nvlist(nvl, "%s", key);
2283075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
2293075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
2303075c896SRyan Stone 
2313075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
2323075c896SRyan Stone 	it = NULL;
2333075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
2343075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
2353075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
2363075c896SRyan Stone 
2373075c896SRyan Stone 	nvlist_destroy(sublist);
2383075c896SRyan Stone 	nvlist_destroy(nvl);
2393075c896SRyan Stone }
2403075c896SRyan Stone 
2413075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
2423075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
2433075c896SRyan Stone {
2443075c896SRyan Stone 	nvlist_t *nvl;
2453075c896SRyan Stone 	void *it;
2463075c896SRyan Stone 	const char *key;
2473075c896SRyan Stone 	void *value;
2483075c896SRyan Stone 	const void *ret_value;
2493075c896SRyan Stone 	size_t value_size, ret_size;
2503075c896SRyan Stone 	int type;
2513075c896SRyan Stone 
2523075c896SRyan Stone 	key = "binary";
2533075c896SRyan Stone 	value_size = 13;
2543075c896SRyan Stone 	value = malloc(value_size);
2553075c896SRyan Stone 	memset(value, 0xa5, value_size);
2563075c896SRyan Stone 	nvl = nvlist_create(0);
2573075c896SRyan Stone 
2583075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
2593075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
2603075c896SRyan Stone 
2613075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
2623075c896SRyan Stone 
2633075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
2643075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
2653075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
2663075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
2673075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key));
2683075c896SRyan Stone 
2693075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
2703075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
2713075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
2723075c896SRyan Stone 
2733075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
2743075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
2753075c896SRyan Stone 
2763075c896SRyan Stone 	ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key);
2773075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
2783075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
2793075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
2803075c896SRyan Stone 
2813075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
2823075c896SRyan Stone 	it = NULL;
2833075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
2843075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
2853075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
2863075c896SRyan Stone 
2873075c896SRyan Stone 	nvlist_destroy(nvl);
2883075c896SRyan Stone 	free(value);
2893075c896SRyan Stone }
2903075c896SRyan Stone 
291*6e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
292*6e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
293*6e623ffdSRyan Stone {
294*6e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
295*6e623ffdSRyan Stone 
296*6e623ffdSRyan Stone 	nvl = nvlist_create(0);
297*6e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
298*6e623ffdSRyan Stone 
299*6e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
300*6e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
301*6e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
302*6e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_empty(clone));
303*6e623ffdSRyan Stone 
304*6e623ffdSRyan Stone 	nvlist_destroy(clone);
305*6e623ffdSRyan Stone 	nvlist_destroy(nvl);
306*6e623ffdSRyan Stone }
307*6e623ffdSRyan Stone 
308*6e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
309*6e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
310*6e623ffdSRyan Stone {
311*6e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
312*6e623ffdSRyan Stone 	const char *key;
313*6e623ffdSRyan Stone 	void *it;
314*6e623ffdSRyan Stone 	uint64_t value;
315*6e623ffdSRyan Stone 	int type;
316*6e623ffdSRyan Stone 
317*6e623ffdSRyan Stone 	nvl = nvlist_create(0);
318*6e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
319*6e623ffdSRyan Stone 
320*6e623ffdSRyan Stone 	key = "testkey";
321*6e623ffdSRyan Stone 	value = 684874;
322*6e623ffdSRyan Stone 	nvlist_add_number(nvl, key, value);
323*6e623ffdSRyan Stone 
324*6e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
325*6e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
326*6e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
327*6e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_number(clone, key));
328*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
329*6e623ffdSRyan Stone 
330*6e623ffdSRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
331*6e623ffdSRyan Stone 	it = NULL;
332*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
333*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
334*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), NULL);
335*6e623ffdSRyan Stone 
336*6e623ffdSRyan Stone 	nvlist_destroy(clone);
337*6e623ffdSRyan Stone 	nvlist_destroy(nvl);
338*6e623ffdSRyan Stone }
339*6e623ffdSRyan Stone 
340*6e623ffdSRyan Stone static const char * const test_subnvlist_key = "nvlist";
341*6e623ffdSRyan Stone 
342*6e623ffdSRyan Stone static const char * const test_string_key = "string";
343*6e623ffdSRyan Stone static const char * const test_string_val = "59525";
344*6e623ffdSRyan Stone 
345*6e623ffdSRyan Stone static nvlist_t*
346*6e623ffdSRyan Stone create_test_nvlist(void)
347*6e623ffdSRyan Stone {
348*6e623ffdSRyan Stone 	nvlist_t *nvl, *sublist;
349*6e623ffdSRyan Stone 
350*6e623ffdSRyan Stone 	nvl = nvlist_create(0);
351*6e623ffdSRyan Stone 	ATF_REQUIRE(nvl != NULL);
352*6e623ffdSRyan Stone 
353*6e623ffdSRyan Stone 	sublist = nvlist_create(0);
354*6e623ffdSRyan Stone 	ATF_REQUIRE(sublist != NULL);
355*6e623ffdSRyan Stone 
356*6e623ffdSRyan Stone 	nvlist_add_string(sublist, test_string_key, test_string_val);
357*6e623ffdSRyan Stone 	nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
358*6e623ffdSRyan Stone 
359*6e623ffdSRyan Stone 	return (nvl);
360*6e623ffdSRyan Stone }
361*6e623ffdSRyan Stone 
362*6e623ffdSRyan Stone static void
363*6e623ffdSRyan Stone verify_test_nvlist(const nvlist_t *nvl)
364*6e623ffdSRyan Stone {
365*6e623ffdSRyan Stone 	void *it;
366*6e623ffdSRyan Stone 	const nvlist_t *value;
367*6e623ffdSRyan Stone 	int type;
368*6e623ffdSRyan Stone 
369*6e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
370*6e623ffdSRyan Stone 
371*6e623ffdSRyan Stone 	value = nvlist_get_nvlist(nvl, test_subnvlist_key);
372*6e623ffdSRyan Stone 
373*6e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
374*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
375*6e623ffdSRyan Stone 	ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
376*6e623ffdSRyan Stone 
377*6e623ffdSRyan Stone 	/* Iterate over both nvlists; ensure that each has only the one key. */
378*6e623ffdSRyan Stone 	it = NULL;
379*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
380*6e623ffdSRyan Stone 	    test_string_key), 0);
381*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
382*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), NULL);
383*6e623ffdSRyan Stone 
384*6e623ffdSRyan Stone 	it = NULL;
385*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
386*6e623ffdSRyan Stone 	    test_subnvlist_key), 0);
387*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
388*6e623ffdSRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
389*6e623ffdSRyan Stone }
390*6e623ffdSRyan Stone 
391*6e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
392*6e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
393*6e623ffdSRyan Stone {
394*6e623ffdSRyan Stone 	nvlist_t *nvl, *clone;
395*6e623ffdSRyan Stone 
396*6e623ffdSRyan Stone 	nvl = create_test_nvlist();
397*6e623ffdSRyan Stone 	clone = nvlist_clone(nvl);
398*6e623ffdSRyan Stone 
399*6e623ffdSRyan Stone 	ATF_REQUIRE(clone != NULL);
400*6e623ffdSRyan Stone 	ATF_REQUIRE(clone != nvl);
401*6e623ffdSRyan Stone 	verify_test_nvlist(clone);
402*6e623ffdSRyan Stone 
403*6e623ffdSRyan Stone 	nvlist_destroy(clone);
404*6e623ffdSRyan Stone 	nvlist_destroy(nvl);
405*6e623ffdSRyan Stone }
406*6e623ffdSRyan Stone 
4073075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
4083075c896SRyan Stone {
4093075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
4103075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
4113075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
4123075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
4133075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
4143075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
4153075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
416*6e623ffdSRyan Stone 
417*6e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
418*6e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
419*6e623ffdSRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
4203075c896SRyan Stone }
4213075c896SRyan Stone /*-
4223075c896SRyan Stone  * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
4233075c896SRyan Stone  * All rights reserved.
4243075c896SRyan Stone  *
4253075c896SRyan Stone  * Redistribution and use in source and binary forms, with or without
4263075c896SRyan Stone  * modification, are permitted provided that the following conditions
4273075c896SRyan Stone  * are met:
4283075c896SRyan Stone  * 1. Redistributions of source code must retain the above copyright
4293075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer.
4303075c896SRyan Stone  * 2. Redistributions in binary form must reproduce the above copyright
4313075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer in the
4323075c896SRyan Stone  *    documentation and/or other materials provided with the distribution.
4333075c896SRyan Stone  *
4343075c896SRyan Stone  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
4353075c896SRyan Stone  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4363075c896SRyan Stone  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4373075c896SRyan Stone  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4383075c896SRyan Stone  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4393075c896SRyan Stone  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4403075c896SRyan Stone  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4413075c896SRyan Stone  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4423075c896SRyan Stone  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4433075c896SRyan Stone  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4443075c896SRyan Stone  * SUCH DAMAGE.
4453075c896SRyan Stone  */
4463075c896SRyan Stone 
4473075c896SRyan Stone #include <atf-c++.hpp>
4483075c896SRyan Stone #include <nv.h>
4493075c896SRyan Stone 
4503075c896SRyan Stone #include <errno.h>
4513075c896SRyan Stone /*
4523075c896SRyan Stone  * Test that a newly created nvlist has no errors, and is empty.
4533075c896SRyan Stone  */
4543075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
4553075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty)
4563075c896SRyan Stone {
4573075c896SRyan Stone 	nvlist_t *nvl;
4583075c896SRyan Stone 	int type;
4593075c896SRyan Stone 	void *it;
4603075c896SRyan Stone 
4613075c896SRyan Stone 	nvl = nvlist_create(0);
4623075c896SRyan Stone 
4633075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
4643075c896SRyan Stone 
4653075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
4663075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
4673075c896SRyan Stone 
4683075c896SRyan Stone 	it = NULL;
4693075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
4703075c896SRyan Stone 
4713075c896SRyan Stone 	nvlist_destroy(nvl);
4723075c896SRyan Stone }
4733075c896SRyan Stone 
4743075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
4753075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
4763075c896SRyan Stone {
4773075c896SRyan Stone 	nvlist_t *nvl;
4783075c896SRyan Stone 	void *it;
4793075c896SRyan Stone 	const char *key;
4803075c896SRyan Stone 	int type;
4813075c896SRyan Stone 
4823075c896SRyan Stone 	key = "key";
4833075c896SRyan Stone 	nvl = nvlist_create(0);
4843075c896SRyan Stone 
4853075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
4863075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
4873075c896SRyan Stone 
4883075c896SRyan Stone 	nvlist_add_null(nvl, key);
4893075c896SRyan Stone 
4903075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
4913075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
4923075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
4933075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
4943075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_null(nvl, "key"));
4953075c896SRyan Stone 
4963075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
4973075c896SRyan Stone 	it = NULL;
4983075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
4993075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
5003075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
5013075c896SRyan Stone 
5023075c896SRyan Stone 	nvlist_destroy(nvl);
5033075c896SRyan Stone }
5043075c896SRyan Stone 
5053075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
5063075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
5073075c896SRyan Stone {
5083075c896SRyan Stone 	nvlist_t *nvl;
5093075c896SRyan Stone 	void *it;
5103075c896SRyan Stone 	const char *key;
5113075c896SRyan Stone 	int type;
5123075c896SRyan Stone 
5133075c896SRyan Stone 	key = "name";
5143075c896SRyan Stone 	nvl = nvlist_create(0);
5153075c896SRyan Stone 
5163075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
5173075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
5183075c896SRyan Stone 
5193075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
5203075c896SRyan Stone 
5213075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
5223075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
5233075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me"));
5243075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
5253075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e'));
5263075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
5273075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true);
5283075c896SRyan Stone 
5293075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
5303075c896SRyan Stone 	it = NULL;
5313075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
5323075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
5333075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
5343075c896SRyan Stone 
5353075c896SRyan Stone 	nvlist_destroy(nvl);
5363075c896SRyan Stone }
5373075c896SRyan Stone 
5383075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
5393075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
5403075c896SRyan Stone {
5413075c896SRyan Stone 	nvlist_t *nvl;
5423075c896SRyan Stone 	void *it;
5433075c896SRyan Stone 	const char *key;
5443075c896SRyan Stone 	uint64_t value;
5453075c896SRyan Stone 	int type;
5463075c896SRyan Stone 
5473075c896SRyan Stone 	key = "foo123";
5483075c896SRyan Stone 	value = 71965;
5493075c896SRyan Stone 	nvl = nvlist_create(0);
5503075c896SRyan Stone 
5513075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
5523075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
5533075c896SRyan Stone 
5543075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
5553075c896SRyan Stone 
5563075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
5573075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
5583075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123));
5593075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
5603075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key));
5613075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
5623075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value);
5633075c896SRyan Stone 
5643075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
5653075c896SRyan Stone 	it = NULL;
5663075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
5673075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
5683075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
5693075c896SRyan Stone 
5703075c896SRyan Stone 	nvlist_destroy(nvl);
5713075c896SRyan Stone }
5723075c896SRyan Stone 
5733075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
5743075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
5753075c896SRyan Stone {
5763075c896SRyan Stone 	nvlist_t *nvl;
5773075c896SRyan Stone 	void *it;
5783075c896SRyan Stone 	const char *key;
5793075c896SRyan Stone 	const char *value;
5803075c896SRyan Stone 	int type;
5813075c896SRyan Stone 
5823075c896SRyan Stone 	key = "test";
5833075c896SRyan Stone 	value = "fgjdkgjdk";
5843075c896SRyan Stone 	nvl = nvlist_create(0);
5853075c896SRyan Stone 
5863075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
5873075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
5883075c896SRyan Stone 
5893075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
5903075c896SRyan Stone 
5913075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
5923075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
5933075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
5943075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
5953075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key));
5963075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
5973075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0);
5983075c896SRyan Stone 
5993075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
6003075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
6013075c896SRyan Stone 
6023075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
6033075c896SRyan Stone 	it = NULL;
6043075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
6053075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
6063075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
6073075c896SRyan Stone 
6083075c896SRyan Stone 	nvlist_destroy(nvl);
6093075c896SRyan Stone }
6103075c896SRyan Stone 
6113075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
6123075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
6133075c896SRyan Stone {
6143075c896SRyan Stone 	nvlist_t *nvl;
6153075c896SRyan Stone 	void *it;
6163075c896SRyan Stone 	const char *key, *subkey;
6173075c896SRyan Stone 	nvlist_t *sublist;
6183075c896SRyan Stone 	const nvlist_t *value;
6193075c896SRyan Stone 	int type;
6203075c896SRyan Stone 
6213075c896SRyan Stone 	key = "test";
6223075c896SRyan Stone 	subkey = "subkey";
6233075c896SRyan Stone 	sublist = nvlist_create(0);
6243075c896SRyan Stone 	nvl = nvlist_create(0);
6253075c896SRyan Stone 
6263075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
6273075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
6283075c896SRyan Stone 
6293075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
6303075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
6313075c896SRyan Stone 
6323075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
6333075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
6343075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
6353075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
6363075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key));
6373075c896SRyan Stone 
6383075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
6393075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
6403075c896SRyan Stone 
6413075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
6423075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
6433075c896SRyan Stone 
6443075c896SRyan Stone 	value = nvlist_getf_nvlist(nvl, "%s", key);
6453075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
6463075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
6473075c896SRyan Stone 
6483075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
6493075c896SRyan Stone 	it = NULL;
6503075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
6513075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
6523075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
6533075c896SRyan Stone 
6543075c896SRyan Stone 	nvlist_destroy(sublist);
6553075c896SRyan Stone 	nvlist_destroy(nvl);
6563075c896SRyan Stone }
6573075c896SRyan Stone 
6583075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
6593075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
6603075c896SRyan Stone {
6613075c896SRyan Stone 	nvlist_t *nvl;
6623075c896SRyan Stone 	void *it;
6633075c896SRyan Stone 	const char *key;
6643075c896SRyan Stone 	void *value;
6653075c896SRyan Stone 	const void *ret_value;
6663075c896SRyan Stone 	size_t value_size, ret_size;
6673075c896SRyan Stone 	int type;
6683075c896SRyan Stone 
6693075c896SRyan Stone 	key = "binary";
6703075c896SRyan Stone 	value_size = 13;
6713075c896SRyan Stone 	value = malloc(value_size);
6723075c896SRyan Stone 	memset(value, 0xa5, value_size);
6733075c896SRyan Stone 	nvl = nvlist_create(0);
6743075c896SRyan Stone 
6753075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
6763075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
6773075c896SRyan Stone 
6783075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
6793075c896SRyan Stone 
6803075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
6813075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
6823075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
6833075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
6843075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key));
6853075c896SRyan Stone 
6863075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
6873075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
6883075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
6893075c896SRyan Stone 
6903075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
6913075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
6923075c896SRyan Stone 
6933075c896SRyan Stone 	ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key);
6943075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
6953075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
6963075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
6973075c896SRyan Stone 
6983075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
6993075c896SRyan Stone 	it = NULL;
7003075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
7013075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
7023075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
7033075c896SRyan Stone 
7043075c896SRyan Stone 	nvlist_destroy(nvl);
7053075c896SRyan Stone 	free(value);
7063075c896SRyan Stone }
7073075c896SRyan Stone 
7083075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
7093075c896SRyan Stone {
7103075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
7113075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
7123075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
7133075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
7143075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
7153075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
7163075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
7173075c896SRyan Stone }
7183075c896SRyan Stone /*-
7193075c896SRyan Stone  * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
7203075c896SRyan Stone  * All rights reserved.
7213075c896SRyan Stone  *
7223075c896SRyan Stone  * Redistribution and use in source and binary forms, with or without
7233075c896SRyan Stone  * modification, are permitted provided that the following conditions
7243075c896SRyan Stone  * are met:
7253075c896SRyan Stone  * 1. Redistributions of source code must retain the above copyright
7263075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer.
7273075c896SRyan Stone  * 2. Redistributions in binary form must reproduce the above copyright
7283075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer in the
7293075c896SRyan Stone  *    documentation and/or other materials provided with the distribution.
7303075c896SRyan Stone  *
7313075c896SRyan Stone  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
7323075c896SRyan Stone  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
7333075c896SRyan Stone  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
7343075c896SRyan Stone  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
7353075c896SRyan Stone  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
7363075c896SRyan Stone  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
7373075c896SRyan Stone  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
7383075c896SRyan Stone  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
7393075c896SRyan Stone  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
7403075c896SRyan Stone  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
7413075c896SRyan Stone  * SUCH DAMAGE.
7423075c896SRyan Stone  */
7433075c896SRyan Stone 
7443075c896SRyan Stone #include <atf-c++.hpp>
7453075c896SRyan Stone #include <nv.h>
7463075c896SRyan Stone 
7473075c896SRyan Stone #include <errno.h>
7483075c896SRyan Stone /*
7493075c896SRyan Stone  * Test that a newly created nvlist has no errors, and is empty.
7503075c896SRyan Stone  */
7513075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
7523075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty)
7533075c896SRyan Stone {
7543075c896SRyan Stone 	nvlist_t *nvl;
7553075c896SRyan Stone 	int type;
7563075c896SRyan Stone 	void *it;
7573075c896SRyan Stone 
7583075c896SRyan Stone 	nvl = nvlist_create(0);
7593075c896SRyan Stone 
7603075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
7613075c896SRyan Stone 
7623075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
7633075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
7643075c896SRyan Stone 
7653075c896SRyan Stone 	it = NULL;
7663075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
7673075c896SRyan Stone 
7683075c896SRyan Stone 	nvlist_destroy(nvl);
7693075c896SRyan Stone }
7703075c896SRyan Stone 
7713075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
7723075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
7733075c896SRyan Stone {
7743075c896SRyan Stone 	nvlist_t *nvl;
7753075c896SRyan Stone 	void *it;
7763075c896SRyan Stone 	const char *key;
7773075c896SRyan Stone 	int type;
7783075c896SRyan Stone 
7793075c896SRyan Stone 	key = "key";
7803075c896SRyan Stone 	nvl = nvlist_create(0);
7813075c896SRyan Stone 
7823075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
7833075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
7843075c896SRyan Stone 
7853075c896SRyan Stone 	nvlist_add_null(nvl, key);
7863075c896SRyan Stone 
7873075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
7883075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
7893075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
7903075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
7913075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_null(nvl, "key"));
7923075c896SRyan Stone 
7933075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
7943075c896SRyan Stone 	it = NULL;
7953075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
7963075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
7973075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
7983075c896SRyan Stone 
7993075c896SRyan Stone 	nvlist_destroy(nvl);
8003075c896SRyan Stone }
8013075c896SRyan Stone 
8023075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
8033075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
8043075c896SRyan Stone {
8053075c896SRyan Stone 	nvlist_t *nvl;
8063075c896SRyan Stone 	void *it;
8073075c896SRyan Stone 	const char *key;
8083075c896SRyan Stone 	int type;
8093075c896SRyan Stone 
8103075c896SRyan Stone 	key = "name";
8113075c896SRyan Stone 	nvl = nvlist_create(0);
8123075c896SRyan Stone 
8133075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
8143075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
8153075c896SRyan Stone 
8163075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
8173075c896SRyan Stone 
8183075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
8193075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
8203075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me"));
8213075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
8223075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e'));
8233075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
8243075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true);
8253075c896SRyan Stone 
8263075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
8273075c896SRyan Stone 	it = NULL;
8283075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
8293075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
8303075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
8313075c896SRyan Stone 
8323075c896SRyan Stone 	nvlist_destroy(nvl);
8333075c896SRyan Stone }
8343075c896SRyan Stone 
8353075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
8363075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
8373075c896SRyan Stone {
8383075c896SRyan Stone 	nvlist_t *nvl;
8393075c896SRyan Stone 	void *it;
8403075c896SRyan Stone 	const char *key;
8413075c896SRyan Stone 	uint64_t value;
8423075c896SRyan Stone 	int type;
8433075c896SRyan Stone 
8443075c896SRyan Stone 	key = "foo123";
8453075c896SRyan Stone 	value = 71965;
8463075c896SRyan Stone 	nvl = nvlist_create(0);
8473075c896SRyan Stone 
8483075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
8493075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
8503075c896SRyan Stone 
8513075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
8523075c896SRyan Stone 
8533075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
8543075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
8553075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123));
8563075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
8573075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key));
8583075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
8593075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value);
8603075c896SRyan Stone 
8613075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
8623075c896SRyan Stone 	it = NULL;
8633075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
8643075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
8653075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
8663075c896SRyan Stone 
8673075c896SRyan Stone 	nvlist_destroy(nvl);
8683075c896SRyan Stone }
8693075c896SRyan Stone 
8703075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
8713075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
8723075c896SRyan Stone {
8733075c896SRyan Stone 	nvlist_t *nvl;
8743075c896SRyan Stone 	void *it;
8753075c896SRyan Stone 	const char *key;
8763075c896SRyan Stone 	const char *value;
8773075c896SRyan Stone 	int type;
8783075c896SRyan Stone 
8793075c896SRyan Stone 	key = "test";
8803075c896SRyan Stone 	value = "fgjdkgjdk";
8813075c896SRyan Stone 	nvl = nvlist_create(0);
8823075c896SRyan Stone 
8833075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
8843075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
8853075c896SRyan Stone 
8863075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
8873075c896SRyan Stone 
8883075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
8893075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
8903075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
8913075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
8923075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key));
8933075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
8943075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0);
8953075c896SRyan Stone 
8963075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
8973075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
8983075c896SRyan Stone 
8993075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
9003075c896SRyan Stone 	it = NULL;
9013075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
9023075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
9033075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
9043075c896SRyan Stone 
9053075c896SRyan Stone 	nvlist_destroy(nvl);
9063075c896SRyan Stone }
9073075c896SRyan Stone 
9083075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
9093075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
9103075c896SRyan Stone {
9113075c896SRyan Stone 	nvlist_t *nvl;
9123075c896SRyan Stone 	void *it;
9133075c896SRyan Stone 	const char *key, *subkey;
9143075c896SRyan Stone 	nvlist_t *sublist;
9153075c896SRyan Stone 	const nvlist_t *value;
9163075c896SRyan Stone 	int type;
9173075c896SRyan Stone 
9183075c896SRyan Stone 	key = "test";
9193075c896SRyan Stone 	subkey = "subkey";
9203075c896SRyan Stone 	sublist = nvlist_create(0);
9213075c896SRyan Stone 	nvl = nvlist_create(0);
9223075c896SRyan Stone 
9233075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
9243075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
9253075c896SRyan Stone 
9263075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
9273075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
9283075c896SRyan Stone 
9293075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
9303075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
9313075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
9323075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
9333075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key));
9343075c896SRyan Stone 
9353075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
9363075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
9373075c896SRyan Stone 
9383075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
9393075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
9403075c896SRyan Stone 
9413075c896SRyan Stone 	value = nvlist_getf_nvlist(nvl, "%s", key);
9423075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
9433075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
9443075c896SRyan Stone 
9453075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
9463075c896SRyan Stone 	it = NULL;
9473075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
9483075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
9493075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
9503075c896SRyan Stone 
9513075c896SRyan Stone 	nvlist_destroy(sublist);
9523075c896SRyan Stone 	nvlist_destroy(nvl);
9533075c896SRyan Stone }
9543075c896SRyan Stone 
9553075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
9563075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
9573075c896SRyan Stone {
9583075c896SRyan Stone 	nvlist_t *nvl;
9593075c896SRyan Stone 	void *it;
9603075c896SRyan Stone 	const char *key;
9613075c896SRyan Stone 	void *value;
9623075c896SRyan Stone 	const void *ret_value;
9633075c896SRyan Stone 	size_t value_size, ret_size;
9643075c896SRyan Stone 	int type;
9653075c896SRyan Stone 
9663075c896SRyan Stone 	key = "binary";
9673075c896SRyan Stone 	value_size = 13;
9683075c896SRyan Stone 	value = malloc(value_size);
9693075c896SRyan Stone 	memset(value, 0xa5, value_size);
9703075c896SRyan Stone 	nvl = nvlist_create(0);
9713075c896SRyan Stone 
9723075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
9733075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
9743075c896SRyan Stone 
9753075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
9763075c896SRyan Stone 
9773075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
9783075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
9793075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
9803075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
9813075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key));
9823075c896SRyan Stone 
9833075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
9843075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
9853075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
9863075c896SRyan Stone 
9873075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
9883075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
9893075c896SRyan Stone 
9903075c896SRyan Stone 	ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key);
9913075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
9923075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
9933075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
9943075c896SRyan Stone 
9953075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
9963075c896SRyan Stone 	it = NULL;
9973075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
9983075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
9993075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
10003075c896SRyan Stone 
10013075c896SRyan Stone 	nvlist_destroy(nvl);
10023075c896SRyan Stone 	free(value);
10033075c896SRyan Stone }
10043075c896SRyan Stone 
10053075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
10063075c896SRyan Stone {
10073075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
10083075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
10093075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
10103075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
10113075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
10123075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
10133075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
10143075c896SRyan Stone }
10153075c896SRyan Stone /*-
10163075c896SRyan Stone  * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
10173075c896SRyan Stone  * All rights reserved.
10183075c896SRyan Stone  *
10193075c896SRyan Stone  * Redistribution and use in source and binary forms, with or without
10203075c896SRyan Stone  * modification, are permitted provided that the following conditions
10213075c896SRyan Stone  * are met:
10223075c896SRyan Stone  * 1. Redistributions of source code must retain the above copyright
10233075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer.
10243075c896SRyan Stone  * 2. Redistributions in binary form must reproduce the above copyright
10253075c896SRyan Stone  *    notice, this list of conditions and the following disclaimer in the
10263075c896SRyan Stone  *    documentation and/or other materials provided with the distribution.
10273075c896SRyan Stone  *
10283075c896SRyan Stone  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
10293075c896SRyan Stone  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
10303075c896SRyan Stone  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
10313075c896SRyan Stone  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
10323075c896SRyan Stone  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
10333075c896SRyan Stone  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
10343075c896SRyan Stone  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
10353075c896SRyan Stone  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
10363075c896SRyan Stone  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
10373075c896SRyan Stone  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
10383075c896SRyan Stone  * SUCH DAMAGE.
10393075c896SRyan Stone  */
10403075c896SRyan Stone 
10413075c896SRyan Stone #include <atf-c++.hpp>
10423075c896SRyan Stone #include <nv.h>
10433075c896SRyan Stone 
10443075c896SRyan Stone #include <errno.h>
10453075c896SRyan Stone #include <limits>
10463075c896SRyan Stone #include <set>
10473075c896SRyan Stone #include <sstream>
10483075c896SRyan Stone #include <string>
10493075c896SRyan Stone 
10503075c896SRyan Stone /*
10513075c896SRyan Stone  * Test that a newly created nvlist has no errors, and is empty.
10523075c896SRyan Stone  */
10533075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
10543075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty)
10553075c896SRyan Stone {
10563075c896SRyan Stone 	nvlist_t *nvl;
10573075c896SRyan Stone 	int type;
10583075c896SRyan Stone 	void *it;
10593075c896SRyan Stone 
10603075c896SRyan Stone 	nvl = nvlist_create(0);
10613075c896SRyan Stone 
10623075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
10633075c896SRyan Stone 
10643075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
10653075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
10663075c896SRyan Stone 
10673075c896SRyan Stone 	it = NULL;
10683075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
10693075c896SRyan Stone 
10703075c896SRyan Stone 	nvlist_destroy(nvl);
10713075c896SRyan Stone }
10723075c896SRyan Stone 
10733075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
10743075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
10753075c896SRyan Stone {
10763075c896SRyan Stone 	nvlist_t *nvl;
10773075c896SRyan Stone 	void *it;
10783075c896SRyan Stone 	const char *key;
10793075c896SRyan Stone 	int type;
10803075c896SRyan Stone 
10813075c896SRyan Stone 	key = "key";
10823075c896SRyan Stone 	nvl = nvlist_create(0);
10833075c896SRyan Stone 
10843075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
10853075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
10863075c896SRyan Stone 
10873075c896SRyan Stone 	nvlist_add_null(nvl, key);
10883075c896SRyan Stone 
10893075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
10903075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
10913075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
10923075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, key));
10933075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_null(nvl, "key"));
10943075c896SRyan Stone 
10953075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
10963075c896SRyan Stone 	it = NULL;
10973075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
10983075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
10993075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
11003075c896SRyan Stone 
11013075c896SRyan Stone 	nvlist_destroy(nvl);
11023075c896SRyan Stone }
11033075c896SRyan Stone 
11043075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
11053075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
11063075c896SRyan Stone {
11073075c896SRyan Stone 	nvlist_t *nvl;
11083075c896SRyan Stone 	void *it;
11093075c896SRyan Stone 	const char *key;
11103075c896SRyan Stone 	int type;
11113075c896SRyan Stone 
11123075c896SRyan Stone 	key = "name";
11133075c896SRyan Stone 	nvl = nvlist_create(0);
11143075c896SRyan Stone 
11153075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
11163075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
11173075c896SRyan Stone 
11183075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
11193075c896SRyan Stone 
11203075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
11213075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
11223075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me"));
11233075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
11243075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e'));
11253075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
11263075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true);
11273075c896SRyan Stone 
11283075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
11293075c896SRyan Stone 	it = NULL;
11303075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
11313075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
11323075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
11333075c896SRyan Stone 
11343075c896SRyan Stone 	nvlist_destroy(nvl);
11353075c896SRyan Stone }
11363075c896SRyan Stone 
11373075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
11383075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
11393075c896SRyan Stone {
11403075c896SRyan Stone 	nvlist_t *nvl;
11413075c896SRyan Stone 	void *it;
11423075c896SRyan Stone 	const char *key;
11433075c896SRyan Stone 	uint64_t value;
11443075c896SRyan Stone 	int type;
11453075c896SRyan Stone 
11463075c896SRyan Stone 	key = "foo123";
11473075c896SRyan Stone 	value = 71965;
11483075c896SRyan Stone 	nvl = nvlist_create(0);
11493075c896SRyan Stone 
11503075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
11513075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
11523075c896SRyan Stone 
11533075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
11543075c896SRyan Stone 
11553075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
11563075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
11573075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123));
11583075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, key));
11593075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key));
11603075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
11613075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value);
11623075c896SRyan Stone 
11633075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
11643075c896SRyan Stone 	it = NULL;
11653075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
11663075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
11673075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
11683075c896SRyan Stone 
11693075c896SRyan Stone 	nvlist_destroy(nvl);
11703075c896SRyan Stone }
11713075c896SRyan Stone 
11723075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
11733075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
11743075c896SRyan Stone {
11753075c896SRyan Stone 	nvlist_t *nvl;
11763075c896SRyan Stone 	void *it;
11773075c896SRyan Stone 	const char *key;
11783075c896SRyan Stone 	const char *value;
11793075c896SRyan Stone 	int type;
11803075c896SRyan Stone 
11813075c896SRyan Stone 	key = "test";
11823075c896SRyan Stone 	value = "fgjdkgjdk";
11833075c896SRyan Stone 	nvl = nvlist_create(0);
11843075c896SRyan Stone 
11853075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
11863075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
11873075c896SRyan Stone 
11883075c896SRyan Stone 	nvlist_add_string(nvl, key, value);
11893075c896SRyan Stone 
11903075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
11913075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
11923075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
11933075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, key));
11943075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key));
11953075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
11963075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0);
11973075c896SRyan Stone 
11983075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
11993075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
12003075c896SRyan Stone 
12013075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
12023075c896SRyan Stone 	it = NULL;
12033075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
12043075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
12053075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
12063075c896SRyan Stone 
12073075c896SRyan Stone 	nvlist_destroy(nvl);
12083075c896SRyan Stone }
12093075c896SRyan Stone 
12103075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
12113075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
12123075c896SRyan Stone {
12133075c896SRyan Stone 	nvlist_t *nvl;
12143075c896SRyan Stone 	void *it;
12153075c896SRyan Stone 	const char *key, *subkey;
12163075c896SRyan Stone 	nvlist_t *sublist;
12173075c896SRyan Stone 	const nvlist_t *value;
12183075c896SRyan Stone 	int type;
12193075c896SRyan Stone 
12203075c896SRyan Stone 	key = "test";
12213075c896SRyan Stone 	subkey = "subkey";
12223075c896SRyan Stone 	sublist = nvlist_create(0);
12233075c896SRyan Stone 	nvl = nvlist_create(0);
12243075c896SRyan Stone 
12253075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
12263075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
12273075c896SRyan Stone 
12283075c896SRyan Stone 	nvlist_add_null(sublist, subkey);
12293075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, sublist);
12303075c896SRyan Stone 
12313075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
12323075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
12333075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
12343075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
12353075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key));
12363075c896SRyan Stone 
12373075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, key);
12383075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
12393075c896SRyan Stone 
12403075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
12413075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
12423075c896SRyan Stone 
12433075c896SRyan Stone 	value = nvlist_getf_nvlist(nvl, "%s", key);
12443075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(value, subkey));
12453075c896SRyan Stone 	ATF_REQUIRE(sublist != value);
12463075c896SRyan Stone 
12473075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
12483075c896SRyan Stone 	it = NULL;
12493075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
12503075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
12513075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
12523075c896SRyan Stone 
12533075c896SRyan Stone 	nvlist_destroy(sublist);
12543075c896SRyan Stone 	nvlist_destroy(nvl);
12553075c896SRyan Stone }
12563075c896SRyan Stone 
12573075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
12583075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
12593075c896SRyan Stone {
12603075c896SRyan Stone 	nvlist_t *nvl;
12613075c896SRyan Stone 	void *it;
12623075c896SRyan Stone 	const char *key;
12633075c896SRyan Stone 	void *value;
12643075c896SRyan Stone 	const void *ret_value;
12653075c896SRyan Stone 	size_t value_size, ret_size;
12663075c896SRyan Stone 	int type;
12673075c896SRyan Stone 
12683075c896SRyan Stone 	key = "binary";
12693075c896SRyan Stone 	value_size = 13;
12703075c896SRyan Stone 	value = malloc(value_size);
12713075c896SRyan Stone 	memset(value, 0xa5, value_size);
12723075c896SRyan Stone 	nvl = nvlist_create(0);
12733075c896SRyan Stone 
12743075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
12753075c896SRyan Stone 	ATF_REQUIRE(!nvlist_exists(nvl, key));
12763075c896SRyan Stone 
12773075c896SRyan Stone 	nvlist_add_binary(nvl, key, value, value_size);
12783075c896SRyan Stone 
12793075c896SRyan Stone 	ATF_REQUIRE(!nvlist_empty(nvl));
12803075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists(nvl, key));
12813075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
12823075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
12833075c896SRyan Stone 	ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key));
12843075c896SRyan Stone 
12853075c896SRyan Stone 	ret_value = nvlist_get_binary(nvl, key, &ret_size);
12863075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
12873075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
12883075c896SRyan Stone 
12893075c896SRyan Stone 	/* nvlist_add_* is required to clone the value, so check for that. */
12903075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
12913075c896SRyan Stone 
12923075c896SRyan Stone 	ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key);
12933075c896SRyan Stone 	ATF_REQUIRE_EQ(value_size, ret_size);
12943075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
12953075c896SRyan Stone 	ATF_REQUIRE(value != ret_value);
12963075c896SRyan Stone 
12973075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
12983075c896SRyan Stone 	it = NULL;
12993075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
13003075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
13013075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL);
13023075c896SRyan Stone 
13033075c896SRyan Stone 	nvlist_destroy(nvl);
13043075c896SRyan Stone 	free(value);
13053075c896SRyan Stone }
13063075c896SRyan Stone 
13073075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
13083075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
13093075c896SRyan Stone {
13103075c896SRyan Stone 	nvlist_t *nvl, *clone;
13113075c896SRyan Stone 
13123075c896SRyan Stone 	nvl = nvlist_create(0);
13133075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
13143075c896SRyan Stone 
13153075c896SRyan Stone 	clone = nvlist_clone(nvl);
13163075c896SRyan Stone 	ATF_REQUIRE(clone != NULL);
13173075c896SRyan Stone 	ATF_REQUIRE(clone != nvl);
13183075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(clone));
13193075c896SRyan Stone 
13203075c896SRyan Stone 	nvlist_destroy(clone);
13213075c896SRyan Stone 	nvlist_destroy(nvl);
13223075c896SRyan Stone }
13233075c896SRyan Stone 
13243075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
13253075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
13263075c896SRyan Stone {
13273075c896SRyan Stone 	nvlist_t *nvl, *clone;
13283075c896SRyan Stone 	const char *key;
13293075c896SRyan Stone 	void *it;
13303075c896SRyan Stone 	uint64_t value;
13313075c896SRyan Stone 	int type;
13323075c896SRyan Stone 
13333075c896SRyan Stone 	nvl = nvlist_create(0);
13343075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
13353075c896SRyan Stone 
13363075c896SRyan Stone 	key = "testkey";
13373075c896SRyan Stone 	value = 684874;
13383075c896SRyan Stone 	nvlist_add_number(nvl, key, value);
13393075c896SRyan Stone 
13403075c896SRyan Stone 	clone = nvlist_clone(nvl);
13413075c896SRyan Stone 	ATF_REQUIRE(clone != NULL);
13423075c896SRyan Stone 	ATF_REQUIRE(clone != nvl);
13433075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(clone, key));
13443075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
13453075c896SRyan Stone 
13463075c896SRyan Stone 	/* Iterate over the nvlist; ensure that it has only our one key. */
13473075c896SRyan Stone 	it = NULL;
13483075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
13493075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
13503075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), NULL);
13513075c896SRyan Stone 
13523075c896SRyan Stone 	nvlist_destroy(clone);
13533075c896SRyan Stone 	nvlist_destroy(nvl);
13543075c896SRyan Stone }
13553075c896SRyan Stone 
13563075c896SRyan Stone static const char * const test_subnvlist_key = "nvlist";
13573075c896SRyan Stone 
13583075c896SRyan Stone static const char * const test_string_key = "string";
13593075c896SRyan Stone static const char * const test_string_val = "59525";
13603075c896SRyan Stone 
13613075c896SRyan Stone static nvlist_t*
13623075c896SRyan Stone create_test_nvlist(void)
13633075c896SRyan Stone {
13643075c896SRyan Stone 	nvlist_t *nvl, *sublist;
13653075c896SRyan Stone 
13663075c896SRyan Stone 	nvl = nvlist_create(0);
13673075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
13683075c896SRyan Stone 
13693075c896SRyan Stone 	sublist = nvlist_create(0);
13703075c896SRyan Stone 	ATF_REQUIRE(sublist != NULL);
13713075c896SRyan Stone 
13723075c896SRyan Stone 	nvlist_add_string(sublist, test_string_key, test_string_val);
13733075c896SRyan Stone 	nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
13743075c896SRyan Stone 
13753075c896SRyan Stone 	return (nvl);
13763075c896SRyan Stone }
13773075c896SRyan Stone 
13783075c896SRyan Stone static void
13793075c896SRyan Stone verify_test_nvlist(const nvlist_t *nvl)
13803075c896SRyan Stone {
13813075c896SRyan Stone 	void *it;
13823075c896SRyan Stone 	const nvlist_t *value;
13833075c896SRyan Stone 	int type;
13843075c896SRyan Stone 
13853075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
13863075c896SRyan Stone 
13873075c896SRyan Stone 	value = nvlist_get_nvlist(nvl, test_subnvlist_key);
13883075c896SRyan Stone 
13893075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
13903075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
13913075c896SRyan Stone 	ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
13923075c896SRyan Stone 
13933075c896SRyan Stone 	/* Iterate over both nvlists; ensure that each has only the one key. */
13943075c896SRyan Stone 	it = NULL;
13953075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
13963075c896SRyan Stone 	    test_string_key), 0);
13973075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
13983075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), NULL);
13993075c896SRyan Stone 
14003075c896SRyan Stone 	it = NULL;
14013075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
14023075c896SRyan Stone 	    test_subnvlist_key), 0);
14033075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
14043075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL);
14053075c896SRyan Stone }
14063075c896SRyan Stone 
14073075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
14083075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
14093075c896SRyan Stone {
14103075c896SRyan Stone 	nvlist_t *nvl, *clone;
14113075c896SRyan Stone 
14123075c896SRyan Stone 	nvl = create_test_nvlist();
14133075c896SRyan Stone 	clone = nvlist_clone(nvl);
14143075c896SRyan Stone 
14153075c896SRyan Stone 	ATF_REQUIRE(clone != NULL);
14163075c896SRyan Stone 	ATF_REQUIRE(clone != nvl);
14173075c896SRyan Stone 	verify_test_nvlist(clone);
14183075c896SRyan Stone 
14193075c896SRyan Stone 	nvlist_destroy(clone);
14203075c896SRyan Stone 	nvlist_destroy(nvl);
14213075c896SRyan Stone }
14223075c896SRyan Stone 
14233075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist);
14243075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist)
14253075c896SRyan Stone {
14263075c896SRyan Stone 	nvlist_t *nvl, *unpacked;
14273075c896SRyan Stone 	void *packed;
14283075c896SRyan Stone 	size_t packed_size;
14293075c896SRyan Stone 
14303075c896SRyan Stone 	nvl = nvlist_create(0);
14313075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
14323075c896SRyan Stone 
14333075c896SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
14343075c896SRyan Stone 	ATF_REQUIRE(packed != NULL);
14353075c896SRyan Stone 
14363075c896SRyan Stone 	unpacked = nvlist_unpack(packed, packed_size);
14373075c896SRyan Stone 	ATF_REQUIRE(unpacked != NULL);
14383075c896SRyan Stone 	ATF_REQUIRE(unpacked != nvl);
14393075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(unpacked));
14403075c896SRyan Stone 
14413075c896SRyan Stone 	nvlist_destroy(unpacked);
14423075c896SRyan Stone 	nvlist_destroy(nvl);
14433075c896SRyan Stone 	free(packed);
14443075c896SRyan Stone }
14453075c896SRyan Stone 
14463075c896SRyan Stone static void
14473075c896SRyan Stone verify_null(const nvlist_t *nvl, int type)
14483075c896SRyan Stone {
14493075c896SRyan Stone 
14503075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
14513075c896SRyan Stone }
14523075c896SRyan Stone 
14533075c896SRyan Stone static void
14543075c896SRyan Stone verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value)
14553075c896SRyan Stone {
14563075c896SRyan Stone 
14573075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
14583075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value);
14593075c896SRyan Stone }
14603075c896SRyan Stone 
14613075c896SRyan Stone static void
14623075c896SRyan Stone verify_string(const nvlist_t *nvl, const char *name, int type,
14633075c896SRyan Stone     const char * value)
14643075c896SRyan Stone {
14653075c896SRyan Stone 
14663075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
14673075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0);
14683075c896SRyan Stone }
14693075c896SRyan Stone 
14703075c896SRyan Stone static void
14713075c896SRyan Stone verify_nvlist(const nvlist_t *nvl, const char *name, int type)
14723075c896SRyan Stone {
14733075c896SRyan Stone 
14743075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
14753075c896SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, name));
14763075c896SRyan Stone }
14773075c896SRyan Stone 
14783075c896SRyan Stone static void
14793075c896SRyan Stone verify_binary(const nvlist_t *nvl, const char *name, int type,
14803075c896SRyan Stone     const void * value, size_t size)
14813075c896SRyan Stone {
14823075c896SRyan Stone 	const void *actual_value;
14833075c896SRyan Stone 	size_t actual_size;
14843075c896SRyan Stone 
14853075c896SRyan Stone 	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
14863075c896SRyan Stone 	actual_value = nvlist_get_binary(nvl, name, &actual_size);
14873075c896SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
14883075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0);
14893075c896SRyan Stone }
14903075c896SRyan Stone 
14913075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values);
14923075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__multiple_values)
14933075c896SRyan Stone {
14943075c896SRyan Stone 	std::ostringstream msg;
14953075c896SRyan Stone 	std::set<std::string> keys_seen;
14963075c896SRyan Stone 	nvlist_t *nvl, *unpacked, *nvvalue;
14973075c896SRyan Stone 	const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name;
14983075c896SRyan Stone 	int numvalue;
14993075c896SRyan Stone 	const char * strvalue;
15003075c896SRyan Stone 	void *binvalue, *packed, *it;
15013075c896SRyan Stone 	size_t binsize, packed_size;
15023075c896SRyan Stone 	int type;
15033075c896SRyan Stone 
15043075c896SRyan Stone 	nvl = nvlist_create(0);
15053075c896SRyan Stone 
15063075c896SRyan Stone 	nullkey = "null";
15073075c896SRyan Stone 	nvlist_add_null(nvl, nullkey);
15083075c896SRyan Stone 
15093075c896SRyan Stone 	numkey = "number";
15103075c896SRyan Stone 	numvalue = 939853984;
15113075c896SRyan Stone 	nvlist_add_number(nvl, numkey, numvalue);
15123075c896SRyan Stone 
15133075c896SRyan Stone 	strkey = "string";
15143075c896SRyan Stone 	strvalue = "jfieutijf";
15153075c896SRyan Stone 	nvlist_add_string(nvl, strkey, strvalue);
15163075c896SRyan Stone 
15173075c896SRyan Stone 	nvkey = "nvlist";
15183075c896SRyan Stone 	nvvalue = create_test_nvlist();
15193075c896SRyan Stone 	nvlist_move_nvlist(nvl, nvkey, nvvalue);
15203075c896SRyan Stone 
15213075c896SRyan Stone 	binkey = "binary";
15223075c896SRyan Stone 	binsize = 4;
15233075c896SRyan Stone 	binvalue = malloc(binsize);
15243075c896SRyan Stone 	memset(binvalue, 'b', binsize);
15253075c896SRyan Stone 	nvlist_move_binary(nvl, binkey, binvalue, binsize);
15263075c896SRyan Stone 
15273075c896SRyan Stone 	packed = nvlist_pack(nvl, &packed_size);
15283075c896SRyan Stone 	ATF_REQUIRE(packed != NULL);
15293075c896SRyan Stone 
15303075c896SRyan Stone 	unpacked = nvlist_unpack(packed, packed_size);
15313075c896SRyan Stone 	ATF_REQUIRE(unpacked != 0);
15323075c896SRyan Stone 
15333075c896SRyan Stone 	it = NULL;
15343075c896SRyan Stone 	while ((name = nvlist_next(unpacked, &type, &it)) != NULL) {
15353075c896SRyan Stone 		/* Ensure that we see every key only once. */
15363075c896SRyan Stone 		ATF_REQUIRE_EQ(keys_seen.count(name), 0);
15373075c896SRyan Stone 
15383075c896SRyan Stone 		if (strcmp(name, nullkey) == 0)
15393075c896SRyan Stone 			verify_null(unpacked, type);
15403075c896SRyan Stone 		else if (strcmp(name, numkey) == 0)
15413075c896SRyan Stone 			verify_number(unpacked, name, type, numvalue);
15423075c896SRyan Stone 		else if (strcmp(name, strkey) == 0)
15433075c896SRyan Stone 			verify_string(unpacked, name, type, strvalue);
15443075c896SRyan Stone 		else if (strcmp(name, nvkey) == 0)
15453075c896SRyan Stone 			verify_nvlist(unpacked, name, type);
15463075c896SRyan Stone 		else if (strcmp(name, binkey) == 0)
15473075c896SRyan Stone 			verify_binary(unpacked, name, type, binvalue, binsize);
15483075c896SRyan Stone 		else {
15493075c896SRyan Stone 			msg << "Unexpected key :'" << name << "'";
15503075c896SRyan Stone 			ATF_FAIL(msg.str().c_str());
15513075c896SRyan Stone 		}
15523075c896SRyan Stone 
15533075c896SRyan Stone 		keys_seen.insert(name);
15543075c896SRyan Stone 	}
15553075c896SRyan Stone 
15563075c896SRyan Stone 	/* Ensure that we saw every key. */
15573075c896SRyan Stone 	ATF_REQUIRE_EQ(keys_seen.size(), 5);
15583075c896SRyan Stone 
15593075c896SRyan Stone 	nvlist_destroy(nvl);
15603075c896SRyan Stone 	nvlist_destroy(unpacked);
15613075c896SRyan Stone 	free(packed);
15623075c896SRyan Stone }
15633075c896SRyan Stone 
15643075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key);
15653075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key)
15663075c896SRyan Stone {
15673075c896SRyan Stone 	nvlist_t *nvl, *unpacked;
15683075c896SRyan Stone 	const char *key1, *key2;
15693075c896SRyan Stone 	void *packed, *keypos;
15703075c896SRyan Stone 	size_t size, keylen;
15713075c896SRyan Stone 
15723075c896SRyan Stone 	nvl = nvlist_create(0);
15733075c896SRyan Stone 
15743075c896SRyan Stone 	key1 = "key1";
15753075c896SRyan Stone 	keylen = strlen(key1);
15763075c896SRyan Stone 	nvlist_add_number(nvl, key1, 5);
15773075c896SRyan Stone 
15783075c896SRyan Stone 	key2 = "key2";
15793075c896SRyan Stone 	ATF_REQUIRE_EQ(keylen, strlen(key2));
15803075c896SRyan Stone 	nvlist_add_number(nvl, key2, 10);
15813075c896SRyan Stone 
15823075c896SRyan Stone 	packed = nvlist_pack(nvl, &size);
15833075c896SRyan Stone 
15843075c896SRyan Stone 	/*
15853075c896SRyan Stone 	 * Mangle the packed nvlist by replacing key1 with key2, creating a
15863075c896SRyan Stone 	 * packed nvlist with a duplicate key.
15873075c896SRyan Stone 	 */
15883075c896SRyan Stone 	keypos = memmem(packed, size, key1, keylen);
15893075c896SRyan Stone 	ATF_REQUIRE(keypos != NULL);
15903075c896SRyan Stone 	memcpy(keypos, key2, keylen);
15913075c896SRyan Stone 
15923075c896SRyan Stone 	unpacked = nvlist_unpack(packed, size);
15933075c896SRyan Stone 	ATF_REQUIRE(nvlist_error(unpacked) != 0);
15943075c896SRyan Stone 
15953075c896SRyan Stone 	free(packed);
15963075c896SRyan Stone 	nvlist_destroy(nvl);
15973075c896SRyan Stone 	nvlist_destroy(unpacked);
15983075c896SRyan Stone }
15993075c896SRyan Stone 
16003075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert);
16013075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_string__single_insert)
16023075c896SRyan Stone {
16033075c896SRyan Stone 	nvlist_t *nvl;
16043075c896SRyan Stone 	const char *key;
16053075c896SRyan Stone 	char *value;
16063075c896SRyan Stone 
16073075c896SRyan Stone 	nvl = nvlist_create(0);
16083075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
16093075c896SRyan Stone 
16103075c896SRyan Stone 	key = "testkey";
16113075c896SRyan Stone 	value = strdup("testval");
16123075c896SRyan Stone 	ATF_REQUIRE(value != NULL);
16133075c896SRyan Stone 
16143075c896SRyan Stone 	nvlist_move_string(nvl, key, value);
16153075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value);
16163075c896SRyan Stone 
16173075c896SRyan Stone 	nvlist_destroy(nvl);
16183075c896SRyan Stone }
16193075c896SRyan Stone 
16203075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child);
16213075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child)
16223075c896SRyan Stone {
16233075c896SRyan Stone 	nvlist_t *parent;
16243075c896SRyan Stone 
16253075c896SRyan Stone 	parent = nvlist_create(0);
16263075c896SRyan Stone 
16273075c896SRyan Stone 	nvlist_move_nvlist(parent, "test", NULL);
16283075c896SRyan Stone 
16293075c896SRyan Stone 	ATF_REQUIRE(nvlist_error(parent) != 0);
16303075c896SRyan Stone 
16313075c896SRyan Stone 	nvlist_destroy(parent);
16323075c896SRyan Stone }
16333075c896SRyan Stone 
16343075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert);
16353075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert)
16363075c896SRyan Stone {
16373075c896SRyan Stone 	nvlist_t *nvl;
16383075c896SRyan Stone 	const char *key;
16393075c896SRyan Stone 	nvlist_t *value;
16403075c896SRyan Stone 
16413075c896SRyan Stone 	nvl = nvlist_create(0);
16423075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
16433075c896SRyan Stone 
16443075c896SRyan Stone 	key = "testkey";
16453075c896SRyan Stone 	value = nvlist_create(0);
16463075c896SRyan Stone 	ATF_REQUIRE(value != NULL);
16473075c896SRyan Stone 
16483075c896SRyan Stone 	nvlist_move_nvlist(nvl, key, value);
16493075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value);
16503075c896SRyan Stone 
16513075c896SRyan Stone 	nvlist_destroy(nvl);
16523075c896SRyan Stone }
16533075c896SRyan Stone 
16543075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert);
16553075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert)
16563075c896SRyan Stone {
16573075c896SRyan Stone 	nvlist_t *nvl;
16583075c896SRyan Stone 	const char *key;
16593075c896SRyan Stone 	void *value;
16603075c896SRyan Stone 	size_t size, actual_size;
16613075c896SRyan Stone 
16623075c896SRyan Stone 	nvl = nvlist_create(0);
16633075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
16643075c896SRyan Stone 
16653075c896SRyan Stone 	key = "testkey";
16663075c896SRyan Stone 	size = 73;
16673075c896SRyan Stone 	value = malloc(size);
16683075c896SRyan Stone 	ATF_REQUIRE(value != NULL);
16693075c896SRyan Stone 
16703075c896SRyan Stone 	nvlist_move_binary(nvl, key, value, size);
16713075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value);
16723075c896SRyan Stone 	ATF_REQUIRE_EQ(size, actual_size);
16733075c896SRyan Stone 
16743075c896SRyan Stone 	nvlist_destroy(nvl);
16753075c896SRyan Stone }
16763075c896SRyan Stone 
16773075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove);
16783075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove)
16793075c896SRyan Stone {
16803075c896SRyan Stone 	nvlist_t *nvl;
16813075c896SRyan Stone 	const char *testkey;
16823075c896SRyan Stone 	bool testval;
16833075c896SRyan Stone 
16843075c896SRyan Stone 	nvl = nvlist_create(0);
16853075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
16863075c896SRyan Stone 
16873075c896SRyan Stone 	testkey = "boolkey";
16883075c896SRyan Stone 	testval = false;
16893075c896SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
16903075c896SRyan Stone 
16913075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
16923075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
16933075c896SRyan Stone 
16943075c896SRyan Stone 	nvlist_destroy(nvl);
16953075c896SRyan Stone }
16963075c896SRyan Stone 
16973075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged);
16983075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged)
16993075c896SRyan Stone {
17003075c896SRyan Stone 	nvlist_t *nvl;
17013075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
17023075c896SRyan Stone 	bool testval, otherval1;
17033075c896SRyan Stone 	nvlist_t *otherval2;
17043075c896SRyan Stone 
17053075c896SRyan Stone 	nvl = nvlist_create(0);
17063075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
17073075c896SRyan Stone 
17083075c896SRyan Stone 	testkey = "boolkey";
17093075c896SRyan Stone 	testval = true;
17103075c896SRyan Stone 	nvlist_add_bool(nvl, testkey, testval);
17113075c896SRyan Stone 
17123075c896SRyan Stone 	otherkey1 = "key1";
17133075c896SRyan Stone 	otherval1 = false;
17143075c896SRyan Stone 	nvlist_add_bool(nvl, otherkey1, otherval1);
17153075c896SRyan Stone 
17163075c896SRyan Stone 	otherkey2 = "key2";
17173075c896SRyan Stone 	otherval2 = create_test_nvlist();
17183075c896SRyan Stone 	nvlist_move_nvlist(nvl, otherkey2, otherval2);
17193075c896SRyan Stone 
17203075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
17213075c896SRyan Stone 
17223075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1));
17233075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1);
17243075c896SRyan Stone 
17253075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2));
17263075c896SRyan Stone 	verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2));
17273075c896SRyan Stone 
17283075c896SRyan Stone 	nvlist_destroy(nvl);
17293075c896SRyan Stone }
17303075c896SRyan Stone 
17313075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove);
17323075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__single_remove)
17333075c896SRyan Stone {
17343075c896SRyan Stone 	nvlist_t *nvl;
17353075c896SRyan Stone 	const char *testkey;
17363075c896SRyan Stone 	uint64_t testval;
17373075c896SRyan Stone 
17383075c896SRyan Stone 	nvl = nvlist_create(0);
17393075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
17403075c896SRyan Stone 
17413075c896SRyan Stone 	testkey = "numkey";
17423075c896SRyan Stone 	testval = std::numeric_limits<uint64_t>::max();
17433075c896SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
17443075c896SRyan Stone 
17453075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
17463075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
17473075c896SRyan Stone 
17483075c896SRyan Stone 	nvlist_destroy(nvl);
17493075c896SRyan Stone }
17503075c896SRyan Stone 
17513075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged);
17523075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged)
17533075c896SRyan Stone {
17543075c896SRyan Stone 	nvlist_t *nvl;
17553075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
17563075c896SRyan Stone 	uint64_t testval, otherval1;
17573075c896SRyan Stone 	const char *otherval2;
17583075c896SRyan Stone 
17593075c896SRyan Stone 	nvl = nvlist_create(0);
17603075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
17613075c896SRyan Stone 
17623075c896SRyan Stone 	otherkey1 = "key1";
17633075c896SRyan Stone 	otherval1 = 5;
17643075c896SRyan Stone 	nvlist_add_number(nvl, otherkey1, otherval1);
17653075c896SRyan Stone 
17663075c896SRyan Stone 	testkey = "numkey";
17673075c896SRyan Stone 	testval = 1654;
17683075c896SRyan Stone 	nvlist_add_number(nvl, testkey, testval);
17693075c896SRyan Stone 
17703075c896SRyan Stone 	otherkey2 = "key2";
17713075c896SRyan Stone 	otherval2 = "string";
17723075c896SRyan Stone 	nvlist_add_string(nvl, otherkey2, otherval2);
17733075c896SRyan Stone 
17743075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
17753075c896SRyan Stone 
17763075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1));
17773075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1);
17783075c896SRyan Stone 
17793075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2));
17803075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0);
17813075c896SRyan Stone 
17823075c896SRyan Stone 	nvlist_destroy(nvl);
17833075c896SRyan Stone }
17843075c896SRyan Stone 
17853075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove);
17863075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__single_remove)
17873075c896SRyan Stone {
17883075c896SRyan Stone 	nvlist_t *nvl;
17893075c896SRyan Stone 	const char *testkey;
17903075c896SRyan Stone 	const char *testval;
17913075c896SRyan Stone 
17923075c896SRyan Stone 	nvl = nvlist_create(0);
17933075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
17943075c896SRyan Stone 
17953075c896SRyan Stone 	testkey = "numkey";
17963075c896SRyan Stone 	testval = "nvlist";
17973075c896SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
17983075c896SRyan Stone 
17993075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
18003075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
18013075c896SRyan Stone 
18023075c896SRyan Stone 	nvlist_destroy(nvl);
18033075c896SRyan Stone }
18043075c896SRyan Stone 
18053075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged);
18063075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged)
18073075c896SRyan Stone {
18083075c896SRyan Stone 	nvlist_t *nvl;
18093075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
18103075c896SRyan Stone 	const char *testval, *otherval1;
18113075c896SRyan Stone 	bool otherval2;
18123075c896SRyan Stone 
18133075c896SRyan Stone 	nvl = nvlist_create(0);
18143075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
18153075c896SRyan Stone 
18163075c896SRyan Stone 	otherkey1 = "key1";
18173075c896SRyan Stone 	otherval1 = "fjdifjdk";
18183075c896SRyan Stone 	nvlist_add_string(nvl, otherkey1, otherval1);
18193075c896SRyan Stone 
18203075c896SRyan Stone 	otherkey2 = "key2";
18213075c896SRyan Stone 	otherval2 = true;
18223075c896SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
18233075c896SRyan Stone 
18243075c896SRyan Stone 	testkey = "strkey";
18253075c896SRyan Stone 	testval = "1654";
18263075c896SRyan Stone 	nvlist_add_string(nvl, testkey, testval);
18273075c896SRyan Stone 
18283075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
18293075c896SRyan Stone 
18303075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1));
18313075c896SRyan Stone 	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0);
18323075c896SRyan Stone 
18333075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
18343075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
18353075c896SRyan Stone 
18363075c896SRyan Stone 	nvlist_destroy(nvl);
18373075c896SRyan Stone }
18383075c896SRyan Stone 
18393075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove);
18403075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove)
18413075c896SRyan Stone {
18423075c896SRyan Stone 	nvlist_t *nvl;
18433075c896SRyan Stone 	const char *testkey;
18443075c896SRyan Stone 	nvlist_t *testval;
18453075c896SRyan Stone 
18463075c896SRyan Stone 	nvl = nvlist_create(0);
18473075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
18483075c896SRyan Stone 
18493075c896SRyan Stone 	testkey = "numkey";
18503075c896SRyan Stone 	testval = create_test_nvlist();
18513075c896SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
18523075c896SRyan Stone 
18533075c896SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
18543075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
18553075c896SRyan Stone 
18563075c896SRyan Stone 	nvlist_destroy(nvl);
18573075c896SRyan Stone }
18583075c896SRyan Stone 
18593075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged);
18603075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged)
18613075c896SRyan Stone {
18623075c896SRyan Stone 	nvlist_t *nvl;
18633075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
18643075c896SRyan Stone 	nvlist_t *testval, *otherval1;
18653075c896SRyan Stone 
18663075c896SRyan Stone 	nvl = nvlist_create(0);
18673075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
18683075c896SRyan Stone 
18693075c896SRyan Stone 	testkey = "strkey";
18703075c896SRyan Stone 	testval = create_test_nvlist();
18713075c896SRyan Stone 	nvlist_move_nvlist(nvl, testkey, testval);
18723075c896SRyan Stone 
18733075c896SRyan Stone 	otherkey1 = "key1";
18743075c896SRyan Stone 	otherval1 = nvlist_create(0);
18753075c896SRyan Stone 	nvlist_move_nvlist(nvl, otherkey1, otherval1);
18763075c896SRyan Stone 
18773075c896SRyan Stone 	otherkey2 = "key2";
18783075c896SRyan Stone 	nvlist_add_null(nvl, otherkey2);
18793075c896SRyan Stone 
18803075c896SRyan Stone 	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
18813075c896SRyan Stone 
18823075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1));
18833075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1)));
18843075c896SRyan Stone 
18853075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2));
18863075c896SRyan Stone 
18873075c896SRyan Stone 	nvlist_destroy(nvl);
18883075c896SRyan Stone }
18893075c896SRyan Stone 
18903075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove);
18913075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove)
18923075c896SRyan Stone {
18933075c896SRyan Stone 	nvlist_t *nvl;
18943075c896SRyan Stone 	const char *testkey;
18953075c896SRyan Stone 	void *testval;
18963075c896SRyan Stone 	const void *actual_val;
18973075c896SRyan Stone 	size_t testsize, actual_size;
18983075c896SRyan Stone 
18993075c896SRyan Stone 	nvl = nvlist_create(0);
19003075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
19013075c896SRyan Stone 
19023075c896SRyan Stone 	testkey = "numkey";
19033075c896SRyan Stone 	testsize = 457;
19043075c896SRyan Stone 	testval = malloc(testsize);
19053075c896SRyan Stone 	memset(testval, '5', testsize);
19063075c896SRyan Stone 	nvlist_move_binary(nvl, testkey, testval, testsize);
19073075c896SRyan Stone 
19083075c896SRyan Stone 	actual_val = nvlist_take_binary(nvl, testkey, &actual_size);
19093075c896SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
19103075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0);
19113075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
19123075c896SRyan Stone 
19133075c896SRyan Stone 	nvlist_destroy(nvl);
19143075c896SRyan Stone }
19153075c896SRyan Stone 
19163075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged);
19173075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged)
19183075c896SRyan Stone {
19193075c896SRyan Stone 	nvlist_t *nvl;
19203075c896SRyan Stone 	const char *testkey, *otherkey1, *otherkey2;
19213075c896SRyan Stone 	const void *actual_value;
19223075c896SRyan Stone 	char testval[] = "gjiertj";
19233075c896SRyan Stone 	char otherval1[] = "fdreg";
19243075c896SRyan Stone 	size_t testsize, othersize, actual_size;
19253075c896SRyan Stone 	bool otherval2;
19263075c896SRyan Stone 
19273075c896SRyan Stone 	nvl = nvlist_create(0);
19283075c896SRyan Stone 	ATF_REQUIRE(nvl != NULL);
19293075c896SRyan Stone 
19303075c896SRyan Stone 	otherkey1 = "key1";
19313075c896SRyan Stone 	othersize = sizeof(otherval1);
19323075c896SRyan Stone 	nvlist_add_binary(nvl, otherkey1, otherval1, othersize);
19333075c896SRyan Stone 
19343075c896SRyan Stone 	otherkey2 = "key2";
19353075c896SRyan Stone 	otherval2 = true;
19363075c896SRyan Stone 	nvlist_add_bool(nvl, otherkey2, otherval2);
19373075c896SRyan Stone 
19383075c896SRyan Stone 	testkey = "strkey";
19393075c896SRyan Stone 	testsize = sizeof(testval);
19403075c896SRyan Stone 	nvlist_add_binary(nvl, testkey, testval, testsize);
19413075c896SRyan Stone 
19423075c896SRyan Stone 	actual_value = nvlist_take_binary(nvl, testkey, &actual_size);
19433075c896SRyan Stone 	ATF_REQUIRE_EQ(testsize, actual_size);
19443075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0);
19453075c896SRyan Stone 
19463075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1));
19473075c896SRyan Stone 	actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size);
19483075c896SRyan Stone 	ATF_REQUIRE_EQ(othersize, actual_size);
19493075c896SRyan Stone 	ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0);
19503075c896SRyan Stone 
19513075c896SRyan Stone 	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
19523075c896SRyan Stone 	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
19533075c896SRyan Stone 
19543075c896SRyan Stone 	nvlist_destroy(nvl);
19553075c896SRyan Stone }
19563075c896SRyan Stone 
19573075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null);
19583075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_null)
19593075c896SRyan Stone {
19603075c896SRyan Stone 	nvlist_t *nvl;
19613075c896SRyan Stone 	const char *key;
19623075c896SRyan Stone 
19633075c896SRyan Stone 	nvl = nvlist_create(0);
19643075c896SRyan Stone 	key = "test";
19653075c896SRyan Stone 	nvlist_add_null(nvl, key);
19663075c896SRyan Stone 
19673075c896SRyan Stone 	nvlist_free(nvl, key);
19683075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
19693075c896SRyan Stone 
19703075c896SRyan Stone 	nvlist_destroy(nvl);
19713075c896SRyan Stone }
19723075c896SRyan Stone 
19733075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool);
19743075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_bool)
19753075c896SRyan Stone {
19763075c896SRyan Stone 	nvlist_t *nvl;
19773075c896SRyan Stone 	const char *key;
19783075c896SRyan Stone 
19793075c896SRyan Stone 	nvl = nvlist_create(0);
19803075c896SRyan Stone 	key = "test";
19813075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
19823075c896SRyan Stone 
19833075c896SRyan Stone 	nvlist_free(nvl, key);
19843075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
19853075c896SRyan Stone 
19863075c896SRyan Stone 	nvlist_destroy(nvl);
19873075c896SRyan Stone }
19883075c896SRyan Stone 
19893075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number);
19903075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_number)
19913075c896SRyan Stone {
19923075c896SRyan Stone 	nvlist_t *nvl;
19933075c896SRyan Stone 	const char *key;
19943075c896SRyan Stone 
19953075c896SRyan Stone 	nvl = nvlist_create(0);
19963075c896SRyan Stone 	key = "test";
19973075c896SRyan Stone 	nvlist_add_number(nvl, key, 584);
19983075c896SRyan Stone 
19993075c896SRyan Stone 	nvlist_free(nvl, key);
20003075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
20013075c896SRyan Stone 
20023075c896SRyan Stone 	nvlist_destroy(nvl);
20033075c896SRyan Stone }
20043075c896SRyan Stone 
20053075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string);
20063075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_string)
20073075c896SRyan Stone {
20083075c896SRyan Stone 	nvlist_t *nvl;
20093075c896SRyan Stone 	const char *key;
20103075c896SRyan Stone 
20113075c896SRyan Stone 	nvl = nvlist_create(0);
20123075c896SRyan Stone 	key = "test";
20133075c896SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
20143075c896SRyan Stone 
20153075c896SRyan Stone 	nvlist_free(nvl, key);
20163075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
20173075c896SRyan Stone 
20183075c896SRyan Stone 	nvlist_destroy(nvl);
20193075c896SRyan Stone }
20203075c896SRyan Stone 
20213075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist);
20223075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_nvlist)
20233075c896SRyan Stone {
20243075c896SRyan Stone 	nvlist_t *nvl;
20253075c896SRyan Stone 	const char *key;
20263075c896SRyan Stone 
20273075c896SRyan Stone 	nvl = nvlist_create(0);
20283075c896SRyan Stone 	key = "test";
20293075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
20303075c896SRyan Stone 
20313075c896SRyan Stone 	nvlist_free(nvl, key);
20323075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
20333075c896SRyan Stone 
20343075c896SRyan Stone 	nvlist_destroy(nvl);
20353075c896SRyan Stone }
20363075c896SRyan Stone 
20373075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary);
20383075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_binary)
20393075c896SRyan Stone {
20403075c896SRyan Stone 	nvlist_t *nvl;
20413075c896SRyan Stone 	const char *key;
20423075c896SRyan Stone 
20433075c896SRyan Stone 	nvl = nvlist_create(0);
20443075c896SRyan Stone 	key = "test";
20453075c896SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
20463075c896SRyan Stone 
20473075c896SRyan Stone 	nvlist_free(nvl, key);
20483075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
20493075c896SRyan Stone 
20503075c896SRyan Stone 	nvlist_destroy(nvl);
20513075c896SRyan Stone }
20523075c896SRyan Stone 
20533075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null);
20543075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_null__single_null)
20553075c896SRyan Stone {
20563075c896SRyan Stone 	nvlist_t *nvl;
20573075c896SRyan Stone 	const char *key;
20583075c896SRyan Stone 
20593075c896SRyan Stone 	nvl = nvlist_create(0);
20603075c896SRyan Stone 	key = "test";
20613075c896SRyan Stone 	nvlist_add_null(nvl, key);
20623075c896SRyan Stone 
20633075c896SRyan Stone 	nvlist_free_null(nvl, key);
20643075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
20653075c896SRyan Stone 
20663075c896SRyan Stone 	nvlist_destroy(nvl);
20673075c896SRyan Stone }
20683075c896SRyan Stone 
20693075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool);
20703075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool)
20713075c896SRyan Stone {
20723075c896SRyan Stone 	nvlist_t *nvl;
20733075c896SRyan Stone 	const char *key;
20743075c896SRyan Stone 
20753075c896SRyan Stone 	nvl = nvlist_create(0);
20763075c896SRyan Stone 	key = "test";
20773075c896SRyan Stone 	nvlist_add_bool(nvl, key, true);
20783075c896SRyan Stone 
20793075c896SRyan Stone 	nvlist_free_bool(nvl, key);
20803075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
20813075c896SRyan Stone 
20823075c896SRyan Stone 	nvlist_destroy(nvl);
20833075c896SRyan Stone }
20843075c896SRyan Stone 
20853075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number);
20863075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_number__single_number)
20873075c896SRyan Stone {
20883075c896SRyan Stone 	nvlist_t *nvl;
20893075c896SRyan Stone 	const char *key;
20903075c896SRyan Stone 
20913075c896SRyan Stone 	nvl = nvlist_create(0);
20923075c896SRyan Stone 	key = "test";
20933075c896SRyan Stone 	nvlist_add_number(nvl, key, 584);
20943075c896SRyan Stone 
20953075c896SRyan Stone 	nvlist_free_number(nvl, key);
20963075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
20973075c896SRyan Stone 
20983075c896SRyan Stone 	nvlist_destroy(nvl);
20993075c896SRyan Stone }
21003075c896SRyan Stone 
21013075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string);
21023075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_string__single_string)
21033075c896SRyan Stone {
21043075c896SRyan Stone 	nvlist_t *nvl;
21053075c896SRyan Stone 	const char *key;
21063075c896SRyan Stone 
21073075c896SRyan Stone 	nvl = nvlist_create(0);
21083075c896SRyan Stone 	key = "test";
21093075c896SRyan Stone 	nvlist_add_string(nvl, key, "gjkfkjd");
21103075c896SRyan Stone 
21113075c896SRyan Stone 	nvlist_free_string(nvl, key);
21123075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
21133075c896SRyan Stone 
21143075c896SRyan Stone 	nvlist_destroy(nvl);
21153075c896SRyan Stone }
21163075c896SRyan Stone 
21173075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist);
21183075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist)
21193075c896SRyan Stone {
21203075c896SRyan Stone 	nvlist_t *nvl;
21213075c896SRyan Stone 	const char *key;
21223075c896SRyan Stone 
21233075c896SRyan Stone 	nvl = nvlist_create(0);
21243075c896SRyan Stone 	key = "test";
21253075c896SRyan Stone 	nvlist_add_nvlist(nvl, key, nvlist_create(0));
21263075c896SRyan Stone 
21273075c896SRyan Stone 	nvlist_free_nvlist(nvl, key);
21283075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
21293075c896SRyan Stone 
21303075c896SRyan Stone 	nvlist_destroy(nvl);
21313075c896SRyan Stone }
21323075c896SRyan Stone 
21333075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary);
21343075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary)
21353075c896SRyan Stone {
21363075c896SRyan Stone 	nvlist_t *nvl;
21373075c896SRyan Stone 	const char *key;
21383075c896SRyan Stone 
21393075c896SRyan Stone 	nvl = nvlist_create(0);
21403075c896SRyan Stone 	key = "test";
21413075c896SRyan Stone 	nvlist_add_binary(nvl, key, "jgjgfd", 6);
21423075c896SRyan Stone 
21433075c896SRyan Stone 	nvlist_free_binary(nvl, key);
21443075c896SRyan Stone 	ATF_REQUIRE(nvlist_empty(nvl));
21453075c896SRyan Stone 
21463075c896SRyan Stone 	nvlist_destroy(nvl);
21473075c896SRyan Stone }
21483075c896SRyan Stone 
21493075c896SRyan Stone ATF_INIT_TEST_CASES(tp)
21503075c896SRyan Stone {
21513075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
21523075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
21533075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
21543075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
21553075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
21563075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
21573075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
21583075c896SRyan Stone 
21593075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
21603075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
21613075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
21623075c896SRyan Stone 
21633075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist);
21643075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values);
21653075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key);
21663075c896SRyan Stone 
21673075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert);
21683075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert);
21693075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child);
21703075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert);
21713075c896SRyan Stone 
21723075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove);
21733075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged);
21743075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove);
21753075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged);
21763075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove);
21773075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged);
21783075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove);
21793075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged);
21803075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove);
21813075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged);
21823075c896SRyan Stone 
21833075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_null);
21843075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool);
21853075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_number);
21863075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_string);
21873075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist);
21883075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary);
21893075c896SRyan Stone 
21903075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null);
21913075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool);
21923075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number);
21933075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string);
21943075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist);
21953075c896SRyan Stone 	ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary);
21963075c896SRyan Stone }
2197