1235783Skib/*- 2235783Skib * Copyright (c) 2014-2015 Sandvine Inc. All rights reserved. 3235783Skib * All rights reserved. 4235783Skib * 5235783Skib * Redistribution and use in source and binary forms, with or without 6235783Skib * modification, are permitted provided that the following conditions 7235783Skib * are met: 8235783Skib * 1. Redistributions of source code must retain the above copyright 9235783Skib * notice, this list of conditions and the following disclaimer. 10235783Skib * 2. Redistributions in binary form must reproduce the above copyright 11235783Skib * notice, this list of conditions and the following disclaimer in the 12235783Skib * documentation and/or other materials provided with the distribution. 13235783Skib * 14235783Skib * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15235783Skib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16235783Skib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17235783Skib * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18235783Skib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19235783Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20235783Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21235783Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22235783Skib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23235783Skib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24235783Skib * SUCH DAMAGE. 25235783Skib */ 26235783Skib 27235783Skib#include <sys/cdefs.h> 28235783Skib__FBSDID("$FreeBSD: stable/10/lib/libnv/tests/nv_tests.cc 319370 2017-06-01 06:16:57Z ngie $"); 29235783Skib 30235783Skib#include <atf-c++.hpp> 31235783Skib#include <nv.h> 32235783Skib 33235783Skib#include <errno.h> 34235783Skib#include <limits> 35235783Skib#include <set> 36235783Skib#include <sstream> 37235783Skib#include <string> 38235783Skib 39235783Skib/* 40235783Skib * Test that a newly created nvlist has no errors, and is empty. 41235783Skib */ 42235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty); 43235783SkibATF_TEST_CASE_BODY(nvlist_create__is_empty) 44235783Skib{ 45235783Skib nvlist_t *nvl; 46235783Skib int type; 47235783Skib void *it; 48235783Skib 49235783Skib nvl = nvlist_create(0); 50235783Skib 51235783Skib ATF_REQUIRE(nvl != NULL); 52235783Skib 53235783Skib ATF_REQUIRE_EQ(nvlist_error(nvl), 0); 54235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 55235783Skib 56235783Skib it = NULL; 57235783Skib ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL)); 58235783Skib 59235783Skib nvlist_destroy(nvl); 60235783Skib} 61235783Skib 62235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert); 63235783SkibATF_TEST_CASE_BODY(nvlist_add_null__single_insert) 64235783Skib{ 65235783Skib nvlist_t *nvl; 66235783Skib void *it; 67235783Skib const char *key; 68235783Skib int type; 69235783Skib 70235783Skib key = "key"; 71235783Skib nvl = nvlist_create(0); 72235783Skib 73235783Skib ATF_REQUIRE(nvl != NULL); 74235783Skib ATF_REQUIRE(!nvlist_exists(nvl, key)); 75235783Skib 76235783Skib nvlist_add_null(nvl, key); 77235783Skib 78235783Skib ATF_REQUIRE(!nvlist_empty(nvl)); 79235783Skib ATF_REQUIRE(nvlist_exists(nvl, key)); 80235783Skib ATF_REQUIRE(nvlist_exists_null(nvl, key)); 81235783Skib ATF_REQUIRE(nvlist_exists_null(nvl, "key")); 82235783Skib 83235783Skib /* Iterate over the nvlist; ensure that it has only our one key. */ 84235783Skib it = NULL; 85235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 86235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 87235783Skib ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 88235783Skib 89235783Skib nvlist_destroy(nvl); 90235783Skib} 91235783Skib 92235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert); 93235783SkibATF_TEST_CASE_BODY(nvlist_add_bool__single_insert) 94235783Skib{ 95235783Skib nvlist_t *nvl; 96235783Skib void *it; 97235783Skib const char *key; 98235783Skib int type; 99235783Skib 100235783Skib key = "name"; 101235783Skib nvl = nvlist_create(0); 102235783Skib 103235783Skib ATF_REQUIRE(nvl != NULL); 104235783Skib ATF_REQUIRE(!nvlist_exists(nvl, key)); 105235783Skib 106235783Skib nvlist_add_bool(nvl, key, true); 107235783Skib 108235783Skib ATF_REQUIRE(!nvlist_empty(nvl)); 109235783Skib ATF_REQUIRE(nvlist_exists(nvl, key)); 110235783Skib ATF_REQUIRE(nvlist_exists(nvl, "name")); 111235783Skib ATF_REQUIRE(nvlist_exists_bool(nvl, key)); 112235783Skib ATF_REQUIRE(nvlist_exists_bool(nvl, "name")); 113235783Skib ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true); 114235783Skib 115235783Skib /* Iterate over the nvlist; ensure that it has only our one key. */ 116235783Skib it = NULL; 117235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 118235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_BOOL); 119235783Skib ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 120235783Skib 121235783Skib nvlist_destroy(nvl); 122235783Skib} 123235783Skib 124235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert); 125235783SkibATF_TEST_CASE_BODY(nvlist_add_number__single_insert) 126235783Skib{ 127235783Skib nvlist_t *nvl; 128235783Skib void *it; 129235783Skib const char *key; 130235783Skib uint64_t value; 131235783Skib int type; 132235783Skib 133235783Skib key = "foo123"; 134235783Skib value = 71965; 135235783Skib nvl = nvlist_create(0); 136235783Skib 137235783Skib ATF_REQUIRE(nvl != NULL); 138235783Skib ATF_REQUIRE(!nvlist_exists(nvl, key)); 139235783Skib 140235783Skib nvlist_add_number(nvl, key, value); 141235783Skib 142235783Skib ATF_REQUIRE(!nvlist_empty(nvl)); 143235783Skib ATF_REQUIRE(nvlist_exists(nvl, key)); 144235783Skib ATF_REQUIRE(nvlist_exists(nvl, "foo123")); 145235783Skib ATF_REQUIRE(nvlist_exists_number(nvl, key)); 146235783Skib ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value); 147235783Skib 148235783Skib /* Iterate over the nvlist; ensure that it has only our one key. */ 149235783Skib it = NULL; 150235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 151235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 152235783Skib ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 153235783Skib 154235783Skib nvlist_destroy(nvl); 155235783Skib} 156235783Skib 157235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert); 158235783SkibATF_TEST_CASE_BODY(nvlist_add_string__single_insert) 159235783Skib{ 160235783Skib nvlist_t *nvl; 161235783Skib void *it; 162235783Skib const char *key; 163235783Skib const char *value; 164235783Skib int type; 165235783Skib 166235783Skib key = "test"; 167235783Skib value = "fgjdkgjdk"; 168235783Skib nvl = nvlist_create(0); 169235783Skib 170235783Skib ATF_REQUIRE(nvl != NULL); 171235783Skib ATF_REQUIRE(!nvlist_exists(nvl, key)); 172235783Skib 173261632Sdumbbell nvlist_add_string(nvl, key, value); 174261632Sdumbbell 175261632Sdumbbell ATF_REQUIRE(!nvlist_empty(nvl)); 176235783Skib ATF_REQUIRE(nvlist_exists(nvl, key)); 177235783Skib ATF_REQUIRE(nvlist_exists(nvl, "test")); 178235783Skib ATF_REQUIRE(nvlist_exists_string(nvl, key)); 179235783Skib ATF_REQUIRE(nvlist_exists_string(nvl, "test")); 180235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0); 181235783Skib 182235783Skib /* nvlist_add_* is required to clone the value, so check for that. */ 183235783Skib ATF_REQUIRE(nvlist_get_string(nvl, key) != value); 184235783Skib 185235783Skib /* Iterate over the nvlist; ensure that it has only our one key. */ 186235783Skib it = NULL; 187235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 188235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 189235783Skib ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 190235783Skib 191235783Skib nvlist_destroy(nvl); 192235783Skib} 193235783Skib 194235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert); 195235783SkibATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert) 196235783Skib{ 197235783Skib nvlist_t *nvl; 198235783Skib void *it; 199235783Skib const char *key, *subkey; 200235783Skib nvlist_t *sublist; 201235783Skib const nvlist_t *value; 202235783Skib int type; 203235783Skib 204235783Skib key = "test"; 205235783Skib subkey = "subkey"; 206235783Skib sublist = nvlist_create(0); 207235783Skib nvl = nvlist_create(0); 208235783Skib 209235783Skib ATF_REQUIRE(nvl != NULL); 210235783Skib ATF_REQUIRE(!nvlist_exists(nvl, key)); 211235783Skib 212235783Skib nvlist_add_null(sublist, subkey); 213235783Skib nvlist_add_nvlist(nvl, key, sublist); 214235783Skib 215235783Skib ATF_REQUIRE(!nvlist_empty(nvl)); 216235783Skib ATF_REQUIRE(nvlist_exists(nvl, key)); 217235783Skib ATF_REQUIRE(nvlist_exists(nvl, "test")); 218235783Skib ATF_REQUIRE(nvlist_exists_nvlist(nvl, key)); 219235783Skib ATF_REQUIRE(nvlist_exists_nvlist(nvl, "test")); 220235783Skib 221235783Skib value = nvlist_get_nvlist(nvl, key); 222235783Skib ATF_REQUIRE(nvlist_exists_null(value, subkey)); 223235783Skib 224235783Skib /* nvlist_add_* is required to clone the value, so check for that. */ 225235783Skib ATF_REQUIRE(sublist != value); 226235783Skib 227235783Skib /* Iterate over the nvlist; ensure that it has only our one key. */ 228235783Skib it = NULL; 229235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 230235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 231235783Skib ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 232235783Skib 233235783Skib nvlist_destroy(sublist); 234235783Skib nvlist_destroy(nvl); 235235783Skib} 236235783Skib 237235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error); 238235783SkibATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error) 239235783Skib{ 240235783Skib nvlist_t *nvl, *parent; 241235783Skib 242235783Skib nvl = nvlist_create(0); 243235783Skib parent = nvlist_create(0); 244235783Skib 245235783Skib nvlist_set_error(nvl, EBADF); 246235783Skib nvlist_add_nvlist(parent, "test", nvl); 247235783Skib ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 248235783Skib 249235783Skib nvlist_destroy(nvl); 250235783Skib nvlist_destroy(parent); 251235783Skib} 252235783Skib 253235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert); 254235783SkibATF_TEST_CASE_BODY(nvlist_add_binary__single_insert) 255235783Skib{ 256235783Skib nvlist_t *nvl; 257235783Skib void *it; 258235783Skib const char *key; 259235783Skib void *value; 260235783Skib const void *ret_value; 261235783Skib size_t value_size, ret_size; 262235783Skib int type; 263235783Skib 264235783Skib key = "binary"; 265235783Skib value_size = 13; 266235783Skib value = malloc(value_size); 267235783Skib memset(value, 0xa5, value_size); 268235783Skib nvl = nvlist_create(0); 269235783Skib 270235783Skib ATF_REQUIRE(nvl != NULL); 271235783Skib ATF_REQUIRE(!nvlist_exists(nvl, key)); 272235783Skib 273235783Skib nvlist_add_binary(nvl, key, value, value_size); 274235783Skib 275235783Skib ATF_REQUIRE(!nvlist_empty(nvl)); 276235783Skib ATF_REQUIRE(nvlist_exists(nvl, key)); 277235783Skib ATF_REQUIRE(nvlist_exists(nvl, "binary")); 278235783Skib ATF_REQUIRE(nvlist_exists_binary(nvl, key)); 279235783Skib ATF_REQUIRE(nvlist_exists_binary(nvl, "binary")); 280235783Skib 281235783Skib ret_value = nvlist_get_binary(nvl, key, &ret_size); 282235783Skib ATF_REQUIRE_EQ(value_size, ret_size); 283235783Skib ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 284235783Skib 285235783Skib /* nvlist_add_* is required to clone the value, so check for that. */ 286235783Skib ATF_REQUIRE(value != ret_value); 287235783Skib 288235783Skib /* Iterate over the nvlist; ensure that it has only our one key. */ 289235783Skib it = NULL; 290235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 291235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 292235783Skib ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 293235783Skib 294235783Skib nvlist_destroy(nvl); 295235783Skib free(value); 296235783Skib} 297235783Skib 298235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist); 299235783SkibATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist) 300235783Skib{ 301235783Skib nvlist_t *nvl, *clone; 302235783Skib 303235783Skib nvl = nvlist_create(0); 304235783Skib ATF_REQUIRE(nvl != NULL); 305235783Skib 306235783Skib clone = nvlist_clone(nvl); 307235783Skib ATF_REQUIRE(clone != NULL); 308235783Skib ATF_REQUIRE(clone != nvl); 309235783Skib ATF_REQUIRE(nvlist_empty(clone)); 310235783Skib 311235783Skib nvlist_destroy(clone); 312235783Skib nvlist_destroy(nvl); 313235783Skib} 314235783Skib 315235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist); 316235783SkibATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist) 317235783Skib{ 318235783Skib nvlist_t *nvl, *clone; 319235783Skib const char *key; 320235783Skib void *it; 321235783Skib uint64_t value; 322235783Skib int type; 323235783Skib 324235783Skib nvl = nvlist_create(0); 325235783Skib ATF_REQUIRE(nvl != NULL); 326235783Skib 327235783Skib key = "testkey"; 328235783Skib value = 684874; 329235783Skib nvlist_add_number(nvl, key, value); 330235783Skib 331235783Skib clone = nvlist_clone(nvl); 332235783Skib ATF_REQUIRE(clone != NULL); 333235783Skib ATF_REQUIRE(clone != nvl); 334235783Skib ATF_REQUIRE(nvlist_exists_number(clone, key)); 335235783Skib ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value); 336235783Skib 337235783Skib /* Iterate over the nvlist; ensure that it has only our one key. */ 338235783Skib it = NULL; 339235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0); 340235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 341235783Skib ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL)); 342235783Skib 343235783Skib nvlist_destroy(clone); 344235783Skib nvlist_destroy(nvl); 345235783Skib} 346235783Skib 347235783Skibstatic const char * const test_subnvlist_key = "nvlist"; 348235783Skib 349235783Skibstatic const char * const test_string_key = "string"; 350235783Skibstatic const char * const test_string_val = "59525"; 351235783Skib 352235783Skibstatic nvlist_t* 353235783Skibcreate_test_nvlist(void) 354235783Skib{ 355235783Skib nvlist_t *nvl, *sublist; 356235783Skib 357235783Skib nvl = nvlist_create(0); 358235783Skib ATF_REQUIRE(nvl != NULL); 359235783Skib 360235783Skib sublist = nvlist_create(0); 361235783Skib ATF_REQUIRE(sublist != NULL); 362235783Skib 363235783Skib nvlist_add_string(sublist, test_string_key, test_string_val); 364235783Skib nvlist_move_nvlist(nvl, test_subnvlist_key, sublist); 365235783Skib 366235783Skib return (nvl); 367235783Skib} 368235783Skib 369235783Skibstatic void 370235783Skibverify_test_nvlist(const nvlist_t *nvl) 371235783Skib{ 372235783Skib void *it; 373235783Skib const nvlist_t *value; 374235783Skib int type; 375235783Skib 376235783Skib ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key)); 377235783Skib 378235783Skib value = nvlist_get_nvlist(nvl, test_subnvlist_key); 379235783Skib 380235783Skib ATF_REQUIRE(nvlist_exists_string(value, test_string_key)); 381235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0); 382235783Skib ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val); 383235783Skib 384235783Skib /* Iterate over both nvlists; ensure that each has only the one key. */ 385235783Skib it = NULL; 386235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it), 387235783Skib test_string_key), 0); 388235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 389235783Skib ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL)); 390235783Skib 391235783Skib it = NULL; 392235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), 393235783Skib test_subnvlist_key), 0); 394235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 395235783Skib ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL)); 396235783Skib} 397235783Skib 398235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist); 399235783SkibATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist) 400235783Skib{ 401235783Skib nvlist_t *nvl, *clone; 402235783Skib 403235783Skib nvl = create_test_nvlist(); 404235783Skib clone = nvlist_clone(nvl); 405235783Skib 406235783Skib ATF_REQUIRE(clone != NULL); 407235783Skib ATF_REQUIRE(clone != nvl); 408235783Skib verify_test_nvlist(clone); 409235783Skib 410235783Skib nvlist_destroy(clone); 411235783Skib nvlist_destroy(nvl); 412235783Skib} 413235783Skib 414235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist); 415235783SkibATF_TEST_CASE_BODY(nvlist_clone__error_nvlist) 416235783Skib{ 417235783Skib nvlist_t *nvl, *clone; 418235783Skib 419235783Skib nvl = nvlist_create(0); 420235783Skib ATF_REQUIRE(nvl != NULL); 421235783Skib 422235783Skib nvlist_set_error(nvl, ENOMEM); 423235783Skib 424235783Skib clone = nvlist_clone(nvl); 425235783Skib ATF_REQUIRE(clone == NULL); 426235783Skib 427235783Skib nvlist_destroy(nvl); 428235783Skib} 429235783Skib 430235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist); 431235783SkibATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist) 432235783Skib{ 433235783Skib nvlist_t *nvl, *unpacked; 434235783Skib void *packed; 435235783Skib size_t packed_size; 436235783Skib 437235783Skib nvl = nvlist_create(0); 438235783Skib ATF_REQUIRE(nvl != NULL); 439235783Skib 440235783Skib packed = nvlist_pack(nvl, &packed_size); 441235783Skib ATF_REQUIRE(packed != NULL); 442235783Skib 443235783Skib unpacked = nvlist_unpack(packed, packed_size); 444235783Skib ATF_REQUIRE(unpacked != NULL); 445235783Skib ATF_REQUIRE(unpacked != nvl); 446235783Skib ATF_REQUIRE(nvlist_empty(unpacked)); 447235783Skib 448235783Skib nvlist_destroy(unpacked); 449235783Skib nvlist_destroy(nvl); 450235783Skib free(packed); 451235783Skib} 452235783Skib 453235783Skibstatic void 454235783Skibverify_null(const nvlist_t *nvl, int type) 455235783Skib{ 456235783Skib 457235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 458235783Skib} 459235783Skib 460235783Skibstatic void 461235783Skibverify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value) 462235783Skib{ 463235783Skib 464235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 465235783Skib ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value); 466235783Skib} 467235783Skib 468235783Skibstatic void 469235783Skibverify_string(const nvlist_t *nvl, const char *name, int type, 470235783Skib const char * value) 471235783Skib{ 472235783Skib 473235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 474235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0); 475235783Skib} 476235783Skib 477235783Skibstatic void 478235783Skibverify_nvlist(const nvlist_t *nvl, const char *name, int type) 479235783Skib{ 480235783Skib 481235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 482235783Skib verify_test_nvlist(nvlist_get_nvlist(nvl, name)); 483235783Skib} 484235783Skib 485235783Skibstatic void 486235783Skibverify_binary(const nvlist_t *nvl, const char *name, int type, 487235783Skib const void * value, size_t size) 488235783Skib{ 489235783Skib const void *actual_value; 490235783Skib size_t actual_size; 491235783Skib 492235783Skib ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 493235783Skib actual_value = nvlist_get_binary(nvl, name, &actual_size); 494235783Skib ATF_REQUIRE_EQ(size, actual_size); 495235783Skib ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0); 496235783Skib} 497235783Skib 498235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values); 499235783SkibATF_TEST_CASE_BODY(nvlist_pack__multiple_values) 500235783Skib{ 501235783Skib std::ostringstream msg; 502235783Skib std::set<std::string> keys_seen; 503235783Skib nvlist_t *nvl, *unpacked, *nvvalue; 504235783Skib const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name; 505235783Skib int numvalue; 506235783Skib const char * strvalue; 507235783Skib void *binvalue, *packed, *it; 508235783Skib size_t binsize, packed_size; 509235783Skib int type; 510235783Skib 511235783Skib nvl = nvlist_create(0); 512235783Skib 513235783Skib nullkey = "null"; 514235783Skib nvlist_add_null(nvl, nullkey); 515235783Skib 516235783Skib numkey = "number"; 517235783Skib numvalue = 939853984; 518235783Skib nvlist_add_number(nvl, numkey, numvalue); 519235783Skib 520235783Skib strkey = "string"; 521235783Skib strvalue = "jfieutijf"; 522235783Skib nvlist_add_string(nvl, strkey, strvalue); 523235783Skib 524235783Skib nvkey = "nvlist"; 525235783Skib nvvalue = create_test_nvlist(); 526261632Sdumbbell nvlist_move_nvlist(nvl, nvkey, nvvalue); 527261632Sdumbbell 528235783Skib binkey = "binary"; 529235783Skib binsize = 4; 530235783Skib binvalue = malloc(binsize); 531235783Skib memset(binvalue, 'b', binsize); 532235783Skib nvlist_move_binary(nvl, binkey, binvalue, binsize); 533235783Skib 534235783Skib packed = nvlist_pack(nvl, &packed_size); 535235783Skib ATF_REQUIRE(packed != NULL); 536235783Skib 537235783Skib unpacked = nvlist_unpack(packed, packed_size); 538235783Skib ATF_REQUIRE(unpacked != 0); 539235783Skib 540235783Skib it = NULL; 541235783Skib while ((name = nvlist_next(unpacked, &type, &it)) != NULL) { 542235783Skib /* Ensure that we see every key only once. */ 543235783Skib ATF_REQUIRE_EQ(keys_seen.count(name), 0); 544235783Skib 545235783Skib if (strcmp(name, nullkey) == 0) 546235783Skib verify_null(unpacked, type); 547235783Skib else if (strcmp(name, numkey) == 0) 548235783Skib verify_number(unpacked, name, type, numvalue); 549235783Skib else if (strcmp(name, strkey) == 0) 550235783Skib verify_string(unpacked, name, type, strvalue); 551235783Skib else if (strcmp(name, nvkey) == 0) 552235783Skib verify_nvlist(unpacked, name, type); 553235783Skib else if (strcmp(name, binkey) == 0) 554235783Skib verify_binary(unpacked, name, type, binvalue, binsize); 555235783Skib else { 556235783Skib msg << "Unexpected key :'" << name << "'"; 557235783Skib ATF_FAIL(msg.str().c_str()); 558235783Skib } 559235783Skib 560235783Skib keys_seen.insert(name); 561235783Skib } 562235783Skib 563235783Skib /* Ensure that we saw every key. */ 564235783Skib ATF_REQUIRE_EQ(keys_seen.size(), 5); 565235783Skib 566235783Skib nvlist_destroy(nvl); 567235783Skib nvlist_destroy(unpacked); 568235783Skib free(packed); 569235783Skib} 570235783Skib 571235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist); 572235783SkibATF_TEST_CASE_BODY(nvlist_pack__error_nvlist) 573235783Skib{ 574235783Skib nvlist_t *nvl; 575235783Skib void *packed; 576235783Skib size_t size; 577235783Skib 578235783Skib nvl = nvlist_create(0); 579235783Skib ATF_REQUIRE(nvl != NULL); 580235783Skib 581235783Skib nvlist_set_error(nvl, ENOMEM); 582235783Skib 583235783Skib packed = nvlist_pack(nvl, &size); 584235783Skib ATF_REQUIRE(packed == NULL); 585235783Skib 586235783Skib nvlist_destroy(nvl); 587235783Skib} 588235783Skib 589235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key); 590235783SkibATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key) 591235783Skib{ 592235783Skib nvlist_t *nvl, *unpacked; 593235783Skib const char *key1, *key2; 594235783Skib void *packed, *keypos; 595235783Skib size_t size, keylen; 596235783Skib 597235783Skib nvl = nvlist_create(0); 598235783Skib 599235783Skib key1 = "key1"; 600235783Skib keylen = strlen(key1); 601235783Skib nvlist_add_number(nvl, key1, 5); 602235783Skib 603235783Skib key2 = "key2"; 604235783Skib ATF_REQUIRE_EQ(keylen, strlen(key2)); 605235783Skib nvlist_add_number(nvl, key2, 10); 606235783Skib 607235783Skib packed = nvlist_pack(nvl, &size); 608235783Skib ATF_REQUIRE(packed != NULL); 609235783Skib 610235783Skib /* 611235783Skib * Mangle the packed nvlist by replacing key1 with key2, creating a 612235783Skib * packed nvlist with a duplicate key. 613235783Skib */ 614235783Skib keypos = memmem(packed, size, key1, keylen); 615235783Skib ATF_REQUIRE(keypos != NULL); 616235783Skib memcpy(keypos, key2, keylen); 617235783Skib 618235783Skib unpacked = nvlist_unpack(packed, size); 619235783Skib ATF_REQUIRE(nvlist_error(unpacked) != 0); 620235783Skib 621235783Skib free(packed); 622235783Skib nvlist_destroy(nvl); 623235783Skib nvlist_destroy(unpacked); 624235783Skib} 625235783Skib 626235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert); 627235783SkibATF_TEST_CASE_BODY(nvlist_move_string__single_insert) 628235783Skib{ 629235783Skib nvlist_t *nvl; 630235783Skib const char *key; 631235783Skib char *value; 632235783Skib 633235783Skib nvl = nvlist_create(0); 634235783Skib ATF_REQUIRE(nvl != NULL); 635235783Skib 636235783Skib key = "testkey"; 637235783Skib value = strdup("testval"); 638235783Skib ATF_REQUIRE(value != NULL); 639235783Skib 640235783Skib nvlist_move_string(nvl, key, value); 641235783Skib ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value); 642235783Skib 643235783Skib nvlist_destroy(nvl); 644235783Skib} 645235783Skib 646235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child); 647235783SkibATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child) 648235783Skib{ 649235783Skib nvlist_t *parent; 650235783Skib 651235783Skib parent = nvlist_create(0); 652235783Skib 653235783Skib nvlist_move_nvlist(parent, "test", NULL); 654235783Skib 655235783Skib ATF_REQUIRE(nvlist_error(parent) != 0); 656235783Skib 657235783Skib nvlist_destroy(parent); 658235783Skib} 659235783Skib 660235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error); 661235783SkibATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error) 662235783Skib{ 663235783Skib nvlist_t *nvl, *parent; 664235783Skib 665235783Skib nvl = nvlist_create(0); 666235783Skib parent = nvlist_create(0); 667235783Skib 668235783Skib nvlist_set_error(nvl, EBADF); 669235783Skib nvlist_move_nvlist(parent, "test", nvl); 670235783Skib ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 671235783Skib 672235783Skib nvlist_destroy(parent); 673235783Skib} 674235783Skib 675235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert); 676235783SkibATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert) 677235783Skib{ 678235783Skib nvlist_t *nvl; 679235783Skib const char *key; 680235783Skib nvlist_t *value; 681235783Skib 682235783Skib nvl = nvlist_create(0); 683235783Skib ATF_REQUIRE(nvl != NULL); 684235783Skib 685235783Skib key = "testkey"; 686235783Skib value = nvlist_create(0); 687235783Skib ATF_REQUIRE(value != NULL); 688235783Skib 689235783Skib nvlist_move_nvlist(nvl, key, value); 690235783Skib ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value); 691235783Skib 692235783Skib nvlist_destroy(nvl); 693235783Skib} 694235783Skib 695235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert); 696235783SkibATF_TEST_CASE_BODY(nvlist_move_binary__single_insert) 697235783Skib{ 698235783Skib nvlist_t *nvl; 699235783Skib const char *key; 700235783Skib void *value; 701235783Skib size_t size, actual_size; 702235783Skib 703235783Skib nvl = nvlist_create(0); 704235783Skib ATF_REQUIRE(nvl != NULL); 705235783Skib 706235783Skib key = "testkey"; 707235783Skib size = 73; 708235783Skib value = malloc(size); 709235783Skib ATF_REQUIRE(value != NULL); 710235783Skib 711235783Skib nvlist_move_binary(nvl, key, value, size); 712235783Skib ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value); 713235783Skib ATF_REQUIRE_EQ(size, actual_size); 714235783Skib 715235783Skib nvlist_destroy(nvl); 716235783Skib} 717235783Skib 718235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove); 719235783SkibATF_TEST_CASE_BODY(nvlist_take_bool__single_remove) 720235783Skib{ 721235783Skib nvlist_t *nvl; 722235783Skib const char *testkey; 723235783Skib bool testval; 724235783Skib 725235783Skib nvl = nvlist_create(0); 726235783Skib ATF_REQUIRE(nvl != NULL); 727235783Skib 728235783Skib testkey = "boolkey"; 729235783Skib testval = false; 730235783Skib nvlist_add_bool(nvl, testkey, testval); 731235783Skib 732235783Skib ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 733235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 734235783Skib 735235783Skib nvlist_destroy(nvl); 736235783Skib} 737235783Skib 738235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged); 739235783SkibATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged) 740235783Skib{ 741235783Skib nvlist_t *nvl; 742235783Skib const char *testkey, *otherkey1, *otherkey2; 743235783Skib bool testval, otherval1; 744235783Skib nvlist_t *otherval2; 745235783Skib 746235783Skib nvl = nvlist_create(0); 747235783Skib ATF_REQUIRE(nvl != NULL); 748235783Skib 749235783Skib testkey = "boolkey"; 750235783Skib testval = true; 751235783Skib nvlist_add_bool(nvl, testkey, testval); 752235783Skib 753235783Skib otherkey1 = "key1"; 754235783Skib otherval1 = false; 755235783Skib nvlist_add_bool(nvl, otherkey1, otherval1); 756235783Skib 757235783Skib otherkey2 = "key2"; 758235783Skib otherval2 = create_test_nvlist(); 759235783Skib nvlist_move_nvlist(nvl, otherkey2, otherval2); 760235783Skib 761235783Skib ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 762235783Skib 763235783Skib ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1)); 764235783Skib ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1); 765235783Skib 766235783Skib ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2)); 767235783Skib verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2)); 768235783Skib 769235783Skib nvlist_destroy(nvl); 770235783Skib} 771235783Skib 772235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove); 773235783SkibATF_TEST_CASE_BODY(nvlist_take_number__single_remove) 774235783Skib{ 775235783Skib nvlist_t *nvl; 776235783Skib const char *testkey; 777235783Skib uint64_t testval; 778235783Skib 779235783Skib nvl = nvlist_create(0); 780235783Skib ATF_REQUIRE(nvl != NULL); 781235783Skib 782235783Skib testkey = "numkey"; 783235783Skib testval = std::numeric_limits<uint64_t>::max(); 784235783Skib nvlist_add_number(nvl, testkey, testval); 785235783Skib 786235783Skib ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 787235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 788235783Skib 789235783Skib nvlist_destroy(nvl); 790235783Skib} 791235783Skib 792235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged); 793235783SkibATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged) 794235783Skib{ 795235783Skib nvlist_t *nvl; 796235783Skib const char *testkey, *otherkey1, *otherkey2; 797235783Skib uint64_t testval, otherval1; 798235783Skib const char *otherval2; 799235783Skib 800235783Skib nvl = nvlist_create(0); 801235783Skib ATF_REQUIRE(nvl != NULL); 802235783Skib 803235783Skib otherkey1 = "key1"; 804235783Skib otherval1 = 5; 805235783Skib nvlist_add_number(nvl, otherkey1, otherval1); 806235783Skib 807235783Skib testkey = "numkey"; 808235783Skib testval = 1654; 809235783Skib nvlist_add_number(nvl, testkey, testval); 810235783Skib 811235783Skib otherkey2 = "key2"; 812235783Skib otherval2 = "string"; 813235783Skib nvlist_add_string(nvl, otherkey2, otherval2); 814235783Skib 815235783Skib ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 816235783Skib 817235783Skib ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1)); 818235783Skib ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1); 819235783Skib 820235783Skib ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2)); 821235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0); 822235783Skib 823235783Skib nvlist_destroy(nvl); 824235783Skib} 825235783Skib 826235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove); 827235783SkibATF_TEST_CASE_BODY(nvlist_take_string__single_remove) 828235783Skib{ 829235783Skib nvlist_t *nvl; 830235783Skib const char *testkey; 831235783Skib const char *testval; 832235783Skib 833235783Skib nvl = nvlist_create(0); 834235783Skib ATF_REQUIRE(nvl != NULL); 835235783Skib 836235783Skib testkey = "numkey"; 837235783Skib testval = "nvlist"; 838235783Skib nvlist_add_string(nvl, testkey, testval); 839235783Skib 840235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 841235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 842235783Skib 843235783Skib nvlist_destroy(nvl); 844235783Skib} 845235783Skib 846235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged); 847235783SkibATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged) 848235783Skib{ 849235783Skib nvlist_t *nvl; 850235783Skib const char *testkey, *otherkey1, *otherkey2; 851235783Skib const char *testval, *otherval1; 852235783Skib bool otherval2; 853235783Skib 854235783Skib nvl = nvlist_create(0); 855235783Skib ATF_REQUIRE(nvl != NULL); 856235783Skib 857235783Skib otherkey1 = "key1"; 858235783Skib otherval1 = "fjdifjdk"; 859235783Skib nvlist_add_string(nvl, otherkey1, otherval1); 860235783Skib 861235783Skib otherkey2 = "key2"; 862235783Skib otherval2 = true; 863235783Skib nvlist_add_bool(nvl, otherkey2, otherval2); 864235783Skib 865235783Skib testkey = "strkey"; 866235783Skib testval = "1654"; 867235783Skib nvlist_add_string(nvl, testkey, testval); 868235783Skib 869235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 870235783Skib 871235783Skib ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1)); 872235783Skib ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0); 873235783Skib 874235783Skib ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 875235783Skib ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 876235783Skib 877235783Skib nvlist_destroy(nvl); 878235783Skib} 879235783Skib 880235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove); 881235783SkibATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove) 882235783Skib{ 883235783Skib nvlist_t *nvl; 884235783Skib const char *testkey; 885235783Skib nvlist_t *testval; 886235783Skib 887235783Skib nvl = nvlist_create(0); 888235783Skib ATF_REQUIRE(nvl != NULL); 889235783Skib 890235783Skib testkey = "numkey"; 891235783Skib testval = create_test_nvlist(); 892235783Skib nvlist_move_nvlist(nvl, testkey, testval); 893235783Skib 894235783Skib verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 895235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 896235783Skib 897235783Skib nvlist_destroy(nvl); 898235783Skib} 899235783Skib 900235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged); 901235783SkibATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged) 902235783Skib{ 903235783Skib nvlist_t *nvl; 904235783Skib const char *testkey, *otherkey1, *otherkey2; 905235783Skib nvlist_t *testval, *otherval1; 906235783Skib 907235783Skib nvl = nvlist_create(0); 908235783Skib ATF_REQUIRE(nvl != NULL); 909235783Skib 910235783Skib testkey = "strkey"; 911235783Skib testval = create_test_nvlist(); 912235783Skib nvlist_move_nvlist(nvl, testkey, testval); 913235783Skib 914235783Skib otherkey1 = "key1"; 915235783Skib otherval1 = nvlist_create(0); 916235783Skib nvlist_move_nvlist(nvl, otherkey1, otherval1); 917235783Skib 918235783Skib otherkey2 = "key2"; 919235783Skib nvlist_add_null(nvl, otherkey2); 920235783Skib 921235783Skib verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 922235783Skib 923235783Skib ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1)); 924235783Skib ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1))); 925235783Skib 926235783Skib ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2)); 927235783Skib 928235783Skib nvlist_destroy(nvl); 929235783Skib} 930235783Skib 931235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove); 932235783SkibATF_TEST_CASE_BODY(nvlist_take_binary__single_remove) 933235783Skib{ 934235783Skib nvlist_t *nvl; 935235783Skib const char *testkey; 936235783Skib void *testval; 937235783Skib const void *actual_val; 938235783Skib size_t testsize, actual_size; 939235783Skib 940235783Skib nvl = nvlist_create(0); 941235783Skib ATF_REQUIRE(nvl != NULL); 942235783Skib 943235783Skib testkey = "numkey"; 944235783Skib testsize = 457; 945235783Skib testval = malloc(testsize); 946235783Skib memset(testval, '5', testsize); 947235783Skib nvlist_move_binary(nvl, testkey, testval, testsize); 948235783Skib 949235783Skib actual_val = nvlist_take_binary(nvl, testkey, &actual_size); 950235783Skib ATF_REQUIRE_EQ(testsize, actual_size); 951235783Skib ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0); 952235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 953235783Skib 954235783Skib nvlist_destroy(nvl); 955235783Skib} 956235783Skib 957235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged); 958235783SkibATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged) 959235783Skib{ 960235783Skib nvlist_t *nvl; 961235783Skib const char *testkey, *otherkey1, *otherkey2; 962235783Skib const void *actual_value; 963235783Skib char testval[] = "gjiertj"; 964235783Skib char otherval1[] = "fdreg"; 965235783Skib size_t testsize, othersize, actual_size; 966235783Skib bool otherval2; 967235783Skib 968235783Skib nvl = nvlist_create(0); 969235783Skib ATF_REQUIRE(nvl != NULL); 970235783Skib 971235783Skib otherkey1 = "key1"; 972235783Skib othersize = sizeof(otherval1); 973235783Skib nvlist_add_binary(nvl, otherkey1, otherval1, othersize); 974235783Skib 975235783Skib otherkey2 = "key2"; 976235783Skib otherval2 = true; 977235783Skib nvlist_add_bool(nvl, otherkey2, otherval2); 978235783Skib 979235783Skib testkey = "strkey"; 980235783Skib testsize = sizeof(testval); 981235783Skib nvlist_add_binary(nvl, testkey, testval, testsize); 982235783Skib 983235783Skib actual_value = nvlist_take_binary(nvl, testkey, &actual_size); 984235783Skib ATF_REQUIRE_EQ(testsize, actual_size); 985235783Skib ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0); 986235783Skib 987235783Skib ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1)); 988235783Skib actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size); 989235783Skib ATF_REQUIRE_EQ(othersize, actual_size); 990235783Skib ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0); 991235783Skib 992235783Skib ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 993235783Skib ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 994235783Skib 995235783Skib nvlist_destroy(nvl); 996235783Skib} 997235783Skib 998235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null); 999235783SkibATF_TEST_CASE_BODY(nvlist_free__single_null) 1000235783Skib{ 1001235783Skib nvlist_t *nvl; 1002235783Skib const char *key; 1003235783Skib 1004235783Skib nvl = nvlist_create(0); 1005235783Skib key = "test"; 1006235783Skib nvlist_add_null(nvl, key); 1007235783Skib 1008235783Skib nvlist_free(nvl, key); 1009235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1010235783Skib 1011235783Skib nvlist_destroy(nvl); 1012235783Skib} 1013235783Skib 1014235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool); 1015235783SkibATF_TEST_CASE_BODY(nvlist_free__single_bool) 1016235783Skib{ 1017235783Skib nvlist_t *nvl; 1018235783Skib const char *key; 1019235783Skib 1020235783Skib nvl = nvlist_create(0); 1021235783Skib key = "test"; 1022235783Skib nvlist_add_bool(nvl, key, true); 1023235783Skib 1024235783Skib nvlist_free(nvl, key); 1025235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1026235783Skib 1027235783Skib nvlist_destroy(nvl); 1028235783Skib} 1029235783Skib 1030235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number); 1031235783SkibATF_TEST_CASE_BODY(nvlist_free__single_number) 1032235783Skib{ 1033235783Skib nvlist_t *nvl; 1034235783Skib const char *key; 1035235783Skib 1036235783Skib nvl = nvlist_create(0); 1037235783Skib key = "test"; 1038235783Skib nvlist_add_number(nvl, key, 584); 1039235783Skib 1040235783Skib nvlist_free(nvl, key); 1041235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1042235783Skib 1043235783Skib nvlist_destroy(nvl); 1044235783Skib} 1045235783Skib 1046235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string); 1047235783SkibATF_TEST_CASE_BODY(nvlist_free__single_string) 1048235783Skib{ 1049235783Skib nvlist_t *nvl; 1050235783Skib const char *key; 1051235783Skib 1052235783Skib nvl = nvlist_create(0); 1053235783Skib key = "test"; 1054235783Skib nvlist_add_string(nvl, key, "gjkfkjd"); 1055235783Skib 1056235783Skib nvlist_free(nvl, key); 1057235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1058235783Skib 1059235783Skib nvlist_destroy(nvl); 1060235783Skib} 1061235783Skib 1062235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist); 1063235783SkibATF_TEST_CASE_BODY(nvlist_free__single_nvlist) 1064235783Skib{ 1065235783Skib nvlist_t *nvl; 1066235783Skib const char *key; 1067235783Skib 1068235783Skib nvl = nvlist_create(0); 1069235783Skib key = "test"; 1070235783Skib nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1071235783Skib 1072235783Skib nvlist_free(nvl, key); 1073235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1074235783Skib 1075235783Skib nvlist_destroy(nvl); 1076235783Skib} 1077235783Skib 1078235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary); 1079235783SkibATF_TEST_CASE_BODY(nvlist_free__single_binary) 1080235783Skib{ 1081235783Skib nvlist_t *nvl; 1082235783Skib const char *key; 1083235783Skib 1084235783Skib nvl = nvlist_create(0); 1085235783Skib key = "test"; 1086235783Skib nvlist_add_binary(nvl, key, "jgjgfd", 6); 1087235783Skib 1088235783Skib nvlist_free(nvl, key); 1089235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1090235783Skib 1091235783Skib nvlist_destroy(nvl); 1092235783Skib} 1093235783Skib 1094235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null); 1095235783SkibATF_TEST_CASE_BODY(nvlist_free_null__single_null) 1096235783Skib{ 1097235783Skib nvlist_t *nvl; 1098235783Skib const char *key; 1099235783Skib 1100235783Skib nvl = nvlist_create(0); 1101235783Skib key = "test"; 1102235783Skib nvlist_add_null(nvl, key); 1103235783Skib 1104235783Skib nvlist_free_null(nvl, key); 1105235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1106235783Skib 1107235783Skib nvlist_destroy(nvl); 1108235783Skib} 1109235783Skib 1110235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool); 1111235783SkibATF_TEST_CASE_BODY(nvlist_free_bool__single_bool) 1112235783Skib{ 1113235783Skib nvlist_t *nvl; 1114235783Skib const char *key; 1115235783Skib 1116235783Skib nvl = nvlist_create(0); 1117235783Skib key = "test"; 1118235783Skib nvlist_add_bool(nvl, key, true); 1119235783Skib 1120235783Skib nvlist_free_bool(nvl, key); 1121235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1122235783Skib 1123235783Skib nvlist_destroy(nvl); 1124235783Skib} 1125235783Skib 1126235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number); 1127235783SkibATF_TEST_CASE_BODY(nvlist_free_number__single_number) 1128235783Skib{ 1129235783Skib nvlist_t *nvl; 1130235783Skib const char *key; 1131235783Skib 1132235783Skib nvl = nvlist_create(0); 1133235783Skib key = "test"; 1134235783Skib nvlist_add_number(nvl, key, 584); 1135235783Skib 1136235783Skib nvlist_free_number(nvl, key); 1137235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1138235783Skib 1139235783Skib nvlist_destroy(nvl); 1140235783Skib} 1141235783Skib 1142235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string); 1143235783SkibATF_TEST_CASE_BODY(nvlist_free_string__single_string) 1144235783Skib{ 1145235783Skib nvlist_t *nvl; 1146235783Skib const char *key; 1147235783Skib 1148235783Skib nvl = nvlist_create(0); 1149235783Skib key = "test"; 1150235783Skib nvlist_add_string(nvl, key, "gjkfkjd"); 1151235783Skib 1152235783Skib nvlist_free_string(nvl, key); 1153235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1154235783Skib 1155235783Skib nvlist_destroy(nvl); 1156235783Skib} 1157235783Skib 1158235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist); 1159235783SkibATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist) 1160235783Skib{ 1161235783Skib nvlist_t *nvl; 1162235783Skib const char *key; 1163235783Skib 1164235783Skib nvl = nvlist_create(0); 1165235783Skib key = "test"; 1166235783Skib nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1167235783Skib 1168235783Skib nvlist_free_nvlist(nvl, key); 1169235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1170235783Skib 1171235783Skib nvlist_destroy(nvl); 1172235783Skib} 1173235783Skib 1174235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary); 1175235783SkibATF_TEST_CASE_BODY(nvlist_free_binary__single_binary) 1176235783Skib{ 1177235783Skib nvlist_t *nvl; 1178235783Skib const char *key; 1179235783Skib 1180235783Skib nvl = nvlist_create(0); 1181235783Skib key = "test"; 1182235783Skib nvlist_add_binary(nvl, key, "jgjgfd", 6); 1183235783Skib 1184235783Skib nvlist_free_binary(nvl, key); 1185235783Skib ATF_REQUIRE(nvlist_empty(nvl)); 1186235783Skib 1187235783Skib nvlist_destroy(nvl); 1188235783Skib} 1189235783Skib 1190235783SkibATF_INIT_TEST_CASES(tp) 1191235783Skib{ 1192235783Skib ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty); 1193235783Skib ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert); 1194235783Skib ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert); 1195235783Skib ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert); 1196235783Skib ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert); 1197235783Skib ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert); 1198235783Skib ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error); 1199235783Skib ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert); 1200235783Skib 1201235783Skib ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist); 1202235783Skib ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist); 1203235783Skib ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist); 1204235783Skib ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist); 1205235783Skib 1206235783Skib ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist); 1207235783Skib ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values); 1208235783Skib ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist); 1209235783Skib ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key); 1210235783Skib 1211235783Skib ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert); 1212235783Skib ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert); 1213235783Skib ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child); 1214235783Skib ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error); 1215235783Skib ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert); 1216235783Skib 1217235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove); 1218235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged); 1219235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove); 1220235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged); 1221235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove); 1222235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged); 1223235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove); 1224235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged); 1225235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove); 1226235783Skib ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged); 1227235783Skib 1228235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free__single_null); 1229235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool); 1230235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free__single_number); 1231235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free__single_string); 1232235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist); 1233235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary); 1234235783Skib 1235235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null); 1236235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool); 1237235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number); 1238235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string); 1239235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist); 1240235783Skib ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary); 1241235783Skib} 1242235783Skib