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