1 /*- 2 * Copyright (c) 2014-2015 Sandvine Inc. All rights reserved. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27 #include <sys/cdefs.h> 28 __FBSDID("$FreeBSD$"); 29 30 #include <atf-c++.hpp> 31 #include <nv.h> 32 33 #include <errno.h> 34 #include <limits> 35 #include <set> 36 #include <sstream> 37 #include <string> 38 39 /* 40 * Test that a newly created nvlist has no errors, and is empty. 41 */ 42 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty); 43 ATF_TEST_CASE_BODY(nvlist_create__is_empty) 44 { 45 nvlist_t *nvl; 46 int type; 47 void *it; 48 49 nvl = nvlist_create(0); 50 51 ATF_REQUIRE(nvl != NULL); 52 53 ATF_REQUIRE_EQ(nvlist_error(nvl), 0); 54 ATF_REQUIRE(nvlist_empty(nvl)); 55 56 it = NULL; 57 ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL)); 58 59 nvlist_destroy(nvl); 60 } 61 62 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert); 63 ATF_TEST_CASE_BODY(nvlist_add_null__single_insert) 64 { 65 nvlist_t *nvl; 66 void *it; 67 const char *key; 68 int type; 69 70 key = "key"; 71 nvl = nvlist_create(0); 72 73 ATF_REQUIRE(nvl != NULL); 74 ATF_REQUIRE(!nvlist_exists(nvl, key)); 75 76 nvlist_add_null(nvl, key); 77 78 ATF_REQUIRE(!nvlist_empty(nvl)); 79 ATF_REQUIRE(nvlist_exists(nvl, key)); 80 ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 81 ATF_REQUIRE(nvlist_exists_null(nvl, key)); 82 ATF_REQUIRE(nvlist_existsf_null(nvl, "key")); 83 84 /* Iterate over the nvlist; ensure that it has only our one key. */ 85 it = NULL; 86 ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 87 ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 88 ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 89 90 nvlist_destroy(nvl); 91 } 92 93 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert); 94 ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert) 95 { 96 nvlist_t *nvl; 97 void *it; 98 const char *key; 99 int type; 100 101 key = "name"; 102 nvl = nvlist_create(0); 103 104 ATF_REQUIRE(nvl != NULL); 105 ATF_REQUIRE(!nvlist_exists(nvl, key)); 106 107 nvlist_add_bool(nvl, key, true); 108 109 ATF_REQUIRE(!nvlist_empty(nvl)); 110 ATF_REQUIRE(nvlist_exists(nvl, key)); 111 ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me")); 112 ATF_REQUIRE(nvlist_exists_bool(nvl, key)); 113 ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e')); 114 ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true); 115 ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true); 116 117 /* Iterate over the nvlist; ensure that it has only our one key. */ 118 it = NULL; 119 ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 120 ATF_REQUIRE_EQ(type, NV_TYPE_BOOL); 121 ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 122 123 nvlist_destroy(nvl); 124 } 125 126 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert); 127 ATF_TEST_CASE_BODY(nvlist_add_number__single_insert) 128 { 129 nvlist_t *nvl; 130 void *it; 131 const char *key; 132 uint64_t value; 133 int type; 134 135 key = "foo123"; 136 value = 71965; 137 nvl = nvlist_create(0); 138 139 ATF_REQUIRE(nvl != NULL); 140 ATF_REQUIRE(!nvlist_exists(nvl, key)); 141 142 nvlist_add_number(nvl, key, value); 143 144 ATF_REQUIRE(!nvlist_empty(nvl)); 145 ATF_REQUIRE(nvlist_exists(nvl, key)); 146 ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123)); 147 ATF_REQUIRE(nvlist_exists_number(nvl, key)); 148 ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key)); 149 ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value); 150 ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value); 151 152 /* Iterate over the nvlist; ensure that it has only our one key. */ 153 it = NULL; 154 ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 155 ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 156 ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 157 158 nvlist_destroy(nvl); 159 } 160 161 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert); 162 ATF_TEST_CASE_BODY(nvlist_add_string__single_insert) 163 { 164 nvlist_t *nvl; 165 void *it; 166 const char *key; 167 const char *value; 168 int type; 169 170 key = "test"; 171 value = "fgjdkgjdk"; 172 nvl = nvlist_create(0); 173 174 ATF_REQUIRE(nvl != NULL); 175 ATF_REQUIRE(!nvlist_exists(nvl, key)); 176 177 nvlist_add_string(nvl, key, value); 178 179 ATF_REQUIRE(!nvlist_empty(nvl)); 180 ATF_REQUIRE(nvlist_exists(nvl, key)); 181 ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 182 ATF_REQUIRE(nvlist_exists_string(nvl, key)); 183 ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key)); 184 ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0); 185 ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0); 186 187 /* nvlist_add_* is required to clone the value, so check for that. */ 188 ATF_REQUIRE(nvlist_get_string(nvl, key) != value); 189 190 /* Iterate over the nvlist; ensure that it has only our one key. */ 191 it = NULL; 192 ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 193 ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 194 ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 195 196 nvlist_destroy(nvl); 197 } 198 199 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert); 200 ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert) 201 { 202 nvlist_t *nvl; 203 void *it; 204 const char *key, *subkey; 205 nvlist_t *sublist; 206 const nvlist_t *value; 207 int type; 208 209 key = "test"; 210 subkey = "subkey"; 211 sublist = nvlist_create(0); 212 nvl = nvlist_create(0); 213 214 ATF_REQUIRE(nvl != NULL); 215 ATF_REQUIRE(!nvlist_exists(nvl, key)); 216 217 nvlist_add_null(sublist, subkey); 218 nvlist_add_nvlist(nvl, key, sublist); 219 220 ATF_REQUIRE(!nvlist_empty(nvl)); 221 ATF_REQUIRE(nvlist_exists(nvl, key)); 222 ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 223 ATF_REQUIRE(nvlist_exists_nvlist(nvl, key)); 224 ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key)); 225 226 value = nvlist_get_nvlist(nvl, key); 227 ATF_REQUIRE(nvlist_exists_null(value, subkey)); 228 229 /* nvlist_add_* is required to clone the value, so check for that. */ 230 ATF_REQUIRE(sublist != value); 231 232 value = nvlist_getf_nvlist(nvl, "%s", key); 233 ATF_REQUIRE(nvlist_exists_null(value, subkey)); 234 ATF_REQUIRE(sublist != value); 235 236 /* Iterate over the nvlist; ensure that it has only our one key. */ 237 it = NULL; 238 ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 239 ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 240 ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 241 242 nvlist_destroy(sublist); 243 nvlist_destroy(nvl); 244 } 245 246 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error); 247 ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error) 248 { 249 nvlist_t *nvl, *parent; 250 251 nvl = nvlist_create(0); 252 parent = nvlist_create(0); 253 254 nvlist_set_error(nvl, EBADF); 255 nvlist_add_nvlist(parent, "test", nvl); 256 ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 257 258 nvlist_destroy(nvl); 259 nvlist_destroy(parent); 260 } 261 262 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert); 263 ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert) 264 { 265 nvlist_t *nvl; 266 void *it; 267 const char *key; 268 void *value; 269 const void *ret_value; 270 size_t value_size, ret_size; 271 int type; 272 273 key = "binary"; 274 value_size = 13; 275 value = malloc(value_size); 276 memset(value, 0xa5, value_size); 277 nvl = nvlist_create(0); 278 279 ATF_REQUIRE(nvl != NULL); 280 ATF_REQUIRE(!nvlist_exists(nvl, key)); 281 282 nvlist_add_binary(nvl, key, value, value_size); 283 284 ATF_REQUIRE(!nvlist_empty(nvl)); 285 ATF_REQUIRE(nvlist_exists(nvl, key)); 286 ATF_REQUIRE(nvlist_existsf(nvl, "%s", key)); 287 ATF_REQUIRE(nvlist_exists_binary(nvl, key)); 288 ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key)); 289 290 ret_value = nvlist_get_binary(nvl, key, &ret_size); 291 ATF_REQUIRE_EQ(value_size, ret_size); 292 ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 293 294 /* nvlist_add_* is required to clone the value, so check for that. */ 295 ATF_REQUIRE(value != ret_value); 296 297 ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key); 298 ATF_REQUIRE_EQ(value_size, ret_size); 299 ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0); 300 ATF_REQUIRE(value != ret_value); 301 302 /* Iterate over the nvlist; ensure that it has only our one key. */ 303 it = NULL; 304 ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0); 305 ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 306 ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL)); 307 308 nvlist_destroy(nvl); 309 free(value); 310 } 311 312 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist); 313 ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist) 314 { 315 nvlist_t *nvl, *clone; 316 317 nvl = nvlist_create(0); 318 ATF_REQUIRE(nvl != NULL); 319 320 clone = nvlist_clone(nvl); 321 ATF_REQUIRE(clone != NULL); 322 ATF_REQUIRE(clone != nvl); 323 ATF_REQUIRE(nvlist_empty(clone)); 324 325 nvlist_destroy(clone); 326 nvlist_destroy(nvl); 327 } 328 329 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist); 330 ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist) 331 { 332 nvlist_t *nvl, *clone; 333 const char *key; 334 void *it; 335 uint64_t value; 336 int type; 337 338 nvl = nvlist_create(0); 339 ATF_REQUIRE(nvl != NULL); 340 341 key = "testkey"; 342 value = 684874; 343 nvlist_add_number(nvl, key, value); 344 345 clone = nvlist_clone(nvl); 346 ATF_REQUIRE(clone != NULL); 347 ATF_REQUIRE(clone != nvl); 348 ATF_REQUIRE(nvlist_exists_number(clone, key)); 349 ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value); 350 351 /* Iterate over the nvlist; ensure that it has only our one key. */ 352 it = NULL; 353 ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0); 354 ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 355 ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL)); 356 357 nvlist_destroy(clone); 358 nvlist_destroy(nvl); 359 } 360 361 static const char * const test_subnvlist_key = "nvlist"; 362 363 static const char * const test_string_key = "string"; 364 static const char * const test_string_val = "59525"; 365 366 static nvlist_t* 367 create_test_nvlist(void) 368 { 369 nvlist_t *nvl, *sublist; 370 371 nvl = nvlist_create(0); 372 ATF_REQUIRE(nvl != NULL); 373 374 sublist = nvlist_create(0); 375 ATF_REQUIRE(sublist != NULL); 376 377 nvlist_add_string(sublist, test_string_key, test_string_val); 378 nvlist_move_nvlist(nvl, test_subnvlist_key, sublist); 379 380 return (nvl); 381 } 382 383 static void 384 verify_test_nvlist(const nvlist_t *nvl) 385 { 386 void *it; 387 const nvlist_t *value; 388 int type; 389 390 ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key)); 391 392 value = nvlist_get_nvlist(nvl, test_subnvlist_key); 393 394 ATF_REQUIRE(nvlist_exists_string(value, test_string_key)); 395 ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0); 396 ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val); 397 398 /* Iterate over both nvlists; ensure that each has only the one key. */ 399 it = NULL; 400 ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it), 401 test_string_key), 0); 402 ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 403 ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL)); 404 405 it = NULL; 406 ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), 407 test_subnvlist_key), 0); 408 ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 409 ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL)); 410 } 411 412 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist); 413 ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist) 414 { 415 nvlist_t *nvl, *clone; 416 417 nvl = create_test_nvlist(); 418 clone = nvlist_clone(nvl); 419 420 ATF_REQUIRE(clone != NULL); 421 ATF_REQUIRE(clone != nvl); 422 verify_test_nvlist(clone); 423 424 nvlist_destroy(clone); 425 nvlist_destroy(nvl); 426 } 427 428 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist); 429 ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist) 430 { 431 nvlist_t *nvl, *clone; 432 433 nvl = nvlist_create(0); 434 ATF_REQUIRE(nvl != NULL); 435 436 nvlist_set_error(nvl, ENOMEM); 437 438 clone = nvlist_clone(nvl); 439 ATF_REQUIRE(clone == NULL); 440 441 nvlist_destroy(nvl); 442 } 443 444 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist); 445 ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist) 446 { 447 nvlist_t *nvl, *unpacked; 448 void *packed; 449 size_t packed_size; 450 451 nvl = nvlist_create(0); 452 ATF_REQUIRE(nvl != NULL); 453 454 packed = nvlist_pack(nvl, &packed_size); 455 ATF_REQUIRE(packed != NULL); 456 457 unpacked = nvlist_unpack(packed, packed_size); 458 ATF_REQUIRE(unpacked != NULL); 459 ATF_REQUIRE(unpacked != nvl); 460 ATF_REQUIRE(nvlist_empty(unpacked)); 461 462 nvlist_destroy(unpacked); 463 nvlist_destroy(nvl); 464 free(packed); 465 } 466 467 static void 468 verify_null(const nvlist_t *nvl, int type) 469 { 470 471 ATF_REQUIRE_EQ(type, NV_TYPE_NULL); 472 } 473 474 static void 475 verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value) 476 { 477 478 ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER); 479 ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value); 480 } 481 482 static void 483 verify_string(const nvlist_t *nvl, const char *name, int type, 484 const char * value) 485 { 486 487 ATF_REQUIRE_EQ(type, NV_TYPE_STRING); 488 ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0); 489 } 490 491 static void 492 verify_nvlist(const nvlist_t *nvl, const char *name, int type) 493 { 494 495 ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST); 496 verify_test_nvlist(nvlist_get_nvlist(nvl, name)); 497 } 498 499 static void 500 verify_binary(const nvlist_t *nvl, const char *name, int type, 501 const void * value, size_t size) 502 { 503 const void *actual_value; 504 size_t actual_size; 505 506 ATF_REQUIRE_EQ(type, NV_TYPE_BINARY); 507 actual_value = nvlist_get_binary(nvl, name, &actual_size); 508 ATF_REQUIRE_EQ(size, actual_size); 509 ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0); 510 } 511 512 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values); 513 ATF_TEST_CASE_BODY(nvlist_pack__multiple_values) 514 { 515 std::ostringstream msg; 516 std::set<std::string> keys_seen; 517 nvlist_t *nvl, *unpacked, *nvvalue; 518 const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name; 519 int numvalue; 520 const char * strvalue; 521 void *binvalue, *packed, *it; 522 size_t binsize, packed_size; 523 int type; 524 525 nvl = nvlist_create(0); 526 527 nullkey = "null"; 528 nvlist_add_null(nvl, nullkey); 529 530 numkey = "number"; 531 numvalue = 939853984; 532 nvlist_add_number(nvl, numkey, numvalue); 533 534 strkey = "string"; 535 strvalue = "jfieutijf"; 536 nvlist_add_string(nvl, strkey, strvalue); 537 538 nvkey = "nvlist"; 539 nvvalue = create_test_nvlist(); 540 nvlist_move_nvlist(nvl, nvkey, nvvalue); 541 542 binkey = "binary"; 543 binsize = 4; 544 binvalue = malloc(binsize); 545 memset(binvalue, 'b', binsize); 546 nvlist_move_binary(nvl, binkey, binvalue, binsize); 547 548 packed = nvlist_pack(nvl, &packed_size); 549 ATF_REQUIRE(packed != NULL); 550 551 unpacked = nvlist_unpack(packed, packed_size); 552 ATF_REQUIRE(unpacked != 0); 553 554 it = NULL; 555 while ((name = nvlist_next(unpacked, &type, &it)) != NULL) { 556 /* Ensure that we see every key only once. */ 557 ATF_REQUIRE_EQ(keys_seen.count(name), 0); 558 559 if (strcmp(name, nullkey) == 0) 560 verify_null(unpacked, type); 561 else if (strcmp(name, numkey) == 0) 562 verify_number(unpacked, name, type, numvalue); 563 else if (strcmp(name, strkey) == 0) 564 verify_string(unpacked, name, type, strvalue); 565 else if (strcmp(name, nvkey) == 0) 566 verify_nvlist(unpacked, name, type); 567 else if (strcmp(name, binkey) == 0) 568 verify_binary(unpacked, name, type, binvalue, binsize); 569 else { 570 msg << "Unexpected key :'" << name << "'"; 571 ATF_FAIL(msg.str().c_str()); 572 } 573 574 keys_seen.insert(name); 575 } 576 577 /* Ensure that we saw every key. */ 578 ATF_REQUIRE_EQ(keys_seen.size(), 5); 579 580 nvlist_destroy(nvl); 581 nvlist_destroy(unpacked); 582 free(packed); 583 } 584 585 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist); 586 ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist) 587 { 588 nvlist_t *nvl; 589 void *packed; 590 size_t size; 591 592 nvl = nvlist_create(0); 593 ATF_REQUIRE(nvl != NULL); 594 595 nvlist_set_error(nvl, ENOMEM); 596 597 packed = nvlist_pack(nvl, &size); 598 ATF_REQUIRE(packed == NULL); 599 600 nvlist_destroy(nvl); 601 } 602 603 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key); 604 ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key) 605 { 606 nvlist_t *nvl, *unpacked; 607 const char *key1, *key2; 608 void *packed, *keypos; 609 size_t size, keylen; 610 611 nvl = nvlist_create(0); 612 613 key1 = "key1"; 614 keylen = strlen(key1); 615 nvlist_add_number(nvl, key1, 5); 616 617 key2 = "key2"; 618 ATF_REQUIRE_EQ(keylen, strlen(key2)); 619 nvlist_add_number(nvl, key2, 10); 620 621 packed = nvlist_pack(nvl, &size); 622 623 /* 624 * Mangle the packed nvlist by replacing key1 with key2, creating a 625 * packed nvlist with a duplicate key. 626 */ 627 keypos = memmem(packed, size, key1, keylen); 628 ATF_REQUIRE(keypos != NULL); 629 memcpy(keypos, key2, keylen); 630 631 unpacked = nvlist_unpack(packed, size); 632 ATF_REQUIRE(nvlist_error(unpacked) != 0); 633 634 free(packed); 635 nvlist_destroy(nvl); 636 nvlist_destroy(unpacked); 637 } 638 639 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert); 640 ATF_TEST_CASE_BODY(nvlist_move_string__single_insert) 641 { 642 nvlist_t *nvl; 643 const char *key; 644 char *value; 645 646 nvl = nvlist_create(0); 647 ATF_REQUIRE(nvl != NULL); 648 649 key = "testkey"; 650 value = strdup("testval"); 651 ATF_REQUIRE(value != NULL); 652 653 nvlist_move_string(nvl, key, value); 654 ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value); 655 656 nvlist_destroy(nvl); 657 } 658 659 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child); 660 ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child) 661 { 662 nvlist_t *parent; 663 664 parent = nvlist_create(0); 665 666 nvlist_move_nvlist(parent, "test", NULL); 667 668 ATF_REQUIRE(nvlist_error(parent) != 0); 669 670 nvlist_destroy(parent); 671 } 672 673 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error); 674 ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error) 675 { 676 nvlist_t *nvl, *parent; 677 678 nvl = nvlist_create(0); 679 parent = nvlist_create(0); 680 681 nvlist_set_error(nvl, EBADF); 682 nvlist_move_nvlist(parent, "test", nvl); 683 ATF_REQUIRE_EQ(nvlist_error(parent), EBADF); 684 685 nvlist_destroy(parent); 686 } 687 688 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert); 689 ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert) 690 { 691 nvlist_t *nvl; 692 const char *key; 693 nvlist_t *value; 694 695 nvl = nvlist_create(0); 696 ATF_REQUIRE(nvl != NULL); 697 698 key = "testkey"; 699 value = nvlist_create(0); 700 ATF_REQUIRE(value != NULL); 701 702 nvlist_move_nvlist(nvl, key, value); 703 ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value); 704 705 nvlist_destroy(nvl); 706 } 707 708 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert); 709 ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert) 710 { 711 nvlist_t *nvl; 712 const char *key; 713 void *value; 714 size_t size, actual_size; 715 716 nvl = nvlist_create(0); 717 ATF_REQUIRE(nvl != NULL); 718 719 key = "testkey"; 720 size = 73; 721 value = malloc(size); 722 ATF_REQUIRE(value != NULL); 723 724 nvlist_move_binary(nvl, key, value, size); 725 ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value); 726 ATF_REQUIRE_EQ(size, actual_size); 727 728 nvlist_destroy(nvl); 729 } 730 731 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove); 732 ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove) 733 { 734 nvlist_t *nvl; 735 const char *testkey; 736 bool testval; 737 738 nvl = nvlist_create(0); 739 ATF_REQUIRE(nvl != NULL); 740 741 testkey = "boolkey"; 742 testval = false; 743 nvlist_add_bool(nvl, testkey, testval); 744 745 ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 746 ATF_REQUIRE(nvlist_empty(nvl)); 747 748 nvlist_destroy(nvl); 749 } 750 751 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged); 752 ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged) 753 { 754 nvlist_t *nvl; 755 const char *testkey, *otherkey1, *otherkey2; 756 bool testval, otherval1; 757 nvlist_t *otherval2; 758 759 nvl = nvlist_create(0); 760 ATF_REQUIRE(nvl != NULL); 761 762 testkey = "boolkey"; 763 testval = true; 764 nvlist_add_bool(nvl, testkey, testval); 765 766 otherkey1 = "key1"; 767 otherval1 = false; 768 nvlist_add_bool(nvl, otherkey1, otherval1); 769 770 otherkey2 = "key2"; 771 otherval2 = create_test_nvlist(); 772 nvlist_move_nvlist(nvl, otherkey2, otherval2); 773 774 ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval); 775 776 ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1)); 777 ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1); 778 779 ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2)); 780 verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2)); 781 782 nvlist_destroy(nvl); 783 } 784 785 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove); 786 ATF_TEST_CASE_BODY(nvlist_take_number__single_remove) 787 { 788 nvlist_t *nvl; 789 const char *testkey; 790 uint64_t testval; 791 792 nvl = nvlist_create(0); 793 ATF_REQUIRE(nvl != NULL); 794 795 testkey = "numkey"; 796 testval = std::numeric_limits<uint64_t>::max(); 797 nvlist_add_number(nvl, testkey, testval); 798 799 ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 800 ATF_REQUIRE(nvlist_empty(nvl)); 801 802 nvlist_destroy(nvl); 803 } 804 805 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged); 806 ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged) 807 { 808 nvlist_t *nvl; 809 const char *testkey, *otherkey1, *otherkey2; 810 uint64_t testval, otherval1; 811 const char *otherval2; 812 813 nvl = nvlist_create(0); 814 ATF_REQUIRE(nvl != NULL); 815 816 otherkey1 = "key1"; 817 otherval1 = 5; 818 nvlist_add_number(nvl, otherkey1, otherval1); 819 820 testkey = "numkey"; 821 testval = 1654; 822 nvlist_add_number(nvl, testkey, testval); 823 824 otherkey2 = "key2"; 825 otherval2 = "string"; 826 nvlist_add_string(nvl, otherkey2, otherval2); 827 828 ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval); 829 830 ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1)); 831 ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1); 832 833 ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2)); 834 ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0); 835 836 nvlist_destroy(nvl); 837 } 838 839 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove); 840 ATF_TEST_CASE_BODY(nvlist_take_string__single_remove) 841 { 842 nvlist_t *nvl; 843 const char *testkey; 844 const char *testval; 845 846 nvl = nvlist_create(0); 847 ATF_REQUIRE(nvl != NULL); 848 849 testkey = "numkey"; 850 testval = "nvlist"; 851 nvlist_add_string(nvl, testkey, testval); 852 853 ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 854 ATF_REQUIRE(nvlist_empty(nvl)); 855 856 nvlist_destroy(nvl); 857 } 858 859 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged); 860 ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged) 861 { 862 nvlist_t *nvl; 863 const char *testkey, *otherkey1, *otherkey2; 864 const char *testval, *otherval1; 865 bool otherval2; 866 867 nvl = nvlist_create(0); 868 ATF_REQUIRE(nvl != NULL); 869 870 otherkey1 = "key1"; 871 otherval1 = "fjdifjdk"; 872 nvlist_add_string(nvl, otherkey1, otherval1); 873 874 otherkey2 = "key2"; 875 otherval2 = true; 876 nvlist_add_bool(nvl, otherkey2, otherval2); 877 878 testkey = "strkey"; 879 testval = "1654"; 880 nvlist_add_string(nvl, testkey, testval); 881 882 ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0); 883 884 ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1)); 885 ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0); 886 887 ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 888 ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 889 890 nvlist_destroy(nvl); 891 } 892 893 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove); 894 ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove) 895 { 896 nvlist_t *nvl; 897 const char *testkey; 898 nvlist_t *testval; 899 900 nvl = nvlist_create(0); 901 ATF_REQUIRE(nvl != NULL); 902 903 testkey = "numkey"; 904 testval = create_test_nvlist(); 905 nvlist_move_nvlist(nvl, testkey, testval); 906 907 verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 908 ATF_REQUIRE(nvlist_empty(nvl)); 909 910 nvlist_destroy(nvl); 911 } 912 913 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged); 914 ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged) 915 { 916 nvlist_t *nvl; 917 const char *testkey, *otherkey1, *otherkey2; 918 nvlist_t *testval, *otherval1; 919 920 nvl = nvlist_create(0); 921 ATF_REQUIRE(nvl != NULL); 922 923 testkey = "strkey"; 924 testval = create_test_nvlist(); 925 nvlist_move_nvlist(nvl, testkey, testval); 926 927 otherkey1 = "key1"; 928 otherval1 = nvlist_create(0); 929 nvlist_move_nvlist(nvl, otherkey1, otherval1); 930 931 otherkey2 = "key2"; 932 nvlist_add_null(nvl, otherkey2); 933 934 verify_test_nvlist(nvlist_take_nvlist(nvl, testkey)); 935 936 ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1)); 937 ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1))); 938 939 ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2)); 940 941 nvlist_destroy(nvl); 942 } 943 944 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove); 945 ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove) 946 { 947 nvlist_t *nvl; 948 const char *testkey; 949 void *testval; 950 const void *actual_val; 951 size_t testsize, actual_size; 952 953 nvl = nvlist_create(0); 954 ATF_REQUIRE(nvl != NULL); 955 956 testkey = "numkey"; 957 testsize = 457; 958 testval = malloc(testsize); 959 memset(testval, '5', testsize); 960 nvlist_move_binary(nvl, testkey, testval, testsize); 961 962 actual_val = nvlist_take_binary(nvl, testkey, &actual_size); 963 ATF_REQUIRE_EQ(testsize, actual_size); 964 ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0); 965 ATF_REQUIRE(nvlist_empty(nvl)); 966 967 nvlist_destroy(nvl); 968 } 969 970 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged); 971 ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged) 972 { 973 nvlist_t *nvl; 974 const char *testkey, *otherkey1, *otherkey2; 975 const void *actual_value; 976 char testval[] = "gjiertj"; 977 char otherval1[] = "fdreg"; 978 size_t testsize, othersize, actual_size; 979 bool otherval2; 980 981 nvl = nvlist_create(0); 982 ATF_REQUIRE(nvl != NULL); 983 984 otherkey1 = "key1"; 985 othersize = sizeof(otherval1); 986 nvlist_add_binary(nvl, otherkey1, otherval1, othersize); 987 988 otherkey2 = "key2"; 989 otherval2 = true; 990 nvlist_add_bool(nvl, otherkey2, otherval2); 991 992 testkey = "strkey"; 993 testsize = sizeof(testval); 994 nvlist_add_binary(nvl, testkey, testval, testsize); 995 996 actual_value = nvlist_take_binary(nvl, testkey, &actual_size); 997 ATF_REQUIRE_EQ(testsize, actual_size); 998 ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0); 999 1000 ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1)); 1001 actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size); 1002 ATF_REQUIRE_EQ(othersize, actual_size); 1003 ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0); 1004 1005 ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2)); 1006 ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2); 1007 1008 nvlist_destroy(nvl); 1009 } 1010 1011 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null); 1012 ATF_TEST_CASE_BODY(nvlist_free__single_null) 1013 { 1014 nvlist_t *nvl; 1015 const char *key; 1016 1017 nvl = nvlist_create(0); 1018 key = "test"; 1019 nvlist_add_null(nvl, key); 1020 1021 nvlist_free(nvl, key); 1022 ATF_REQUIRE(nvlist_empty(nvl)); 1023 1024 nvlist_destroy(nvl); 1025 } 1026 1027 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool); 1028 ATF_TEST_CASE_BODY(nvlist_free__single_bool) 1029 { 1030 nvlist_t *nvl; 1031 const char *key; 1032 1033 nvl = nvlist_create(0); 1034 key = "test"; 1035 nvlist_add_bool(nvl, key, true); 1036 1037 nvlist_free(nvl, key); 1038 ATF_REQUIRE(nvlist_empty(nvl)); 1039 1040 nvlist_destroy(nvl); 1041 } 1042 1043 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number); 1044 ATF_TEST_CASE_BODY(nvlist_free__single_number) 1045 { 1046 nvlist_t *nvl; 1047 const char *key; 1048 1049 nvl = nvlist_create(0); 1050 key = "test"; 1051 nvlist_add_number(nvl, key, 584); 1052 1053 nvlist_free(nvl, key); 1054 ATF_REQUIRE(nvlist_empty(nvl)); 1055 1056 nvlist_destroy(nvl); 1057 } 1058 1059 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string); 1060 ATF_TEST_CASE_BODY(nvlist_free__single_string) 1061 { 1062 nvlist_t *nvl; 1063 const char *key; 1064 1065 nvl = nvlist_create(0); 1066 key = "test"; 1067 nvlist_add_string(nvl, key, "gjkfkjd"); 1068 1069 nvlist_free(nvl, key); 1070 ATF_REQUIRE(nvlist_empty(nvl)); 1071 1072 nvlist_destroy(nvl); 1073 } 1074 1075 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist); 1076 ATF_TEST_CASE_BODY(nvlist_free__single_nvlist) 1077 { 1078 nvlist_t *nvl; 1079 const char *key; 1080 1081 nvl = nvlist_create(0); 1082 key = "test"; 1083 nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1084 1085 nvlist_free(nvl, key); 1086 ATF_REQUIRE(nvlist_empty(nvl)); 1087 1088 nvlist_destroy(nvl); 1089 } 1090 1091 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary); 1092 ATF_TEST_CASE_BODY(nvlist_free__single_binary) 1093 { 1094 nvlist_t *nvl; 1095 const char *key; 1096 1097 nvl = nvlist_create(0); 1098 key = "test"; 1099 nvlist_add_binary(nvl, key, "jgjgfd", 6); 1100 1101 nvlist_free(nvl, key); 1102 ATF_REQUIRE(nvlist_empty(nvl)); 1103 1104 nvlist_destroy(nvl); 1105 } 1106 1107 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null); 1108 ATF_TEST_CASE_BODY(nvlist_free_null__single_null) 1109 { 1110 nvlist_t *nvl; 1111 const char *key; 1112 1113 nvl = nvlist_create(0); 1114 key = "test"; 1115 nvlist_add_null(nvl, key); 1116 1117 nvlist_free_null(nvl, key); 1118 ATF_REQUIRE(nvlist_empty(nvl)); 1119 1120 nvlist_destroy(nvl); 1121 } 1122 1123 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool); 1124 ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool) 1125 { 1126 nvlist_t *nvl; 1127 const char *key; 1128 1129 nvl = nvlist_create(0); 1130 key = "test"; 1131 nvlist_add_bool(nvl, key, true); 1132 1133 nvlist_free_bool(nvl, key); 1134 ATF_REQUIRE(nvlist_empty(nvl)); 1135 1136 nvlist_destroy(nvl); 1137 } 1138 1139 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number); 1140 ATF_TEST_CASE_BODY(nvlist_free_number__single_number) 1141 { 1142 nvlist_t *nvl; 1143 const char *key; 1144 1145 nvl = nvlist_create(0); 1146 key = "test"; 1147 nvlist_add_number(nvl, key, 584); 1148 1149 nvlist_free_number(nvl, key); 1150 ATF_REQUIRE(nvlist_empty(nvl)); 1151 1152 nvlist_destroy(nvl); 1153 } 1154 1155 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string); 1156 ATF_TEST_CASE_BODY(nvlist_free_string__single_string) 1157 { 1158 nvlist_t *nvl; 1159 const char *key; 1160 1161 nvl = nvlist_create(0); 1162 key = "test"; 1163 nvlist_add_string(nvl, key, "gjkfkjd"); 1164 1165 nvlist_free_string(nvl, key); 1166 ATF_REQUIRE(nvlist_empty(nvl)); 1167 1168 nvlist_destroy(nvl); 1169 } 1170 1171 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist); 1172 ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist) 1173 { 1174 nvlist_t *nvl; 1175 const char *key; 1176 1177 nvl = nvlist_create(0); 1178 key = "test"; 1179 nvlist_add_nvlist(nvl, key, nvlist_create(0)); 1180 1181 nvlist_free_nvlist(nvl, key); 1182 ATF_REQUIRE(nvlist_empty(nvl)); 1183 1184 nvlist_destroy(nvl); 1185 } 1186 1187 ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary); 1188 ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary) 1189 { 1190 nvlist_t *nvl; 1191 const char *key; 1192 1193 nvl = nvlist_create(0); 1194 key = "test"; 1195 nvlist_add_binary(nvl, key, "jgjgfd", 6); 1196 1197 nvlist_free_binary(nvl, key); 1198 ATF_REQUIRE(nvlist_empty(nvl)); 1199 1200 nvlist_destroy(nvl); 1201 } 1202 1203 ATF_INIT_TEST_CASES(tp) 1204 { 1205 ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty); 1206 ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert); 1207 ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert); 1208 ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert); 1209 ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert); 1210 ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert); 1211 ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error); 1212 ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert); 1213 1214 ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist); 1215 ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist); 1216 ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist); 1217 ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist); 1218 1219 ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist); 1220 ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values); 1221 ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist); 1222 ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key); 1223 1224 ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert); 1225 ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert); 1226 ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child); 1227 ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error); 1228 ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert); 1229 1230 ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove); 1231 ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged); 1232 ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove); 1233 ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged); 1234 ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove); 1235 ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged); 1236 ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove); 1237 ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged); 1238 ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove); 1239 ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged); 1240 1241 ATF_ADD_TEST_CASE(tp, nvlist_free__single_null); 1242 ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool); 1243 ATF_ADD_TEST_CASE(tp, nvlist_free__single_number); 1244 ATF_ADD_TEST_CASE(tp, nvlist_free__single_string); 1245 ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist); 1246 ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary); 1247 1248 ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null); 1249 ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool); 1250 ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number); 1251 ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string); 1252 ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist); 1253 ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary); 1254 } 1255