13075c896SRyan Stone /*- 23075c896SRyan Stone * Copyright (c) 2014-2015 Sandvine Inc. All rights reserved. 33075c896SRyan Stone * All rights reserved. 43075c896SRyan Stone * 53075c896SRyan Stone * Redistribution and use in source and binary forms, with or without 63075c896SRyan Stone * modification, are permitted provided that the following conditions 73075c896SRyan Stone * are met: 83075c896SRyan Stone * 1. Redistributions of source code must retain the above copyright 93075c896SRyan Stone * notice, this list of conditions and the following disclaimer. 103075c896SRyan Stone * 2. Redistributions in binary form must reproduce the above copyright 113075c896SRyan Stone * notice, this list of conditions and the following disclaimer in the 123075c896SRyan Stone * documentation and/or other materials provided with the distribution. 133075c896SRyan Stone * 143075c896SRyan Stone * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 153075c896SRyan Stone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 163075c896SRyan Stone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 173075c896SRyan Stone * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 183075c896SRyan Stone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 193075c896SRyan Stone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 203075c896SRyan Stone * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 213075c896SRyan Stone * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 223075c896SRyan Stone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 233075c896SRyan Stone * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 243075c896SRyan Stone * SUCH DAMAGE. 253075c896SRyan Stone */ 263075c896SRyan Stone 273075c896SRyan Stone #include <sys/cdefs.h> 283075c896SRyan Stone __FBSDID("$FreeBSD$"); 293075c896SRyan Stone 303075c896SRyan Stone #include <atf-c++.hpp> 313075c896SRyan Stone #include <nv.h> 323075c896SRyan Stone 333075c896SRyan Stone #include <errno.h> 34fad0a264SRyan Stone #include <limits> 356c721f82SRyan Stone #include <set> 366c721f82SRyan Stone #include <sstream> 376c721f82SRyan Stone #include <string> 386c721f82SRyan Stone 393075c896SRyan Stone /* 403075c896SRyan Stone * Test that a newly created nvlist has no errors, and is empty. 413075c896SRyan Stone */ 423075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty); 433075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty) 443075c896SRyan Stone { 453075c896SRyan Stone nvlist_t *nvl; 463075c896SRyan Stone int type; 473075c896SRyan Stone void *it; 483075c896SRyan Stone 493075c896SRyan Stone nvl = nvlist_create(0); 503075c896SRyan Stone 513075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 523075c896SRyan Stone 533075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_error(nvl), 0); 543075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 553075c896SRyan Stone 563075c896SRyan Stone it = NULL; 573075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL); 583075c896SRyan Stone 593075c896SRyan Stone nvlist_destroy(nvl); 603075c896SRyan Stone } 613075c896SRyan Stone 623075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert); 633075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert) 643075c896SRyan Stone { 653075c896SRyan Stone nvlist_t *nvl; 663075c896SRyan Stone void *it; 673075c896SRyan Stone const char *key; 683075c896SRyan Stone int type; 693075c896SRyan Stone 703075c896SRyan Stone key = "key"; 713075c896SRyan Stone nvl = nvlist_create(0); 723075c896SRyan Stone 733075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 743075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 753075c896SRyan Stone 763075c896SRyan Stone nvlist_add_null(nvl, key); 773075c896SRyan Stone 783075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 793075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 803075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 813075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(nvl, key)); 823075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_null(nvl, "key")); 833075c896SRyan Stone 843075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 853075c896SRyan Stone it = NULL; 863075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 873075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 883075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 893075c896SRyan Stone 903075c896SRyan Stone nvlist_destroy(nvl); 913075c896SRyan Stone } 923075c896SRyan Stone 933075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert); 943075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert) 953075c896SRyan Stone { 963075c896SRyan Stone nvlist_t *nvl; 973075c896SRyan Stone void *it; 983075c896SRyan Stone const char *key; 993075c896SRyan Stone int type; 1003075c896SRyan Stone 1013075c896SRyan Stone key = "name"; 1023075c896SRyan Stone nvl = nvlist_create(0); 1033075c896SRyan Stone 1043075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 1053075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 1063075c896SRyan Stone 1073075c896SRyan Stone nvlist_add_bool(nvl, key, true); 1083075c896SRyan Stone 1093075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 1103075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 1113075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me")); 1123075c896SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, key)); 1133075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e')); 1143075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true); 1153075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true); 1163075c896SRyan Stone 1173075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 1183075c896SRyan Stone it = NULL; 1193075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 1203075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BOOL); 1213075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 1223075c896SRyan Stone 1233075c896SRyan Stone nvlist_destroy(nvl); 1243075c896SRyan Stone } 1253075c896SRyan Stone 1263075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert); 1273075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert) 1283075c896SRyan Stone { 1293075c896SRyan Stone nvlist_t *nvl; 1303075c896SRyan Stone void *it; 1313075c896SRyan Stone const char *key; 1323075c896SRyan Stone uint64_t value; 1333075c896SRyan Stone int type; 1343075c896SRyan Stone 1353075c896SRyan Stone key = "foo123"; 1363075c896SRyan Stone value = 71965; 1373075c896SRyan Stone nvl = nvlist_create(0); 1383075c896SRyan Stone 1393075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 1403075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 1413075c896SRyan Stone 1423075c896SRyan Stone nvlist_add_number(nvl, key, value); 1433075c896SRyan Stone 1443075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 1453075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 1463075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123)); 1473075c896SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, key)); 1483075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key)); 1493075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value); 1503075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value); 1513075c896SRyan Stone 1523075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 1533075c896SRyan Stone it = NULL; 1543075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 1553075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 1563075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 1573075c896SRyan Stone 1583075c896SRyan Stone nvlist_destroy(nvl); 1593075c896SRyan Stone } 1603075c896SRyan Stone 1613075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert); 1623075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert) 1633075c896SRyan Stone { 1643075c896SRyan Stone nvlist_t *nvl; 1653075c896SRyan Stone void *it; 1663075c896SRyan Stone const char *key; 1673075c896SRyan Stone const char *value; 1683075c896SRyan Stone int type; 1693075c896SRyan Stone 1703075c896SRyan Stone key = "test"; 1713075c896SRyan Stone value = "fgjdkgjdk"; 1723075c896SRyan Stone nvl = nvlist_create(0); 1733075c896SRyan Stone 1743075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 1753075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 1763075c896SRyan Stone 1773075c896SRyan Stone nvlist_add_string(nvl, key, value); 1783075c896SRyan Stone 1793075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 1803075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 1813075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 1823075c896SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, key)); 1833075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key)); 1843075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0); 1853075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0); 1863075c896SRyan Stone 1873075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 1883075c896SRyan Stone ATF_REQUIRE(nvlist_get_string(nvl, key) != value); 1893075c896SRyan Stone 1903075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 1913075c896SRyan Stone it = NULL; 1923075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 1933075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 1943075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 1953075c896SRyan Stone 1963075c896SRyan Stone nvlist_destroy(nvl); 1973075c896SRyan Stone } 1983075c896SRyan Stone 1993075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert); 2003075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert) 2013075c896SRyan Stone { 2023075c896SRyan Stone nvlist_t *nvl; 2033075c896SRyan Stone void *it; 2043075c896SRyan Stone const char *key, *subkey; 2053075c896SRyan Stone nvlist_t *sublist; 2063075c896SRyan Stone const nvlist_t *value; 2073075c896SRyan Stone int type; 2083075c896SRyan Stone 2093075c896SRyan Stone key = "test"; 2103075c896SRyan Stone subkey = "subkey"; 2113075c896SRyan Stone sublist = nvlist_create(0); 2123075c896SRyan Stone nvl = nvlist_create(0); 2133075c896SRyan Stone 2143075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 2153075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 2163075c896SRyan Stone 2173075c896SRyan Stone nvlist_add_null(sublist, subkey); 2183075c896SRyan Stone nvlist_add_nvlist(nvl, key, sublist); 2193075c896SRyan Stone 2203075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 2213075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 2223075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 2233075c896SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, key)); 2243075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key)); 2253075c896SRyan Stone 2263075c896SRyan Stone value = nvlist_get_nvlist(nvl, key); 2273075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(value, subkey)); 2283075c896SRyan Stone 2293075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 2303075c896SRyan Stone ATF_REQUIRE(sublist != value); 2313075c896SRyan Stone 2323075c896SRyan Stone value = nvlist_getf_nvlist(nvl, "%s", key); 2333075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(value, subkey)); 2343075c896SRyan Stone ATF_REQUIRE(sublist != value); 2353075c896SRyan Stone 2363075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 2373075c896SRyan Stone it = NULL; 2383075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 2393075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 2403075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 2413075c896SRyan Stone 2423075c896SRyan Stone nvlist_destroy(sublist); 2433075c896SRyan Stone nvlist_destroy(nvl); 2443075c896SRyan Stone } 2453075c896SRyan Stone 246*19a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error); 247*19a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error) 248*19a4afb3SRyan Stone { 249*19a4afb3SRyan Stone nvlist_t *nvl, *parent; 250*19a4afb3SRyan Stone 251*19a4afb3SRyan Stone nvl = nvlist_create(0); 252*19a4afb3SRyan Stone parent = nvlist_create(0); 253*19a4afb3SRyan Stone 254*19a4afb3SRyan Stone nvlist_set_error(nvl, EBADF); 255*19a4afb3SRyan Stone nvlist_add_nvlist(parent, "test", nvl); 256*19a4afb3SRyan Stone ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 257*19a4afb3SRyan Stone 258*19a4afb3SRyan Stone nvlist_destroy(nvl); 259*19a4afb3SRyan Stone nvlist_destroy(parent); 260*19a4afb3SRyan Stone } 261*19a4afb3SRyan Stone 2623075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert); 2633075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert) 2643075c896SRyan Stone { 2653075c896SRyan Stone nvlist_t *nvl; 2663075c896SRyan Stone void *it; 2673075c896SRyan Stone const char *key; 2683075c896SRyan Stone void *value; 2693075c896SRyan Stone const void *ret_value; 2703075c896SRyan Stone size_t value_size, ret_size; 2713075c896SRyan Stone int type; 2723075c896SRyan Stone 2733075c896SRyan Stone key = "binary"; 2743075c896SRyan Stone value_size = 13; 2753075c896SRyan Stone value = malloc(value_size); 2763075c896SRyan Stone memset(value, 0xa5, value_size); 2773075c896SRyan Stone nvl = nvlist_create(0); 2783075c896SRyan Stone 2793075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 2803075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 2813075c896SRyan Stone 2823075c896SRyan Stone nvlist_add_binary(nvl, key, value, value_size); 2833075c896SRyan Stone 2843075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 2853075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 2863075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 2873075c896SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, key)); 2883075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key)); 2893075c896SRyan Stone 2903075c896SRyan Stone ret_value = nvlist_get_binary(nvl, key, &ret_size); 2913075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 2923075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 2933075c896SRyan Stone 2943075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 2953075c896SRyan Stone ATF_REQUIRE(value != ret_value); 2963075c896SRyan Stone 2973075c896SRyan Stone ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key); 2983075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 2993075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 3003075c896SRyan Stone ATF_REQUIRE(value != ret_value); 3013075c896SRyan Stone 3023075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 3033075c896SRyan Stone it = NULL; 3043075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 3053075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 3063075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 3073075c896SRyan Stone 3083075c896SRyan Stone nvlist_destroy(nvl); 3093075c896SRyan Stone free(value); 3103075c896SRyan Stone } 3113075c896SRyan Stone 3126e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist); 3136e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist) 3146e623ffdSRyan Stone { 3156e623ffdSRyan Stone nvlist_t *nvl, *clone; 3166e623ffdSRyan Stone 3176e623ffdSRyan Stone nvl = nvlist_create(0); 3186e623ffdSRyan Stone ATF_REQUIRE(nvl != NULL); 3196e623ffdSRyan Stone 3206e623ffdSRyan Stone clone = nvlist_clone(nvl); 3216e623ffdSRyan Stone ATF_REQUIRE(clone != NULL); 3226e623ffdSRyan Stone ATF_REQUIRE(clone != nvl); 3236e623ffdSRyan Stone ATF_REQUIRE(nvlist_empty(clone)); 3246e623ffdSRyan Stone 3256e623ffdSRyan Stone nvlist_destroy(clone); 3266e623ffdSRyan Stone nvlist_destroy(nvl); 3276e623ffdSRyan Stone } 3286e623ffdSRyan Stone 3296e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist); 3306e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist) 3316e623ffdSRyan Stone { 3326e623ffdSRyan Stone nvlist_t *nvl, *clone; 3336e623ffdSRyan Stone const char *key; 3346e623ffdSRyan Stone void *it; 3356e623ffdSRyan Stone uint64_t value; 3366e623ffdSRyan Stone int type; 3376e623ffdSRyan Stone 3386e623ffdSRyan Stone nvl = nvlist_create(0); 3396e623ffdSRyan Stone ATF_REQUIRE(nvl != NULL); 3406e623ffdSRyan Stone 3416e623ffdSRyan Stone key = "testkey"; 3426e623ffdSRyan Stone value = 684874; 3436e623ffdSRyan Stone nvlist_add_number(nvl, key, value); 3446e623ffdSRyan Stone 3456e623ffdSRyan Stone clone = nvlist_clone(nvl); 3466e623ffdSRyan Stone ATF_REQUIRE(clone != NULL); 3476e623ffdSRyan Stone ATF_REQUIRE(clone != nvl); 3486e623ffdSRyan Stone ATF_REQUIRE(nvlist_exists_number(clone, key)); 3496e623ffdSRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value); 3506e623ffdSRyan Stone 3516e623ffdSRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 3526e623ffdSRyan Stone it = NULL; 3536e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0); 3546e623ffdSRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 3556e623ffdSRyan Stone ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), NULL); 3566e623ffdSRyan Stone 3576e623ffdSRyan Stone nvlist_destroy(clone); 3586e623ffdSRyan Stone nvlist_destroy(nvl); 3596e623ffdSRyan Stone } 3606e623ffdSRyan Stone 3616e623ffdSRyan Stone static const char * const test_subnvlist_key = "nvlist"; 3626e623ffdSRyan Stone 3636e623ffdSRyan Stone static const char * const test_string_key = "string"; 3646e623ffdSRyan Stone static const char * const test_string_val = "59525"; 3656e623ffdSRyan Stone 3666e623ffdSRyan Stone static nvlist_t* 3676e623ffdSRyan Stone create_test_nvlist(void) 3686e623ffdSRyan Stone { 3696e623ffdSRyan Stone nvlist_t *nvl, *sublist; 3706e623ffdSRyan Stone 3716e623ffdSRyan Stone nvl = nvlist_create(0); 3726e623ffdSRyan Stone ATF_REQUIRE(nvl != NULL); 3736e623ffdSRyan Stone 3746e623ffdSRyan Stone sublist = nvlist_create(0); 3756e623ffdSRyan Stone ATF_REQUIRE(sublist != NULL); 3766e623ffdSRyan Stone 3776e623ffdSRyan Stone nvlist_add_string(sublist, test_string_key, test_string_val); 3786e623ffdSRyan Stone nvlist_move_nvlist(nvl, test_subnvlist_key, sublist); 3796e623ffdSRyan Stone 3806e623ffdSRyan Stone return (nvl); 3816e623ffdSRyan Stone } 3826e623ffdSRyan Stone 3836e623ffdSRyan Stone static void 3846e623ffdSRyan Stone verify_test_nvlist(const nvlist_t *nvl) 3856e623ffdSRyan Stone { 3866e623ffdSRyan Stone void *it; 3876e623ffdSRyan Stone const nvlist_t *value; 3886e623ffdSRyan Stone int type; 3896e623ffdSRyan Stone 3906e623ffdSRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key)); 3916e623ffdSRyan Stone 3926e623ffdSRyan Stone value = nvlist_get_nvlist(nvl, test_subnvlist_key); 3936e623ffdSRyan Stone 3946e623ffdSRyan Stone ATF_REQUIRE(nvlist_exists_string(value, test_string_key)); 3956e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0); 3966e623ffdSRyan Stone ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val); 3976e623ffdSRyan Stone 3986e623ffdSRyan Stone /* Iterate over both nvlists; ensure that each has only the one key. */ 3996e623ffdSRyan Stone it = NULL; 4006e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it), 4016e623ffdSRyan Stone test_string_key), 0); 4026e623ffdSRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 4036e623ffdSRyan Stone ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), NULL); 4046e623ffdSRyan Stone 4056e623ffdSRyan Stone it = NULL; 4066e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), 4076e623ffdSRyan Stone test_subnvlist_key), 0); 4086e623ffdSRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 4096e623ffdSRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL); 4106e623ffdSRyan Stone } 4116e623ffdSRyan Stone 4126e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist); 4136e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist) 4146e623ffdSRyan Stone { 4156e623ffdSRyan Stone nvlist_t *nvl, *clone; 4166e623ffdSRyan Stone 4176e623ffdSRyan Stone nvl = create_test_nvlist(); 4186e623ffdSRyan Stone clone = nvlist_clone(nvl); 4196e623ffdSRyan Stone 4206e623ffdSRyan Stone ATF_REQUIRE(clone != NULL); 4216e623ffdSRyan Stone ATF_REQUIRE(clone != nvl); 4226e623ffdSRyan Stone verify_test_nvlist(clone); 4236e623ffdSRyan Stone 4246e623ffdSRyan Stone nvlist_destroy(clone); 4256e623ffdSRyan Stone nvlist_destroy(nvl); 4266e623ffdSRyan Stone } 4276e623ffdSRyan Stone 428a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist); 429a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist) 430a87e5162SRyan Stone { 431a87e5162SRyan Stone nvlist_t *nvl, *clone; 432a87e5162SRyan Stone 433a87e5162SRyan Stone nvl = nvlist_create(0); 434a87e5162SRyan Stone ATF_REQUIRE(nvl != NULL); 435a87e5162SRyan Stone 436a87e5162SRyan Stone nvlist_set_error(nvl, ENOMEM); 437a87e5162SRyan Stone 438a87e5162SRyan Stone clone = nvlist_clone(nvl); 439a87e5162SRyan Stone ATF_REQUIRE(clone == NULL); 440a87e5162SRyan Stone 441a87e5162SRyan Stone nvlist_destroy(nvl); 442a87e5162SRyan Stone } 443a87e5162SRyan Stone 4446c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist); 4456c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist) 4466c721f82SRyan Stone { 4476c721f82SRyan Stone nvlist_t *nvl, *unpacked; 4486c721f82SRyan Stone void *packed; 4496c721f82SRyan Stone size_t packed_size; 4506c721f82SRyan Stone 4516c721f82SRyan Stone nvl = nvlist_create(0); 4526c721f82SRyan Stone ATF_REQUIRE(nvl != NULL); 4536c721f82SRyan Stone 4546c721f82SRyan Stone packed = nvlist_pack(nvl, &packed_size); 4556c721f82SRyan Stone ATF_REQUIRE(packed != NULL); 4566c721f82SRyan Stone 4576c721f82SRyan Stone unpacked = nvlist_unpack(packed, packed_size); 4586c721f82SRyan Stone ATF_REQUIRE(unpacked != NULL); 4596c721f82SRyan Stone ATF_REQUIRE(unpacked != nvl); 4606c721f82SRyan Stone ATF_REQUIRE(nvlist_empty(unpacked)); 4616c721f82SRyan Stone 4626c721f82SRyan Stone nvlist_destroy(unpacked); 4636c721f82SRyan Stone nvlist_destroy(nvl); 4646c721f82SRyan Stone free(packed); 4656c721f82SRyan Stone } 4666c721f82SRyan Stone 4676c721f82SRyan Stone static void 4686c721f82SRyan Stone verify_null(const nvlist_t *nvl, int type) 4696c721f82SRyan Stone { 4706c721f82SRyan Stone 4716c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 4726c721f82SRyan Stone } 4736c721f82SRyan Stone 4746c721f82SRyan Stone static void 4756c721f82SRyan Stone verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value) 4766c721f82SRyan Stone { 4776c721f82SRyan Stone 4786c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 4796c721f82SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value); 4806c721f82SRyan Stone } 4816c721f82SRyan Stone 4826c721f82SRyan Stone static void 4836c721f82SRyan Stone verify_string(const nvlist_t *nvl, const char *name, int type, 4846c721f82SRyan Stone const char * value) 4856c721f82SRyan Stone { 4866c721f82SRyan Stone 4876c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 4886c721f82SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0); 4896c721f82SRyan Stone } 4906c721f82SRyan Stone 4916c721f82SRyan Stone static void 4926c721f82SRyan Stone verify_nvlist(const nvlist_t *nvl, const char *name, int type) 4936c721f82SRyan Stone { 4946c721f82SRyan Stone 4956c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 4966c721f82SRyan Stone verify_test_nvlist(nvlist_get_nvlist(nvl, name)); 4976c721f82SRyan Stone } 4986c721f82SRyan Stone 4996c721f82SRyan Stone static void 5006c721f82SRyan Stone verify_binary(const nvlist_t *nvl, const char *name, int type, 5016c721f82SRyan Stone const void * value, size_t size) 5026c721f82SRyan Stone { 5036c721f82SRyan Stone const void *actual_value; 5046c721f82SRyan Stone size_t actual_size; 5056c721f82SRyan Stone 5066c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 5076c721f82SRyan Stone actual_value = nvlist_get_binary(nvl, name, &actual_size); 5086c721f82SRyan Stone ATF_REQUIRE_EQ(size, actual_size); 5096c721f82SRyan Stone ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0); 5106c721f82SRyan Stone } 5116c721f82SRyan Stone 5126c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values); 5136c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__multiple_values) 5146c721f82SRyan Stone { 5156c721f82SRyan Stone std::ostringstream msg; 5166c721f82SRyan Stone std::set<std::string> keys_seen; 5176c721f82SRyan Stone nvlist_t *nvl, *unpacked, *nvvalue; 5186c721f82SRyan Stone const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name; 5196c721f82SRyan Stone int numvalue; 5206c721f82SRyan Stone const char * strvalue; 5216c721f82SRyan Stone void *binvalue, *packed, *it; 5226c721f82SRyan Stone size_t binsize, packed_size; 5236c721f82SRyan Stone int type; 5246c721f82SRyan Stone 5256c721f82SRyan Stone nvl = nvlist_create(0); 5266c721f82SRyan Stone 5276c721f82SRyan Stone nullkey = "null"; 5286c721f82SRyan Stone nvlist_add_null(nvl, nullkey); 5296c721f82SRyan Stone 5306c721f82SRyan Stone numkey = "number"; 5316c721f82SRyan Stone numvalue = 939853984; 5326c721f82SRyan Stone nvlist_add_number(nvl, numkey, numvalue); 5336c721f82SRyan Stone 5346c721f82SRyan Stone strkey = "string"; 5356c721f82SRyan Stone strvalue = "jfieutijf"; 5366c721f82SRyan Stone nvlist_add_string(nvl, strkey, strvalue); 5376c721f82SRyan Stone 5386c721f82SRyan Stone nvkey = "nvlist"; 5396c721f82SRyan Stone nvvalue = create_test_nvlist(); 5406c721f82SRyan Stone nvlist_move_nvlist(nvl, nvkey, nvvalue); 5416c721f82SRyan Stone 5426c721f82SRyan Stone binkey = "binary"; 5436c721f82SRyan Stone binsize = 4; 5446c721f82SRyan Stone binvalue = malloc(binsize); 5456c721f82SRyan Stone memset(binvalue, 'b', binsize); 5466c721f82SRyan Stone nvlist_move_binary(nvl, binkey, binvalue, binsize); 5476c721f82SRyan Stone 5486c721f82SRyan Stone packed = nvlist_pack(nvl, &packed_size); 5496c721f82SRyan Stone ATF_REQUIRE(packed != NULL); 5506c721f82SRyan Stone 5516c721f82SRyan Stone unpacked = nvlist_unpack(packed, packed_size); 5526c721f82SRyan Stone ATF_REQUIRE(unpacked != 0); 5536c721f82SRyan Stone 5546c721f82SRyan Stone it = NULL; 5556c721f82SRyan Stone while ((name = nvlist_next(unpacked, &type, &it)) != NULL) { 5566c721f82SRyan Stone /* Ensure that we see every key only once. */ 5576c721f82SRyan Stone ATF_REQUIRE_EQ(keys_seen.count(name), 0); 5586c721f82SRyan Stone 5596c721f82SRyan Stone if (strcmp(name, nullkey) == 0) 5606c721f82SRyan Stone verify_null(unpacked, type); 5616c721f82SRyan Stone else if (strcmp(name, numkey) == 0) 5626c721f82SRyan Stone verify_number(unpacked, name, type, numvalue); 5636c721f82SRyan Stone else if (strcmp(name, strkey) == 0) 5646c721f82SRyan Stone verify_string(unpacked, name, type, strvalue); 5656c721f82SRyan Stone else if (strcmp(name, nvkey) == 0) 5666c721f82SRyan Stone verify_nvlist(unpacked, name, type); 5676c721f82SRyan Stone else if (strcmp(name, binkey) == 0) 5686c721f82SRyan Stone verify_binary(unpacked, name, type, binvalue, binsize); 5696c721f82SRyan Stone else { 5706c721f82SRyan Stone msg << "Unexpected key :'" << name << "'"; 5716c721f82SRyan Stone ATF_FAIL(msg.str().c_str()); 5726c721f82SRyan Stone } 5736c721f82SRyan Stone 5746c721f82SRyan Stone keys_seen.insert(name); 5756c721f82SRyan Stone } 5766c721f82SRyan Stone 5776c721f82SRyan Stone /* Ensure that we saw every key. */ 5786c721f82SRyan Stone ATF_REQUIRE_EQ(keys_seen.size(), 5); 5796c721f82SRyan Stone 5806c721f82SRyan Stone nvlist_destroy(nvl); 5816c721f82SRyan Stone nvlist_destroy(unpacked); 5826c721f82SRyan Stone free(packed); 5836c721f82SRyan Stone } 5846c721f82SRyan Stone 585a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist); 586a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist) 587a87e5162SRyan Stone { 588a87e5162SRyan Stone nvlist_t *nvl; 589a87e5162SRyan Stone void *packed; 590a87e5162SRyan Stone size_t size; 591a87e5162SRyan Stone 592a87e5162SRyan Stone nvl = nvlist_create(0); 593a87e5162SRyan Stone ATF_REQUIRE(nvl != NULL); 594a87e5162SRyan Stone 595a87e5162SRyan Stone nvlist_set_error(nvl, ENOMEM); 596a87e5162SRyan Stone 597a87e5162SRyan Stone packed = nvlist_pack(nvl, &size); 598a87e5162SRyan Stone ATF_REQUIRE(packed == NULL); 599a87e5162SRyan Stone 600a87e5162SRyan Stone nvlist_destroy(nvl); 601a87e5162SRyan Stone } 602a87e5162SRyan Stone 6036c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key); 6046c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key) 6056c721f82SRyan Stone { 6066c721f82SRyan Stone nvlist_t *nvl, *unpacked; 6076c721f82SRyan Stone const char *key1, *key2; 6086c721f82SRyan Stone void *packed, *keypos; 6096c721f82SRyan Stone size_t size, keylen; 6106c721f82SRyan Stone 6116c721f82SRyan Stone nvl = nvlist_create(0); 6126c721f82SRyan Stone 6136c721f82SRyan Stone key1 = "key1"; 6146c721f82SRyan Stone keylen = strlen(key1); 6156c721f82SRyan Stone nvlist_add_number(nvl, key1, 5); 6166c721f82SRyan Stone 6176c721f82SRyan Stone key2 = "key2"; 6186c721f82SRyan Stone ATF_REQUIRE_EQ(keylen, strlen(key2)); 6196c721f82SRyan Stone nvlist_add_number(nvl, key2, 10); 6206c721f82SRyan Stone 6216c721f82SRyan Stone packed = nvlist_pack(nvl, &size); 6226c721f82SRyan Stone 6236c721f82SRyan Stone /* 6246c721f82SRyan Stone * Mangle the packed nvlist by replacing key1 with key2, creating a 6256c721f82SRyan Stone * packed nvlist with a duplicate key. 6266c721f82SRyan Stone */ 6276c721f82SRyan Stone keypos = memmem(packed, size, key1, keylen); 6286c721f82SRyan Stone ATF_REQUIRE(keypos != NULL); 6296c721f82SRyan Stone memcpy(keypos, key2, keylen); 6306c721f82SRyan Stone 6316c721f82SRyan Stone unpacked = nvlist_unpack(packed, size); 6326c721f82SRyan Stone ATF_REQUIRE(nvlist_error(unpacked) != 0); 6336c721f82SRyan Stone 6346c721f82SRyan Stone free(packed); 6356c721f82SRyan Stone nvlist_destroy(nvl); 6366c721f82SRyan Stone nvlist_destroy(unpacked); 6376c721f82SRyan Stone } 6386c721f82SRyan Stone 63971637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert); 64071637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_string__single_insert) 64171637d76SRyan Stone { 64271637d76SRyan Stone nvlist_t *nvl; 64371637d76SRyan Stone const char *key; 64471637d76SRyan Stone char *value; 64571637d76SRyan Stone 64671637d76SRyan Stone nvl = nvlist_create(0); 64771637d76SRyan Stone ATF_REQUIRE(nvl != NULL); 64871637d76SRyan Stone 64971637d76SRyan Stone key = "testkey"; 65071637d76SRyan Stone value = strdup("testval"); 65171637d76SRyan Stone ATF_REQUIRE(value != NULL); 65271637d76SRyan Stone 65371637d76SRyan Stone nvlist_move_string(nvl, key, value); 65471637d76SRyan Stone ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value); 65571637d76SRyan Stone 65671637d76SRyan Stone nvlist_destroy(nvl); 65771637d76SRyan Stone } 65871637d76SRyan Stone 65971637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child); 66071637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child) 66171637d76SRyan Stone { 66271637d76SRyan Stone nvlist_t *parent; 66371637d76SRyan Stone 66471637d76SRyan Stone parent = nvlist_create(0); 66571637d76SRyan Stone 66671637d76SRyan Stone nvlist_move_nvlist(parent, "test", NULL); 66771637d76SRyan Stone 66871637d76SRyan Stone ATF_REQUIRE(nvlist_error(parent) != 0); 66971637d76SRyan Stone 67071637d76SRyan Stone nvlist_destroy(parent); 67171637d76SRyan Stone } 67271637d76SRyan Stone 673*19a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error); 674*19a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error) 675*19a4afb3SRyan Stone { 676*19a4afb3SRyan Stone nvlist_t *nvl, *parent; 677*19a4afb3SRyan Stone 678*19a4afb3SRyan Stone nvl = nvlist_create(0); 679*19a4afb3SRyan Stone parent = nvlist_create(0); 680*19a4afb3SRyan Stone 681*19a4afb3SRyan Stone nvlist_set_error(nvl, EBADF); 682*19a4afb3SRyan Stone nvlist_move_nvlist(parent, "test", nvl); 683*19a4afb3SRyan Stone ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 684*19a4afb3SRyan Stone 685*19a4afb3SRyan Stone nvlist_destroy(parent); 686*19a4afb3SRyan Stone } 687*19a4afb3SRyan Stone 68871637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert); 68971637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert) 69071637d76SRyan Stone { 69171637d76SRyan Stone nvlist_t *nvl; 69271637d76SRyan Stone const char *key; 69371637d76SRyan Stone nvlist_t *value; 69471637d76SRyan Stone 69571637d76SRyan Stone nvl = nvlist_create(0); 69671637d76SRyan Stone ATF_REQUIRE(nvl != NULL); 69771637d76SRyan Stone 69871637d76SRyan Stone key = "testkey"; 69971637d76SRyan Stone value = nvlist_create(0); 70071637d76SRyan Stone ATF_REQUIRE(value != NULL); 70171637d76SRyan Stone 70271637d76SRyan Stone nvlist_move_nvlist(nvl, key, value); 70371637d76SRyan Stone ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value); 70471637d76SRyan Stone 70571637d76SRyan Stone nvlist_destroy(nvl); 70671637d76SRyan Stone } 70771637d76SRyan Stone 70871637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert); 70971637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert) 71071637d76SRyan Stone { 71171637d76SRyan Stone nvlist_t *nvl; 71271637d76SRyan Stone const char *key; 71371637d76SRyan Stone void *value; 71471637d76SRyan Stone size_t size, actual_size; 71571637d76SRyan Stone 71671637d76SRyan Stone nvl = nvlist_create(0); 71771637d76SRyan Stone ATF_REQUIRE(nvl != NULL); 71871637d76SRyan Stone 71971637d76SRyan Stone key = "testkey"; 72071637d76SRyan Stone size = 73; 72171637d76SRyan Stone value = malloc(size); 72271637d76SRyan Stone ATF_REQUIRE(value != NULL); 72371637d76SRyan Stone 72471637d76SRyan Stone nvlist_move_binary(nvl, key, value, size); 72571637d76SRyan Stone ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value); 72671637d76SRyan Stone ATF_REQUIRE_EQ(size, actual_size); 72771637d76SRyan Stone 72871637d76SRyan Stone nvlist_destroy(nvl); 72971637d76SRyan Stone } 73071637d76SRyan Stone 731fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove); 732fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove) 733fad0a264SRyan Stone { 734fad0a264SRyan Stone nvlist_t *nvl; 735fad0a264SRyan Stone const char *testkey; 736fad0a264SRyan Stone bool testval; 737fad0a264SRyan Stone 738fad0a264SRyan Stone nvl = nvlist_create(0); 739fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 740fad0a264SRyan Stone 741fad0a264SRyan Stone testkey = "boolkey"; 742fad0a264SRyan Stone testval = false; 743fad0a264SRyan Stone nvlist_add_bool(nvl, testkey, testval); 744fad0a264SRyan Stone 745fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 746fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 747fad0a264SRyan Stone 748fad0a264SRyan Stone nvlist_destroy(nvl); 749fad0a264SRyan Stone } 750fad0a264SRyan Stone 751fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged); 752fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged) 753fad0a264SRyan Stone { 754fad0a264SRyan Stone nvlist_t *nvl; 755fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 756fad0a264SRyan Stone bool testval, otherval1; 757fad0a264SRyan Stone nvlist_t *otherval2; 758fad0a264SRyan Stone 759fad0a264SRyan Stone nvl = nvlist_create(0); 760fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 761fad0a264SRyan Stone 762fad0a264SRyan Stone testkey = "boolkey"; 763fad0a264SRyan Stone testval = true; 764fad0a264SRyan Stone nvlist_add_bool(nvl, testkey, testval); 765fad0a264SRyan Stone 766fad0a264SRyan Stone otherkey1 = "key1"; 767fad0a264SRyan Stone otherval1 = false; 768fad0a264SRyan Stone nvlist_add_bool(nvl, otherkey1, otherval1); 769fad0a264SRyan Stone 770fad0a264SRyan Stone otherkey2 = "key2"; 771fad0a264SRyan Stone otherval2 = create_test_nvlist(); 772fad0a264SRyan Stone nvlist_move_nvlist(nvl, otherkey2, otherval2); 773fad0a264SRyan Stone 774fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 775fad0a264SRyan Stone 776fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1)); 777fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1); 778fad0a264SRyan Stone 779fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2)); 780fad0a264SRyan Stone verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2)); 781fad0a264SRyan Stone 782fad0a264SRyan Stone nvlist_destroy(nvl); 783fad0a264SRyan Stone } 784fad0a264SRyan Stone 785fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove); 786fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__single_remove) 787fad0a264SRyan Stone { 788fad0a264SRyan Stone nvlist_t *nvl; 789fad0a264SRyan Stone const char *testkey; 790fad0a264SRyan Stone uint64_t testval; 791fad0a264SRyan Stone 792fad0a264SRyan Stone nvl = nvlist_create(0); 793fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 794fad0a264SRyan Stone 795fad0a264SRyan Stone testkey = "numkey"; 796fad0a264SRyan Stone testval = std::numeric_limits<uint64_t>::max(); 797fad0a264SRyan Stone nvlist_add_number(nvl, testkey, testval); 798fad0a264SRyan Stone 799fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 800fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 801fad0a264SRyan Stone 802fad0a264SRyan Stone nvlist_destroy(nvl); 803fad0a264SRyan Stone } 804fad0a264SRyan Stone 805fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged); 806fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged) 807fad0a264SRyan Stone { 808fad0a264SRyan Stone nvlist_t *nvl; 809fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 810fad0a264SRyan Stone uint64_t testval, otherval1; 811fad0a264SRyan Stone const char *otherval2; 812fad0a264SRyan Stone 813fad0a264SRyan Stone nvl = nvlist_create(0); 814fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 815fad0a264SRyan Stone 816fad0a264SRyan Stone otherkey1 = "key1"; 817fad0a264SRyan Stone otherval1 = 5; 818fad0a264SRyan Stone nvlist_add_number(nvl, otherkey1, otherval1); 819fad0a264SRyan Stone 820fad0a264SRyan Stone testkey = "numkey"; 821fad0a264SRyan Stone testval = 1654; 822fad0a264SRyan Stone nvlist_add_number(nvl, testkey, testval); 823fad0a264SRyan Stone 824fad0a264SRyan Stone otherkey2 = "key2"; 825fad0a264SRyan Stone otherval2 = "string"; 826fad0a264SRyan Stone nvlist_add_string(nvl, otherkey2, otherval2); 827fad0a264SRyan Stone 828fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 829fad0a264SRyan Stone 830fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1)); 831fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1); 832fad0a264SRyan Stone 833fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2)); 834fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0); 835fad0a264SRyan Stone 836fad0a264SRyan Stone nvlist_destroy(nvl); 837fad0a264SRyan Stone } 838fad0a264SRyan Stone 839fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove); 840fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__single_remove) 841fad0a264SRyan Stone { 842fad0a264SRyan Stone nvlist_t *nvl; 843fad0a264SRyan Stone const char *testkey; 844fad0a264SRyan Stone const char *testval; 845fad0a264SRyan Stone 846fad0a264SRyan Stone nvl = nvlist_create(0); 847fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 848fad0a264SRyan Stone 849fad0a264SRyan Stone testkey = "numkey"; 850fad0a264SRyan Stone testval = "nvlist"; 851fad0a264SRyan Stone nvlist_add_string(nvl, testkey, testval); 852fad0a264SRyan Stone 853fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 854fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 855fad0a264SRyan Stone 856fad0a264SRyan Stone nvlist_destroy(nvl); 857fad0a264SRyan Stone } 858fad0a264SRyan Stone 859fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged); 860fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged) 861fad0a264SRyan Stone { 862fad0a264SRyan Stone nvlist_t *nvl; 863fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 864fad0a264SRyan Stone const char *testval, *otherval1; 865fad0a264SRyan Stone bool otherval2; 866fad0a264SRyan Stone 867fad0a264SRyan Stone nvl = nvlist_create(0); 868fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 869fad0a264SRyan Stone 870fad0a264SRyan Stone otherkey1 = "key1"; 871fad0a264SRyan Stone otherval1 = "fjdifjdk"; 872fad0a264SRyan Stone nvlist_add_string(nvl, otherkey1, otherval1); 873fad0a264SRyan Stone 874fad0a264SRyan Stone otherkey2 = "key2"; 875fad0a264SRyan Stone otherval2 = true; 876fad0a264SRyan Stone nvlist_add_bool(nvl, otherkey2, otherval2); 877fad0a264SRyan Stone 878fad0a264SRyan Stone testkey = "strkey"; 879fad0a264SRyan Stone testval = "1654"; 880fad0a264SRyan Stone nvlist_add_string(nvl, testkey, testval); 881fad0a264SRyan Stone 882fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 883fad0a264SRyan Stone 884fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1)); 885fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0); 886fad0a264SRyan Stone 887fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 888fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 889fad0a264SRyan Stone 890fad0a264SRyan Stone nvlist_destroy(nvl); 891fad0a264SRyan Stone } 892fad0a264SRyan Stone 893fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove); 894fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove) 895fad0a264SRyan Stone { 896fad0a264SRyan Stone nvlist_t *nvl; 897fad0a264SRyan Stone const char *testkey; 898fad0a264SRyan Stone nvlist_t *testval; 899fad0a264SRyan Stone 900fad0a264SRyan Stone nvl = nvlist_create(0); 901fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 902fad0a264SRyan Stone 903fad0a264SRyan Stone testkey = "numkey"; 904fad0a264SRyan Stone testval = create_test_nvlist(); 905fad0a264SRyan Stone nvlist_move_nvlist(nvl, testkey, testval); 906fad0a264SRyan Stone 907fad0a264SRyan Stone verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 908fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 909fad0a264SRyan Stone 910fad0a264SRyan Stone nvlist_destroy(nvl); 911fad0a264SRyan Stone } 912fad0a264SRyan Stone 913fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged); 914fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged) 915fad0a264SRyan Stone { 916fad0a264SRyan Stone nvlist_t *nvl; 917fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 918fad0a264SRyan Stone nvlist_t *testval, *otherval1; 919fad0a264SRyan Stone 920fad0a264SRyan Stone nvl = nvlist_create(0); 921fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 922fad0a264SRyan Stone 923fad0a264SRyan Stone testkey = "strkey"; 924fad0a264SRyan Stone testval = create_test_nvlist(); 925fad0a264SRyan Stone nvlist_move_nvlist(nvl, testkey, testval); 926fad0a264SRyan Stone 927fad0a264SRyan Stone otherkey1 = "key1"; 928fad0a264SRyan Stone otherval1 = nvlist_create(0); 929fad0a264SRyan Stone nvlist_move_nvlist(nvl, otherkey1, otherval1); 930fad0a264SRyan Stone 931fad0a264SRyan Stone otherkey2 = "key2"; 932fad0a264SRyan Stone nvlist_add_null(nvl, otherkey2); 933fad0a264SRyan Stone 934fad0a264SRyan Stone verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 935fad0a264SRyan Stone 936fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1)); 937fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1))); 938fad0a264SRyan Stone 939fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2)); 940fad0a264SRyan Stone 941fad0a264SRyan Stone nvlist_destroy(nvl); 942fad0a264SRyan Stone } 943fad0a264SRyan Stone 944fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove); 945fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove) 946fad0a264SRyan Stone { 947fad0a264SRyan Stone nvlist_t *nvl; 948fad0a264SRyan Stone const char *testkey; 949fad0a264SRyan Stone void *testval; 950fad0a264SRyan Stone const void *actual_val; 951fad0a264SRyan Stone size_t testsize, actual_size; 952fad0a264SRyan Stone 953fad0a264SRyan Stone nvl = nvlist_create(0); 954fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 955fad0a264SRyan Stone 956fad0a264SRyan Stone testkey = "numkey"; 957fad0a264SRyan Stone testsize = 457; 958fad0a264SRyan Stone testval = malloc(testsize); 959fad0a264SRyan Stone memset(testval, '5', testsize); 960fad0a264SRyan Stone nvlist_move_binary(nvl, testkey, testval, testsize); 961fad0a264SRyan Stone 962fad0a264SRyan Stone actual_val = nvlist_take_binary(nvl, testkey, &actual_size); 963fad0a264SRyan Stone ATF_REQUIRE_EQ(testsize, actual_size); 964fad0a264SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0); 965fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 966fad0a264SRyan Stone 967fad0a264SRyan Stone nvlist_destroy(nvl); 968fad0a264SRyan Stone } 969fad0a264SRyan Stone 970fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged); 971fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged) 972fad0a264SRyan Stone { 973fad0a264SRyan Stone nvlist_t *nvl; 974fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 975fad0a264SRyan Stone const void *actual_value; 976fad0a264SRyan Stone char testval[] = "gjiertj"; 977fad0a264SRyan Stone char otherval1[] = "fdreg"; 978fad0a264SRyan Stone size_t testsize, othersize, actual_size; 979fad0a264SRyan Stone bool otherval2; 980fad0a264SRyan Stone 981fad0a264SRyan Stone nvl = nvlist_create(0); 982fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 983fad0a264SRyan Stone 984fad0a264SRyan Stone otherkey1 = "key1"; 985fad0a264SRyan Stone othersize = sizeof(otherval1); 986fad0a264SRyan Stone nvlist_add_binary(nvl, otherkey1, otherval1, othersize); 987fad0a264SRyan Stone 988fad0a264SRyan Stone otherkey2 = "key2"; 989fad0a264SRyan Stone otherval2 = true; 990fad0a264SRyan Stone nvlist_add_bool(nvl, otherkey2, otherval2); 991fad0a264SRyan Stone 992fad0a264SRyan Stone testkey = "strkey"; 993fad0a264SRyan Stone testsize = sizeof(testval); 994fad0a264SRyan Stone nvlist_add_binary(nvl, testkey, testval, testsize); 995fad0a264SRyan Stone 996fad0a264SRyan Stone actual_value = nvlist_take_binary(nvl, testkey, &actual_size); 997fad0a264SRyan Stone ATF_REQUIRE_EQ(testsize, actual_size); 998fad0a264SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0); 999fad0a264SRyan Stone 1000fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1)); 1001fad0a264SRyan Stone actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size); 1002fad0a264SRyan Stone ATF_REQUIRE_EQ(othersize, actual_size); 1003fad0a264SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0); 1004fad0a264SRyan Stone 1005fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 1006fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 1007fad0a264SRyan Stone 1008fad0a264SRyan Stone nvlist_destroy(nvl); 1009fad0a264SRyan Stone } 1010fad0a264SRyan Stone 1011339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null); 1012339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_null) 1013339bcfc7SRyan Stone { 1014339bcfc7SRyan Stone nvlist_t *nvl; 1015339bcfc7SRyan Stone const char *key; 1016339bcfc7SRyan Stone 1017339bcfc7SRyan Stone nvl = nvlist_create(0); 1018339bcfc7SRyan Stone key = "test"; 1019339bcfc7SRyan Stone nvlist_add_null(nvl, key); 1020339bcfc7SRyan Stone 1021339bcfc7SRyan Stone nvlist_free(nvl, key); 1022339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1023339bcfc7SRyan Stone 1024339bcfc7SRyan Stone nvlist_destroy(nvl); 1025339bcfc7SRyan Stone } 1026339bcfc7SRyan Stone 1027339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool); 1028339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_bool) 1029339bcfc7SRyan Stone { 1030339bcfc7SRyan Stone nvlist_t *nvl; 1031339bcfc7SRyan Stone const char *key; 1032339bcfc7SRyan Stone 1033339bcfc7SRyan Stone nvl = nvlist_create(0); 1034339bcfc7SRyan Stone key = "test"; 1035339bcfc7SRyan Stone nvlist_add_bool(nvl, key, true); 1036339bcfc7SRyan Stone 1037339bcfc7SRyan Stone nvlist_free(nvl, key); 1038339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1039339bcfc7SRyan Stone 1040339bcfc7SRyan Stone nvlist_destroy(nvl); 1041339bcfc7SRyan Stone } 1042339bcfc7SRyan Stone 1043339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number); 1044339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_number) 1045339bcfc7SRyan Stone { 1046339bcfc7SRyan Stone nvlist_t *nvl; 1047339bcfc7SRyan Stone const char *key; 1048339bcfc7SRyan Stone 1049339bcfc7SRyan Stone nvl = nvlist_create(0); 1050339bcfc7SRyan Stone key = "test"; 1051339bcfc7SRyan Stone nvlist_add_number(nvl, key, 584); 1052339bcfc7SRyan Stone 1053339bcfc7SRyan Stone nvlist_free(nvl, key); 1054339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1055339bcfc7SRyan Stone 1056339bcfc7SRyan Stone nvlist_destroy(nvl); 1057339bcfc7SRyan Stone } 1058339bcfc7SRyan Stone 1059339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string); 1060339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_string) 1061339bcfc7SRyan Stone { 1062339bcfc7SRyan Stone nvlist_t *nvl; 1063339bcfc7SRyan Stone const char *key; 1064339bcfc7SRyan Stone 1065339bcfc7SRyan Stone nvl = nvlist_create(0); 1066339bcfc7SRyan Stone key = "test"; 1067339bcfc7SRyan Stone nvlist_add_string(nvl, key, "gjkfkjd"); 1068339bcfc7SRyan Stone 1069339bcfc7SRyan Stone nvlist_free(nvl, key); 1070339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1071339bcfc7SRyan Stone 1072339bcfc7SRyan Stone nvlist_destroy(nvl); 1073339bcfc7SRyan Stone } 1074339bcfc7SRyan Stone 1075339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist); 1076339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_nvlist) 1077339bcfc7SRyan Stone { 1078339bcfc7SRyan Stone nvlist_t *nvl; 1079339bcfc7SRyan Stone const char *key; 1080339bcfc7SRyan Stone 1081339bcfc7SRyan Stone nvl = nvlist_create(0); 1082339bcfc7SRyan Stone key = "test"; 1083339bcfc7SRyan Stone nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1084339bcfc7SRyan Stone 1085339bcfc7SRyan Stone nvlist_free(nvl, key); 1086339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1087339bcfc7SRyan Stone 1088339bcfc7SRyan Stone nvlist_destroy(nvl); 1089339bcfc7SRyan Stone } 1090339bcfc7SRyan Stone 1091339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary); 1092339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_binary) 1093339bcfc7SRyan Stone { 1094339bcfc7SRyan Stone nvlist_t *nvl; 1095339bcfc7SRyan Stone const char *key; 1096339bcfc7SRyan Stone 1097339bcfc7SRyan Stone nvl = nvlist_create(0); 1098339bcfc7SRyan Stone key = "test"; 1099339bcfc7SRyan Stone nvlist_add_binary(nvl, key, "jgjgfd", 6); 1100339bcfc7SRyan Stone 1101339bcfc7SRyan Stone nvlist_free(nvl, key); 1102339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1103339bcfc7SRyan Stone 1104339bcfc7SRyan Stone nvlist_destroy(nvl); 1105339bcfc7SRyan Stone } 1106339bcfc7SRyan Stone 1107339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null); 1108339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_null__single_null) 1109339bcfc7SRyan Stone { 1110339bcfc7SRyan Stone nvlist_t *nvl; 1111339bcfc7SRyan Stone const char *key; 1112339bcfc7SRyan Stone 1113339bcfc7SRyan Stone nvl = nvlist_create(0); 1114339bcfc7SRyan Stone key = "test"; 1115339bcfc7SRyan Stone nvlist_add_null(nvl, key); 1116339bcfc7SRyan Stone 1117339bcfc7SRyan Stone nvlist_free_null(nvl, key); 1118339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1119339bcfc7SRyan Stone 1120339bcfc7SRyan Stone nvlist_destroy(nvl); 1121339bcfc7SRyan Stone } 1122339bcfc7SRyan Stone 1123339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool); 1124339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool) 1125339bcfc7SRyan Stone { 1126339bcfc7SRyan Stone nvlist_t *nvl; 1127339bcfc7SRyan Stone const char *key; 1128339bcfc7SRyan Stone 1129339bcfc7SRyan Stone nvl = nvlist_create(0); 1130339bcfc7SRyan Stone key = "test"; 1131339bcfc7SRyan Stone nvlist_add_bool(nvl, key, true); 1132339bcfc7SRyan Stone 1133339bcfc7SRyan Stone nvlist_free_bool(nvl, key); 1134339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1135339bcfc7SRyan Stone 1136339bcfc7SRyan Stone nvlist_destroy(nvl); 1137339bcfc7SRyan Stone } 1138339bcfc7SRyan Stone 1139339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number); 1140339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_number__single_number) 1141339bcfc7SRyan Stone { 1142339bcfc7SRyan Stone nvlist_t *nvl; 1143339bcfc7SRyan Stone const char *key; 1144339bcfc7SRyan Stone 1145339bcfc7SRyan Stone nvl = nvlist_create(0); 1146339bcfc7SRyan Stone key = "test"; 1147339bcfc7SRyan Stone nvlist_add_number(nvl, key, 584); 1148339bcfc7SRyan Stone 1149339bcfc7SRyan Stone nvlist_free_number(nvl, key); 1150339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1151339bcfc7SRyan Stone 1152339bcfc7SRyan Stone nvlist_destroy(nvl); 1153339bcfc7SRyan Stone } 1154339bcfc7SRyan Stone 1155339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string); 1156339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_string__single_string) 1157339bcfc7SRyan Stone { 1158339bcfc7SRyan Stone nvlist_t *nvl; 1159339bcfc7SRyan Stone const char *key; 1160339bcfc7SRyan Stone 1161339bcfc7SRyan Stone nvl = nvlist_create(0); 1162339bcfc7SRyan Stone key = "test"; 1163339bcfc7SRyan Stone nvlist_add_string(nvl, key, "gjkfkjd"); 1164339bcfc7SRyan Stone 1165339bcfc7SRyan Stone nvlist_free_string(nvl, key); 1166339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1167339bcfc7SRyan Stone 1168339bcfc7SRyan Stone nvlist_destroy(nvl); 1169339bcfc7SRyan Stone } 1170339bcfc7SRyan Stone 1171339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist); 1172339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist) 1173339bcfc7SRyan Stone { 1174339bcfc7SRyan Stone nvlist_t *nvl; 1175339bcfc7SRyan Stone const char *key; 1176339bcfc7SRyan Stone 1177339bcfc7SRyan Stone nvl = nvlist_create(0); 1178339bcfc7SRyan Stone key = "test"; 1179339bcfc7SRyan Stone nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1180339bcfc7SRyan Stone 1181339bcfc7SRyan Stone nvlist_free_nvlist(nvl, key); 1182339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1183339bcfc7SRyan Stone 1184339bcfc7SRyan Stone nvlist_destroy(nvl); 1185339bcfc7SRyan Stone } 1186339bcfc7SRyan Stone 1187339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary); 1188339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary) 1189339bcfc7SRyan Stone { 1190339bcfc7SRyan Stone nvlist_t *nvl; 1191339bcfc7SRyan Stone const char *key; 1192339bcfc7SRyan Stone 1193339bcfc7SRyan Stone nvl = nvlist_create(0); 1194339bcfc7SRyan Stone key = "test"; 1195339bcfc7SRyan Stone nvlist_add_binary(nvl, key, "jgjgfd", 6); 1196339bcfc7SRyan Stone 1197339bcfc7SRyan Stone nvlist_free_binary(nvl, key); 1198339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1199339bcfc7SRyan Stone 1200339bcfc7SRyan Stone nvlist_destroy(nvl); 1201339bcfc7SRyan Stone } 1202339bcfc7SRyan Stone 12033075c896SRyan Stone ATF_INIT_TEST_CASES(tp) 12043075c896SRyan Stone { 12053075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty); 12063075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert); 12073075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert); 12083075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert); 12093075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert); 12103075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert); 1211*19a4afb3SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error); 12123075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert); 12136e623ffdSRyan Stone 12146e623ffdSRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist); 12156e623ffdSRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist); 12166e623ffdSRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist); 1217a87e5162SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist); 12186c721f82SRyan Stone 12196c721f82SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist); 12206c721f82SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values); 1221a87e5162SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist); 12226c721f82SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key); 122371637d76SRyan Stone 122471637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert); 122571637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert); 122671637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child); 1227*19a4afb3SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error); 122871637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert); 1229fad0a264SRyan Stone 1230fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove); 1231fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged); 1232fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove); 1233fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged); 1234fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove); 1235fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged); 1236fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove); 1237fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged); 1238fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove); 1239fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged); 1240339bcfc7SRyan Stone 1241339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_null); 1242339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool); 1243339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_number); 1244339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_string); 1245339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist); 1246339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary); 1247339bcfc7SRyan Stone 1248339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null); 1249339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool); 1250339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number); 1251339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string); 1252339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist); 1253339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary); 12543075c896SRyan Stone } 12553075c896SRyan Stone /*- 12563075c896SRyan Stone * Copyright (c) 2014-2015 Sandvine Inc. All rights reserved. 12573075c896SRyan Stone * All rights reserved. 12583075c896SRyan Stone * 12593075c896SRyan Stone * Redistribution and use in source and binary forms, with or without 12603075c896SRyan Stone * modification, are permitted provided that the following conditions 12613075c896SRyan Stone * are met: 12623075c896SRyan Stone * 1. Redistributions of source code must retain the above copyright 12633075c896SRyan Stone * notice, this list of conditions and the following disclaimer. 12643075c896SRyan Stone * 2. Redistributions in binary form must reproduce the above copyright 12653075c896SRyan Stone * notice, this list of conditions and the following disclaimer in the 12663075c896SRyan Stone * documentation and/or other materials provided with the distribution. 12673075c896SRyan Stone * 12683075c896SRyan Stone * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 12693075c896SRyan Stone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 12703075c896SRyan Stone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 12713075c896SRyan Stone * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 12723075c896SRyan Stone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 12733075c896SRyan Stone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 12743075c896SRyan Stone * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 12753075c896SRyan Stone * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 12763075c896SRyan Stone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 12773075c896SRyan Stone * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 12783075c896SRyan Stone * SUCH DAMAGE. 12793075c896SRyan Stone */ 12803075c896SRyan Stone 12813075c896SRyan Stone #include <atf-c++.hpp> 12823075c896SRyan Stone #include <nv.h> 12833075c896SRyan Stone 12843075c896SRyan Stone #include <errno.h> 12853075c896SRyan Stone /* 12863075c896SRyan Stone * Test that a newly created nvlist has no errors, and is empty. 12873075c896SRyan Stone */ 12883075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty); 12893075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty) 12903075c896SRyan Stone { 12913075c896SRyan Stone nvlist_t *nvl; 12923075c896SRyan Stone int type; 12933075c896SRyan Stone void *it; 12943075c896SRyan Stone 12953075c896SRyan Stone nvl = nvlist_create(0); 12963075c896SRyan Stone 12973075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 12983075c896SRyan Stone 12993075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_error(nvl), 0); 13003075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 13013075c896SRyan Stone 13023075c896SRyan Stone it = NULL; 13033075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL); 13043075c896SRyan Stone 13053075c896SRyan Stone nvlist_destroy(nvl); 13063075c896SRyan Stone } 13073075c896SRyan Stone 13083075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert); 13093075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert) 13103075c896SRyan Stone { 13113075c896SRyan Stone nvlist_t *nvl; 13123075c896SRyan Stone void *it; 13133075c896SRyan Stone const char *key; 13143075c896SRyan Stone int type; 13153075c896SRyan Stone 13163075c896SRyan Stone key = "key"; 13173075c896SRyan Stone nvl = nvlist_create(0); 13183075c896SRyan Stone 13193075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 13203075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 13213075c896SRyan Stone 13223075c896SRyan Stone nvlist_add_null(nvl, key); 13233075c896SRyan Stone 13243075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 13253075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 13263075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 13273075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(nvl, key)); 13283075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_null(nvl, "key")); 13293075c896SRyan Stone 13303075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 13313075c896SRyan Stone it = NULL; 13323075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 13333075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 13343075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 13353075c896SRyan Stone 13363075c896SRyan Stone nvlist_destroy(nvl); 13373075c896SRyan Stone } 13383075c896SRyan Stone 13393075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert); 13403075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert) 13413075c896SRyan Stone { 13423075c896SRyan Stone nvlist_t *nvl; 13433075c896SRyan Stone void *it; 13443075c896SRyan Stone const char *key; 13453075c896SRyan Stone int type; 13463075c896SRyan Stone 13473075c896SRyan Stone key = "name"; 13483075c896SRyan Stone nvl = nvlist_create(0); 13493075c896SRyan Stone 13503075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 13513075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 13523075c896SRyan Stone 13533075c896SRyan Stone nvlist_add_bool(nvl, key, true); 13543075c896SRyan Stone 13553075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 13563075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 13573075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me")); 13583075c896SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, key)); 13593075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e')); 13603075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true); 13613075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true); 13623075c896SRyan Stone 13633075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 13643075c896SRyan Stone it = NULL; 13653075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 13663075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BOOL); 13673075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 13683075c896SRyan Stone 13693075c896SRyan Stone nvlist_destroy(nvl); 13703075c896SRyan Stone } 13713075c896SRyan Stone 13723075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert); 13733075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert) 13743075c896SRyan Stone { 13753075c896SRyan Stone nvlist_t *nvl; 13763075c896SRyan Stone void *it; 13773075c896SRyan Stone const char *key; 13783075c896SRyan Stone uint64_t value; 13793075c896SRyan Stone int type; 13803075c896SRyan Stone 13813075c896SRyan Stone key = "foo123"; 13823075c896SRyan Stone value = 71965; 13833075c896SRyan Stone nvl = nvlist_create(0); 13843075c896SRyan Stone 13853075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 13863075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 13873075c896SRyan Stone 13883075c896SRyan Stone nvlist_add_number(nvl, key, value); 13893075c896SRyan Stone 13903075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 13913075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 13923075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123)); 13933075c896SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, key)); 13943075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key)); 13953075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value); 13963075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value); 13973075c896SRyan Stone 13983075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 13993075c896SRyan Stone it = NULL; 14003075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 14013075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 14023075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 14033075c896SRyan Stone 14043075c896SRyan Stone nvlist_destroy(nvl); 14053075c896SRyan Stone } 14063075c896SRyan Stone 14073075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert); 14083075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert) 14093075c896SRyan Stone { 14103075c896SRyan Stone nvlist_t *nvl; 14113075c896SRyan Stone void *it; 14123075c896SRyan Stone const char *key; 14133075c896SRyan Stone const char *value; 14143075c896SRyan Stone int type; 14153075c896SRyan Stone 14163075c896SRyan Stone key = "test"; 14173075c896SRyan Stone value = "fgjdkgjdk"; 14183075c896SRyan Stone nvl = nvlist_create(0); 14193075c896SRyan Stone 14203075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 14213075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 14223075c896SRyan Stone 14233075c896SRyan Stone nvlist_add_string(nvl, key, value); 14243075c896SRyan Stone 14253075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 14263075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 14273075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 14283075c896SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, key)); 14293075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key)); 14303075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0); 14313075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0); 14323075c896SRyan Stone 14333075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 14343075c896SRyan Stone ATF_REQUIRE(nvlist_get_string(nvl, key) != value); 14353075c896SRyan Stone 14363075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 14373075c896SRyan Stone it = NULL; 14383075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 14393075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 14403075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 14413075c896SRyan Stone 14423075c896SRyan Stone nvlist_destroy(nvl); 14433075c896SRyan Stone } 14443075c896SRyan Stone 14453075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert); 14463075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert) 14473075c896SRyan Stone { 14483075c896SRyan Stone nvlist_t *nvl; 14493075c896SRyan Stone void *it; 14503075c896SRyan Stone const char *key, *subkey; 14513075c896SRyan Stone nvlist_t *sublist; 14523075c896SRyan Stone const nvlist_t *value; 14533075c896SRyan Stone int type; 14543075c896SRyan Stone 14553075c896SRyan Stone key = "test"; 14563075c896SRyan Stone subkey = "subkey"; 14573075c896SRyan Stone sublist = nvlist_create(0); 14583075c896SRyan Stone nvl = nvlist_create(0); 14593075c896SRyan Stone 14603075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 14613075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 14623075c896SRyan Stone 14633075c896SRyan Stone nvlist_add_null(sublist, subkey); 14643075c896SRyan Stone nvlist_add_nvlist(nvl, key, sublist); 14653075c896SRyan Stone 14663075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 14673075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 14683075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 14693075c896SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, key)); 14703075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key)); 14713075c896SRyan Stone 14723075c896SRyan Stone value = nvlist_get_nvlist(nvl, key); 14733075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(value, subkey)); 14743075c896SRyan Stone 14753075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 14763075c896SRyan Stone ATF_REQUIRE(sublist != value); 14773075c896SRyan Stone 14783075c896SRyan Stone value = nvlist_getf_nvlist(nvl, "%s", key); 14793075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(value, subkey)); 14803075c896SRyan Stone ATF_REQUIRE(sublist != value); 14813075c896SRyan Stone 14823075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 14833075c896SRyan Stone it = NULL; 14843075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 14853075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 14863075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 14873075c896SRyan Stone 14883075c896SRyan Stone nvlist_destroy(sublist); 14893075c896SRyan Stone nvlist_destroy(nvl); 14903075c896SRyan Stone } 14913075c896SRyan Stone 14923075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert); 14933075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert) 14943075c896SRyan Stone { 14953075c896SRyan Stone nvlist_t *nvl; 14963075c896SRyan Stone void *it; 14973075c896SRyan Stone const char *key; 14983075c896SRyan Stone void *value; 14993075c896SRyan Stone const void *ret_value; 15003075c896SRyan Stone size_t value_size, ret_size; 15013075c896SRyan Stone int type; 15023075c896SRyan Stone 15033075c896SRyan Stone key = "binary"; 15043075c896SRyan Stone value_size = 13; 15053075c896SRyan Stone value = malloc(value_size); 15063075c896SRyan Stone memset(value, 0xa5, value_size); 15073075c896SRyan Stone nvl = nvlist_create(0); 15083075c896SRyan Stone 15093075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 15103075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 15113075c896SRyan Stone 15123075c896SRyan Stone nvlist_add_binary(nvl, key, value, value_size); 15133075c896SRyan Stone 15143075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 15153075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 15163075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 15173075c896SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, key)); 15183075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key)); 15193075c896SRyan Stone 15203075c896SRyan Stone ret_value = nvlist_get_binary(nvl, key, &ret_size); 15213075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 15223075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 15233075c896SRyan Stone 15243075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 15253075c896SRyan Stone ATF_REQUIRE(value != ret_value); 15263075c896SRyan Stone 15273075c896SRyan Stone ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key); 15283075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 15293075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 15303075c896SRyan Stone ATF_REQUIRE(value != ret_value); 15313075c896SRyan Stone 15323075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 15333075c896SRyan Stone it = NULL; 15343075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 15353075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 15363075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 15373075c896SRyan Stone 15383075c896SRyan Stone nvlist_destroy(nvl); 15393075c896SRyan Stone free(value); 15403075c896SRyan Stone } 15413075c896SRyan Stone 15423075c896SRyan Stone ATF_INIT_TEST_CASES(tp) 15433075c896SRyan Stone { 15443075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty); 15453075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert); 15463075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert); 15473075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert); 15483075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert); 15493075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert); 15503075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert); 15513075c896SRyan Stone } 15523075c896SRyan Stone /*- 15533075c896SRyan Stone * Copyright (c) 2014-2015 Sandvine Inc. All rights reserved. 15543075c896SRyan Stone * All rights reserved. 15553075c896SRyan Stone * 15563075c896SRyan Stone * Redistribution and use in source and binary forms, with or without 15573075c896SRyan Stone * modification, are permitted provided that the following conditions 15583075c896SRyan Stone * are met: 15593075c896SRyan Stone * 1. Redistributions of source code must retain the above copyright 15603075c896SRyan Stone * notice, this list of conditions and the following disclaimer. 15613075c896SRyan Stone * 2. Redistributions in binary form must reproduce the above copyright 15623075c896SRyan Stone * notice, this list of conditions and the following disclaimer in the 15633075c896SRyan Stone * documentation and/or other materials provided with the distribution. 15643075c896SRyan Stone * 15653075c896SRyan Stone * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15663075c896SRyan Stone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15673075c896SRyan Stone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 15683075c896SRyan Stone * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15693075c896SRyan Stone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 15703075c896SRyan Stone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 15713075c896SRyan Stone * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 15723075c896SRyan Stone * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 15733075c896SRyan Stone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 15743075c896SRyan Stone * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 15753075c896SRyan Stone * SUCH DAMAGE. 15763075c896SRyan Stone */ 15773075c896SRyan Stone 15783075c896SRyan Stone #include <atf-c++.hpp> 15793075c896SRyan Stone #include <nv.h> 15803075c896SRyan Stone 15813075c896SRyan Stone #include <errno.h> 15823075c896SRyan Stone /* 15833075c896SRyan Stone * Test that a newly created nvlist has no errors, and is empty. 15843075c896SRyan Stone */ 15853075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty); 15863075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty) 15873075c896SRyan Stone { 15883075c896SRyan Stone nvlist_t *nvl; 15893075c896SRyan Stone int type; 15903075c896SRyan Stone void *it; 15913075c896SRyan Stone 15923075c896SRyan Stone nvl = nvlist_create(0); 15933075c896SRyan Stone 15943075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 15953075c896SRyan Stone 15963075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_error(nvl), 0); 15973075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 15983075c896SRyan Stone 15993075c896SRyan Stone it = NULL; 16003075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL); 16013075c896SRyan Stone 16023075c896SRyan Stone nvlist_destroy(nvl); 16033075c896SRyan Stone } 16043075c896SRyan Stone 16053075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert); 16063075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert) 16073075c896SRyan Stone { 16083075c896SRyan Stone nvlist_t *nvl; 16093075c896SRyan Stone void *it; 16103075c896SRyan Stone const char *key; 16113075c896SRyan Stone int type; 16123075c896SRyan Stone 16133075c896SRyan Stone key = "key"; 16143075c896SRyan Stone nvl = nvlist_create(0); 16153075c896SRyan Stone 16163075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 16173075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 16183075c896SRyan Stone 16193075c896SRyan Stone nvlist_add_null(nvl, key); 16203075c896SRyan Stone 16213075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 16223075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 16233075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 16243075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(nvl, key)); 16253075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_null(nvl, "key")); 16263075c896SRyan Stone 16273075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 16283075c896SRyan Stone it = NULL; 16293075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 16303075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 16313075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 16323075c896SRyan Stone 16333075c896SRyan Stone nvlist_destroy(nvl); 16343075c896SRyan Stone } 16353075c896SRyan Stone 16363075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert); 16373075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert) 16383075c896SRyan Stone { 16393075c896SRyan Stone nvlist_t *nvl; 16403075c896SRyan Stone void *it; 16413075c896SRyan Stone const char *key; 16423075c896SRyan Stone int type; 16433075c896SRyan Stone 16443075c896SRyan Stone key = "name"; 16453075c896SRyan Stone nvl = nvlist_create(0); 16463075c896SRyan Stone 16473075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 16483075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 16493075c896SRyan Stone 16503075c896SRyan Stone nvlist_add_bool(nvl, key, true); 16513075c896SRyan Stone 16523075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 16533075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 16543075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me")); 16553075c896SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, key)); 16563075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e')); 16573075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true); 16583075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true); 16593075c896SRyan Stone 16603075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 16613075c896SRyan Stone it = NULL; 16623075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 16633075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BOOL); 16643075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 16653075c896SRyan Stone 16663075c896SRyan Stone nvlist_destroy(nvl); 16673075c896SRyan Stone } 16683075c896SRyan Stone 16693075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert); 16703075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert) 16713075c896SRyan Stone { 16723075c896SRyan Stone nvlist_t *nvl; 16733075c896SRyan Stone void *it; 16743075c896SRyan Stone const char *key; 16753075c896SRyan Stone uint64_t value; 16763075c896SRyan Stone int type; 16773075c896SRyan Stone 16783075c896SRyan Stone key = "foo123"; 16793075c896SRyan Stone value = 71965; 16803075c896SRyan Stone nvl = nvlist_create(0); 16813075c896SRyan Stone 16823075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 16833075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 16843075c896SRyan Stone 16853075c896SRyan Stone nvlist_add_number(nvl, key, value); 16863075c896SRyan Stone 16873075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 16883075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 16893075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123)); 16903075c896SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, key)); 16913075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key)); 16923075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value); 16933075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value); 16943075c896SRyan Stone 16953075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 16963075c896SRyan Stone it = NULL; 16973075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 16983075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 16993075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 17003075c896SRyan Stone 17013075c896SRyan Stone nvlist_destroy(nvl); 17023075c896SRyan Stone } 17033075c896SRyan Stone 17043075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert); 17053075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert) 17063075c896SRyan Stone { 17073075c896SRyan Stone nvlist_t *nvl; 17083075c896SRyan Stone void *it; 17093075c896SRyan Stone const char *key; 17103075c896SRyan Stone const char *value; 17113075c896SRyan Stone int type; 17123075c896SRyan Stone 17133075c896SRyan Stone key = "test"; 17143075c896SRyan Stone value = "fgjdkgjdk"; 17153075c896SRyan Stone nvl = nvlist_create(0); 17163075c896SRyan Stone 17173075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 17183075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 17193075c896SRyan Stone 17203075c896SRyan Stone nvlist_add_string(nvl, key, value); 17213075c896SRyan Stone 17223075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 17233075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 17243075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 17253075c896SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, key)); 17263075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key)); 17273075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0); 17283075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0); 17293075c896SRyan Stone 17303075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 17313075c896SRyan Stone ATF_REQUIRE(nvlist_get_string(nvl, key) != value); 17323075c896SRyan Stone 17333075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 17343075c896SRyan Stone it = NULL; 17353075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 17363075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 17373075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 17383075c896SRyan Stone 17393075c896SRyan Stone nvlist_destroy(nvl); 17403075c896SRyan Stone } 17413075c896SRyan Stone 17423075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert); 17433075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert) 17443075c896SRyan Stone { 17453075c896SRyan Stone nvlist_t *nvl; 17463075c896SRyan Stone void *it; 17473075c896SRyan Stone const char *key, *subkey; 17483075c896SRyan Stone nvlist_t *sublist; 17493075c896SRyan Stone const nvlist_t *value; 17503075c896SRyan Stone int type; 17513075c896SRyan Stone 17523075c896SRyan Stone key = "test"; 17533075c896SRyan Stone subkey = "subkey"; 17543075c896SRyan Stone sublist = nvlist_create(0); 17553075c896SRyan Stone nvl = nvlist_create(0); 17563075c896SRyan Stone 17573075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 17583075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 17593075c896SRyan Stone 17603075c896SRyan Stone nvlist_add_null(sublist, subkey); 17613075c896SRyan Stone nvlist_add_nvlist(nvl, key, sublist); 17623075c896SRyan Stone 17633075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 17643075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 17653075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 17663075c896SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, key)); 17673075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key)); 17683075c896SRyan Stone 17693075c896SRyan Stone value = nvlist_get_nvlist(nvl, key); 17703075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(value, subkey)); 17713075c896SRyan Stone 17723075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 17733075c896SRyan Stone ATF_REQUIRE(sublist != value); 17743075c896SRyan Stone 17753075c896SRyan Stone value = nvlist_getf_nvlist(nvl, "%s", key); 17763075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(value, subkey)); 17773075c896SRyan Stone ATF_REQUIRE(sublist != value); 17783075c896SRyan Stone 17793075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 17803075c896SRyan Stone it = NULL; 17813075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 17823075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 17833075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 17843075c896SRyan Stone 17853075c896SRyan Stone nvlist_destroy(sublist); 17863075c896SRyan Stone nvlist_destroy(nvl); 17873075c896SRyan Stone } 17883075c896SRyan Stone 17893075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert); 17903075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert) 17913075c896SRyan Stone { 17923075c896SRyan Stone nvlist_t *nvl; 17933075c896SRyan Stone void *it; 17943075c896SRyan Stone const char *key; 17953075c896SRyan Stone void *value; 17963075c896SRyan Stone const void *ret_value; 17973075c896SRyan Stone size_t value_size, ret_size; 17983075c896SRyan Stone int type; 17993075c896SRyan Stone 18003075c896SRyan Stone key = "binary"; 18013075c896SRyan Stone value_size = 13; 18023075c896SRyan Stone value = malloc(value_size); 18033075c896SRyan Stone memset(value, 0xa5, value_size); 18043075c896SRyan Stone nvl = nvlist_create(0); 18053075c896SRyan Stone 18063075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 18073075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 18083075c896SRyan Stone 18093075c896SRyan Stone nvlist_add_binary(nvl, key, value, value_size); 18103075c896SRyan Stone 18113075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 18123075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 18133075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 18143075c896SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, key)); 18153075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key)); 18163075c896SRyan Stone 18173075c896SRyan Stone ret_value = nvlist_get_binary(nvl, key, &ret_size); 18183075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 18193075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 18203075c896SRyan Stone 18213075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 18223075c896SRyan Stone ATF_REQUIRE(value != ret_value); 18233075c896SRyan Stone 18243075c896SRyan Stone ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key); 18253075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 18263075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 18273075c896SRyan Stone ATF_REQUIRE(value != ret_value); 18283075c896SRyan Stone 18293075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 18303075c896SRyan Stone it = NULL; 18313075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 18323075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 18333075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 18343075c896SRyan Stone 18353075c896SRyan Stone nvlist_destroy(nvl); 18363075c896SRyan Stone free(value); 18373075c896SRyan Stone } 18383075c896SRyan Stone 18393075c896SRyan Stone ATF_INIT_TEST_CASES(tp) 18403075c896SRyan Stone { 18413075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty); 18423075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert); 18433075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert); 18443075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert); 18453075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert); 18463075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert); 18473075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert); 18483075c896SRyan Stone } 18493075c896SRyan Stone /*- 18503075c896SRyan Stone * Copyright (c) 2014-2015 Sandvine Inc. All rights reserved. 18513075c896SRyan Stone * All rights reserved. 18523075c896SRyan Stone * 18533075c896SRyan Stone * Redistribution and use in source and binary forms, with or without 18543075c896SRyan Stone * modification, are permitted provided that the following conditions 18553075c896SRyan Stone * are met: 18563075c896SRyan Stone * 1. Redistributions of source code must retain the above copyright 18573075c896SRyan Stone * notice, this list of conditions and the following disclaimer. 18583075c896SRyan Stone * 2. Redistributions in binary form must reproduce the above copyright 18593075c896SRyan Stone * notice, this list of conditions and the following disclaimer in the 18603075c896SRyan Stone * documentation and/or other materials provided with the distribution. 18613075c896SRyan Stone * 18623075c896SRyan Stone * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18633075c896SRyan Stone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18643075c896SRyan Stone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18653075c896SRyan Stone * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18663075c896SRyan Stone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18673075c896SRyan Stone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 18683075c896SRyan Stone * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 18693075c896SRyan Stone * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18703075c896SRyan Stone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 18713075c896SRyan Stone * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 18723075c896SRyan Stone * SUCH DAMAGE. 18733075c896SRyan Stone */ 18743075c896SRyan Stone 18753075c896SRyan Stone #include <atf-c++.hpp> 18763075c896SRyan Stone #include <nv.h> 18773075c896SRyan Stone 18783075c896SRyan Stone #include <errno.h> 18793075c896SRyan Stone #include <limits> 18803075c896SRyan Stone #include <set> 18813075c896SRyan Stone #include <sstream> 18823075c896SRyan Stone #include <string> 18833075c896SRyan Stone 18843075c896SRyan Stone /* 18853075c896SRyan Stone * Test that a newly created nvlist has no errors, and is empty. 18863075c896SRyan Stone */ 18873075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty); 18883075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty) 18893075c896SRyan Stone { 18903075c896SRyan Stone nvlist_t *nvl; 18913075c896SRyan Stone int type; 18923075c896SRyan Stone void *it; 18933075c896SRyan Stone 18943075c896SRyan Stone nvl = nvlist_create(0); 18953075c896SRyan Stone 18963075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 18973075c896SRyan Stone 18983075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_error(nvl), 0); 18993075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 19003075c896SRyan Stone 19013075c896SRyan Stone it = NULL; 19023075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL); 19033075c896SRyan Stone 19043075c896SRyan Stone nvlist_destroy(nvl); 19053075c896SRyan Stone } 19063075c896SRyan Stone 19073075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert); 19083075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert) 19093075c896SRyan Stone { 19103075c896SRyan Stone nvlist_t *nvl; 19113075c896SRyan Stone void *it; 19123075c896SRyan Stone const char *key; 19133075c896SRyan Stone int type; 19143075c896SRyan Stone 19153075c896SRyan Stone key = "key"; 19163075c896SRyan Stone nvl = nvlist_create(0); 19173075c896SRyan Stone 19183075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 19193075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 19203075c896SRyan Stone 19213075c896SRyan Stone nvlist_add_null(nvl, key); 19223075c896SRyan Stone 19233075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 19243075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 19253075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 19263075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(nvl, key)); 19273075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_null(nvl, "key")); 19283075c896SRyan Stone 19293075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 19303075c896SRyan Stone it = NULL; 19313075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 19323075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 19333075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 19343075c896SRyan Stone 19353075c896SRyan Stone nvlist_destroy(nvl); 19363075c896SRyan Stone } 19373075c896SRyan Stone 19383075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert); 19393075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert) 19403075c896SRyan Stone { 19413075c896SRyan Stone nvlist_t *nvl; 19423075c896SRyan Stone void *it; 19433075c896SRyan Stone const char *key; 19443075c896SRyan Stone int type; 19453075c896SRyan Stone 19463075c896SRyan Stone key = "name"; 19473075c896SRyan Stone nvl = nvlist_create(0); 19483075c896SRyan Stone 19493075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 19503075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 19513075c896SRyan Stone 19523075c896SRyan Stone nvlist_add_bool(nvl, key, true); 19533075c896SRyan Stone 19543075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 19553075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 19563075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me")); 19573075c896SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, key)); 19583075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e')); 19593075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true); 19603075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true); 19613075c896SRyan Stone 19623075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 19633075c896SRyan Stone it = NULL; 19643075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 19653075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BOOL); 19663075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 19673075c896SRyan Stone 19683075c896SRyan Stone nvlist_destroy(nvl); 19693075c896SRyan Stone } 19703075c896SRyan Stone 19713075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert); 19723075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert) 19733075c896SRyan Stone { 19743075c896SRyan Stone nvlist_t *nvl; 19753075c896SRyan Stone void *it; 19763075c896SRyan Stone const char *key; 19773075c896SRyan Stone uint64_t value; 19783075c896SRyan Stone int type; 19793075c896SRyan Stone 19803075c896SRyan Stone key = "foo123"; 19813075c896SRyan Stone value = 71965; 19823075c896SRyan Stone nvl = nvlist_create(0); 19833075c896SRyan Stone 19843075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 19853075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 19863075c896SRyan Stone 19873075c896SRyan Stone nvlist_add_number(nvl, key, value); 19883075c896SRyan Stone 19893075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 19903075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 19913075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123)); 19923075c896SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, key)); 19933075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key)); 19943075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value); 19953075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value); 19963075c896SRyan Stone 19973075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 19983075c896SRyan Stone it = NULL; 19993075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 20003075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 20013075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 20023075c896SRyan Stone 20033075c896SRyan Stone nvlist_destroy(nvl); 20043075c896SRyan Stone } 20053075c896SRyan Stone 20063075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert); 20073075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert) 20083075c896SRyan Stone { 20093075c896SRyan Stone nvlist_t *nvl; 20103075c896SRyan Stone void *it; 20113075c896SRyan Stone const char *key; 20123075c896SRyan Stone const char *value; 20133075c896SRyan Stone int type; 20143075c896SRyan Stone 20153075c896SRyan Stone key = "test"; 20163075c896SRyan Stone value = "fgjdkgjdk"; 20173075c896SRyan Stone nvl = nvlist_create(0); 20183075c896SRyan Stone 20193075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 20203075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 20213075c896SRyan Stone 20223075c896SRyan Stone nvlist_add_string(nvl, key, value); 20233075c896SRyan Stone 20243075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 20253075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 20263075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 20273075c896SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, key)); 20283075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key)); 20293075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0); 20303075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0); 20313075c896SRyan Stone 20323075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 20333075c896SRyan Stone ATF_REQUIRE(nvlist_get_string(nvl, key) != value); 20343075c896SRyan Stone 20353075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 20363075c896SRyan Stone it = NULL; 20373075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 20383075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 20393075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 20403075c896SRyan Stone 20413075c896SRyan Stone nvlist_destroy(nvl); 20423075c896SRyan Stone } 20433075c896SRyan Stone 20443075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert); 20453075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert) 20463075c896SRyan Stone { 20473075c896SRyan Stone nvlist_t *nvl; 20483075c896SRyan Stone void *it; 20493075c896SRyan Stone const char *key, *subkey; 20503075c896SRyan Stone nvlist_t *sublist; 20513075c896SRyan Stone const nvlist_t *value; 20523075c896SRyan Stone int type; 20533075c896SRyan Stone 20543075c896SRyan Stone key = "test"; 20553075c896SRyan Stone subkey = "subkey"; 20563075c896SRyan Stone sublist = nvlist_create(0); 20573075c896SRyan Stone nvl = nvlist_create(0); 20583075c896SRyan Stone 20593075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 20603075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 20613075c896SRyan Stone 20623075c896SRyan Stone nvlist_add_null(sublist, subkey); 20633075c896SRyan Stone nvlist_add_nvlist(nvl, key, sublist); 20643075c896SRyan Stone 20653075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 20663075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 20673075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 20683075c896SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, key)); 20693075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key)); 20703075c896SRyan Stone 20713075c896SRyan Stone value = nvlist_get_nvlist(nvl, key); 20723075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(value, subkey)); 20733075c896SRyan Stone 20743075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 20753075c896SRyan Stone ATF_REQUIRE(sublist != value); 20763075c896SRyan Stone 20773075c896SRyan Stone value = nvlist_getf_nvlist(nvl, "%s", key); 20783075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(value, subkey)); 20793075c896SRyan Stone ATF_REQUIRE(sublist != value); 20803075c896SRyan Stone 20813075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 20823075c896SRyan Stone it = NULL; 20833075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 20843075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 20853075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 20863075c896SRyan Stone 20873075c896SRyan Stone nvlist_destroy(sublist); 20883075c896SRyan Stone nvlist_destroy(nvl); 20893075c896SRyan Stone } 20903075c896SRyan Stone 20913075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert); 20923075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert) 20933075c896SRyan Stone { 20943075c896SRyan Stone nvlist_t *nvl; 20953075c896SRyan Stone void *it; 20963075c896SRyan Stone const char *key; 20973075c896SRyan Stone void *value; 20983075c896SRyan Stone const void *ret_value; 20993075c896SRyan Stone size_t value_size, ret_size; 21003075c896SRyan Stone int type; 21013075c896SRyan Stone 21023075c896SRyan Stone key = "binary"; 21033075c896SRyan Stone value_size = 13; 21043075c896SRyan Stone value = malloc(value_size); 21053075c896SRyan Stone memset(value, 0xa5, value_size); 21063075c896SRyan Stone nvl = nvlist_create(0); 21073075c896SRyan Stone 21083075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 21093075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 21103075c896SRyan Stone 21113075c896SRyan Stone nvlist_add_binary(nvl, key, value, value_size); 21123075c896SRyan Stone 21133075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 21143075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 21153075c896SRyan Stone ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 21163075c896SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, key)); 21173075c896SRyan Stone ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key)); 21183075c896SRyan Stone 21193075c896SRyan Stone ret_value = nvlist_get_binary(nvl, key, &ret_size); 21203075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 21213075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 21223075c896SRyan Stone 21233075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 21243075c896SRyan Stone ATF_REQUIRE(value != ret_value); 21253075c896SRyan Stone 21263075c896SRyan Stone ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key); 21273075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 21283075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 21293075c896SRyan Stone ATF_REQUIRE(value != ret_value); 21303075c896SRyan Stone 21313075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 21323075c896SRyan Stone it = NULL; 21333075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 21343075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 21353075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), NULL); 21363075c896SRyan Stone 21373075c896SRyan Stone nvlist_destroy(nvl); 21383075c896SRyan Stone free(value); 21393075c896SRyan Stone } 21403075c896SRyan Stone 21413075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist); 21423075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist) 21433075c896SRyan Stone { 21443075c896SRyan Stone nvlist_t *nvl, *clone; 21453075c896SRyan Stone 21463075c896SRyan Stone nvl = nvlist_create(0); 21473075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 21483075c896SRyan Stone 21493075c896SRyan Stone clone = nvlist_clone(nvl); 21503075c896SRyan Stone ATF_REQUIRE(clone != NULL); 21513075c896SRyan Stone ATF_REQUIRE(clone != nvl); 21523075c896SRyan Stone ATF_REQUIRE(nvlist_empty(clone)); 21533075c896SRyan Stone 21543075c896SRyan Stone nvlist_destroy(clone); 21553075c896SRyan Stone nvlist_destroy(nvl); 21563075c896SRyan Stone } 21573075c896SRyan Stone 21583075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist); 21593075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist) 21603075c896SRyan Stone { 21613075c896SRyan Stone nvlist_t *nvl, *clone; 21623075c896SRyan Stone const char *key; 21633075c896SRyan Stone void *it; 21643075c896SRyan Stone uint64_t value; 21653075c896SRyan Stone int type; 21663075c896SRyan Stone 21673075c896SRyan Stone nvl = nvlist_create(0); 21683075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 21693075c896SRyan Stone 21703075c896SRyan Stone key = "testkey"; 21713075c896SRyan Stone value = 684874; 21723075c896SRyan Stone nvlist_add_number(nvl, key, value); 21733075c896SRyan Stone 21743075c896SRyan Stone clone = nvlist_clone(nvl); 21753075c896SRyan Stone ATF_REQUIRE(clone != NULL); 21763075c896SRyan Stone ATF_REQUIRE(clone != nvl); 21773075c896SRyan Stone ATF_REQUIRE(nvlist_exists_number(clone, key)); 21783075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value); 21793075c896SRyan Stone 21803075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 21813075c896SRyan Stone it = NULL; 21823075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0); 21833075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 21843075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), NULL); 21853075c896SRyan Stone 21863075c896SRyan Stone nvlist_destroy(clone); 21873075c896SRyan Stone nvlist_destroy(nvl); 21883075c896SRyan Stone } 21893075c896SRyan Stone 21903075c896SRyan Stone static const char * const test_subnvlist_key = "nvlist"; 21913075c896SRyan Stone 21923075c896SRyan Stone static const char * const test_string_key = "string"; 21933075c896SRyan Stone static const char * const test_string_val = "59525"; 21943075c896SRyan Stone 21953075c896SRyan Stone static nvlist_t* 21963075c896SRyan Stone create_test_nvlist(void) 21973075c896SRyan Stone { 21983075c896SRyan Stone nvlist_t *nvl, *sublist; 21993075c896SRyan Stone 22003075c896SRyan Stone nvl = nvlist_create(0); 22013075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 22023075c896SRyan Stone 22033075c896SRyan Stone sublist = nvlist_create(0); 22043075c896SRyan Stone ATF_REQUIRE(sublist != NULL); 22053075c896SRyan Stone 22063075c896SRyan Stone nvlist_add_string(sublist, test_string_key, test_string_val); 22073075c896SRyan Stone nvlist_move_nvlist(nvl, test_subnvlist_key, sublist); 22083075c896SRyan Stone 22093075c896SRyan Stone return (nvl); 22103075c896SRyan Stone } 22113075c896SRyan Stone 22123075c896SRyan Stone static void 22133075c896SRyan Stone verify_test_nvlist(const nvlist_t *nvl) 22143075c896SRyan Stone { 22153075c896SRyan Stone void *it; 22163075c896SRyan Stone const nvlist_t *value; 22173075c896SRyan Stone int type; 22183075c896SRyan Stone 22193075c896SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key)); 22203075c896SRyan Stone 22213075c896SRyan Stone value = nvlist_get_nvlist(nvl, test_subnvlist_key); 22223075c896SRyan Stone 22233075c896SRyan Stone ATF_REQUIRE(nvlist_exists_string(value, test_string_key)); 22243075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0); 22253075c896SRyan Stone ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val); 22263075c896SRyan Stone 22273075c896SRyan Stone /* Iterate over both nvlists; ensure that each has only the one key. */ 22283075c896SRyan Stone it = NULL; 22293075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it), 22303075c896SRyan Stone test_string_key), 0); 22313075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 22323075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), NULL); 22333075c896SRyan Stone 22343075c896SRyan Stone it = NULL; 22353075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), 22363075c896SRyan Stone test_subnvlist_key), 0); 22373075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 22383075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), NULL); 22393075c896SRyan Stone } 22403075c896SRyan Stone 22413075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist); 22423075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist) 22433075c896SRyan Stone { 22443075c896SRyan Stone nvlist_t *nvl, *clone; 22453075c896SRyan Stone 22463075c896SRyan Stone nvl = create_test_nvlist(); 22473075c896SRyan Stone clone = nvlist_clone(nvl); 22483075c896SRyan Stone 22493075c896SRyan Stone ATF_REQUIRE(clone != NULL); 22503075c896SRyan Stone ATF_REQUIRE(clone != nvl); 22513075c896SRyan Stone verify_test_nvlist(clone); 22523075c896SRyan Stone 22533075c896SRyan Stone nvlist_destroy(clone); 22543075c896SRyan Stone nvlist_destroy(nvl); 22553075c896SRyan Stone } 22563075c896SRyan Stone 22573075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist); 22583075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist) 22593075c896SRyan Stone { 22603075c896SRyan Stone nvlist_t *nvl, *unpacked; 22613075c896SRyan Stone void *packed; 22623075c896SRyan Stone size_t packed_size; 22633075c896SRyan Stone 22643075c896SRyan Stone nvl = nvlist_create(0); 22653075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 22663075c896SRyan Stone 22673075c896SRyan Stone packed = nvlist_pack(nvl, &packed_size); 22683075c896SRyan Stone ATF_REQUIRE(packed != NULL); 22693075c896SRyan Stone 22703075c896SRyan Stone unpacked = nvlist_unpack(packed, packed_size); 22713075c896SRyan Stone ATF_REQUIRE(unpacked != NULL); 22723075c896SRyan Stone ATF_REQUIRE(unpacked != nvl); 22733075c896SRyan Stone ATF_REQUIRE(nvlist_empty(unpacked)); 22743075c896SRyan Stone 22753075c896SRyan Stone nvlist_destroy(unpacked); 22763075c896SRyan Stone nvlist_destroy(nvl); 22773075c896SRyan Stone free(packed); 22783075c896SRyan Stone } 22793075c896SRyan Stone 22803075c896SRyan Stone static void 22813075c896SRyan Stone verify_null(const nvlist_t *nvl, int type) 22823075c896SRyan Stone { 22833075c896SRyan Stone 22843075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 22853075c896SRyan Stone } 22863075c896SRyan Stone 22873075c896SRyan Stone static void 22883075c896SRyan Stone verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value) 22893075c896SRyan Stone { 22903075c896SRyan Stone 22913075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 22923075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value); 22933075c896SRyan Stone } 22943075c896SRyan Stone 22953075c896SRyan Stone static void 22963075c896SRyan Stone verify_string(const nvlist_t *nvl, const char *name, int type, 22973075c896SRyan Stone const char * value) 22983075c896SRyan Stone { 22993075c896SRyan Stone 23003075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 23013075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0); 23023075c896SRyan Stone } 23033075c896SRyan Stone 23043075c896SRyan Stone static void 23053075c896SRyan Stone verify_nvlist(const nvlist_t *nvl, const char *name, int type) 23063075c896SRyan Stone { 23073075c896SRyan Stone 23083075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 23093075c896SRyan Stone verify_test_nvlist(nvlist_get_nvlist(nvl, name)); 23103075c896SRyan Stone } 23113075c896SRyan Stone 23123075c896SRyan Stone static void 23133075c896SRyan Stone verify_binary(const nvlist_t *nvl, const char *name, int type, 23143075c896SRyan Stone const void * value, size_t size) 23153075c896SRyan Stone { 23163075c896SRyan Stone const void *actual_value; 23173075c896SRyan Stone size_t actual_size; 23183075c896SRyan Stone 23193075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 23203075c896SRyan Stone actual_value = nvlist_get_binary(nvl, name, &actual_size); 23213075c896SRyan Stone ATF_REQUIRE_EQ(size, actual_size); 23223075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0); 23233075c896SRyan Stone } 23243075c896SRyan Stone 23253075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values); 23263075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__multiple_values) 23273075c896SRyan Stone { 23283075c896SRyan Stone std::ostringstream msg; 23293075c896SRyan Stone std::set<std::string> keys_seen; 23303075c896SRyan Stone nvlist_t *nvl, *unpacked, *nvvalue; 23313075c896SRyan Stone const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name; 23323075c896SRyan Stone int numvalue; 23333075c896SRyan Stone const char * strvalue; 23343075c896SRyan Stone void *binvalue, *packed, *it; 23353075c896SRyan Stone size_t binsize, packed_size; 23363075c896SRyan Stone int type; 23373075c896SRyan Stone 23383075c896SRyan Stone nvl = nvlist_create(0); 23393075c896SRyan Stone 23403075c896SRyan Stone nullkey = "null"; 23413075c896SRyan Stone nvlist_add_null(nvl, nullkey); 23423075c896SRyan Stone 23433075c896SRyan Stone numkey = "number"; 23443075c896SRyan Stone numvalue = 939853984; 23453075c896SRyan Stone nvlist_add_number(nvl, numkey, numvalue); 23463075c896SRyan Stone 23473075c896SRyan Stone strkey = "string"; 23483075c896SRyan Stone strvalue = "jfieutijf"; 23493075c896SRyan Stone nvlist_add_string(nvl, strkey, strvalue); 23503075c896SRyan Stone 23513075c896SRyan Stone nvkey = "nvlist"; 23523075c896SRyan Stone nvvalue = create_test_nvlist(); 23533075c896SRyan Stone nvlist_move_nvlist(nvl, nvkey, nvvalue); 23543075c896SRyan Stone 23553075c896SRyan Stone binkey = "binary"; 23563075c896SRyan Stone binsize = 4; 23573075c896SRyan Stone binvalue = malloc(binsize); 23583075c896SRyan Stone memset(binvalue, 'b', binsize); 23593075c896SRyan Stone nvlist_move_binary(nvl, binkey, binvalue, binsize); 23603075c896SRyan Stone 23613075c896SRyan Stone packed = nvlist_pack(nvl, &packed_size); 23623075c896SRyan Stone ATF_REQUIRE(packed != NULL); 23633075c896SRyan Stone 23643075c896SRyan Stone unpacked = nvlist_unpack(packed, packed_size); 23653075c896SRyan Stone ATF_REQUIRE(unpacked != 0); 23663075c896SRyan Stone 23673075c896SRyan Stone it = NULL; 23683075c896SRyan Stone while ((name = nvlist_next(unpacked, &type, &it)) != NULL) { 23693075c896SRyan Stone /* Ensure that we see every key only once. */ 23703075c896SRyan Stone ATF_REQUIRE_EQ(keys_seen.count(name), 0); 23713075c896SRyan Stone 23723075c896SRyan Stone if (strcmp(name, nullkey) == 0) 23733075c896SRyan Stone verify_null(unpacked, type); 23743075c896SRyan Stone else if (strcmp(name, numkey) == 0) 23753075c896SRyan Stone verify_number(unpacked, name, type, numvalue); 23763075c896SRyan Stone else if (strcmp(name, strkey) == 0) 23773075c896SRyan Stone verify_string(unpacked, name, type, strvalue); 23783075c896SRyan Stone else if (strcmp(name, nvkey) == 0) 23793075c896SRyan Stone verify_nvlist(unpacked, name, type); 23803075c896SRyan Stone else if (strcmp(name, binkey) == 0) 23813075c896SRyan Stone verify_binary(unpacked, name, type, binvalue, binsize); 23823075c896SRyan Stone else { 23833075c896SRyan Stone msg << "Unexpected key :'" << name << "'"; 23843075c896SRyan Stone ATF_FAIL(msg.str().c_str()); 23853075c896SRyan Stone } 23863075c896SRyan Stone 23873075c896SRyan Stone keys_seen.insert(name); 23883075c896SRyan Stone } 23893075c896SRyan Stone 23903075c896SRyan Stone /* Ensure that we saw every key. */ 23913075c896SRyan Stone ATF_REQUIRE_EQ(keys_seen.size(), 5); 23923075c896SRyan Stone 23933075c896SRyan Stone nvlist_destroy(nvl); 23943075c896SRyan Stone nvlist_destroy(unpacked); 23953075c896SRyan Stone free(packed); 23963075c896SRyan Stone } 23973075c896SRyan Stone 23983075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key); 23993075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key) 24003075c896SRyan Stone { 24013075c896SRyan Stone nvlist_t *nvl, *unpacked; 24023075c896SRyan Stone const char *key1, *key2; 24033075c896SRyan Stone void *packed, *keypos; 24043075c896SRyan Stone size_t size, keylen; 24053075c896SRyan Stone 24063075c896SRyan Stone nvl = nvlist_create(0); 24073075c896SRyan Stone 24083075c896SRyan Stone key1 = "key1"; 24093075c896SRyan Stone keylen = strlen(key1); 24103075c896SRyan Stone nvlist_add_number(nvl, key1, 5); 24113075c896SRyan Stone 24123075c896SRyan Stone key2 = "key2"; 24133075c896SRyan Stone ATF_REQUIRE_EQ(keylen, strlen(key2)); 24143075c896SRyan Stone nvlist_add_number(nvl, key2, 10); 24153075c896SRyan Stone 24163075c896SRyan Stone packed = nvlist_pack(nvl, &size); 24173075c896SRyan Stone 24183075c896SRyan Stone /* 24193075c896SRyan Stone * Mangle the packed nvlist by replacing key1 with key2, creating a 24203075c896SRyan Stone * packed nvlist with a duplicate key. 24213075c896SRyan Stone */ 24223075c896SRyan Stone keypos = memmem(packed, size, key1, keylen); 24233075c896SRyan Stone ATF_REQUIRE(keypos != NULL); 24243075c896SRyan Stone memcpy(keypos, key2, keylen); 24253075c896SRyan Stone 24263075c896SRyan Stone unpacked = nvlist_unpack(packed, size); 24273075c896SRyan Stone ATF_REQUIRE(nvlist_error(unpacked) != 0); 24283075c896SRyan Stone 24293075c896SRyan Stone free(packed); 24303075c896SRyan Stone nvlist_destroy(nvl); 24313075c896SRyan Stone nvlist_destroy(unpacked); 24323075c896SRyan Stone } 24333075c896SRyan Stone 24343075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert); 24353075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_string__single_insert) 24363075c896SRyan Stone { 24373075c896SRyan Stone nvlist_t *nvl; 24383075c896SRyan Stone const char *key; 24393075c896SRyan Stone char *value; 24403075c896SRyan Stone 24413075c896SRyan Stone nvl = nvlist_create(0); 24423075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 24433075c896SRyan Stone 24443075c896SRyan Stone key = "testkey"; 24453075c896SRyan Stone value = strdup("testval"); 24463075c896SRyan Stone ATF_REQUIRE(value != NULL); 24473075c896SRyan Stone 24483075c896SRyan Stone nvlist_move_string(nvl, key, value); 24493075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value); 24503075c896SRyan Stone 24513075c896SRyan Stone nvlist_destroy(nvl); 24523075c896SRyan Stone } 24533075c896SRyan Stone 24543075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child); 24553075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child) 24563075c896SRyan Stone { 24573075c896SRyan Stone nvlist_t *parent; 24583075c896SRyan Stone 24593075c896SRyan Stone parent = nvlist_create(0); 24603075c896SRyan Stone 24613075c896SRyan Stone nvlist_move_nvlist(parent, "test", NULL); 24623075c896SRyan Stone 24633075c896SRyan Stone ATF_REQUIRE(nvlist_error(parent) != 0); 24643075c896SRyan Stone 24653075c896SRyan Stone nvlist_destroy(parent); 24663075c896SRyan Stone } 24673075c896SRyan Stone 24683075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert); 24693075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert) 24703075c896SRyan Stone { 24713075c896SRyan Stone nvlist_t *nvl; 24723075c896SRyan Stone const char *key; 24733075c896SRyan Stone nvlist_t *value; 24743075c896SRyan Stone 24753075c896SRyan Stone nvl = nvlist_create(0); 24763075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 24773075c896SRyan Stone 24783075c896SRyan Stone key = "testkey"; 24793075c896SRyan Stone value = nvlist_create(0); 24803075c896SRyan Stone ATF_REQUIRE(value != NULL); 24813075c896SRyan Stone 24823075c896SRyan Stone nvlist_move_nvlist(nvl, key, value); 24833075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value); 24843075c896SRyan Stone 24853075c896SRyan Stone nvlist_destroy(nvl); 24863075c896SRyan Stone } 24873075c896SRyan Stone 24883075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert); 24893075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert) 24903075c896SRyan Stone { 24913075c896SRyan Stone nvlist_t *nvl; 24923075c896SRyan Stone const char *key; 24933075c896SRyan Stone void *value; 24943075c896SRyan Stone size_t size, actual_size; 24953075c896SRyan Stone 24963075c896SRyan Stone nvl = nvlist_create(0); 24973075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 24983075c896SRyan Stone 24993075c896SRyan Stone key = "testkey"; 25003075c896SRyan Stone size = 73; 25013075c896SRyan Stone value = malloc(size); 25023075c896SRyan Stone ATF_REQUIRE(value != NULL); 25033075c896SRyan Stone 25043075c896SRyan Stone nvlist_move_binary(nvl, key, value, size); 25053075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value); 25063075c896SRyan Stone ATF_REQUIRE_EQ(size, actual_size); 25073075c896SRyan Stone 25083075c896SRyan Stone nvlist_destroy(nvl); 25093075c896SRyan Stone } 25103075c896SRyan Stone 25113075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove); 25123075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove) 25133075c896SRyan Stone { 25143075c896SRyan Stone nvlist_t *nvl; 25153075c896SRyan Stone const char *testkey; 25163075c896SRyan Stone bool testval; 25173075c896SRyan Stone 25183075c896SRyan Stone nvl = nvlist_create(0); 25193075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 25203075c896SRyan Stone 25213075c896SRyan Stone testkey = "boolkey"; 25223075c896SRyan Stone testval = false; 25233075c896SRyan Stone nvlist_add_bool(nvl, testkey, testval); 25243075c896SRyan Stone 25253075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 25263075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 25273075c896SRyan Stone 25283075c896SRyan Stone nvlist_destroy(nvl); 25293075c896SRyan Stone } 25303075c896SRyan Stone 25313075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged); 25323075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged) 25333075c896SRyan Stone { 25343075c896SRyan Stone nvlist_t *nvl; 25353075c896SRyan Stone const char *testkey, *otherkey1, *otherkey2; 25363075c896SRyan Stone bool testval, otherval1; 25373075c896SRyan Stone nvlist_t *otherval2; 25383075c896SRyan Stone 25393075c896SRyan Stone nvl = nvlist_create(0); 25403075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 25413075c896SRyan Stone 25423075c896SRyan Stone testkey = "boolkey"; 25433075c896SRyan Stone testval = true; 25443075c896SRyan Stone nvlist_add_bool(nvl, testkey, testval); 25453075c896SRyan Stone 25463075c896SRyan Stone otherkey1 = "key1"; 25473075c896SRyan Stone otherval1 = false; 25483075c896SRyan Stone nvlist_add_bool(nvl, otherkey1, otherval1); 25493075c896SRyan Stone 25503075c896SRyan Stone otherkey2 = "key2"; 25513075c896SRyan Stone otherval2 = create_test_nvlist(); 25523075c896SRyan Stone nvlist_move_nvlist(nvl, otherkey2, otherval2); 25533075c896SRyan Stone 25543075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 25553075c896SRyan Stone 25563075c896SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1)); 25573075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1); 25583075c896SRyan Stone 25593075c896SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2)); 25603075c896SRyan Stone verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2)); 25613075c896SRyan Stone 25623075c896SRyan Stone nvlist_destroy(nvl); 25633075c896SRyan Stone } 25643075c896SRyan Stone 25653075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove); 25663075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__single_remove) 25673075c896SRyan Stone { 25683075c896SRyan Stone nvlist_t *nvl; 25693075c896SRyan Stone const char *testkey; 25703075c896SRyan Stone uint64_t testval; 25713075c896SRyan Stone 25723075c896SRyan Stone nvl = nvlist_create(0); 25733075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 25743075c896SRyan Stone 25753075c896SRyan Stone testkey = "numkey"; 25763075c896SRyan Stone testval = std::numeric_limits<uint64_t>::max(); 25773075c896SRyan Stone nvlist_add_number(nvl, testkey, testval); 25783075c896SRyan Stone 25793075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 25803075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 25813075c896SRyan Stone 25823075c896SRyan Stone nvlist_destroy(nvl); 25833075c896SRyan Stone } 25843075c896SRyan Stone 25853075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged); 25863075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged) 25873075c896SRyan Stone { 25883075c896SRyan Stone nvlist_t *nvl; 25893075c896SRyan Stone const char *testkey, *otherkey1, *otherkey2; 25903075c896SRyan Stone uint64_t testval, otherval1; 25913075c896SRyan Stone const char *otherval2; 25923075c896SRyan Stone 25933075c896SRyan Stone nvl = nvlist_create(0); 25943075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 25953075c896SRyan Stone 25963075c896SRyan Stone otherkey1 = "key1"; 25973075c896SRyan Stone otherval1 = 5; 25983075c896SRyan Stone nvlist_add_number(nvl, otherkey1, otherval1); 25993075c896SRyan Stone 26003075c896SRyan Stone testkey = "numkey"; 26013075c896SRyan Stone testval = 1654; 26023075c896SRyan Stone nvlist_add_number(nvl, testkey, testval); 26033075c896SRyan Stone 26043075c896SRyan Stone otherkey2 = "key2"; 26053075c896SRyan Stone otherval2 = "string"; 26063075c896SRyan Stone nvlist_add_string(nvl, otherkey2, otherval2); 26073075c896SRyan Stone 26083075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 26093075c896SRyan Stone 26103075c896SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1)); 26113075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1); 26123075c896SRyan Stone 26133075c896SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2)); 26143075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0); 26153075c896SRyan Stone 26163075c896SRyan Stone nvlist_destroy(nvl); 26173075c896SRyan Stone } 26183075c896SRyan Stone 26193075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove); 26203075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__single_remove) 26213075c896SRyan Stone { 26223075c896SRyan Stone nvlist_t *nvl; 26233075c896SRyan Stone const char *testkey; 26243075c896SRyan Stone const char *testval; 26253075c896SRyan Stone 26263075c896SRyan Stone nvl = nvlist_create(0); 26273075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 26283075c896SRyan Stone 26293075c896SRyan Stone testkey = "numkey"; 26303075c896SRyan Stone testval = "nvlist"; 26313075c896SRyan Stone nvlist_add_string(nvl, testkey, testval); 26323075c896SRyan Stone 26333075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 26343075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 26353075c896SRyan Stone 26363075c896SRyan Stone nvlist_destroy(nvl); 26373075c896SRyan Stone } 26383075c896SRyan Stone 26393075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged); 26403075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged) 26413075c896SRyan Stone { 26423075c896SRyan Stone nvlist_t *nvl; 26433075c896SRyan Stone const char *testkey, *otherkey1, *otherkey2; 26443075c896SRyan Stone const char *testval, *otherval1; 26453075c896SRyan Stone bool otherval2; 26463075c896SRyan Stone 26473075c896SRyan Stone nvl = nvlist_create(0); 26483075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 26493075c896SRyan Stone 26503075c896SRyan Stone otherkey1 = "key1"; 26513075c896SRyan Stone otherval1 = "fjdifjdk"; 26523075c896SRyan Stone nvlist_add_string(nvl, otherkey1, otherval1); 26533075c896SRyan Stone 26543075c896SRyan Stone otherkey2 = "key2"; 26553075c896SRyan Stone otherval2 = true; 26563075c896SRyan Stone nvlist_add_bool(nvl, otherkey2, otherval2); 26573075c896SRyan Stone 26583075c896SRyan Stone testkey = "strkey"; 26593075c896SRyan Stone testval = "1654"; 26603075c896SRyan Stone nvlist_add_string(nvl, testkey, testval); 26613075c896SRyan Stone 26623075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 26633075c896SRyan Stone 26643075c896SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1)); 26653075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0); 26663075c896SRyan Stone 26673075c896SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 26683075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 26693075c896SRyan Stone 26703075c896SRyan Stone nvlist_destroy(nvl); 26713075c896SRyan Stone } 26723075c896SRyan Stone 26733075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove); 26743075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove) 26753075c896SRyan Stone { 26763075c896SRyan Stone nvlist_t *nvl; 26773075c896SRyan Stone const char *testkey; 26783075c896SRyan Stone nvlist_t *testval; 26793075c896SRyan Stone 26803075c896SRyan Stone nvl = nvlist_create(0); 26813075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 26823075c896SRyan Stone 26833075c896SRyan Stone testkey = "numkey"; 26843075c896SRyan Stone testval = create_test_nvlist(); 26853075c896SRyan Stone nvlist_move_nvlist(nvl, testkey, testval); 26863075c896SRyan Stone 26873075c896SRyan Stone verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 26883075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 26893075c896SRyan Stone 26903075c896SRyan Stone nvlist_destroy(nvl); 26913075c896SRyan Stone } 26923075c896SRyan Stone 26933075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged); 26943075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged) 26953075c896SRyan Stone { 26963075c896SRyan Stone nvlist_t *nvl; 26973075c896SRyan Stone const char *testkey, *otherkey1, *otherkey2; 26983075c896SRyan Stone nvlist_t *testval, *otherval1; 26993075c896SRyan Stone 27003075c896SRyan Stone nvl = nvlist_create(0); 27013075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 27023075c896SRyan Stone 27033075c896SRyan Stone testkey = "strkey"; 27043075c896SRyan Stone testval = create_test_nvlist(); 27053075c896SRyan Stone nvlist_move_nvlist(nvl, testkey, testval); 27063075c896SRyan Stone 27073075c896SRyan Stone otherkey1 = "key1"; 27083075c896SRyan Stone otherval1 = nvlist_create(0); 27093075c896SRyan Stone nvlist_move_nvlist(nvl, otherkey1, otherval1); 27103075c896SRyan Stone 27113075c896SRyan Stone otherkey2 = "key2"; 27123075c896SRyan Stone nvlist_add_null(nvl, otherkey2); 27133075c896SRyan Stone 27143075c896SRyan Stone verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 27153075c896SRyan Stone 27163075c896SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1)); 27173075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1))); 27183075c896SRyan Stone 27193075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2)); 27203075c896SRyan Stone 27213075c896SRyan Stone nvlist_destroy(nvl); 27223075c896SRyan Stone } 27233075c896SRyan Stone 27243075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove); 27253075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove) 27263075c896SRyan Stone { 27273075c896SRyan Stone nvlist_t *nvl; 27283075c896SRyan Stone const char *testkey; 27293075c896SRyan Stone void *testval; 27303075c896SRyan Stone const void *actual_val; 27313075c896SRyan Stone size_t testsize, actual_size; 27323075c896SRyan Stone 27333075c896SRyan Stone nvl = nvlist_create(0); 27343075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 27353075c896SRyan Stone 27363075c896SRyan Stone testkey = "numkey"; 27373075c896SRyan Stone testsize = 457; 27383075c896SRyan Stone testval = malloc(testsize); 27393075c896SRyan Stone memset(testval, '5', testsize); 27403075c896SRyan Stone nvlist_move_binary(nvl, testkey, testval, testsize); 27413075c896SRyan Stone 27423075c896SRyan Stone actual_val = nvlist_take_binary(nvl, testkey, &actual_size); 27433075c896SRyan Stone ATF_REQUIRE_EQ(testsize, actual_size); 27443075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0); 27453075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 27463075c896SRyan Stone 27473075c896SRyan Stone nvlist_destroy(nvl); 27483075c896SRyan Stone } 27493075c896SRyan Stone 27503075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged); 27513075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged) 27523075c896SRyan Stone { 27533075c896SRyan Stone nvlist_t *nvl; 27543075c896SRyan Stone const char *testkey, *otherkey1, *otherkey2; 27553075c896SRyan Stone const void *actual_value; 27563075c896SRyan Stone char testval[] = "gjiertj"; 27573075c896SRyan Stone char otherval1[] = "fdreg"; 27583075c896SRyan Stone size_t testsize, othersize, actual_size; 27593075c896SRyan Stone bool otherval2; 27603075c896SRyan Stone 27613075c896SRyan Stone nvl = nvlist_create(0); 27623075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 27633075c896SRyan Stone 27643075c896SRyan Stone otherkey1 = "key1"; 27653075c896SRyan Stone othersize = sizeof(otherval1); 27663075c896SRyan Stone nvlist_add_binary(nvl, otherkey1, otherval1, othersize); 27673075c896SRyan Stone 27683075c896SRyan Stone otherkey2 = "key2"; 27693075c896SRyan Stone otherval2 = true; 27703075c896SRyan Stone nvlist_add_bool(nvl, otherkey2, otherval2); 27713075c896SRyan Stone 27723075c896SRyan Stone testkey = "strkey"; 27733075c896SRyan Stone testsize = sizeof(testval); 27743075c896SRyan Stone nvlist_add_binary(nvl, testkey, testval, testsize); 27753075c896SRyan Stone 27763075c896SRyan Stone actual_value = nvlist_take_binary(nvl, testkey, &actual_size); 27773075c896SRyan Stone ATF_REQUIRE_EQ(testsize, actual_size); 27783075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0); 27793075c896SRyan Stone 27803075c896SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1)); 27813075c896SRyan Stone actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size); 27823075c896SRyan Stone ATF_REQUIRE_EQ(othersize, actual_size); 27833075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0); 27843075c896SRyan Stone 27853075c896SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 27863075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 27873075c896SRyan Stone 27883075c896SRyan Stone nvlist_destroy(nvl); 27893075c896SRyan Stone } 27903075c896SRyan Stone 27913075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null); 27923075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_null) 27933075c896SRyan Stone { 27943075c896SRyan Stone nvlist_t *nvl; 27953075c896SRyan Stone const char *key; 27963075c896SRyan Stone 27973075c896SRyan Stone nvl = nvlist_create(0); 27983075c896SRyan Stone key = "test"; 27993075c896SRyan Stone nvlist_add_null(nvl, key); 28003075c896SRyan Stone 28013075c896SRyan Stone nvlist_free(nvl, key); 28023075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 28033075c896SRyan Stone 28043075c896SRyan Stone nvlist_destroy(nvl); 28053075c896SRyan Stone } 28063075c896SRyan Stone 28073075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool); 28083075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_bool) 28093075c896SRyan Stone { 28103075c896SRyan Stone nvlist_t *nvl; 28113075c896SRyan Stone const char *key; 28123075c896SRyan Stone 28133075c896SRyan Stone nvl = nvlist_create(0); 28143075c896SRyan Stone key = "test"; 28153075c896SRyan Stone nvlist_add_bool(nvl, key, true); 28163075c896SRyan Stone 28173075c896SRyan Stone nvlist_free(nvl, key); 28183075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 28193075c896SRyan Stone 28203075c896SRyan Stone nvlist_destroy(nvl); 28213075c896SRyan Stone } 28223075c896SRyan Stone 28233075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number); 28243075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_number) 28253075c896SRyan Stone { 28263075c896SRyan Stone nvlist_t *nvl; 28273075c896SRyan Stone const char *key; 28283075c896SRyan Stone 28293075c896SRyan Stone nvl = nvlist_create(0); 28303075c896SRyan Stone key = "test"; 28313075c896SRyan Stone nvlist_add_number(nvl, key, 584); 28323075c896SRyan Stone 28333075c896SRyan Stone nvlist_free(nvl, key); 28343075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 28353075c896SRyan Stone 28363075c896SRyan Stone nvlist_destroy(nvl); 28373075c896SRyan Stone } 28383075c896SRyan Stone 28393075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string); 28403075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_string) 28413075c896SRyan Stone { 28423075c896SRyan Stone nvlist_t *nvl; 28433075c896SRyan Stone const char *key; 28443075c896SRyan Stone 28453075c896SRyan Stone nvl = nvlist_create(0); 28463075c896SRyan Stone key = "test"; 28473075c896SRyan Stone nvlist_add_string(nvl, key, "gjkfkjd"); 28483075c896SRyan Stone 28493075c896SRyan Stone nvlist_free(nvl, key); 28503075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 28513075c896SRyan Stone 28523075c896SRyan Stone nvlist_destroy(nvl); 28533075c896SRyan Stone } 28543075c896SRyan Stone 28553075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist); 28563075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_nvlist) 28573075c896SRyan Stone { 28583075c896SRyan Stone nvlist_t *nvl; 28593075c896SRyan Stone const char *key; 28603075c896SRyan Stone 28613075c896SRyan Stone nvl = nvlist_create(0); 28623075c896SRyan Stone key = "test"; 28633075c896SRyan Stone nvlist_add_nvlist(nvl, key, nvlist_create(0)); 28643075c896SRyan Stone 28653075c896SRyan Stone nvlist_free(nvl, key); 28663075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 28673075c896SRyan Stone 28683075c896SRyan Stone nvlist_destroy(nvl); 28693075c896SRyan Stone } 28703075c896SRyan Stone 28713075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary); 28723075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_binary) 28733075c896SRyan Stone { 28743075c896SRyan Stone nvlist_t *nvl; 28753075c896SRyan Stone const char *key; 28763075c896SRyan Stone 28773075c896SRyan Stone nvl = nvlist_create(0); 28783075c896SRyan Stone key = "test"; 28793075c896SRyan Stone nvlist_add_binary(nvl, key, "jgjgfd", 6); 28803075c896SRyan Stone 28813075c896SRyan Stone nvlist_free(nvl, key); 28823075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 28833075c896SRyan Stone 28843075c896SRyan Stone nvlist_destroy(nvl); 28853075c896SRyan Stone } 28863075c896SRyan Stone 28873075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null); 28883075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_null__single_null) 28893075c896SRyan Stone { 28903075c896SRyan Stone nvlist_t *nvl; 28913075c896SRyan Stone const char *key; 28923075c896SRyan Stone 28933075c896SRyan Stone nvl = nvlist_create(0); 28943075c896SRyan Stone key = "test"; 28953075c896SRyan Stone nvlist_add_null(nvl, key); 28963075c896SRyan Stone 28973075c896SRyan Stone nvlist_free_null(nvl, key); 28983075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 28993075c896SRyan Stone 29003075c896SRyan Stone nvlist_destroy(nvl); 29013075c896SRyan Stone } 29023075c896SRyan Stone 29033075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool); 29043075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool) 29053075c896SRyan Stone { 29063075c896SRyan Stone nvlist_t *nvl; 29073075c896SRyan Stone const char *key; 29083075c896SRyan Stone 29093075c896SRyan Stone nvl = nvlist_create(0); 29103075c896SRyan Stone key = "test"; 29113075c896SRyan Stone nvlist_add_bool(nvl, key, true); 29123075c896SRyan Stone 29133075c896SRyan Stone nvlist_free_bool(nvl, key); 29143075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 29153075c896SRyan Stone 29163075c896SRyan Stone nvlist_destroy(nvl); 29173075c896SRyan Stone } 29183075c896SRyan Stone 29193075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number); 29203075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_number__single_number) 29213075c896SRyan Stone { 29223075c896SRyan Stone nvlist_t *nvl; 29233075c896SRyan Stone const char *key; 29243075c896SRyan Stone 29253075c896SRyan Stone nvl = nvlist_create(0); 29263075c896SRyan Stone key = "test"; 29273075c896SRyan Stone nvlist_add_number(nvl, key, 584); 29283075c896SRyan Stone 29293075c896SRyan Stone nvlist_free_number(nvl, key); 29303075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 29313075c896SRyan Stone 29323075c896SRyan Stone nvlist_destroy(nvl); 29333075c896SRyan Stone } 29343075c896SRyan Stone 29353075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string); 29363075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_string__single_string) 29373075c896SRyan Stone { 29383075c896SRyan Stone nvlist_t *nvl; 29393075c896SRyan Stone const char *key; 29403075c896SRyan Stone 29413075c896SRyan Stone nvl = nvlist_create(0); 29423075c896SRyan Stone key = "test"; 29433075c896SRyan Stone nvlist_add_string(nvl, key, "gjkfkjd"); 29443075c896SRyan Stone 29453075c896SRyan Stone nvlist_free_string(nvl, key); 29463075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 29473075c896SRyan Stone 29483075c896SRyan Stone nvlist_destroy(nvl); 29493075c896SRyan Stone } 29503075c896SRyan Stone 29513075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist); 29523075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist) 29533075c896SRyan Stone { 29543075c896SRyan Stone nvlist_t *nvl; 29553075c896SRyan Stone const char *key; 29563075c896SRyan Stone 29573075c896SRyan Stone nvl = nvlist_create(0); 29583075c896SRyan Stone key = "test"; 29593075c896SRyan Stone nvlist_add_nvlist(nvl, key, nvlist_create(0)); 29603075c896SRyan Stone 29613075c896SRyan Stone nvlist_free_nvlist(nvl, key); 29623075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 29633075c896SRyan Stone 29643075c896SRyan Stone nvlist_destroy(nvl); 29653075c896SRyan Stone } 29663075c896SRyan Stone 29673075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary); 29683075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary) 29693075c896SRyan Stone { 29703075c896SRyan Stone nvlist_t *nvl; 29713075c896SRyan Stone const char *key; 29723075c896SRyan Stone 29733075c896SRyan Stone nvl = nvlist_create(0); 29743075c896SRyan Stone key = "test"; 29753075c896SRyan Stone nvlist_add_binary(nvl, key, "jgjgfd", 6); 29763075c896SRyan Stone 29773075c896SRyan Stone nvlist_free_binary(nvl, key); 29783075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 29793075c896SRyan Stone 29803075c896SRyan Stone nvlist_destroy(nvl); 29813075c896SRyan Stone } 29823075c896SRyan Stone 29833075c896SRyan Stone ATF_INIT_TEST_CASES(tp) 29843075c896SRyan Stone { 29853075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty); 29863075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert); 29873075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert); 29883075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert); 29893075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert); 29903075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert); 29913075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert); 29923075c896SRyan Stone 29933075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist); 29943075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist); 29953075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist); 29963075c896SRyan Stone 29973075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist); 29983075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values); 29993075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key); 30003075c896SRyan Stone 30013075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert); 30023075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert); 30033075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child); 30043075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert); 30053075c896SRyan Stone 30063075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove); 30073075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged); 30083075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove); 30093075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged); 30103075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove); 30113075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged); 30123075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove); 30133075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged); 30143075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove); 30153075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged); 30163075c896SRyan Stone 30173075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_null); 30183075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool); 30193075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_number); 30203075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_string); 30213075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist); 30223075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary); 30233075c896SRyan Stone 30243075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null); 30253075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool); 30263075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number); 30273075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string); 30283075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist); 30293075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary); 30303075c896SRyan Stone } 3031