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 30*c36e54bbSMariusz Zaborski #include <sys/nv.h> 31*c36e54bbSMariusz Zaborski 323075c896SRyan Stone #include <atf-c++.hpp> 333075c896SRyan Stone 343075c896SRyan Stone #include <errno.h> 35fad0a264SRyan Stone #include <limits> 366c721f82SRyan Stone #include <set> 376c721f82SRyan Stone #include <sstream> 386c721f82SRyan Stone #include <string> 396c721f82SRyan Stone 403075c896SRyan Stone /* 413075c896SRyan Stone * Test that a newly created nvlist has no errors, and is empty. 423075c896SRyan Stone */ 433075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty); 443075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_create__is_empty) 453075c896SRyan Stone { 463075c896SRyan Stone nvlist_t *nvl; 473075c896SRyan Stone int type; 483075c896SRyan Stone void *it; 493075c896SRyan Stone 503075c896SRyan Stone nvl = nvlist_create(0); 513075c896SRyan Stone 523075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 533075c896SRyan Stone 543075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_error(nvl), 0); 553075c896SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 563075c896SRyan Stone 573075c896SRyan Stone it = NULL; 58bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL)); 593075c896SRyan Stone 603075c896SRyan Stone nvlist_destroy(nvl); 613075c896SRyan Stone } 623075c896SRyan Stone 633075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert); 643075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_null__single_insert) 653075c896SRyan Stone { 663075c896SRyan Stone nvlist_t *nvl; 673075c896SRyan Stone void *it; 683075c896SRyan Stone const char *key; 693075c896SRyan Stone int type; 703075c896SRyan Stone 713075c896SRyan Stone key = "key"; 723075c896SRyan Stone nvl = nvlist_create(0); 733075c896SRyan Stone 743075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 753075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 763075c896SRyan Stone 773075c896SRyan Stone nvlist_add_null(nvl, key); 783075c896SRyan Stone 793075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 803075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 813075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(nvl, key)); 8237c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_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); 88bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 893075c896SRyan Stone 903075c896SRyan Stone nvlist_destroy(nvl); 913075c896SRyan Stone } 923075c896SRyan Stone 933075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert); 943075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert) 953075c896SRyan Stone { 963075c896SRyan Stone nvlist_t *nvl; 973075c896SRyan Stone void *it; 983075c896SRyan Stone const char *key; 993075c896SRyan Stone int type; 1003075c896SRyan Stone 1013075c896SRyan Stone key = "name"; 1023075c896SRyan Stone nvl = nvlist_create(0); 1033075c896SRyan Stone 1043075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 1053075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 1063075c896SRyan Stone 1073075c896SRyan Stone nvlist_add_bool(nvl, key, true); 1083075c896SRyan Stone 1093075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 1103075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 11137c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "name")); 1123075c896SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, key)); 11337c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_bool(nvl, "name")); 1143075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true); 1153075c896SRyan Stone 1163075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 1173075c896SRyan Stone it = NULL; 1183075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 1193075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BOOL); 120bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 1213075c896SRyan Stone 1223075c896SRyan Stone nvlist_destroy(nvl); 1233075c896SRyan Stone } 1243075c896SRyan Stone 1253075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert); 1263075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_number__single_insert) 1273075c896SRyan Stone { 1283075c896SRyan Stone nvlist_t *nvl; 1293075c896SRyan Stone void *it; 1303075c896SRyan Stone const char *key; 1313075c896SRyan Stone uint64_t value; 1323075c896SRyan Stone int type; 1333075c896SRyan Stone 1343075c896SRyan Stone key = "foo123"; 1353075c896SRyan Stone value = 71965; 1363075c896SRyan Stone nvl = nvlist_create(0); 1373075c896SRyan Stone 1383075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 1393075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 1403075c896SRyan Stone 1413075c896SRyan Stone nvlist_add_number(nvl, key, value); 1423075c896SRyan Stone 1433075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 1443075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 14537c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "foo123")); 1463075c896SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, key)); 1473075c896SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value); 1483075c896SRyan Stone 1493075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 1503075c896SRyan Stone it = NULL; 1513075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 1523075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 153bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 1543075c896SRyan Stone 1553075c896SRyan Stone nvlist_destroy(nvl); 1563075c896SRyan Stone } 1573075c896SRyan Stone 1583075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert); 1593075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_string__single_insert) 1603075c896SRyan Stone { 1613075c896SRyan Stone nvlist_t *nvl; 1623075c896SRyan Stone void *it; 1633075c896SRyan Stone const char *key; 1643075c896SRyan Stone const char *value; 1653075c896SRyan Stone int type; 1663075c896SRyan Stone 1673075c896SRyan Stone key = "test"; 1683075c896SRyan Stone value = "fgjdkgjdk"; 1693075c896SRyan Stone nvl = nvlist_create(0); 1703075c896SRyan Stone 1713075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 1723075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 1733075c896SRyan Stone 1743075c896SRyan Stone nvlist_add_string(nvl, key, value); 1753075c896SRyan Stone 1763075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 1773075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 17837c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "test")); 1793075c896SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, key)); 18037c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_string(nvl, "test")); 1813075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0); 1823075c896SRyan Stone 1833075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 1843075c896SRyan Stone ATF_REQUIRE(nvlist_get_string(nvl, key) != value); 1853075c896SRyan Stone 1863075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 1873075c896SRyan Stone it = NULL; 1883075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 1893075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 190bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 1913075c896SRyan Stone 1923075c896SRyan Stone nvlist_destroy(nvl); 1933075c896SRyan Stone } 1943075c896SRyan Stone 1953075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert); 1963075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert) 1973075c896SRyan Stone { 1983075c896SRyan Stone nvlist_t *nvl; 1993075c896SRyan Stone void *it; 2003075c896SRyan Stone const char *key, *subkey; 2013075c896SRyan Stone nvlist_t *sublist; 2023075c896SRyan Stone const nvlist_t *value; 2033075c896SRyan Stone int type; 2043075c896SRyan Stone 2053075c896SRyan Stone key = "test"; 2063075c896SRyan Stone subkey = "subkey"; 2073075c896SRyan Stone sublist = nvlist_create(0); 2083075c896SRyan Stone nvl = nvlist_create(0); 2093075c896SRyan Stone 2103075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 2113075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 2123075c896SRyan Stone 2133075c896SRyan Stone nvlist_add_null(sublist, subkey); 2143075c896SRyan Stone nvlist_add_nvlist(nvl, key, sublist); 2153075c896SRyan Stone 2163075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 2173075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 21837c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "test")); 2193075c896SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, key)); 22037c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_nvlist(nvl, "test")); 2213075c896SRyan Stone 2223075c896SRyan Stone value = nvlist_get_nvlist(nvl, key); 2233075c896SRyan Stone ATF_REQUIRE(nvlist_exists_null(value, subkey)); 2243075c896SRyan Stone 2253075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 2263075c896SRyan Stone ATF_REQUIRE(sublist != value); 2273075c896SRyan Stone 2283075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 2293075c896SRyan Stone it = NULL; 2303075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 2313075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 232bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 2333075c896SRyan Stone 2343075c896SRyan Stone nvlist_destroy(sublist); 2353075c896SRyan Stone nvlist_destroy(nvl); 2363075c896SRyan Stone } 2373075c896SRyan Stone 23819a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error); 23919a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error) 24019a4afb3SRyan Stone { 24119a4afb3SRyan Stone nvlist_t *nvl, *parent; 24219a4afb3SRyan Stone 24319a4afb3SRyan Stone nvl = nvlist_create(0); 24419a4afb3SRyan Stone parent = nvlist_create(0); 24519a4afb3SRyan Stone 24619a4afb3SRyan Stone nvlist_set_error(nvl, EBADF); 24719a4afb3SRyan Stone nvlist_add_nvlist(parent, "test", nvl); 24819a4afb3SRyan Stone ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 24919a4afb3SRyan Stone 25019a4afb3SRyan Stone nvlist_destroy(nvl); 25119a4afb3SRyan Stone nvlist_destroy(parent); 25219a4afb3SRyan Stone } 25319a4afb3SRyan Stone 2543075c896SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert); 2553075c896SRyan Stone ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert) 2563075c896SRyan Stone { 2573075c896SRyan Stone nvlist_t *nvl; 2583075c896SRyan Stone void *it; 2593075c896SRyan Stone const char *key; 2603075c896SRyan Stone void *value; 2613075c896SRyan Stone const void *ret_value; 2623075c896SRyan Stone size_t value_size, ret_size; 2633075c896SRyan Stone int type; 2643075c896SRyan Stone 2653075c896SRyan Stone key = "binary"; 2663075c896SRyan Stone value_size = 13; 2673075c896SRyan Stone value = malloc(value_size); 2683075c896SRyan Stone memset(value, 0xa5, value_size); 2693075c896SRyan Stone nvl = nvlist_create(0); 2703075c896SRyan Stone 2713075c896SRyan Stone ATF_REQUIRE(nvl != NULL); 2723075c896SRyan Stone ATF_REQUIRE(!nvlist_exists(nvl, key)); 2733075c896SRyan Stone 2743075c896SRyan Stone nvlist_add_binary(nvl, key, value, value_size); 2753075c896SRyan Stone 2763075c896SRyan Stone ATF_REQUIRE(!nvlist_empty(nvl)); 2773075c896SRyan Stone ATF_REQUIRE(nvlist_exists(nvl, key)); 27837c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists(nvl, "binary")); 2793075c896SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, key)); 28037c6848cSMariusz Zaborski ATF_REQUIRE(nvlist_exists_binary(nvl, "binary")); 2813075c896SRyan Stone 2823075c896SRyan Stone ret_value = nvlist_get_binary(nvl, key, &ret_size); 2833075c896SRyan Stone ATF_REQUIRE_EQ(value_size, ret_size); 2843075c896SRyan Stone ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 2853075c896SRyan Stone 2863075c896SRyan Stone /* nvlist_add_* is required to clone the value, so check for that. */ 2873075c896SRyan Stone ATF_REQUIRE(value != ret_value); 2883075c896SRyan Stone 2893075c896SRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 2903075c896SRyan Stone it = NULL; 2913075c896SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 2923075c896SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 293bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 2943075c896SRyan Stone 2953075c896SRyan Stone nvlist_destroy(nvl); 2963075c896SRyan Stone free(value); 2973075c896SRyan Stone } 2983075c896SRyan Stone 2996e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist); 3006e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist) 3016e623ffdSRyan Stone { 3026e623ffdSRyan Stone nvlist_t *nvl, *clone; 3036e623ffdSRyan Stone 3046e623ffdSRyan Stone nvl = nvlist_create(0); 3056e623ffdSRyan Stone ATF_REQUIRE(nvl != NULL); 3066e623ffdSRyan Stone 3076e623ffdSRyan Stone clone = nvlist_clone(nvl); 3086e623ffdSRyan Stone ATF_REQUIRE(clone != NULL); 3096e623ffdSRyan Stone ATF_REQUIRE(clone != nvl); 3106e623ffdSRyan Stone ATF_REQUIRE(nvlist_empty(clone)); 3116e623ffdSRyan Stone 3126e623ffdSRyan Stone nvlist_destroy(clone); 3136e623ffdSRyan Stone nvlist_destroy(nvl); 3146e623ffdSRyan Stone } 3156e623ffdSRyan Stone 3166e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist); 3176e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist) 3186e623ffdSRyan Stone { 3196e623ffdSRyan Stone nvlist_t *nvl, *clone; 3206e623ffdSRyan Stone const char *key; 3216e623ffdSRyan Stone void *it; 3226e623ffdSRyan Stone uint64_t value; 3236e623ffdSRyan Stone int type; 3246e623ffdSRyan Stone 3256e623ffdSRyan Stone nvl = nvlist_create(0); 3266e623ffdSRyan Stone ATF_REQUIRE(nvl != NULL); 3276e623ffdSRyan Stone 3286e623ffdSRyan Stone key = "testkey"; 3296e623ffdSRyan Stone value = 684874; 3306e623ffdSRyan Stone nvlist_add_number(nvl, key, value); 3316e623ffdSRyan Stone 3326e623ffdSRyan Stone clone = nvlist_clone(nvl); 3336e623ffdSRyan Stone ATF_REQUIRE(clone != NULL); 3346e623ffdSRyan Stone ATF_REQUIRE(clone != nvl); 3356e623ffdSRyan Stone ATF_REQUIRE(nvlist_exists_number(clone, key)); 3366e623ffdSRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value); 3376e623ffdSRyan Stone 3386e623ffdSRyan Stone /* Iterate over the nvlist; ensure that it has only our one key. */ 3396e623ffdSRyan Stone it = NULL; 3406e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0); 3416e623ffdSRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 342bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL)); 3436e623ffdSRyan Stone 3446e623ffdSRyan Stone nvlist_destroy(clone); 3456e623ffdSRyan Stone nvlist_destroy(nvl); 3466e623ffdSRyan Stone } 3476e623ffdSRyan Stone 3486e623ffdSRyan Stone static const char * const test_subnvlist_key = "nvlist"; 3496e623ffdSRyan Stone 3506e623ffdSRyan Stone static const char * const test_string_key = "string"; 3516e623ffdSRyan Stone static const char * const test_string_val = "59525"; 3526e623ffdSRyan Stone 3536e623ffdSRyan Stone static nvlist_t* 3546e623ffdSRyan Stone create_test_nvlist(void) 3556e623ffdSRyan Stone { 3566e623ffdSRyan Stone nvlist_t *nvl, *sublist; 3576e623ffdSRyan Stone 3586e623ffdSRyan Stone nvl = nvlist_create(0); 3596e623ffdSRyan Stone ATF_REQUIRE(nvl != NULL); 3606e623ffdSRyan Stone 3616e623ffdSRyan Stone sublist = nvlist_create(0); 3626e623ffdSRyan Stone ATF_REQUIRE(sublist != NULL); 3636e623ffdSRyan Stone 3646e623ffdSRyan Stone nvlist_add_string(sublist, test_string_key, test_string_val); 3656e623ffdSRyan Stone nvlist_move_nvlist(nvl, test_subnvlist_key, sublist); 3666e623ffdSRyan Stone 3676e623ffdSRyan Stone return (nvl); 3686e623ffdSRyan Stone } 3696e623ffdSRyan Stone 3706e623ffdSRyan Stone static void 3716e623ffdSRyan Stone verify_test_nvlist(const nvlist_t *nvl) 3726e623ffdSRyan Stone { 3736e623ffdSRyan Stone void *it; 3746e623ffdSRyan Stone const nvlist_t *value; 3756e623ffdSRyan Stone int type; 3766e623ffdSRyan Stone 3776e623ffdSRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key)); 3786e623ffdSRyan Stone 3796e623ffdSRyan Stone value = nvlist_get_nvlist(nvl, test_subnvlist_key); 3806e623ffdSRyan Stone 3816e623ffdSRyan Stone ATF_REQUIRE(nvlist_exists_string(value, test_string_key)); 3826e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0); 3836e623ffdSRyan Stone ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val); 3846e623ffdSRyan Stone 3856e623ffdSRyan Stone /* Iterate over both nvlists; ensure that each has only the one key. */ 3866e623ffdSRyan Stone it = NULL; 3876e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it), 3886e623ffdSRyan Stone test_string_key), 0); 3896e623ffdSRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 390bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL)); 3916e623ffdSRyan Stone 3926e623ffdSRyan Stone it = NULL; 3936e623ffdSRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), 3946e623ffdSRyan Stone test_subnvlist_key), 0); 3956e623ffdSRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 396bf5d6cf0SDimitry Andric ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL)); 3976e623ffdSRyan Stone } 3986e623ffdSRyan Stone 3996e623ffdSRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist); 4006e623ffdSRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist) 4016e623ffdSRyan Stone { 4026e623ffdSRyan Stone nvlist_t *nvl, *clone; 4036e623ffdSRyan Stone 4046e623ffdSRyan Stone nvl = create_test_nvlist(); 4056e623ffdSRyan Stone clone = nvlist_clone(nvl); 4066e623ffdSRyan Stone 4076e623ffdSRyan Stone ATF_REQUIRE(clone != NULL); 4086e623ffdSRyan Stone ATF_REQUIRE(clone != nvl); 4096e623ffdSRyan Stone verify_test_nvlist(clone); 4106e623ffdSRyan Stone 4116e623ffdSRyan Stone nvlist_destroy(clone); 4126e623ffdSRyan Stone nvlist_destroy(nvl); 4136e623ffdSRyan Stone } 4146e623ffdSRyan Stone 415a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist); 416a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist) 417a87e5162SRyan Stone { 418a87e5162SRyan Stone nvlist_t *nvl, *clone; 419a87e5162SRyan Stone 420a87e5162SRyan Stone nvl = nvlist_create(0); 421a87e5162SRyan Stone ATF_REQUIRE(nvl != NULL); 422a87e5162SRyan Stone 423a87e5162SRyan Stone nvlist_set_error(nvl, ENOMEM); 424a87e5162SRyan Stone 425a87e5162SRyan Stone clone = nvlist_clone(nvl); 426a87e5162SRyan Stone ATF_REQUIRE(clone == NULL); 427a87e5162SRyan Stone 428a87e5162SRyan Stone nvlist_destroy(nvl); 429a87e5162SRyan Stone } 430a87e5162SRyan Stone 4316c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist); 4326c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist) 4336c721f82SRyan Stone { 4346c721f82SRyan Stone nvlist_t *nvl, *unpacked; 4356c721f82SRyan Stone void *packed; 4366c721f82SRyan Stone size_t packed_size; 4376c721f82SRyan Stone 4386c721f82SRyan Stone nvl = nvlist_create(0); 4396c721f82SRyan Stone ATF_REQUIRE(nvl != NULL); 4406c721f82SRyan Stone 4416c721f82SRyan Stone packed = nvlist_pack(nvl, &packed_size); 4426c721f82SRyan Stone ATF_REQUIRE(packed != NULL); 4436c721f82SRyan Stone 444bd1da0a0SMariusz Zaborski unpacked = nvlist_unpack(packed, packed_size, 0); 4456c721f82SRyan Stone ATF_REQUIRE(unpacked != NULL); 4466c721f82SRyan Stone ATF_REQUIRE(unpacked != nvl); 4476c721f82SRyan Stone ATF_REQUIRE(nvlist_empty(unpacked)); 4486c721f82SRyan Stone 4496c721f82SRyan Stone nvlist_destroy(unpacked); 4506c721f82SRyan Stone nvlist_destroy(nvl); 4516c721f82SRyan Stone free(packed); 4526c721f82SRyan Stone } 4536c721f82SRyan Stone 45400173c09SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__flags_nvlist); 45500173c09SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_unpack__flags_nvlist) 45600173c09SMariusz Zaborski { 45700173c09SMariusz Zaborski nvlist_t *nvl, *unpacked; 45800173c09SMariusz Zaborski void *packed; 45900173c09SMariusz Zaborski size_t packed_size; 46000173c09SMariusz Zaborski 46100173c09SMariusz Zaborski nvl = nvlist_create(NV_FLAG_NO_UNIQUE); 46200173c09SMariusz Zaborski ATF_REQUIRE(nvl != NULL); 46300173c09SMariusz Zaborski 46400173c09SMariusz Zaborski nvlist_add_bool(nvl, "name", true); 46500173c09SMariusz Zaborski ATF_REQUIRE(!nvlist_empty(nvl)); 46600173c09SMariusz Zaborski ATF_REQUIRE(nvlist_exists_bool(nvl, "name")); 46700173c09SMariusz Zaborski 46800173c09SMariusz Zaborski packed = nvlist_pack(nvl, &packed_size); 46900173c09SMariusz Zaborski ATF_REQUIRE(packed != NULL); 47000173c09SMariusz Zaborski 47100173c09SMariusz Zaborski unpacked = nvlist_unpack(packed, packed_size, 0); 47200173c09SMariusz Zaborski ATF_REQUIRE(unpacked == NULL); 47300173c09SMariusz Zaborski 47400173c09SMariusz Zaborski unpacked = nvlist_unpack(packed, packed_size, NV_FLAG_IGNORE_CASE); 47500173c09SMariusz Zaborski ATF_REQUIRE(unpacked == NULL); 47600173c09SMariusz Zaborski 47700173c09SMariusz Zaborski unpacked = nvlist_unpack(packed, packed_size, NV_FLAG_NO_UNIQUE); 47800173c09SMariusz Zaborski ATF_REQUIRE(unpacked != NULL); 47900173c09SMariusz Zaborski ATF_REQUIRE(unpacked != nvl); 48000173c09SMariusz Zaborski ATF_REQUIRE(!nvlist_empty(unpacked)); 48100173c09SMariusz Zaborski ATF_REQUIRE(nvlist_exists_bool(unpacked, "name")); 48200173c09SMariusz Zaborski 48300173c09SMariusz Zaborski nvlist_destroy(unpacked); 48400173c09SMariusz Zaborski nvlist_destroy(nvl); 48500173c09SMariusz Zaborski free(packed); 48600173c09SMariusz Zaborski } 48700173c09SMariusz Zaborski 4886c721f82SRyan Stone static void 4896c721f82SRyan Stone verify_null(const nvlist_t *nvl, int type) 4906c721f82SRyan Stone { 4916c721f82SRyan Stone 4926c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 4936c721f82SRyan Stone } 4946c721f82SRyan Stone 4956c721f82SRyan Stone static void 4966c721f82SRyan Stone verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value) 4976c721f82SRyan Stone { 4986c721f82SRyan Stone 4996c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 5006c721f82SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value); 5016c721f82SRyan Stone } 5026c721f82SRyan Stone 5036c721f82SRyan Stone static void 5046c721f82SRyan Stone verify_string(const nvlist_t *nvl, const char *name, int type, 5056c721f82SRyan Stone const char * value) 5066c721f82SRyan Stone { 5076c721f82SRyan Stone 5086c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 5096c721f82SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0); 5106c721f82SRyan Stone } 5116c721f82SRyan Stone 5126c721f82SRyan Stone static void 5136c721f82SRyan Stone verify_nvlist(const nvlist_t *nvl, const char *name, int type) 5146c721f82SRyan Stone { 5156c721f82SRyan Stone 5166c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 5176c721f82SRyan Stone verify_test_nvlist(nvlist_get_nvlist(nvl, name)); 5186c721f82SRyan Stone } 5196c721f82SRyan Stone 5206c721f82SRyan Stone static void 5216c721f82SRyan Stone verify_binary(const nvlist_t *nvl, const char *name, int type, 5226c721f82SRyan Stone const void * value, size_t size) 5236c721f82SRyan Stone { 5246c721f82SRyan Stone const void *actual_value; 5256c721f82SRyan Stone size_t actual_size; 5266c721f82SRyan Stone 5276c721f82SRyan Stone ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 5286c721f82SRyan Stone actual_value = nvlist_get_binary(nvl, name, &actual_size); 5296c721f82SRyan Stone ATF_REQUIRE_EQ(size, actual_size); 5306c721f82SRyan Stone ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0); 5316c721f82SRyan Stone } 5326c721f82SRyan Stone 5336c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values); 5346c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__multiple_values) 5356c721f82SRyan Stone { 5366c721f82SRyan Stone std::ostringstream msg; 5376c721f82SRyan Stone std::set<std::string> keys_seen; 5386c721f82SRyan Stone nvlist_t *nvl, *unpacked, *nvvalue; 5396c721f82SRyan Stone const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name; 5406c721f82SRyan Stone int numvalue; 5416c721f82SRyan Stone const char * strvalue; 5426c721f82SRyan Stone void *binvalue, *packed, *it; 5436c721f82SRyan Stone size_t binsize, packed_size; 5446c721f82SRyan Stone int type; 5456c721f82SRyan Stone 5466c721f82SRyan Stone nvl = nvlist_create(0); 5476c721f82SRyan Stone 5486c721f82SRyan Stone nullkey = "null"; 5496c721f82SRyan Stone nvlist_add_null(nvl, nullkey); 5506c721f82SRyan Stone 5516c721f82SRyan Stone numkey = "number"; 5526c721f82SRyan Stone numvalue = 939853984; 5536c721f82SRyan Stone nvlist_add_number(nvl, numkey, numvalue); 5546c721f82SRyan Stone 5556c721f82SRyan Stone strkey = "string"; 5566c721f82SRyan Stone strvalue = "jfieutijf"; 5576c721f82SRyan Stone nvlist_add_string(nvl, strkey, strvalue); 5586c721f82SRyan Stone 5596c721f82SRyan Stone nvkey = "nvlist"; 5606c721f82SRyan Stone nvvalue = create_test_nvlist(); 5616c721f82SRyan Stone nvlist_move_nvlist(nvl, nvkey, nvvalue); 5626c721f82SRyan Stone 5636c721f82SRyan Stone binkey = "binary"; 5646c721f82SRyan Stone binsize = 4; 5656c721f82SRyan Stone binvalue = malloc(binsize); 5666c721f82SRyan Stone memset(binvalue, 'b', binsize); 5676c721f82SRyan Stone nvlist_move_binary(nvl, binkey, binvalue, binsize); 5686c721f82SRyan Stone 5696c721f82SRyan Stone packed = nvlist_pack(nvl, &packed_size); 5706c721f82SRyan Stone ATF_REQUIRE(packed != NULL); 5716c721f82SRyan Stone 572bd1da0a0SMariusz Zaborski unpacked = nvlist_unpack(packed, packed_size, 0); 5736c721f82SRyan Stone ATF_REQUIRE(unpacked != 0); 5746c721f82SRyan Stone 5756c721f82SRyan Stone it = NULL; 5766c721f82SRyan Stone while ((name = nvlist_next(unpacked, &type, &it)) != NULL) { 5776c721f82SRyan Stone /* Ensure that we see every key only once. */ 5786c721f82SRyan Stone ATF_REQUIRE_EQ(keys_seen.count(name), 0); 5796c721f82SRyan Stone 5806c721f82SRyan Stone if (strcmp(name, nullkey) == 0) 5816c721f82SRyan Stone verify_null(unpacked, type); 5826c721f82SRyan Stone else if (strcmp(name, numkey) == 0) 5836c721f82SRyan Stone verify_number(unpacked, name, type, numvalue); 5846c721f82SRyan Stone else if (strcmp(name, strkey) == 0) 5856c721f82SRyan Stone verify_string(unpacked, name, type, strvalue); 5866c721f82SRyan Stone else if (strcmp(name, nvkey) == 0) 5876c721f82SRyan Stone verify_nvlist(unpacked, name, type); 5886c721f82SRyan Stone else if (strcmp(name, binkey) == 0) 5896c721f82SRyan Stone verify_binary(unpacked, name, type, binvalue, binsize); 5906c721f82SRyan Stone else { 5916c721f82SRyan Stone msg << "Unexpected key :'" << name << "'"; 5926c721f82SRyan Stone ATF_FAIL(msg.str().c_str()); 5936c721f82SRyan Stone } 5946c721f82SRyan Stone 5956c721f82SRyan Stone keys_seen.insert(name); 5966c721f82SRyan Stone } 5976c721f82SRyan Stone 5986c721f82SRyan Stone /* Ensure that we saw every key. */ 5996c721f82SRyan Stone ATF_REQUIRE_EQ(keys_seen.size(), 5); 6006c721f82SRyan Stone 6016c721f82SRyan Stone nvlist_destroy(nvl); 6026c721f82SRyan Stone nvlist_destroy(unpacked); 6036c721f82SRyan Stone free(packed); 6046c721f82SRyan Stone } 6056c721f82SRyan Stone 606a87e5162SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist); 607a87e5162SRyan Stone ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist) 608a87e5162SRyan Stone { 609a87e5162SRyan Stone nvlist_t *nvl; 610a87e5162SRyan Stone void *packed; 611a87e5162SRyan Stone size_t size; 612a87e5162SRyan Stone 613a87e5162SRyan Stone nvl = nvlist_create(0); 614a87e5162SRyan Stone ATF_REQUIRE(nvl != NULL); 615a87e5162SRyan Stone 616a87e5162SRyan Stone nvlist_set_error(nvl, ENOMEM); 617a87e5162SRyan Stone 618a87e5162SRyan Stone packed = nvlist_pack(nvl, &size); 619a87e5162SRyan Stone ATF_REQUIRE(packed == NULL); 620a87e5162SRyan Stone 621a87e5162SRyan Stone nvlist_destroy(nvl); 622a87e5162SRyan Stone } 623a87e5162SRyan Stone 6246c721f82SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key); 6256c721f82SRyan Stone ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key) 6266c721f82SRyan Stone { 6276c721f82SRyan Stone nvlist_t *nvl, *unpacked; 6286c721f82SRyan Stone const char *key1, *key2; 6296c721f82SRyan Stone void *packed, *keypos; 6306c721f82SRyan Stone size_t size, keylen; 6316c721f82SRyan Stone 6326c721f82SRyan Stone nvl = nvlist_create(0); 6336c721f82SRyan Stone 6346c721f82SRyan Stone key1 = "key1"; 6356c721f82SRyan Stone keylen = strlen(key1); 6366c721f82SRyan Stone nvlist_add_number(nvl, key1, 5); 6376c721f82SRyan Stone 6386c721f82SRyan Stone key2 = "key2"; 6396c721f82SRyan Stone ATF_REQUIRE_EQ(keylen, strlen(key2)); 6406c721f82SRyan Stone nvlist_add_number(nvl, key2, 10); 6416c721f82SRyan Stone 6426c721f82SRyan Stone packed = nvlist_pack(nvl, &size); 6436c721f82SRyan Stone 6446c721f82SRyan Stone /* 6456c721f82SRyan Stone * Mangle the packed nvlist by replacing key1 with key2, creating a 6466c721f82SRyan Stone * packed nvlist with a duplicate key. 6476c721f82SRyan Stone */ 6486c721f82SRyan Stone keypos = memmem(packed, size, key1, keylen); 6496c721f82SRyan Stone ATF_REQUIRE(keypos != NULL); 6506c721f82SRyan Stone memcpy(keypos, key2, keylen); 6516c721f82SRyan Stone 652bd1da0a0SMariusz Zaborski unpacked = nvlist_unpack(packed, size, 0); 6536c721f82SRyan Stone ATF_REQUIRE(nvlist_error(unpacked) != 0); 6546c721f82SRyan Stone 6556c721f82SRyan Stone free(packed); 6566c721f82SRyan Stone nvlist_destroy(nvl); 6576c721f82SRyan Stone nvlist_destroy(unpacked); 6586c721f82SRyan Stone } 6596c721f82SRyan Stone 66071637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert); 66171637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_string__single_insert) 66271637d76SRyan Stone { 66371637d76SRyan Stone nvlist_t *nvl; 66471637d76SRyan Stone const char *key; 66571637d76SRyan Stone char *value; 66671637d76SRyan Stone 66771637d76SRyan Stone nvl = nvlist_create(0); 66871637d76SRyan Stone ATF_REQUIRE(nvl != NULL); 66971637d76SRyan Stone 67071637d76SRyan Stone key = "testkey"; 67171637d76SRyan Stone value = strdup("testval"); 67271637d76SRyan Stone ATF_REQUIRE(value != NULL); 67371637d76SRyan Stone 67471637d76SRyan Stone nvlist_move_string(nvl, key, value); 67571637d76SRyan Stone ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value); 67671637d76SRyan Stone 67771637d76SRyan Stone nvlist_destroy(nvl); 67871637d76SRyan Stone } 67971637d76SRyan Stone 68071637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child); 68171637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child) 68271637d76SRyan Stone { 68371637d76SRyan Stone nvlist_t *parent; 68471637d76SRyan Stone 68571637d76SRyan Stone parent = nvlist_create(0); 68671637d76SRyan Stone 68771637d76SRyan Stone nvlist_move_nvlist(parent, "test", NULL); 68871637d76SRyan Stone 68971637d76SRyan Stone ATF_REQUIRE(nvlist_error(parent) != 0); 69071637d76SRyan Stone 69171637d76SRyan Stone nvlist_destroy(parent); 69271637d76SRyan Stone } 69371637d76SRyan Stone 69419a4afb3SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error); 69519a4afb3SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error) 69619a4afb3SRyan Stone { 69719a4afb3SRyan Stone nvlist_t *nvl, *parent; 69819a4afb3SRyan Stone 69919a4afb3SRyan Stone nvl = nvlist_create(0); 70019a4afb3SRyan Stone parent = nvlist_create(0); 70119a4afb3SRyan Stone 70219a4afb3SRyan Stone nvlist_set_error(nvl, EBADF); 70319a4afb3SRyan Stone nvlist_move_nvlist(parent, "test", nvl); 70419a4afb3SRyan Stone ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 70519a4afb3SRyan Stone 70619a4afb3SRyan Stone nvlist_destroy(parent); 70719a4afb3SRyan Stone } 70819a4afb3SRyan Stone 70971637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert); 71071637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert) 71171637d76SRyan Stone { 71271637d76SRyan Stone nvlist_t *nvl; 71371637d76SRyan Stone const char *key; 71471637d76SRyan Stone nvlist_t *value; 71571637d76SRyan Stone 71671637d76SRyan Stone nvl = nvlist_create(0); 71771637d76SRyan Stone ATF_REQUIRE(nvl != NULL); 71871637d76SRyan Stone 71971637d76SRyan Stone key = "testkey"; 72071637d76SRyan Stone value = nvlist_create(0); 72171637d76SRyan Stone ATF_REQUIRE(value != NULL); 72271637d76SRyan Stone 72371637d76SRyan Stone nvlist_move_nvlist(nvl, key, value); 72471637d76SRyan Stone ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value); 72571637d76SRyan Stone 72671637d76SRyan Stone nvlist_destroy(nvl); 72771637d76SRyan Stone } 72871637d76SRyan Stone 72971637d76SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert); 73071637d76SRyan Stone ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert) 73171637d76SRyan Stone { 73271637d76SRyan Stone nvlist_t *nvl; 73371637d76SRyan Stone const char *key; 73471637d76SRyan Stone void *value; 73571637d76SRyan Stone size_t size, actual_size; 73671637d76SRyan Stone 73771637d76SRyan Stone nvl = nvlist_create(0); 73871637d76SRyan Stone ATF_REQUIRE(nvl != NULL); 73971637d76SRyan Stone 74071637d76SRyan Stone key = "testkey"; 74171637d76SRyan Stone size = 73; 74271637d76SRyan Stone value = malloc(size); 74371637d76SRyan Stone ATF_REQUIRE(value != NULL); 74471637d76SRyan Stone 74571637d76SRyan Stone nvlist_move_binary(nvl, key, value, size); 74671637d76SRyan Stone ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value); 74771637d76SRyan Stone ATF_REQUIRE_EQ(size, actual_size); 74871637d76SRyan Stone 74971637d76SRyan Stone nvlist_destroy(nvl); 75071637d76SRyan Stone } 75171637d76SRyan Stone 752fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove); 753fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove) 754fad0a264SRyan Stone { 755fad0a264SRyan Stone nvlist_t *nvl; 756fad0a264SRyan Stone const char *testkey; 757fad0a264SRyan Stone bool testval; 758fad0a264SRyan Stone 759fad0a264SRyan Stone nvl = nvlist_create(0); 760fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 761fad0a264SRyan Stone 762fad0a264SRyan Stone testkey = "boolkey"; 763fad0a264SRyan Stone testval = false; 764fad0a264SRyan Stone nvlist_add_bool(nvl, testkey, testval); 765fad0a264SRyan Stone 766fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 767fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 768fad0a264SRyan Stone 769fad0a264SRyan Stone nvlist_destroy(nvl); 770fad0a264SRyan Stone } 771fad0a264SRyan Stone 772fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged); 773fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged) 774fad0a264SRyan Stone { 775fad0a264SRyan Stone nvlist_t *nvl; 776fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 777fad0a264SRyan Stone bool testval, otherval1; 778fad0a264SRyan Stone nvlist_t *otherval2; 779fad0a264SRyan Stone 780fad0a264SRyan Stone nvl = nvlist_create(0); 781fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 782fad0a264SRyan Stone 783fad0a264SRyan Stone testkey = "boolkey"; 784fad0a264SRyan Stone testval = true; 785fad0a264SRyan Stone nvlist_add_bool(nvl, testkey, testval); 786fad0a264SRyan Stone 787fad0a264SRyan Stone otherkey1 = "key1"; 788fad0a264SRyan Stone otherval1 = false; 789fad0a264SRyan Stone nvlist_add_bool(nvl, otherkey1, otherval1); 790fad0a264SRyan Stone 791fad0a264SRyan Stone otherkey2 = "key2"; 792fad0a264SRyan Stone otherval2 = create_test_nvlist(); 793fad0a264SRyan Stone nvlist_move_nvlist(nvl, otherkey2, otherval2); 794fad0a264SRyan Stone 795fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 796fad0a264SRyan Stone 797fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1)); 798fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1); 799fad0a264SRyan Stone 800fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2)); 801fad0a264SRyan Stone verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2)); 802fad0a264SRyan Stone 803fad0a264SRyan Stone nvlist_destroy(nvl); 804fad0a264SRyan Stone } 805fad0a264SRyan Stone 806fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove); 807fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__single_remove) 808fad0a264SRyan Stone { 809fad0a264SRyan Stone nvlist_t *nvl; 810fad0a264SRyan Stone const char *testkey; 811fad0a264SRyan Stone uint64_t testval; 812fad0a264SRyan Stone 813fad0a264SRyan Stone nvl = nvlist_create(0); 814fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 815fad0a264SRyan Stone 816fad0a264SRyan Stone testkey = "numkey"; 817fad0a264SRyan Stone testval = std::numeric_limits<uint64_t>::max(); 818fad0a264SRyan Stone nvlist_add_number(nvl, testkey, testval); 819fad0a264SRyan Stone 820fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 821fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 822fad0a264SRyan Stone 823fad0a264SRyan Stone nvlist_destroy(nvl); 824fad0a264SRyan Stone } 825fad0a264SRyan Stone 826fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged); 827fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged) 828fad0a264SRyan Stone { 829fad0a264SRyan Stone nvlist_t *nvl; 830fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 831fad0a264SRyan Stone uint64_t testval, otherval1; 832fad0a264SRyan Stone const char *otherval2; 833fad0a264SRyan Stone 834fad0a264SRyan Stone nvl = nvlist_create(0); 835fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 836fad0a264SRyan Stone 837fad0a264SRyan Stone otherkey1 = "key1"; 838fad0a264SRyan Stone otherval1 = 5; 839fad0a264SRyan Stone nvlist_add_number(nvl, otherkey1, otherval1); 840fad0a264SRyan Stone 841fad0a264SRyan Stone testkey = "numkey"; 842fad0a264SRyan Stone testval = 1654; 843fad0a264SRyan Stone nvlist_add_number(nvl, testkey, testval); 844fad0a264SRyan Stone 845fad0a264SRyan Stone otherkey2 = "key2"; 846fad0a264SRyan Stone otherval2 = "string"; 847fad0a264SRyan Stone nvlist_add_string(nvl, otherkey2, otherval2); 848fad0a264SRyan Stone 849fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 850fad0a264SRyan Stone 851fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1)); 852fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1); 853fad0a264SRyan Stone 854fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2)); 855fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0); 856fad0a264SRyan Stone 857fad0a264SRyan Stone nvlist_destroy(nvl); 858fad0a264SRyan Stone } 859fad0a264SRyan Stone 860fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove); 861fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__single_remove) 862fad0a264SRyan Stone { 863fad0a264SRyan Stone nvlist_t *nvl; 864fad0a264SRyan Stone const char *testkey; 865fad0a264SRyan Stone const char *testval; 866fad0a264SRyan Stone 867fad0a264SRyan Stone nvl = nvlist_create(0); 868fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 869fad0a264SRyan Stone 870fad0a264SRyan Stone testkey = "numkey"; 871fad0a264SRyan Stone testval = "nvlist"; 872fad0a264SRyan Stone nvlist_add_string(nvl, testkey, testval); 873fad0a264SRyan Stone 874fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 875fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 876fad0a264SRyan Stone 877fad0a264SRyan Stone nvlist_destroy(nvl); 878fad0a264SRyan Stone } 879fad0a264SRyan Stone 880fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged); 881fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged) 882fad0a264SRyan Stone { 883fad0a264SRyan Stone nvlist_t *nvl; 884fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 885fad0a264SRyan Stone const char *testval, *otherval1; 886fad0a264SRyan Stone bool otherval2; 887fad0a264SRyan Stone 888fad0a264SRyan Stone nvl = nvlist_create(0); 889fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 890fad0a264SRyan Stone 891fad0a264SRyan Stone otherkey1 = "key1"; 892fad0a264SRyan Stone otherval1 = "fjdifjdk"; 893fad0a264SRyan Stone nvlist_add_string(nvl, otherkey1, otherval1); 894fad0a264SRyan Stone 895fad0a264SRyan Stone otherkey2 = "key2"; 896fad0a264SRyan Stone otherval2 = true; 897fad0a264SRyan Stone nvlist_add_bool(nvl, otherkey2, otherval2); 898fad0a264SRyan Stone 899fad0a264SRyan Stone testkey = "strkey"; 900fad0a264SRyan Stone testval = "1654"; 901fad0a264SRyan Stone nvlist_add_string(nvl, testkey, testval); 902fad0a264SRyan Stone 903fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 904fad0a264SRyan Stone 905fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1)); 906fad0a264SRyan Stone ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0); 907fad0a264SRyan Stone 908fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 909fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 910fad0a264SRyan Stone 911fad0a264SRyan Stone nvlist_destroy(nvl); 912fad0a264SRyan Stone } 913fad0a264SRyan Stone 914fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove); 915fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove) 916fad0a264SRyan Stone { 917fad0a264SRyan Stone nvlist_t *nvl; 918fad0a264SRyan Stone const char *testkey; 919fad0a264SRyan Stone nvlist_t *testval; 920fad0a264SRyan Stone 921fad0a264SRyan Stone nvl = nvlist_create(0); 922fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 923fad0a264SRyan Stone 924fad0a264SRyan Stone testkey = "numkey"; 925fad0a264SRyan Stone testval = create_test_nvlist(); 926fad0a264SRyan Stone nvlist_move_nvlist(nvl, testkey, testval); 927fad0a264SRyan Stone 928fad0a264SRyan Stone verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 929fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 930fad0a264SRyan Stone 931fad0a264SRyan Stone nvlist_destroy(nvl); 932fad0a264SRyan Stone } 933fad0a264SRyan Stone 934fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged); 935fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged) 936fad0a264SRyan Stone { 937fad0a264SRyan Stone nvlist_t *nvl; 938fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 939fad0a264SRyan Stone nvlist_t *testval, *otherval1; 940fad0a264SRyan Stone 941fad0a264SRyan Stone nvl = nvlist_create(0); 942fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 943fad0a264SRyan Stone 944fad0a264SRyan Stone testkey = "strkey"; 945fad0a264SRyan Stone testval = create_test_nvlist(); 946fad0a264SRyan Stone nvlist_move_nvlist(nvl, testkey, testval); 947fad0a264SRyan Stone 948fad0a264SRyan Stone otherkey1 = "key1"; 949fad0a264SRyan Stone otherval1 = nvlist_create(0); 950fad0a264SRyan Stone nvlist_move_nvlist(nvl, otherkey1, otherval1); 951fad0a264SRyan Stone 952fad0a264SRyan Stone otherkey2 = "key2"; 953fad0a264SRyan Stone nvlist_add_null(nvl, otherkey2); 954fad0a264SRyan Stone 955fad0a264SRyan Stone verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 956fad0a264SRyan Stone 957fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1)); 958fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1))); 959fad0a264SRyan Stone 960fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2)); 961fad0a264SRyan Stone 962fad0a264SRyan Stone nvlist_destroy(nvl); 963fad0a264SRyan Stone } 964fad0a264SRyan Stone 965fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove); 966fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove) 967fad0a264SRyan Stone { 968fad0a264SRyan Stone nvlist_t *nvl; 969fad0a264SRyan Stone const char *testkey; 970fad0a264SRyan Stone void *testval; 971fad0a264SRyan Stone const void *actual_val; 972fad0a264SRyan Stone size_t testsize, actual_size; 973fad0a264SRyan Stone 974fad0a264SRyan Stone nvl = nvlist_create(0); 975fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 976fad0a264SRyan Stone 977fad0a264SRyan Stone testkey = "numkey"; 978fad0a264SRyan Stone testsize = 457; 979fad0a264SRyan Stone testval = malloc(testsize); 980fad0a264SRyan Stone memset(testval, '5', testsize); 981fad0a264SRyan Stone nvlist_move_binary(nvl, testkey, testval, testsize); 982fad0a264SRyan Stone 983fad0a264SRyan Stone actual_val = nvlist_take_binary(nvl, testkey, &actual_size); 984fad0a264SRyan Stone ATF_REQUIRE_EQ(testsize, actual_size); 985fad0a264SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0); 986fad0a264SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 987fad0a264SRyan Stone 988fad0a264SRyan Stone nvlist_destroy(nvl); 989fad0a264SRyan Stone } 990fad0a264SRyan Stone 991fad0a264SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged); 992fad0a264SRyan Stone ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged) 993fad0a264SRyan Stone { 994fad0a264SRyan Stone nvlist_t *nvl; 995fad0a264SRyan Stone const char *testkey, *otherkey1, *otherkey2; 996fad0a264SRyan Stone const void *actual_value; 997fad0a264SRyan Stone char testval[] = "gjiertj"; 998fad0a264SRyan Stone char otherval1[] = "fdreg"; 999fad0a264SRyan Stone size_t testsize, othersize, actual_size; 1000fad0a264SRyan Stone bool otherval2; 1001fad0a264SRyan Stone 1002fad0a264SRyan Stone nvl = nvlist_create(0); 1003fad0a264SRyan Stone ATF_REQUIRE(nvl != NULL); 1004fad0a264SRyan Stone 1005fad0a264SRyan Stone otherkey1 = "key1"; 1006fad0a264SRyan Stone othersize = sizeof(otherval1); 1007fad0a264SRyan Stone nvlist_add_binary(nvl, otherkey1, otherval1, othersize); 1008fad0a264SRyan Stone 1009fad0a264SRyan Stone otherkey2 = "key2"; 1010fad0a264SRyan Stone otherval2 = true; 1011fad0a264SRyan Stone nvlist_add_bool(nvl, otherkey2, otherval2); 1012fad0a264SRyan Stone 1013fad0a264SRyan Stone testkey = "strkey"; 1014fad0a264SRyan Stone testsize = sizeof(testval); 1015fad0a264SRyan Stone nvlist_add_binary(nvl, testkey, testval, testsize); 1016fad0a264SRyan Stone 1017fad0a264SRyan Stone actual_value = nvlist_take_binary(nvl, testkey, &actual_size); 1018fad0a264SRyan Stone ATF_REQUIRE_EQ(testsize, actual_size); 1019fad0a264SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0); 1020fad0a264SRyan Stone 1021fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1)); 1022fad0a264SRyan Stone actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size); 1023fad0a264SRyan Stone ATF_REQUIRE_EQ(othersize, actual_size); 1024fad0a264SRyan Stone ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0); 1025fad0a264SRyan Stone 1026fad0a264SRyan Stone ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 1027fad0a264SRyan Stone ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 1028fad0a264SRyan Stone 1029fad0a264SRyan Stone nvlist_destroy(nvl); 1030fad0a264SRyan Stone } 1031fad0a264SRyan Stone 1032339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null); 1033339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_null) 1034339bcfc7SRyan Stone { 1035339bcfc7SRyan Stone nvlist_t *nvl; 1036339bcfc7SRyan Stone const char *key; 1037339bcfc7SRyan Stone 1038339bcfc7SRyan Stone nvl = nvlist_create(0); 1039339bcfc7SRyan Stone key = "test"; 1040339bcfc7SRyan Stone nvlist_add_null(nvl, key); 1041339bcfc7SRyan Stone 1042339bcfc7SRyan Stone nvlist_free(nvl, key); 1043339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1044339bcfc7SRyan Stone 1045339bcfc7SRyan Stone nvlist_destroy(nvl); 1046339bcfc7SRyan Stone } 1047339bcfc7SRyan Stone 1048339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool); 1049339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_bool) 1050339bcfc7SRyan Stone { 1051339bcfc7SRyan Stone nvlist_t *nvl; 1052339bcfc7SRyan Stone const char *key; 1053339bcfc7SRyan Stone 1054339bcfc7SRyan Stone nvl = nvlist_create(0); 1055339bcfc7SRyan Stone key = "test"; 1056339bcfc7SRyan Stone nvlist_add_bool(nvl, key, true); 1057339bcfc7SRyan Stone 1058339bcfc7SRyan Stone nvlist_free(nvl, key); 1059339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1060339bcfc7SRyan Stone 1061339bcfc7SRyan Stone nvlist_destroy(nvl); 1062339bcfc7SRyan Stone } 1063339bcfc7SRyan Stone 1064339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number); 1065339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_number) 1066339bcfc7SRyan Stone { 1067339bcfc7SRyan Stone nvlist_t *nvl; 1068339bcfc7SRyan Stone const char *key; 1069339bcfc7SRyan Stone 1070339bcfc7SRyan Stone nvl = nvlist_create(0); 1071339bcfc7SRyan Stone key = "test"; 1072339bcfc7SRyan Stone nvlist_add_number(nvl, key, 584); 1073339bcfc7SRyan Stone 1074339bcfc7SRyan Stone nvlist_free(nvl, key); 1075339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1076339bcfc7SRyan Stone 1077339bcfc7SRyan Stone nvlist_destroy(nvl); 1078339bcfc7SRyan Stone } 1079339bcfc7SRyan Stone 1080339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string); 1081339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_string) 1082339bcfc7SRyan Stone { 1083339bcfc7SRyan Stone nvlist_t *nvl; 1084339bcfc7SRyan Stone const char *key; 1085339bcfc7SRyan Stone 1086339bcfc7SRyan Stone nvl = nvlist_create(0); 1087339bcfc7SRyan Stone key = "test"; 1088339bcfc7SRyan Stone nvlist_add_string(nvl, key, "gjkfkjd"); 1089339bcfc7SRyan Stone 1090339bcfc7SRyan Stone nvlist_free(nvl, key); 1091339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1092339bcfc7SRyan Stone 1093339bcfc7SRyan Stone nvlist_destroy(nvl); 1094339bcfc7SRyan Stone } 1095339bcfc7SRyan Stone 1096339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist); 1097339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_nvlist) 1098339bcfc7SRyan Stone { 1099339bcfc7SRyan Stone nvlist_t *nvl; 1100339bcfc7SRyan Stone const char *key; 1101339bcfc7SRyan Stone 1102339bcfc7SRyan Stone nvl = nvlist_create(0); 1103339bcfc7SRyan Stone key = "test"; 1104339bcfc7SRyan Stone nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1105339bcfc7SRyan Stone 1106339bcfc7SRyan Stone nvlist_free(nvl, key); 1107339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1108339bcfc7SRyan Stone 1109339bcfc7SRyan Stone nvlist_destroy(nvl); 1110339bcfc7SRyan Stone } 1111339bcfc7SRyan Stone 1112339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary); 1113339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free__single_binary) 1114339bcfc7SRyan Stone { 1115339bcfc7SRyan Stone nvlist_t *nvl; 1116339bcfc7SRyan Stone const char *key; 1117339bcfc7SRyan Stone 1118339bcfc7SRyan Stone nvl = nvlist_create(0); 1119339bcfc7SRyan Stone key = "test"; 1120339bcfc7SRyan Stone nvlist_add_binary(nvl, key, "jgjgfd", 6); 1121339bcfc7SRyan Stone 1122339bcfc7SRyan Stone nvlist_free(nvl, key); 1123339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1124339bcfc7SRyan Stone 1125339bcfc7SRyan Stone nvlist_destroy(nvl); 1126339bcfc7SRyan Stone } 1127339bcfc7SRyan Stone 1128339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null); 1129339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_null__single_null) 1130339bcfc7SRyan Stone { 1131339bcfc7SRyan Stone nvlist_t *nvl; 1132339bcfc7SRyan Stone const char *key; 1133339bcfc7SRyan Stone 1134339bcfc7SRyan Stone nvl = nvlist_create(0); 1135339bcfc7SRyan Stone key = "test"; 1136339bcfc7SRyan Stone nvlist_add_null(nvl, key); 1137339bcfc7SRyan Stone 1138339bcfc7SRyan Stone nvlist_free_null(nvl, key); 1139339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1140339bcfc7SRyan Stone 1141339bcfc7SRyan Stone nvlist_destroy(nvl); 1142339bcfc7SRyan Stone } 1143339bcfc7SRyan Stone 1144339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool); 1145339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool) 1146339bcfc7SRyan Stone { 1147339bcfc7SRyan Stone nvlist_t *nvl; 1148339bcfc7SRyan Stone const char *key; 1149339bcfc7SRyan Stone 1150339bcfc7SRyan Stone nvl = nvlist_create(0); 1151339bcfc7SRyan Stone key = "test"; 1152339bcfc7SRyan Stone nvlist_add_bool(nvl, key, true); 1153339bcfc7SRyan Stone 1154339bcfc7SRyan Stone nvlist_free_bool(nvl, key); 1155339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1156339bcfc7SRyan Stone 1157339bcfc7SRyan Stone nvlist_destroy(nvl); 1158339bcfc7SRyan Stone } 1159339bcfc7SRyan Stone 1160339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number); 1161339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_number__single_number) 1162339bcfc7SRyan Stone { 1163339bcfc7SRyan Stone nvlist_t *nvl; 1164339bcfc7SRyan Stone const char *key; 1165339bcfc7SRyan Stone 1166339bcfc7SRyan Stone nvl = nvlist_create(0); 1167339bcfc7SRyan Stone key = "test"; 1168339bcfc7SRyan Stone nvlist_add_number(nvl, key, 584); 1169339bcfc7SRyan Stone 1170339bcfc7SRyan Stone nvlist_free_number(nvl, key); 1171339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1172339bcfc7SRyan Stone 1173339bcfc7SRyan Stone nvlist_destroy(nvl); 1174339bcfc7SRyan Stone } 1175339bcfc7SRyan Stone 1176339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string); 1177339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_string__single_string) 1178339bcfc7SRyan Stone { 1179339bcfc7SRyan Stone nvlist_t *nvl; 1180339bcfc7SRyan Stone const char *key; 1181339bcfc7SRyan Stone 1182339bcfc7SRyan Stone nvl = nvlist_create(0); 1183339bcfc7SRyan Stone key = "test"; 1184339bcfc7SRyan Stone nvlist_add_string(nvl, key, "gjkfkjd"); 1185339bcfc7SRyan Stone 1186339bcfc7SRyan Stone nvlist_free_string(nvl, key); 1187339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1188339bcfc7SRyan Stone 1189339bcfc7SRyan Stone nvlist_destroy(nvl); 1190339bcfc7SRyan Stone } 1191339bcfc7SRyan Stone 1192339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist); 1193339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist) 1194339bcfc7SRyan Stone { 1195339bcfc7SRyan Stone nvlist_t *nvl; 1196339bcfc7SRyan Stone const char *key; 1197339bcfc7SRyan Stone 1198339bcfc7SRyan Stone nvl = nvlist_create(0); 1199339bcfc7SRyan Stone key = "test"; 1200339bcfc7SRyan Stone nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1201339bcfc7SRyan Stone 1202339bcfc7SRyan Stone nvlist_free_nvlist(nvl, key); 1203339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1204339bcfc7SRyan Stone 1205339bcfc7SRyan Stone nvlist_destroy(nvl); 1206339bcfc7SRyan Stone } 1207339bcfc7SRyan Stone 1208339bcfc7SRyan Stone ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary); 1209339bcfc7SRyan Stone ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary) 1210339bcfc7SRyan Stone { 1211339bcfc7SRyan Stone nvlist_t *nvl; 1212339bcfc7SRyan Stone const char *key; 1213339bcfc7SRyan Stone 1214339bcfc7SRyan Stone nvl = nvlist_create(0); 1215339bcfc7SRyan Stone key = "test"; 1216339bcfc7SRyan Stone nvlist_add_binary(nvl, key, "jgjgfd", 6); 1217339bcfc7SRyan Stone 1218339bcfc7SRyan Stone nvlist_free_binary(nvl, key); 1219339bcfc7SRyan Stone ATF_REQUIRE(nvlist_empty(nvl)); 1220339bcfc7SRyan Stone 1221339bcfc7SRyan Stone nvlist_destroy(nvl); 1222339bcfc7SRyan Stone } 1223339bcfc7SRyan Stone 12243075c896SRyan Stone ATF_INIT_TEST_CASES(tp) 12253075c896SRyan Stone { 12263075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty); 12273075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert); 12283075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert); 12293075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert); 12303075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert); 12313075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert); 123219a4afb3SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error); 12333075c896SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert); 12346e623ffdSRyan Stone 12356e623ffdSRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist); 12366e623ffdSRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist); 12376e623ffdSRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist); 1238a87e5162SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist); 12396c721f82SRyan Stone 12406c721f82SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist); 12416c721f82SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values); 1242a87e5162SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist); 12436c721f82SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key); 124400173c09SMariusz Zaborski ATF_ADD_TEST_CASE(tp, nvlist_unpack__flags_nvlist); 124571637d76SRyan Stone 124671637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert); 124771637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert); 124871637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child); 124919a4afb3SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error); 125071637d76SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert); 1251fad0a264SRyan Stone 1252fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove); 1253fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged); 1254fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove); 1255fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged); 1256fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove); 1257fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged); 1258fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove); 1259fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged); 1260fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove); 1261fad0a264SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged); 1262339bcfc7SRyan Stone 1263339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_null); 1264339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool); 1265339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_number); 1266339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_string); 1267339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist); 1268339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary); 1269339bcfc7SRyan Stone 1270339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null); 1271339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool); 1272339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number); 1273339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string); 1274339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist); 1275339bcfc7SRyan Stone ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary); 12763075c896SRyan Stone } 1277