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