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; 57bf5d6cf0SDimitry 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_exists_null(nvl, key)); 81*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_null(nvl, "key")); 823075c896SRyan Stone 833075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 843075c896SRyan Stone it = NULL; 853075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 863075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 87bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 883075c896SRyan Stone 893075c896SRyan Stone nvlist_destroy(nvl); 903075c896SRyan Stone } 913075c896SRyan Stone 923075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert); 933075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert) 943075c896SRyan Stone { 953075c896SRyan Stone nvlist_t *nvl; 963075c896SRyan Stone void *it; 973075c896SRyan Stone const char *key; 983075c896SRyan Stone int type; 993075c896SRyan Stone 1003075c896SRyan Stone key = "name"; 1013075c896SRyan Stone nvl = nvlist_create(0); 1023075c896SRyan Stone 1033075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 1043075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 1053075c896SRyan Stone 1063075c896SRyan Stone nvlist_add_bool(nvl, key, true); 1073075c896SRyan Stone 1083075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 1093075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 110*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "name")); 1113075c896SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, key)); 112*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_bool(nvl, "name")); 1133075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true); 1143075c896SRyan Stone 1153075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 1163075c896SRyan Stone it = NULL; 1173075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 1183075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BOOL); 119bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 1203075c896SRyan Stone 1213075c896SRyan Stone nvlist_destroy(nvl); 1223075c896SRyan Stone } 1233075c896SRyan Stone 1243075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert); 1253075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert) 1263075c896SRyan Stone { 1273075c896SRyan Stone nvlist_t *nvl; 1283075c896SRyan Stone void *it; 1293075c896SRyan Stone const char *key; 1303075c896SRyan Stone uint64_t value; 1313075c896SRyan Stone int type; 1323075c896SRyan Stone 1333075c896SRyan Stone key = "foo123"; 1343075c896SRyan Stone value = 71965; 1353075c896SRyan Stone nvl = nvlist_create(0); 1363075c896SRyan Stone 1373075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 1383075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 1393075c896SRyan Stone 1403075c896SRyan Stone nvlist_add_number(nvl, key, value); 1413075c896SRyan Stone 1423075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 1433075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 144*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "foo123")); 1453075c896SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, key)); 1463075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value); 1473075c896SRyan Stone 1483075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 1493075c896SRyan Stone it = NULL; 1503075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 1513075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 152bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 1533075c896SRyan Stone 1543075c896SRyan Stone nvlist_destroy(nvl); 1553075c896SRyan Stone } 1563075c896SRyan Stone 1573075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert); 1583075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert) 1593075c896SRyan Stone { 1603075c896SRyan Stone nvlist_t *nvl; 1613075c896SRyan Stone void *it; 1623075c896SRyan Stone const char *key; 1633075c896SRyan Stone const char *value; 1643075c896SRyan Stone int type; 1653075c896SRyan Stone 1663075c896SRyan Stone key = "test"; 1673075c896SRyan Stone value = "fgjdkgjdk"; 1683075c896SRyan Stone nvl = nvlist_create(0); 1693075c896SRyan Stone 1703075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 1713075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 1723075c896SRyan Stone 1733075c896SRyan Stone nvlist_add_string(nvl, key, value); 1743075c896SRyan Stone 1753075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 1763075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 177*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "test")); 1783075c896SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, key)); 179*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_string(nvl, "test")); 1803075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, 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); 189bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(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)); 217*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "test")); 2183075c896SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, key)); 219*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_nvlist(nvl, "test")); 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 /* Iterate over the nvlist; ensure that it has only our one key. */ 2283075c896SRyan Stone it = NULL; 2293075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 2303075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 231bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 2323075c896SRyan Stone 2333075c896SRyan Stone nvlist_destroy(sublist); 2343075c896SRyan Stone nvlist_destroy(nvl); 2353075c896SRyan Stone } 2363075c896SRyan Stone 23719a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error); 23819a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error) 23919a4afb3SRyan Stone { 24019a4afb3SRyan Stone nvlist_t *nvl, *parent; 24119a4afb3SRyan Stone 24219a4afb3SRyan Stone nvl = nvlist_create(0); 24319a4afb3SRyan Stone parent = nvlist_create(0); 24419a4afb3SRyan Stone 24519a4afb3SRyan Stone nvlist_set_error(nvl, EBADF); 24619a4afb3SRyan Stone nvlist_add_nvlist(parent, "test", nvl); 24719a4afb3SRyan Stone ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 24819a4afb3SRyan Stone 24919a4afb3SRyan Stone nvlist_destroy(nvl); 25019a4afb3SRyan Stone nvlist_destroy(parent); 25119a4afb3SRyan Stone } 25219a4afb3SRyan Stone 2533075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert); 2543075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert) 2553075c896SRyan Stone { 2563075c896SRyan Stone nvlist_t *nvl; 2573075c896SRyan Stone void *it; 2583075c896SRyan Stone const char *key; 2593075c896SRyan Stone void *value; 2603075c896SRyan Stone const void *ret_value; 2613075c896SRyan Stone size_t value_size, ret_size; 2623075c896SRyan Stone int type; 2633075c896SRyan Stone 2643075c896SRyan Stone key = "binary"; 2653075c896SRyan Stone value_size = 13; 2663075c896SRyan Stone value = malloc(value_size); 2673075c896SRyan Stone memset(value, 0xa5, value_size); 2683075c896SRyan Stone nvl = nvlist_create(0); 2693075c896SRyan Stone 2703075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 2713075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 2723075c896SRyan Stone 2733075c896SRyan Stone nvlist_add_binary(nvl, key, value, value_size); 2743075c896SRyan Stone 2753075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 2763075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 277*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "binary")); 2783075c896SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, key)); 279*37c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_binary(nvl, "binary")); 2803075c896SRyan Stone 2813075c896SRyan Stone ret_value = nvlist_get_binary(nvl, key, &ret_size); 2823075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 2833075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 2843075c896SRyan Stone 2853075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 2863075c896SRyan Stone ATF_REQUIRE(value != ret_value); 2873075c896SRyan Stone 2883075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 2893075c896SRyan Stone it = NULL; 2903075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 2913075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 292bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 2933075c896SRyan Stone 2943075c896SRyan Stone nvlist_destroy(nvl); 2953075c896SRyan Stone free(value); 2963075c896SRyan Stone } 2973075c896SRyan Stone 2986e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist); 2996e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist) 3006e623ffdSRyan Stone { 3016e623ffdSRyan Stone nvlist_t *nvl, *clone; 3026e623ffdSRyan Stone 3036e623ffdSRyan Stone nvl = nvlist_create(0); 3046e623ffdSRyan Stone ATF_REQUIRE(nvl != NULL); 3056e623ffdSRyan Stone 3066e623ffdSRyan Stone clone = nvlist_clone(nvl); 3076e623ffdSRyan Stone ATF_REQUIRE(clone != NULL); 3086e623ffdSRyan Stone ATF_REQUIRE(clone != nvl); 3096e623ffdSRyan Stone ATF_REQUIRE(nvlist_empty(clone)); 3106e623ffdSRyan Stone 3116e623ffdSRyan Stone nvlist_destroy(clone); 3126e623ffdSRyan Stone nvlist_destroy(nvl); 3136e623ffdSRyan Stone } 3146e623ffdSRyan Stone 3156e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist); 3166e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist) 3176e623ffdSRyan Stone { 3186e623ffdSRyan Stone nvlist_t *nvl, *clone; 3196e623ffdSRyan Stone const char *key; 3206e623ffdSRyan Stone void *it; 3216e623ffdSRyan Stone uint64_t value; 3226e623ffdSRyan Stone int type; 3236e623ffdSRyan Stone 3246e623ffdSRyan Stone nvl = nvlist_create(0); 3256e623ffdSRyan Stone ATF_REQUIRE(nvl != NULL); 3266e623ffdSRyan Stone 3276e623ffdSRyan Stone key = "testkey"; 3286e623ffdSRyan Stone value = 684874; 3296e623ffdSRyan Stone nvlist_add_number(nvl, key, value); 3306e623ffdSRyan Stone 3316e623ffdSRyan Stone clone = nvlist_clone(nvl); 3326e623ffdSRyan Stone ATF_REQUIRE(clone != NULL); 3336e623ffdSRyan Stone ATF_REQUIRE(clone != nvl); 3346e623ffdSRyan Stone ATF_REQUIRE(nvlist_exists_number(clone, key)); 3356e623ffdSRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value); 3366e623ffdSRyan Stone 3376e623ffdSRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 3386e623ffdSRyan Stone it = NULL; 3396e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0); 3406e623ffdSRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 341bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL)); 3426e623ffdSRyan Stone 3436e623ffdSRyan Stone nvlist_destroy(clone); 3446e623ffdSRyan Stone nvlist_destroy(nvl); 3456e623ffdSRyan Stone } 3466e623ffdSRyan Stone 3476e623ffdSRyan Stone static const char * const test_subnvlist_key = "nvlist"; 3486e623ffdSRyan Stone 3496e623ffdSRyan Stone static const char * const test_string_key = "string"; 3506e623ffdSRyan Stone static const char * const test_string_val = "59525"; 3516e623ffdSRyan Stone 3526e623ffdSRyan Stone static nvlist_t* 3536e623ffdSRyan Stone create_test_nvlist(void) 3546e623ffdSRyan Stone { 3556e623ffdSRyan Stone nvlist_t *nvl, *sublist; 3566e623ffdSRyan Stone 3576e623ffdSRyan Stone nvl = nvlist_create(0); 3586e623ffdSRyan Stone ATF_REQUIRE(nvl != NULL); 3596e623ffdSRyan Stone 3606e623ffdSRyan Stone sublist = nvlist_create(0); 3616e623ffdSRyan Stone ATF_REQUIRE(sublist != NULL); 3626e623ffdSRyan Stone 3636e623ffdSRyan Stone nvlist_add_string(sublist, test_string_key, test_string_val); 3646e623ffdSRyan Stone nvlist_move_nvlist(nvl, test_subnvlist_key, sublist); 3656e623ffdSRyan Stone 3666e623ffdSRyan Stone return (nvl); 3676e623ffdSRyan Stone } 3686e623ffdSRyan Stone 3696e623ffdSRyan Stone static void 3706e623ffdSRyan Stone verify_test_nvlist(const nvlist_t *nvl) 3716e623ffdSRyan Stone { 3726e623ffdSRyan Stone void *it; 3736e623ffdSRyan Stone const nvlist_t *value; 3746e623ffdSRyan Stone int type; 3756e623ffdSRyan Stone 3766e623ffdSRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key)); 3776e623ffdSRyan Stone 3786e623ffdSRyan Stone value = nvlist_get_nvlist(nvl, test_subnvlist_key); 3796e623ffdSRyan Stone 3806e623ffdSRyan Stone ATF_REQUIRE(nvlist_exists_string(value, test_string_key)); 3816e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0); 3826e623ffdSRyan Stone ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val); 3836e623ffdSRyan Stone 3846e623ffdSRyan Stone /* Iterate over both nvlists; ensure that each has only the one key. */ 3856e623ffdSRyan Stone it = NULL; 3866e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it), 3876e623ffdSRyan Stone test_string_key), 0); 3886e623ffdSRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 389bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL)); 3906e623ffdSRyan Stone 3916e623ffdSRyan Stone it = NULL; 3926e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), 3936e623ffdSRyan Stone test_subnvlist_key), 0); 3946e623ffdSRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 395bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL)); 3966e623ffdSRyan Stone } 3976e623ffdSRyan Stone 3986e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist); 3996e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist) 4006e623ffdSRyan Stone { 4016e623ffdSRyan Stone nvlist_t *nvl, *clone; 4026e623ffdSRyan Stone 4036e623ffdSRyan Stone nvl = create_test_nvlist(); 4046e623ffdSRyan Stone clone = nvlist_clone(nvl); 4056e623ffdSRyan Stone 4066e623ffdSRyan Stone ATF_REQUIRE(clone != NULL); 4076e623ffdSRyan Stone ATF_REQUIRE(clone != nvl); 4086e623ffdSRyan Stone verify_test_nvlist(clone); 4096e623ffdSRyan Stone 4106e623ffdSRyan Stone nvlist_destroy(clone); 4116e623ffdSRyan Stone nvlist_destroy(nvl); 4126e623ffdSRyan Stone } 4136e623ffdSRyan Stone 414a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist); 415a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist) 416a87e5162SRyan Stone { 417a87e5162SRyan Stone nvlist_t *nvl, *clone; 418a87e5162SRyan Stone 419a87e5162SRyan Stone nvl = nvlist_create(0); 420a87e5162SRyan Stone ATF_REQUIRE(nvl != NULL); 421a87e5162SRyan Stone 422a87e5162SRyan Stone nvlist_set_error(nvl, ENOMEM); 423a87e5162SRyan Stone 424a87e5162SRyan Stone clone = nvlist_clone(nvl); 425a87e5162SRyan Stone ATF_REQUIRE(clone == NULL); 426a87e5162SRyan Stone 427a87e5162SRyan Stone nvlist_destroy(nvl); 428a87e5162SRyan Stone } 429a87e5162SRyan Stone 4306c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist); 4316c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist) 4326c721f82SRyan Stone { 4336c721f82SRyan Stone nvlist_t *nvl, *unpacked; 4346c721f82SRyan Stone void *packed; 4356c721f82SRyan Stone size_t packed_size; 4366c721f82SRyan Stone 4376c721f82SRyan Stone nvl = nvlist_create(0); 4386c721f82SRyan Stone ATF_REQUIRE(nvl != NULL); 4396c721f82SRyan Stone 4406c721f82SRyan Stone packed = nvlist_pack(nvl, &packed_size); 4416c721f82SRyan Stone ATF_REQUIRE(packed != NULL); 4426c721f82SRyan Stone 4436c721f82SRyan Stone unpacked = nvlist_unpack(packed, packed_size); 4446c721f82SRyan Stone ATF_REQUIRE(unpacked != NULL); 4456c721f82SRyan Stone ATF_REQUIRE(unpacked != nvl); 4466c721f82SRyan Stone ATF_REQUIRE(nvlist_empty(unpacked)); 4476c721f82SRyan Stone 4486c721f82SRyan Stone nvlist_destroy(unpacked); 4496c721f82SRyan Stone nvlist_destroy(nvl); 4506c721f82SRyan Stone free(packed); 4516c721f82SRyan Stone } 4526c721f82SRyan Stone 4536c721f82SRyan Stone static void 4546c721f82SRyan Stone verify_null(const nvlist_t *nvl, int type) 4556c721f82SRyan Stone { 4566c721f82SRyan Stone 4576c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 4586c721f82SRyan Stone } 4596c721f82SRyan Stone 4606c721f82SRyan Stone static void 4616c721f82SRyan Stone verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value) 4626c721f82SRyan Stone { 4636c721f82SRyan Stone 4646c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 4656c721f82SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value); 4666c721f82SRyan Stone } 4676c721f82SRyan Stone 4686c721f82SRyan Stone static void 4696c721f82SRyan Stone verify_string(const nvlist_t *nvl, const char *name, int type, 4706c721f82SRyan Stone const char * value) 4716c721f82SRyan Stone { 4726c721f82SRyan Stone 4736c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 4746c721f82SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0); 4756c721f82SRyan Stone } 4766c721f82SRyan Stone 4776c721f82SRyan Stone static void 4786c721f82SRyan Stone verify_nvlist(const nvlist_t *nvl, const char *name, int type) 4796c721f82SRyan Stone { 4806c721f82SRyan Stone 4816c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 4826c721f82SRyan Stone verify_test_nvlist(nvlist_get_nvlist(nvl, name)); 4836c721f82SRyan Stone } 4846c721f82SRyan Stone 4856c721f82SRyan Stone static void 4866c721f82SRyan Stone verify_binary(const nvlist_t *nvl, const char *name, int type, 4876c721f82SRyan Stone const void * value, size_t size) 4886c721f82SRyan Stone { 4896c721f82SRyan Stone const void *actual_value; 4906c721f82SRyan Stone size_t actual_size; 4916c721f82SRyan Stone 4926c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 4936c721f82SRyan Stone actual_value = nvlist_get_binary(nvl, name, &actual_size); 4946c721f82SRyan Stone ATF_REQUIRE_EQ(size, actual_size); 4956c721f82SRyan Stone ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0); 4966c721f82SRyan Stone } 4976c721f82SRyan Stone 4986c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values); 4996c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__multiple_values) 5006c721f82SRyan Stone { 5016c721f82SRyan Stone std::ostringstream msg; 5026c721f82SRyan Stone std::set<std::string> keys_seen; 5036c721f82SRyan Stone nvlist_t *nvl, *unpacked, *nvvalue; 5046c721f82SRyan Stone const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name; 5056c721f82SRyan Stone int numvalue; 5066c721f82SRyan Stone const char * strvalue; 5076c721f82SRyan Stone void *binvalue, *packed, *it; 5086c721f82SRyan Stone size_t binsize, packed_size; 5096c721f82SRyan Stone int type; 5106c721f82SRyan Stone 5116c721f82SRyan Stone nvl = nvlist_create(0); 5126c721f82SRyan Stone 5136c721f82SRyan Stone nullkey = "null"; 5146c721f82SRyan Stone nvlist_add_null(nvl, nullkey); 5156c721f82SRyan Stone 5166c721f82SRyan Stone numkey = "number"; 5176c721f82SRyan Stone numvalue = 939853984; 5186c721f82SRyan Stone nvlist_add_number(nvl, numkey, numvalue); 5196c721f82SRyan Stone 5206c721f82SRyan Stone strkey = "string"; 5216c721f82SRyan Stone strvalue = "jfieutijf"; 5226c721f82SRyan Stone nvlist_add_string(nvl, strkey, strvalue); 5236c721f82SRyan Stone 5246c721f82SRyan Stone nvkey = "nvlist"; 5256c721f82SRyan Stone nvvalue = create_test_nvlist(); 5266c721f82SRyan Stone nvlist_move_nvlist(nvl, nvkey, nvvalue); 5276c721f82SRyan Stone 5286c721f82SRyan Stone binkey = "binary"; 5296c721f82SRyan Stone binsize = 4; 5306c721f82SRyan Stone binvalue = malloc(binsize); 5316c721f82SRyan Stone memset(binvalue, 'b', binsize); 5326c721f82SRyan Stone nvlist_move_binary(nvl, binkey, binvalue, binsize); 5336c721f82SRyan Stone 5346c721f82SRyan Stone packed = nvlist_pack(nvl, &packed_size); 5356c721f82SRyan Stone ATF_REQUIRE(packed != NULL); 5366c721f82SRyan Stone 5376c721f82SRyan Stone unpacked = nvlist_unpack(packed, packed_size); 5386c721f82SRyan Stone ATF_REQUIRE(unpacked != 0); 5396c721f82SRyan Stone 5406c721f82SRyan Stone it = NULL; 5416c721f82SRyan Stone while ((name = nvlist_next(unpacked, &type, &it)) != NULL) { 5426c721f82SRyan Stone /* Ensure that we see every key only once. */ 5436c721f82SRyan Stone ATF_REQUIRE_EQ(keys_seen.count(name), 0); 5446c721f82SRyan Stone 5456c721f82SRyan Stone if (strcmp(name, nullkey) == 0) 5466c721f82SRyan Stone verify_null(unpacked, type); 5476c721f82SRyan Stone else if (strcmp(name, numkey) == 0) 5486c721f82SRyan Stone verify_number(unpacked, name, type, numvalue); 5496c721f82SRyan Stone else if (strcmp(name, strkey) == 0) 5506c721f82SRyan Stone verify_string(unpacked, name, type, strvalue); 5516c721f82SRyan Stone else if (strcmp(name, nvkey) == 0) 5526c721f82SRyan Stone verify_nvlist(unpacked, name, type); 5536c721f82SRyan Stone else if (strcmp(name, binkey) == 0) 5546c721f82SRyan Stone verify_binary(unpacked, name, type, binvalue, binsize); 5556c721f82SRyan Stone else { 5566c721f82SRyan Stone msg << "Unexpected key :'" << name << "'"; 5576c721f82SRyan Stone ATF_FAIL(msg.str().c_str()); 5586c721f82SRyan Stone } 5596c721f82SRyan Stone 5606c721f82SRyan Stone keys_seen.insert(name); 5616c721f82SRyan Stone } 5626c721f82SRyan Stone 5636c721f82SRyan Stone /* Ensure that we saw every key. */ 5646c721f82SRyan Stone ATF_REQUIRE_EQ(keys_seen.size(), 5); 5656c721f82SRyan Stone 5666c721f82SRyan Stone nvlist_destroy(nvl); 5676c721f82SRyan Stone nvlist_destroy(unpacked); 5686c721f82SRyan Stone free(packed); 5696c721f82SRyan Stone } 5706c721f82SRyan Stone 571a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist); 572a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist) 573a87e5162SRyan Stone { 574a87e5162SRyan Stone nvlist_t *nvl; 575a87e5162SRyan Stone void *packed; 576a87e5162SRyan Stone size_t size; 577a87e5162SRyan Stone 578a87e5162SRyan Stone nvl = nvlist_create(0); 579a87e5162SRyan Stone ATF_REQUIRE(nvl != NULL); 580a87e5162SRyan Stone 581a87e5162SRyan Stone nvlist_set_error(nvl, ENOMEM); 582a87e5162SRyan Stone 583a87e5162SRyan Stone packed = nvlist_pack(nvl, &size); 584a87e5162SRyan Stone ATF_REQUIRE(packed == NULL); 585a87e5162SRyan Stone 586a87e5162SRyan Stone nvlist_destroy(nvl); 587a87e5162SRyan Stone } 588a87e5162SRyan Stone 5896c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key); 5906c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key) 5916c721f82SRyan Stone { 5926c721f82SRyan Stone nvlist_t *nvl, *unpacked; 5936c721f82SRyan Stone const char *key1, *key2; 5946c721f82SRyan Stone void *packed, *keypos; 5956c721f82SRyan Stone size_t size, keylen; 5966c721f82SRyan Stone 5976c721f82SRyan Stone nvl = nvlist_create(0); 5986c721f82SRyan Stone 5996c721f82SRyan Stone key1 = "key1"; 6006c721f82SRyan Stone keylen = strlen(key1); 6016c721f82SRyan Stone nvlist_add_number(nvl, key1, 5); 6026c721f82SRyan Stone 6036c721f82SRyan Stone key2 = "key2"; 6046c721f82SRyan Stone ATF_REQUIRE_EQ(keylen, strlen(key2)); 6056c721f82SRyan Stone nvlist_add_number(nvl, key2, 10); 6066c721f82SRyan Stone 6076c721f82SRyan Stone packed = nvlist_pack(nvl, &size); 6086c721f82SRyan Stone 6096c721f82SRyan Stone /* 6106c721f82SRyan Stone * Mangle the packed nvlist by replacing key1 with key2, creating a 6116c721f82SRyan Stone * packed nvlist with a duplicate key. 6126c721f82SRyan Stone */ 6136c721f82SRyan Stone keypos = memmem(packed, size, key1, keylen); 6146c721f82SRyan Stone ATF_REQUIRE(keypos != NULL); 6156c721f82SRyan Stone memcpy(keypos, key2, keylen); 6166c721f82SRyan Stone 6176c721f82SRyan Stone unpacked = nvlist_unpack(packed, size); 6186c721f82SRyan Stone ATF_REQUIRE(nvlist_error(unpacked) != 0); 6196c721f82SRyan Stone 6206c721f82SRyan Stone free(packed); 6216c721f82SRyan Stone nvlist_destroy(nvl); 6226c721f82SRyan Stone nvlist_destroy(unpacked); 6236c721f82SRyan Stone } 6246c721f82SRyan Stone 62571637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert); 62671637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_string__single_insert) 62771637d76SRyan Stone { 62871637d76SRyan Stone nvlist_t *nvl; 62971637d76SRyan Stone const char *key; 63071637d76SRyan Stone char *value; 63171637d76SRyan Stone 63271637d76SRyan Stone nvl = nvlist_create(0); 63371637d76SRyan Stone ATF_REQUIRE(nvl != NULL); 63471637d76SRyan Stone 63571637d76SRyan Stone key = "testkey"; 63671637d76SRyan Stone value = strdup("testval"); 63771637d76SRyan Stone ATF_REQUIRE(value != NULL); 63871637d76SRyan Stone 63971637d76SRyan Stone nvlist_move_string(nvl, key, value); 64071637d76SRyan Stone ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value); 64171637d76SRyan Stone 64271637d76SRyan Stone nvlist_destroy(nvl); 64371637d76SRyan Stone } 64471637d76SRyan Stone 64571637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child); 64671637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child) 64771637d76SRyan Stone { 64871637d76SRyan Stone nvlist_t *parent; 64971637d76SRyan Stone 65071637d76SRyan Stone parent = nvlist_create(0); 65171637d76SRyan Stone 65271637d76SRyan Stone nvlist_move_nvlist(parent, "test", NULL); 65371637d76SRyan Stone 65471637d76SRyan Stone ATF_REQUIRE(nvlist_error(parent) != 0); 65571637d76SRyan Stone 65671637d76SRyan Stone nvlist_destroy(parent); 65771637d76SRyan Stone } 65871637d76SRyan Stone 65919a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error); 66019a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error) 66119a4afb3SRyan Stone { 66219a4afb3SRyan Stone nvlist_t *nvl, *parent; 66319a4afb3SRyan Stone 66419a4afb3SRyan Stone nvl = nvlist_create(0); 66519a4afb3SRyan Stone parent = nvlist_create(0); 66619a4afb3SRyan Stone 66719a4afb3SRyan Stone nvlist_set_error(nvl, EBADF); 66819a4afb3SRyan Stone nvlist_move_nvlist(parent, "test", nvl); 66919a4afb3SRyan Stone ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 67019a4afb3SRyan Stone 67119a4afb3SRyan Stone nvlist_destroy(parent); 67219a4afb3SRyan Stone } 67319a4afb3SRyan Stone 67471637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert); 67571637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert) 67671637d76SRyan Stone { 67771637d76SRyan Stone nvlist_t *nvl; 67871637d76SRyan Stone const char *key; 67971637d76SRyan Stone nvlist_t *value; 68071637d76SRyan Stone 68171637d76SRyan Stone nvl = nvlist_create(0); 68271637d76SRyan Stone ATF_REQUIRE(nvl != NULL); 68371637d76SRyan Stone 68471637d76SRyan Stone key = "testkey"; 68571637d76SRyan Stone value = nvlist_create(0); 68671637d76SRyan Stone ATF_REQUIRE(value != NULL); 68771637d76SRyan Stone 68871637d76SRyan Stone nvlist_move_nvlist(nvl, key, value); 68971637d76SRyan Stone ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value); 69071637d76SRyan Stone 69171637d76SRyan Stone nvlist_destroy(nvl); 69271637d76SRyan Stone } 69371637d76SRyan Stone 69471637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert); 69571637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert) 69671637d76SRyan Stone { 69771637d76SRyan Stone nvlist_t *nvl; 69871637d76SRyan Stone const char *key; 69971637d76SRyan Stone void *value; 70071637d76SRyan Stone size_t size, actual_size; 70171637d76SRyan Stone 70271637d76SRyan Stone nvl = nvlist_create(0); 70371637d76SRyan Stone ATF_REQUIRE(nvl != NULL); 70471637d76SRyan Stone 70571637d76SRyan Stone key = "testkey"; 70671637d76SRyan Stone size = 73; 70771637d76SRyan Stone value = malloc(size); 70871637d76SRyan Stone ATF_REQUIRE(value != NULL); 70971637d76SRyan Stone 71071637d76SRyan Stone nvlist_move_binary(nvl, key, value, size); 71171637d76SRyan Stone ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value); 71271637d76SRyan Stone ATF_REQUIRE_EQ(size, actual_size); 71371637d76SRyan Stone 71471637d76SRyan Stone nvlist_destroy(nvl); 71571637d76SRyan Stone } 71671637d76SRyan Stone 717fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove); 718fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove) 719fad0a264SRyan Stone { 720fad0a264SRyan Stone nvlist_t *nvl; 721fad0a264SRyan Stone const char *testkey; 722fad0a264SRyan Stone bool testval; 723fad0a264SRyan Stone 724fad0a264SRyan Stone nvl = nvlist_create(0); 725fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 726fad0a264SRyan Stone 727fad0a264SRyan Stone testkey = "boolkey"; 728fad0a264SRyan Stone testval = false; 729fad0a264SRyan Stone nvlist_add_bool(nvl, testkey, testval); 730fad0a264SRyan Stone 731fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 732fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 733fad0a264SRyan Stone 734fad0a264SRyan Stone nvlist_destroy(nvl); 735fad0a264SRyan Stone } 736fad0a264SRyan Stone 737fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged); 738fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged) 739fad0a264SRyan Stone { 740fad0a264SRyan Stone nvlist_t *nvl; 741fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 742fad0a264SRyan Stone bool testval, otherval1; 743fad0a264SRyan Stone nvlist_t *otherval2; 744fad0a264SRyan Stone 745fad0a264SRyan Stone nvl = nvlist_create(0); 746fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 747fad0a264SRyan Stone 748fad0a264SRyan Stone testkey = "boolkey"; 749fad0a264SRyan Stone testval = true; 750fad0a264SRyan Stone nvlist_add_bool(nvl, testkey, testval); 751fad0a264SRyan Stone 752fad0a264SRyan Stone otherkey1 = "key1"; 753fad0a264SRyan Stone otherval1 = false; 754fad0a264SRyan Stone nvlist_add_bool(nvl, otherkey1, otherval1); 755fad0a264SRyan Stone 756fad0a264SRyan Stone otherkey2 = "key2"; 757fad0a264SRyan Stone otherval2 = create_test_nvlist(); 758fad0a264SRyan Stone nvlist_move_nvlist(nvl, otherkey2, otherval2); 759fad0a264SRyan Stone 760fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 761fad0a264SRyan Stone 762fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1)); 763fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1); 764fad0a264SRyan Stone 765fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2)); 766fad0a264SRyan Stone verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2)); 767fad0a264SRyan Stone 768fad0a264SRyan Stone nvlist_destroy(nvl); 769fad0a264SRyan Stone } 770fad0a264SRyan Stone 771fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove); 772fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__single_remove) 773fad0a264SRyan Stone { 774fad0a264SRyan Stone nvlist_t *nvl; 775fad0a264SRyan Stone const char *testkey; 776fad0a264SRyan Stone uint64_t testval; 777fad0a264SRyan Stone 778fad0a264SRyan Stone nvl = nvlist_create(0); 779fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 780fad0a264SRyan Stone 781fad0a264SRyan Stone testkey = "numkey"; 782fad0a264SRyan Stone testval = std::numeric_limits<uint64_t>::max(); 783fad0a264SRyan Stone nvlist_add_number(nvl, testkey, testval); 784fad0a264SRyan Stone 785fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 786fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 787fad0a264SRyan Stone 788fad0a264SRyan Stone nvlist_destroy(nvl); 789fad0a264SRyan Stone } 790fad0a264SRyan Stone 791fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged); 792fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged) 793fad0a264SRyan Stone { 794fad0a264SRyan Stone nvlist_t *nvl; 795fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 796fad0a264SRyan Stone uint64_t testval, otherval1; 797fad0a264SRyan Stone const char *otherval2; 798fad0a264SRyan Stone 799fad0a264SRyan Stone nvl = nvlist_create(0); 800fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 801fad0a264SRyan Stone 802fad0a264SRyan Stone otherkey1 = "key1"; 803fad0a264SRyan Stone otherval1 = 5; 804fad0a264SRyan Stone nvlist_add_number(nvl, otherkey1, otherval1); 805fad0a264SRyan Stone 806fad0a264SRyan Stone testkey = "numkey"; 807fad0a264SRyan Stone testval = 1654; 808fad0a264SRyan Stone nvlist_add_number(nvl, testkey, testval); 809fad0a264SRyan Stone 810fad0a264SRyan Stone otherkey2 = "key2"; 811fad0a264SRyan Stone otherval2 = "string"; 812fad0a264SRyan Stone nvlist_add_string(nvl, otherkey2, otherval2); 813fad0a264SRyan Stone 814fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 815fad0a264SRyan Stone 816fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1)); 817fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1); 818fad0a264SRyan Stone 819fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2)); 820fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0); 821fad0a264SRyan Stone 822fad0a264SRyan Stone nvlist_destroy(nvl); 823fad0a264SRyan Stone } 824fad0a264SRyan Stone 825fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove); 826fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__single_remove) 827fad0a264SRyan Stone { 828fad0a264SRyan Stone nvlist_t *nvl; 829fad0a264SRyan Stone const char *testkey; 830fad0a264SRyan Stone const char *testval; 831fad0a264SRyan Stone 832fad0a264SRyan Stone nvl = nvlist_create(0); 833fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 834fad0a264SRyan Stone 835fad0a264SRyan Stone testkey = "numkey"; 836fad0a264SRyan Stone testval = "nvlist"; 837fad0a264SRyan Stone nvlist_add_string(nvl, testkey, testval); 838fad0a264SRyan Stone 839fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 840fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 841fad0a264SRyan Stone 842fad0a264SRyan Stone nvlist_destroy(nvl); 843fad0a264SRyan Stone } 844fad0a264SRyan Stone 845fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged); 846fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged) 847fad0a264SRyan Stone { 848fad0a264SRyan Stone nvlist_t *nvl; 849fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 850fad0a264SRyan Stone const char *testval, *otherval1; 851fad0a264SRyan Stone bool otherval2; 852fad0a264SRyan Stone 853fad0a264SRyan Stone nvl = nvlist_create(0); 854fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 855fad0a264SRyan Stone 856fad0a264SRyan Stone otherkey1 = "key1"; 857fad0a264SRyan Stone otherval1 = "fjdifjdk"; 858fad0a264SRyan Stone nvlist_add_string(nvl, otherkey1, otherval1); 859fad0a264SRyan Stone 860fad0a264SRyan Stone otherkey2 = "key2"; 861fad0a264SRyan Stone otherval2 = true; 862fad0a264SRyan Stone nvlist_add_bool(nvl, otherkey2, otherval2); 863fad0a264SRyan Stone 864fad0a264SRyan Stone testkey = "strkey"; 865fad0a264SRyan Stone testval = "1654"; 866fad0a264SRyan Stone nvlist_add_string(nvl, testkey, testval); 867fad0a264SRyan Stone 868fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 869fad0a264SRyan Stone 870fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1)); 871fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0); 872fad0a264SRyan Stone 873fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 874fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 875fad0a264SRyan Stone 876fad0a264SRyan Stone nvlist_destroy(nvl); 877fad0a264SRyan Stone } 878fad0a264SRyan Stone 879fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove); 880fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove) 881fad0a264SRyan Stone { 882fad0a264SRyan Stone nvlist_t *nvl; 883fad0a264SRyan Stone const char *testkey; 884fad0a264SRyan Stone nvlist_t *testval; 885fad0a264SRyan Stone 886fad0a264SRyan Stone nvl = nvlist_create(0); 887fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 888fad0a264SRyan Stone 889fad0a264SRyan Stone testkey = "numkey"; 890fad0a264SRyan Stone testval = create_test_nvlist(); 891fad0a264SRyan Stone nvlist_move_nvlist(nvl, testkey, testval); 892fad0a264SRyan Stone 893fad0a264SRyan Stone verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 894fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 895fad0a264SRyan Stone 896fad0a264SRyan Stone nvlist_destroy(nvl); 897fad0a264SRyan Stone } 898fad0a264SRyan Stone 899fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged); 900fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged) 901fad0a264SRyan Stone { 902fad0a264SRyan Stone nvlist_t *nvl; 903fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 904fad0a264SRyan Stone nvlist_t *testval, *otherval1; 905fad0a264SRyan Stone 906fad0a264SRyan Stone nvl = nvlist_create(0); 907fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 908fad0a264SRyan Stone 909fad0a264SRyan Stone testkey = "strkey"; 910fad0a264SRyan Stone testval = create_test_nvlist(); 911fad0a264SRyan Stone nvlist_move_nvlist(nvl, testkey, testval); 912fad0a264SRyan Stone 913fad0a264SRyan Stone otherkey1 = "key1"; 914fad0a264SRyan Stone otherval1 = nvlist_create(0); 915fad0a264SRyan Stone nvlist_move_nvlist(nvl, otherkey1, otherval1); 916fad0a264SRyan Stone 917fad0a264SRyan Stone otherkey2 = "key2"; 918fad0a264SRyan Stone nvlist_add_null(nvl, otherkey2); 919fad0a264SRyan Stone 920fad0a264SRyan Stone verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 921fad0a264SRyan Stone 922fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1)); 923fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1))); 924fad0a264SRyan Stone 925fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2)); 926fad0a264SRyan Stone 927fad0a264SRyan Stone nvlist_destroy(nvl); 928fad0a264SRyan Stone } 929fad0a264SRyan Stone 930fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove); 931fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove) 932fad0a264SRyan Stone { 933fad0a264SRyan Stone nvlist_t *nvl; 934fad0a264SRyan Stone const char *testkey; 935fad0a264SRyan Stone void *testval; 936fad0a264SRyan Stone const void *actual_val; 937fad0a264SRyan Stone size_t testsize, actual_size; 938fad0a264SRyan Stone 939fad0a264SRyan Stone nvl = nvlist_create(0); 940fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 941fad0a264SRyan Stone 942fad0a264SRyan Stone testkey = "numkey"; 943fad0a264SRyan Stone testsize = 457; 944fad0a264SRyan Stone testval = malloc(testsize); 945fad0a264SRyan Stone memset(testval, '5', testsize); 946fad0a264SRyan Stone nvlist_move_binary(nvl, testkey, testval, testsize); 947fad0a264SRyan Stone 948fad0a264SRyan Stone actual_val = nvlist_take_binary(nvl, testkey, &actual_size); 949fad0a264SRyan Stone ATF_REQUIRE_EQ(testsize, actual_size); 950fad0a264SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0); 951fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 952fad0a264SRyan Stone 953fad0a264SRyan Stone nvlist_destroy(nvl); 954fad0a264SRyan Stone } 955fad0a264SRyan Stone 956fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged); 957fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged) 958fad0a264SRyan Stone { 959fad0a264SRyan Stone nvlist_t *nvl; 960fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 961fad0a264SRyan Stone const void *actual_value; 962fad0a264SRyan Stone char testval[] = "gjiertj"; 963fad0a264SRyan Stone char otherval1[] = "fdreg"; 964fad0a264SRyan Stone size_t testsize, othersize, actual_size; 965fad0a264SRyan Stone bool otherval2; 966fad0a264SRyan Stone 967fad0a264SRyan Stone nvl = nvlist_create(0); 968fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 969fad0a264SRyan Stone 970fad0a264SRyan Stone otherkey1 = "key1"; 971fad0a264SRyan Stone othersize = sizeof(otherval1); 972fad0a264SRyan Stone nvlist_add_binary(nvl, otherkey1, otherval1, othersize); 973fad0a264SRyan Stone 974fad0a264SRyan Stone otherkey2 = "key2"; 975fad0a264SRyan Stone otherval2 = true; 976fad0a264SRyan Stone nvlist_add_bool(nvl, otherkey2, otherval2); 977fad0a264SRyan Stone 978fad0a264SRyan Stone testkey = "strkey"; 979fad0a264SRyan Stone testsize = sizeof(testval); 980fad0a264SRyan Stone nvlist_add_binary(nvl, testkey, testval, testsize); 981fad0a264SRyan Stone 982fad0a264SRyan Stone actual_value = nvlist_take_binary(nvl, testkey, &actual_size); 983fad0a264SRyan Stone ATF_REQUIRE_EQ(testsize, actual_size); 984fad0a264SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0); 985fad0a264SRyan Stone 986fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1)); 987fad0a264SRyan Stone actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size); 988fad0a264SRyan Stone ATF_REQUIRE_EQ(othersize, actual_size); 989fad0a264SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0); 990fad0a264SRyan Stone 991fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 992fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 993fad0a264SRyan Stone 994fad0a264SRyan Stone nvlist_destroy(nvl); 995fad0a264SRyan Stone } 996fad0a264SRyan Stone 997339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null); 998339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_null) 999339bcfc7SRyan Stone { 1000339bcfc7SRyan Stone nvlist_t *nvl; 1001339bcfc7SRyan Stone const char *key; 1002339bcfc7SRyan Stone 1003339bcfc7SRyan Stone nvl = nvlist_create(0); 1004339bcfc7SRyan Stone key = "test"; 1005339bcfc7SRyan Stone nvlist_add_null(nvl, key); 1006339bcfc7SRyan Stone 1007339bcfc7SRyan Stone nvlist_free(nvl, key); 1008339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1009339bcfc7SRyan Stone 1010339bcfc7SRyan Stone nvlist_destroy(nvl); 1011339bcfc7SRyan Stone } 1012339bcfc7SRyan Stone 1013339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool); 1014339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_bool) 1015339bcfc7SRyan Stone { 1016339bcfc7SRyan Stone nvlist_t *nvl; 1017339bcfc7SRyan Stone const char *key; 1018339bcfc7SRyan Stone 1019339bcfc7SRyan Stone nvl = nvlist_create(0); 1020339bcfc7SRyan Stone key = "test"; 1021339bcfc7SRyan Stone nvlist_add_bool(nvl, key, true); 1022339bcfc7SRyan Stone 1023339bcfc7SRyan Stone nvlist_free(nvl, key); 1024339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1025339bcfc7SRyan Stone 1026339bcfc7SRyan Stone nvlist_destroy(nvl); 1027339bcfc7SRyan Stone } 1028339bcfc7SRyan Stone 1029339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number); 1030339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_number) 1031339bcfc7SRyan Stone { 1032339bcfc7SRyan Stone nvlist_t *nvl; 1033339bcfc7SRyan Stone const char *key; 1034339bcfc7SRyan Stone 1035339bcfc7SRyan Stone nvl = nvlist_create(0); 1036339bcfc7SRyan Stone key = "test"; 1037339bcfc7SRyan Stone nvlist_add_number(nvl, key, 584); 1038339bcfc7SRyan Stone 1039339bcfc7SRyan Stone nvlist_free(nvl, key); 1040339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1041339bcfc7SRyan Stone 1042339bcfc7SRyan Stone nvlist_destroy(nvl); 1043339bcfc7SRyan Stone } 1044339bcfc7SRyan Stone 1045339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string); 1046339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_string) 1047339bcfc7SRyan Stone { 1048339bcfc7SRyan Stone nvlist_t *nvl; 1049339bcfc7SRyan Stone const char *key; 1050339bcfc7SRyan Stone 1051339bcfc7SRyan Stone nvl = nvlist_create(0); 1052339bcfc7SRyan Stone key = "test"; 1053339bcfc7SRyan Stone nvlist_add_string(nvl, key, "gjkfkjd"); 1054339bcfc7SRyan Stone 1055339bcfc7SRyan Stone nvlist_free(nvl, key); 1056339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1057339bcfc7SRyan Stone 1058339bcfc7SRyan Stone nvlist_destroy(nvl); 1059339bcfc7SRyan Stone } 1060339bcfc7SRyan Stone 1061339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist); 1062339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_nvlist) 1063339bcfc7SRyan Stone { 1064339bcfc7SRyan Stone nvlist_t *nvl; 1065339bcfc7SRyan Stone const char *key; 1066339bcfc7SRyan Stone 1067339bcfc7SRyan Stone nvl = nvlist_create(0); 1068339bcfc7SRyan Stone key = "test"; 1069339bcfc7SRyan Stone nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1070339bcfc7SRyan Stone 1071339bcfc7SRyan Stone nvlist_free(nvl, key); 1072339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1073339bcfc7SRyan Stone 1074339bcfc7SRyan Stone nvlist_destroy(nvl); 1075339bcfc7SRyan Stone } 1076339bcfc7SRyan Stone 1077339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary); 1078339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_binary) 1079339bcfc7SRyan Stone { 1080339bcfc7SRyan Stone nvlist_t *nvl; 1081339bcfc7SRyan Stone const char *key; 1082339bcfc7SRyan Stone 1083339bcfc7SRyan Stone nvl = nvlist_create(0); 1084339bcfc7SRyan Stone key = "test"; 1085339bcfc7SRyan Stone nvlist_add_binary(nvl, key, "jgjgfd", 6); 1086339bcfc7SRyan Stone 1087339bcfc7SRyan Stone nvlist_free(nvl, key); 1088339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1089339bcfc7SRyan Stone 1090339bcfc7SRyan Stone nvlist_destroy(nvl); 1091339bcfc7SRyan Stone } 1092339bcfc7SRyan Stone 1093339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null); 1094339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_null__single_null) 1095339bcfc7SRyan Stone { 1096339bcfc7SRyan Stone nvlist_t *nvl; 1097339bcfc7SRyan Stone const char *key; 1098339bcfc7SRyan Stone 1099339bcfc7SRyan Stone nvl = nvlist_create(0); 1100339bcfc7SRyan Stone key = "test"; 1101339bcfc7SRyan Stone nvlist_add_null(nvl, key); 1102339bcfc7SRyan Stone 1103339bcfc7SRyan Stone nvlist_free_null(nvl, key); 1104339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1105339bcfc7SRyan Stone 1106339bcfc7SRyan Stone nvlist_destroy(nvl); 1107339bcfc7SRyan Stone } 1108339bcfc7SRyan Stone 1109339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool); 1110339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool) 1111339bcfc7SRyan Stone { 1112339bcfc7SRyan Stone nvlist_t *nvl; 1113339bcfc7SRyan Stone const char *key; 1114339bcfc7SRyan Stone 1115339bcfc7SRyan Stone nvl = nvlist_create(0); 1116339bcfc7SRyan Stone key = "test"; 1117339bcfc7SRyan Stone nvlist_add_bool(nvl, key, true); 1118339bcfc7SRyan Stone 1119339bcfc7SRyan Stone nvlist_free_bool(nvl, key); 1120339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1121339bcfc7SRyan Stone 1122339bcfc7SRyan Stone nvlist_destroy(nvl); 1123339bcfc7SRyan Stone } 1124339bcfc7SRyan Stone 1125339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number); 1126339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_number__single_number) 1127339bcfc7SRyan Stone { 1128339bcfc7SRyan Stone nvlist_t *nvl; 1129339bcfc7SRyan Stone const char *key; 1130339bcfc7SRyan Stone 1131339bcfc7SRyan Stone nvl = nvlist_create(0); 1132339bcfc7SRyan Stone key = "test"; 1133339bcfc7SRyan Stone nvlist_add_number(nvl, key, 584); 1134339bcfc7SRyan Stone 1135339bcfc7SRyan Stone nvlist_free_number(nvl, key); 1136339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1137339bcfc7SRyan Stone 1138339bcfc7SRyan Stone nvlist_destroy(nvl); 1139339bcfc7SRyan Stone } 1140339bcfc7SRyan Stone 1141339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string); 1142339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_string__single_string) 1143339bcfc7SRyan Stone { 1144339bcfc7SRyan Stone nvlist_t *nvl; 1145339bcfc7SRyan Stone const char *key; 1146339bcfc7SRyan Stone 1147339bcfc7SRyan Stone nvl = nvlist_create(0); 1148339bcfc7SRyan Stone key = "test"; 1149339bcfc7SRyan Stone nvlist_add_string(nvl, key, "gjkfkjd"); 1150339bcfc7SRyan Stone 1151339bcfc7SRyan Stone nvlist_free_string(nvl, key); 1152339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1153339bcfc7SRyan Stone 1154339bcfc7SRyan Stone nvlist_destroy(nvl); 1155339bcfc7SRyan Stone } 1156339bcfc7SRyan Stone 1157339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist); 1158339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist) 1159339bcfc7SRyan Stone { 1160339bcfc7SRyan Stone nvlist_t *nvl; 1161339bcfc7SRyan Stone const char *key; 1162339bcfc7SRyan Stone 1163339bcfc7SRyan Stone nvl = nvlist_create(0); 1164339bcfc7SRyan Stone key = "test"; 1165339bcfc7SRyan Stone nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1166339bcfc7SRyan Stone 1167339bcfc7SRyan Stone nvlist_free_nvlist(nvl, key); 1168339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1169339bcfc7SRyan Stone 1170339bcfc7SRyan Stone nvlist_destroy(nvl); 1171339bcfc7SRyan Stone } 1172339bcfc7SRyan Stone 1173339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary); 1174339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary) 1175339bcfc7SRyan Stone { 1176339bcfc7SRyan Stone nvlist_t *nvl; 1177339bcfc7SRyan Stone const char *key; 1178339bcfc7SRyan Stone 1179339bcfc7SRyan Stone nvl = nvlist_create(0); 1180339bcfc7SRyan Stone key = "test"; 1181339bcfc7SRyan Stone nvlist_add_binary(nvl, key, "jgjgfd", 6); 1182339bcfc7SRyan Stone 1183339bcfc7SRyan Stone nvlist_free_binary(nvl, key); 1184339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1185339bcfc7SRyan Stone 1186339bcfc7SRyan Stone nvlist_destroy(nvl); 1187339bcfc7SRyan Stone } 1188339bcfc7SRyan Stone 11893075c896SRyan Stone ATF_INIT_TEST_CASES(tp) 11903075c896SRyan Stone { 11913075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty); 11923075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert); 11933075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert); 11943075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert); 11953075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert); 11963075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert); 119719a4afb3SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error); 11983075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert); 11996e623ffdSRyan Stone 12006e623ffdSRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist); 12016e623ffdSRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist); 12026e623ffdSRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist); 1203a87e5162SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist); 12046c721f82SRyan Stone 12056c721f82SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist); 12066c721f82SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values); 1207a87e5162SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist); 12086c721f82SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key); 120971637d76SRyan Stone 121071637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert); 121171637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert); 121271637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child); 121319a4afb3SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error); 121471637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert); 1215fad0a264SRyan Stone 1216fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove); 1217fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged); 1218fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove); 1219fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged); 1220fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove); 1221fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged); 1222fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove); 1223fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged); 1224fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove); 1225fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged); 1226339bcfc7SRyan Stone 1227339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_null); 1228339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool); 1229339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_number); 1230339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_string); 1231339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist); 1232339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary); 1233339bcfc7SRyan Stone 1234339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null); 1235339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool); 1236339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number); 1237339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string); 1238339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist); 1239339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary); 12403075c896SRyan Stone } 1241