1 /* $NetBSD: t_proplib.c,v 1.5 2025/09/23 22:35:40 rillig Exp $ */ 2 3 /* 4 * Copyright (c) 2008, 2020 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /* 30 * Written by Jason Thorpe 5/26/2006. 31 * Public domain. 32 */ 33 34 #include <sys/cdefs.h> 35 __COPYRIGHT("@(#) Copyright (c) 2008, 2020\ 36 The NetBSD Foundation, inc. All rights reserved."); 37 __RCSID("$NetBSD: t_proplib.c,v 1.5 2025/09/23 22:35:40 rillig Exp $"); 38 39 #include <limits.h> 40 #include <stdlib.h> 41 #include <string.h> 42 #include <prop/proplib.h> 43 44 #include <atf-c.h> 45 46 static const char compare1[] = 47 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" 48 "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" 49 "<plist version=\"1.0\">\n" 50 "<dict>\n" 51 " <key>false-val</key>\n" 52 " <false/>\n" 53 " <key>one</key>\n" 54 " <integer>1</integer>\n" 55 " <key>three</key>\n" 56 " <array>\n" 57 " <dict>\n" 58 " <key>one</key>\n" 59 " <integer>1</integer>\n" 60 " <key>two</key>\n" 61 " <string>number-two</string>\n" 62 " </dict>\n" 63 " <dict>\n" 64 " <key>one</key>\n" 65 " <integer>1</integer>\n" 66 " <key>two</key>\n" 67 " <string>number-two</string>\n" 68 " </dict>\n" 69 " <dict>\n" 70 " <key>one</key>\n" 71 " <integer>1</integer>\n" 72 " <key>two</key>\n" 73 " <string>number-two</string>\n" 74 " </dict>\n" 75 " </array>\n" 76 " <key>true-val</key>\n" 77 " <true/>\n" 78 " <key>two</key>\n" 79 " <string>number-two</string>\n" 80 "</dict>\n" 81 "</plist>\n"; 82 83 static const char const_data1[] = { 84 0xde, 0xad, 0xbe, 0xef 85 }; 86 87 static const char const_data2[] = { 88 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55 89 }; 90 91 static const char const_string1[] = 92 "The quick brown fox jumps over the lazy dog."; 93 94 static const char const_string2[] = 95 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, " 96 "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; 97 98 ATF_TC(prop_basic); 99 ATF_TC_HEAD(prop_basic, tc) 100 { 101 atf_tc_set_md_var(tc, "descr", "A basic test of proplib(3)"); 102 } 103 104 ATF_TC_BODY(prop_basic, tc) 105 { 106 prop_dictionary_t dict; 107 char *ext1; 108 109 dict = prop_dictionary_create(); 110 ATF_REQUIRE(dict != NULL); 111 112 { 113 prop_number_t num = prop_number_create_signed(1); 114 ATF_REQUIRE(num != NULL); 115 116 ATF_REQUIRE_EQ(prop_dictionary_set(dict, "one", num), true); 117 prop_object_release(num); 118 } 119 120 { 121 prop_string_t str = prop_string_create_copy("number-two"); 122 ATF_REQUIRE(str != NULL); 123 124 ATF_REQUIRE_EQ(prop_dictionary_set(dict, "two", str), true); 125 prop_object_release(str); 126 } 127 128 { 129 prop_array_t arr; 130 prop_dictionary_t dict_copy; 131 int i; 132 133 arr = prop_array_create(); 134 ATF_REQUIRE(arr != NULL); 135 136 for (i = 0; i < 3; ++i) { 137 dict_copy = prop_dictionary_copy(dict); 138 ATF_REQUIRE(dict_copy != NULL); 139 ATF_REQUIRE_EQ(prop_array_add(arr, dict_copy), true); 140 prop_object_release(dict_copy); 141 } 142 143 ATF_REQUIRE_EQ(prop_dictionary_set(dict, "three", arr), true); 144 prop_object_release(arr); 145 } 146 147 { 148 prop_bool_t val = prop_bool_create(true); 149 ATF_REQUIRE(val != NULL); 150 ATF_REQUIRE_EQ(prop_dictionary_set(dict, "true-val", val), true); 151 prop_object_release(val); 152 153 val = prop_bool_create(false); 154 ATF_REQUIRE(val != NULL); 155 ATF_REQUIRE_EQ(prop_dictionary_set(dict, "false-val", val), true); 156 prop_object_release(val); 157 } 158 159 ext1 = prop_dictionary_externalize(dict); 160 ATF_REQUIRE(ext1 != NULL); 161 ATF_REQUIRE_STREQ(compare1, ext1); 162 163 { 164 prop_dictionary_t dict2; 165 char *ext2; 166 167 dict2 = prop_dictionary_internalize(ext1); 168 ATF_REQUIRE(dict2 != NULL); 169 ext2 = prop_dictionary_externalize(dict2); 170 ATF_REQUIRE(ext2 != NULL); 171 ATF_REQUIRE_STREQ(ext1, ext2); 172 prop_object_release(dict2); 173 free(ext2); 174 } 175 176 prop_object_release(dict); 177 free(ext1); 178 } 179 180 ATF_TC(prop_dictionary_equals); 181 ATF_TC_HEAD(prop_dictionary_equals, tc) 182 { 183 atf_tc_set_md_var(tc, "descr", "Test prop_dictionary_equals(3)"); 184 } 185 186 ATF_TC_BODY(prop_dictionary_equals, tc) 187 { 188 prop_dictionary_t c, d; 189 190 /* 191 * Fixed, should not fail any more... 192 * 193 atf_tc_expect_death("PR lib/43964"); 194 * 195 */ 196 197 d = prop_dictionary_internalize(compare1); 198 199 ATF_REQUIRE(d != NULL); 200 201 c = prop_dictionary_copy(d); 202 203 ATF_REQUIRE(c != NULL); 204 205 if (prop_dictionary_equals(c, d) != true) 206 atf_tc_fail("dictionaries are not equal"); 207 208 prop_object_release(c); 209 prop_object_release(d); 210 } 211 212 ATF_TC(prop_dictionary_internalize_base64); 213 ATF_TC_HEAD(prop_dictionary_internalize_base64, tc) 214 { 215 atf_tc_set_md_var(tc, "descr", "Test internalizing base64-encoded data"); 216 } 217 218 ATF_TC_BODY(prop_dictionary_internalize_base64, tc) 219 { 220 221 prop_dictionary_t dict = prop_dictionary_internalize( 222 "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" 223 "<plist version=\"1.0\">\n" 224 "<dict>\n" 225 " <key>encoded</key>\n" 226 " <data>SGVsbG8sIHdvcmxkCg==</data>\n" 227 " <key>length-1</key>\n" 228 " <data>aQ==</data>\n" 229 " <key>length-2</key>\n" 230 " <data>aWk=</data>\n" 231 " <key>length-3</key>\n" 232 " <data>aWlp</data>\n" 233 "</dict>\n" 234 "</plist>\n"); 235 236 237 ATF_REQUIRE(dict != NULL); 238 239 const void *data; 240 size_t size; 241 bool ok; 242 243 ok = prop_dictionary_get_data(dict, "encoded", &data, &size); 244 ATF_REQUIRE(ok); 245 ATF_CHECK_EQ(size, 13); 246 ATF_CHECK_EQ(memcmp(data, "Hello, world\n", 13), 0); 247 248 ok = prop_dictionary_get_data(dict, "length-1", &data, &size); 249 ATF_REQUIRE(ok); 250 ATF_CHECK_EQ(size, 1); 251 ATF_CHECK_EQ(memcmp(data, "i", 1), 0); 252 253 ok = prop_dictionary_get_data(dict, "length-2", &data, &size); 254 ATF_REQUIRE(ok); 255 ATF_CHECK_EQ(size, 2); 256 ATF_CHECK_EQ(memcmp(data, "ii", 2), 0); 257 258 ok = prop_dictionary_get_data(dict, "length-3", &data, &size); 259 ATF_REQUIRE(ok); 260 ATF_CHECK_EQ(size, 3); 261 ATF_CHECK_EQ(memcmp(data, "iii", 3), 0); 262 263 prop_object_release(dict); 264 } 265 266 ATF_TC(prop_data_basic); 267 ATF_TC_HEAD(prop_data_basic, tc) 268 { 269 atf_tc_set_md_var(tc, "descr", "tests prop_data basics"); 270 } 271 ATF_TC_BODY(prop_data_basic, tc) 272 { 273 prop_data_t d1, d2; 274 char buf[sizeof(const_data1)]; 275 276 /* 277 * This test exercises implementation details, not only 278 * API contract. 279 */ 280 281 d1 = prop_data_create_copy(const_data1, 0); 282 ATF_REQUIRE(d1 != NULL); 283 ATF_REQUIRE(prop_data_value(d1) == NULL); 284 prop_object_release(d1); 285 286 d1 = prop_data_create_copy(NULL, sizeof(const_data1)); 287 ATF_REQUIRE(d1 != NULL); 288 ATF_REQUIRE(prop_data_value(d1) == NULL); 289 prop_object_release(d1); 290 291 d1 = prop_data_create_nocopy(const_data1, 0); 292 ATF_REQUIRE(d1 != NULL); 293 ATF_REQUIRE(prop_data_value(d1) == NULL); 294 prop_object_release(d1); 295 296 d1 = prop_data_create_nocopy(NULL, sizeof(const_data1)); 297 ATF_REQUIRE(d1 != NULL); 298 ATF_REQUIRE(prop_data_value(d1) == NULL); 299 prop_object_release(d1); 300 301 d1 = prop_data_create_nocopy(const_data1, sizeof(const_data1)); 302 ATF_REQUIRE(d1 != NULL); 303 ATF_REQUIRE(prop_data_value(d1) == const_data1); 304 d2 = prop_data_copy(d1); 305 ATF_REQUIRE(d2 != NULL); 306 ATF_REQUIRE(d2 == d1); 307 prop_object_release(d1); 308 prop_object_release(d2); 309 310 d1 = prop_data_create_copy(const_data1, sizeof(const_data1)); 311 ATF_REQUIRE(d1 != NULL); 312 ATF_REQUIRE(prop_data_value(d1) != const_data1); 313 d2 = prop_data_copy(d1); 314 ATF_REQUIRE(d2 != NULL); 315 ATF_REQUIRE(d2 == d1); 316 ATF_REQUIRE(prop_data_equals(d1, d2)); 317 prop_object_release(d2); 318 319 d2 = prop_data_create_copy(const_data2, sizeof(const_data2)); 320 ATF_REQUIRE(d2 != NULL); 321 ATF_REQUIRE(prop_data_value(d2) != const_data2); 322 ATF_REQUIRE(!prop_data_equals(d1, d2)); 323 324 ATF_REQUIRE(prop_data_size(d1) == sizeof(const_data1)); 325 ATF_REQUIRE(prop_data_size(d2) == sizeof(const_data2)); 326 327 ATF_REQUIRE(prop_data_copy_value(d1, buf, sizeof(buf))); 328 ATF_REQUIRE(memcmp(buf, const_data1, sizeof(buf)) == 0); 329 ATF_REQUIRE(!prop_data_copy_value(d2, buf, sizeof(buf))); 330 331 prop_object_release(d1); 332 prop_object_release(d2); 333 } 334 335 ATF_TC(prop_number_basic); 336 ATF_TC_HEAD(prop_number_basic, tc) 337 { 338 atf_tc_set_md_var(tc, "descr", "tests prop_number basics"); 339 } 340 ATF_TC_BODY(prop_number_basic, tc) 341 { 342 prop_number_t s1, s2, u1, u2, u3, u4; 343 344 /* 345 * This test exercises implementation details, not only 346 * API contract. 347 */ 348 349 s1 = prop_number_create_signed(INTMAX_MAX); 350 ATF_REQUIRE(s1 != NULL); 351 ATF_REQUIRE(prop_number_unsigned(s1) == false); 352 ATF_REQUIRE(prop_number_signed_value(s1) == INTMAX_MAX); 353 ATF_REQUIRE(prop_number_unsigned_value(s1) == INTMAX_MAX); 354 ATF_REQUIRE(prop_number_equals_signed(s1, INTMAX_MAX) == true); 355 356 s2 = prop_number_create_signed(INTMAX_MAX); 357 ATF_REQUIRE(s2 == s1); 358 ATF_REQUIRE(prop_number_unsigned(s2) == false); 359 360 u1 = prop_number_create_unsigned(UINTMAX_MAX); 361 ATF_REQUIRE(u1 != NULL); 362 ATF_REQUIRE(prop_number_unsigned(u1) == true); 363 ATF_REQUIRE(prop_number_unsigned_value(u1) == UINTMAX_MAX); 364 ATF_REQUIRE(prop_number_equals_unsigned(u1, UINTMAX_MAX) == true); 365 366 u2 = prop_number_create_unsigned(0); 367 ATF_REQUIRE(u2 != NULL); 368 ATF_REQUIRE(u2 != u1); 369 ATF_REQUIRE(prop_number_unsigned(u2) == true); 370 ATF_REQUIRE(prop_number_unsigned_value(u2) == 0); 371 372 u3 = prop_number_copy(u1); 373 ATF_REQUIRE(u3 == u1); 374 ATF_REQUIRE(prop_number_unsigned(u3) == true); 375 ATF_REQUIRE(prop_number_unsigned_value(u3) == UINTMAX_MAX); 376 377 u4 = prop_number_create_unsigned(INTMAX_MAX); 378 ATF_REQUIRE(u4 != NULL); 379 ATF_REQUIRE(u4 != s1); 380 ATF_REQUIRE(prop_number_equals_signed(u4, INTMAX_MAX) == true); 381 ATF_REQUIRE(prop_number_equals_unsigned(u4, INTMAX_MAX) == true); 382 383 prop_object_release(s1); 384 prop_object_release(s2); 385 386 prop_object_release(u1); 387 prop_object_release(u2); 388 prop_object_release(u3); 389 prop_object_release(u4); 390 } 391 392 ATF_TC(prop_number_range_check); 393 ATF_TC_HEAD(prop_number_range_check, tc) 394 { 395 atf_tc_set_md_var(tc, "descr", "tests prop_number range checking"); 396 } 397 ATF_TC_BODY(prop_number_range_check, tc) 398 { 399 union { 400 signed char v_schar; 401 short v_shrt; 402 int v_int; 403 long v_long; 404 long long v_llong; 405 intptr_t v_intptr; 406 int8_t v_int8; 407 int16_t v_int16; 408 int32_t v_int32; 409 int64_t v_int64; 410 411 unsigned char v_uchar; 412 unsigned short v_ushrt; 413 unsigned int v_uint; 414 unsigned long v_ulong; 415 unsigned long long v_ullong; 416 uintptr_t v_uintptr; 417 uint8_t v_uint8; 418 uint16_t v_uint16; 419 uint32_t v_uint32; 420 uint64_t v_uint64; 421 } val; 422 423 prop_number_t n_schar_max = prop_number_create_signed(SCHAR_MAX); 424 prop_number_t n_schar_min = prop_number_create_signed(SCHAR_MIN); 425 prop_number_t n_uchar_max = prop_number_create_unsigned(UCHAR_MAX); 426 ATF_REQUIRE(n_schar_max != NULL); 427 ATF_REQUIRE(n_schar_min != NULL); 428 ATF_REQUIRE(n_uchar_max != NULL); 429 430 prop_number_t n_shrt_max = prop_number_create_signed(SHRT_MAX); 431 prop_number_t n_shrt_min = prop_number_create_signed(SHRT_MIN); 432 prop_number_t n_ushrt_max = prop_number_create_unsigned(USHRT_MAX); 433 ATF_REQUIRE(n_shrt_max != NULL); 434 ATF_REQUIRE(n_shrt_min != NULL); 435 ATF_REQUIRE(n_ushrt_max != NULL); 436 437 prop_number_t n_int_max = prop_number_create_signed(INT_MAX); 438 prop_number_t n_int_min = prop_number_create_signed(INT_MIN); 439 prop_number_t n_uint_max = prop_number_create_unsigned(UINT_MAX); 440 ATF_REQUIRE(n_int_max != NULL); 441 ATF_REQUIRE(n_int_min != NULL); 442 ATF_REQUIRE(n_uint_max != NULL); 443 444 prop_number_t n_long_max = prop_number_create_signed(LONG_MAX); 445 prop_number_t n_long_min = prop_number_create_signed(LONG_MIN); 446 prop_number_t n_ulong_max = prop_number_create_unsigned(ULONG_MAX); 447 ATF_REQUIRE(n_long_max != NULL); 448 ATF_REQUIRE(n_long_min != NULL); 449 ATF_REQUIRE(n_ulong_max != NULL); 450 451 prop_number_t n_llong_max = prop_number_create_signed(LLONG_MAX); 452 prop_number_t n_llong_min = prop_number_create_signed(LLONG_MIN); 453 prop_number_t n_ullong_max = prop_number_create_unsigned(ULLONG_MAX); 454 ATF_REQUIRE(n_llong_max != NULL); 455 ATF_REQUIRE(n_llong_min != NULL); 456 ATF_REQUIRE(n_ullong_max != NULL); 457 458 prop_number_t n_intptr_max = prop_number_create_signed(INTPTR_MAX); 459 prop_number_t n_intptr_min = prop_number_create_signed(INTPTR_MIN); 460 prop_number_t n_uintptr_max = prop_number_create_unsigned(UINTPTR_MAX); 461 ATF_REQUIRE(n_intptr_max != NULL); 462 ATF_REQUIRE(n_intptr_min != NULL); 463 ATF_REQUIRE(n_uintptr_max != NULL); 464 465 prop_number_t n_int8_max = prop_number_create_signed(INT8_MAX); 466 prop_number_t n_int8_min = prop_number_create_signed(INT8_MIN); 467 prop_number_t n_uint8_max = prop_number_create_unsigned(UINT8_MAX); 468 ATF_REQUIRE(n_int8_max != NULL); 469 ATF_REQUIRE(n_int8_min != NULL); 470 ATF_REQUIRE(n_uint8_max != NULL); 471 472 prop_number_t n_int16_max = prop_number_create_signed(INT16_MAX); 473 prop_number_t n_int16_min = prop_number_create_signed(INT16_MIN); 474 prop_number_t n_uint16_max = prop_number_create_unsigned(UINT16_MAX); 475 ATF_REQUIRE(n_int16_max != NULL); 476 ATF_REQUIRE(n_int16_min != NULL); 477 ATF_REQUIRE(n_uint16_max != NULL); 478 479 prop_number_t n_int32_max = prop_number_create_signed(INT32_MAX); 480 prop_number_t n_int32_min = prop_number_create_signed(INT32_MIN); 481 prop_number_t n_uint32_max = prop_number_create_unsigned(UINT32_MAX); 482 ATF_REQUIRE(n_int32_max != NULL); 483 ATF_REQUIRE(n_int32_min != NULL); 484 ATF_REQUIRE(n_uint32_max != NULL); 485 486 prop_number_t n_int64_max = prop_number_create_signed(INT64_MAX); 487 prop_number_t n_int64_min = prop_number_create_signed(INT64_MIN); 488 prop_number_t n_uint64_max = prop_number_create_unsigned(UINT64_MAX); 489 ATF_REQUIRE(n_int64_max != NULL); 490 ATF_REQUIRE(n_int64_min != NULL); 491 ATF_REQUIRE(n_uint64_max != NULL); 492 493 /* signed / unsigned char */ 494 ATF_REQUIRE(prop_number_schar_value(n_schar_max, &val.v_schar) && 495 val.v_schar == SCHAR_MAX); 496 ATF_REQUIRE(prop_number_schar_value(n_schar_min, &val.v_schar) && 497 val.v_schar == SCHAR_MIN); 498 ATF_REQUIRE(!prop_number_schar_value(n_uchar_max, &val.v_schar)); 499 500 ATF_REQUIRE(prop_number_uchar_value(n_schar_max, &val.v_uchar) && 501 val.v_uchar == SCHAR_MAX); 502 ATF_REQUIRE(!prop_number_uchar_value(n_schar_min, &val.v_uchar)); 503 ATF_REQUIRE(prop_number_uchar_value(n_uchar_max, &val.v_uchar) && 504 val.v_uchar == UCHAR_MAX); 505 506 ATF_REQUIRE(!prop_number_schar_value(n_shrt_min, &val.v_schar)); 507 ATF_REQUIRE(!prop_number_uchar_value(n_shrt_max, &val.v_uchar)); 508 509 /* short / unsigned short */ 510 ATF_REQUIRE(prop_number_short_value(n_uchar_max, &val.v_shrt) && 511 val.v_shrt == UCHAR_MAX); 512 513 ATF_REQUIRE(prop_number_short_value(n_shrt_max, &val.v_shrt) && 514 val.v_shrt == SHRT_MAX); 515 ATF_REQUIRE(prop_number_short_value(n_shrt_min, &val.v_shrt) && 516 val.v_shrt == SHRT_MIN); 517 ATF_REQUIRE(!prop_number_short_value(n_ushrt_max, &val.v_shrt)); 518 519 ATF_REQUIRE(prop_number_ushort_value(n_shrt_max, &val.v_ushrt) && 520 val.v_ushrt == SHRT_MAX); 521 ATF_REQUIRE(!prop_number_ushort_value(n_shrt_min, &val.v_ushrt)); 522 ATF_REQUIRE(prop_number_ushort_value(n_ushrt_max, &val.v_ushrt) && 523 val.v_ushrt == USHRT_MAX); 524 525 ATF_REQUIRE(!prop_number_short_value(n_int_min, &val.v_shrt)); 526 ATF_REQUIRE(!prop_number_ushort_value(n_int_max, &val.v_ushrt)); 527 528 /* int / unsigned int */ 529 ATF_REQUIRE(prop_number_int_value(n_ushrt_max, &val.v_int) && 530 val.v_int == USHRT_MAX); 531 532 ATF_REQUIRE(prop_number_int_value(n_int_max, &val.v_int) && 533 val.v_int == INT_MAX); 534 ATF_REQUIRE(prop_number_int_value(n_int_min, &val.v_int) && 535 val.v_int == INT_MIN); 536 ATF_REQUIRE(!prop_number_int_value(n_uint_max, &val.v_int)); 537 538 ATF_REQUIRE(prop_number_uint_value(n_int_max, &val.v_uint) && 539 val.v_uint == INT_MAX); 540 ATF_REQUIRE(!prop_number_uint_value(n_int_min, &val.v_uint)); 541 ATF_REQUIRE(prop_number_uint_value(n_uint_max, &val.v_uint) && 542 val.v_uint == UINT_MAX); 543 544 #ifdef _LP64 545 ATF_REQUIRE(!prop_number_int_value(n_long_min, &val.v_int)); 546 ATF_REQUIRE(!prop_number_uint_value(n_long_max, &val.v_uint)); 547 #else 548 ATF_REQUIRE(!prop_number_int_value(n_llong_min, &val.v_int)); 549 ATF_REQUIRE(!prop_number_uint_value(n_llong_max, &val.v_uint)); 550 #endif /* _LP64 */ 551 552 /* long / unsigned long */ 553 #ifdef _LP64 554 ATF_REQUIRE(prop_number_long_value(n_uint_max, &val.v_long) && 555 val.v_long == UINT_MAX); 556 #endif 557 558 ATF_REQUIRE(prop_number_long_value(n_long_max, &val.v_long) && 559 val.v_long == LONG_MAX); 560 ATF_REQUIRE(prop_number_long_value(n_long_min, &val.v_long) && 561 val.v_long == LONG_MIN); 562 ATF_REQUIRE(!prop_number_long_value(n_ulong_max, &val.v_long)); 563 564 ATF_REQUIRE(prop_number_ulong_value(n_long_max, &val.v_ulong) && 565 val.v_ulong == LONG_MAX); 566 ATF_REQUIRE(!prop_number_ulong_value(n_long_min, &val.v_ulong)); 567 ATF_REQUIRE(prop_number_ulong_value(n_ulong_max, &val.v_ulong) && 568 val.v_ulong == ULONG_MAX); 569 570 #ifndef _LP64 571 ATF_REQUIRE(!prop_number_long_value(n_llong_min, &val.v_long)); 572 ATF_REQUIRE(!prop_number_ulong_value(n_llong_max, &val.v_ulong)); 573 #endif 574 575 /* intptr_t / uintptr_t */ 576 #ifdef _LP64 577 ATF_REQUIRE(prop_number_intptr_value(n_uint_max, &val.v_intptr) && 578 val.v_intptr == UINT_MAX); 579 #endif 580 581 ATF_REQUIRE(prop_number_intptr_value(n_intptr_max, &val.v_intptr) && 582 val.v_intptr == INTPTR_MAX); 583 ATF_REQUIRE(prop_number_intptr_value(n_intptr_min, &val.v_intptr) && 584 val.v_intptr == INTPTR_MIN); 585 ATF_REQUIRE(!prop_number_intptr_value(n_uintptr_max, &val.v_intptr)); 586 587 ATF_REQUIRE(prop_number_uintptr_value(n_intptr_max, &val.v_uintptr) && 588 val.v_uintptr == INTPTR_MAX); 589 ATF_REQUIRE(!prop_number_uintptr_value(n_intptr_min, &val.v_uintptr)); 590 ATF_REQUIRE(prop_number_uintptr_value(n_uintptr_max, &val.v_uintptr) && 591 val.v_uintptr == UINTPTR_MAX); 592 593 #ifndef _LP64 594 ATF_REQUIRE(!prop_number_intptr_value(n_llong_min, &val.v_intptr)); 595 ATF_REQUIRE(!prop_number_uintptr_value(n_llong_max, &val.v_uintptr)); 596 #endif 597 598 /* long long / unsigned long long */ 599 #ifdef _LP64 600 ATF_REQUIRE(prop_number_longlong_value(n_uint_max, &val.v_llong) && 601 val.v_llong == UINT_MAX); 602 #else 603 ATF_REQUIRE(prop_number_longlong_value(n_ulong_max, &val.v_llong) && 604 val.v_llong == ULONG_MAX); 605 #endif 606 607 ATF_REQUIRE(prop_number_longlong_value(n_llong_max, &val.v_llong) && 608 val.v_llong == LLONG_MAX); 609 ATF_REQUIRE(prop_number_longlong_value(n_llong_min, &val.v_llong) && 610 val.v_llong == LLONG_MIN); 611 ATF_REQUIRE(!prop_number_longlong_value(n_ullong_max, &val.v_llong)); 612 613 ATF_REQUIRE(prop_number_ulonglong_value(n_llong_max, &val.v_ullong) && 614 val.v_ullong == LLONG_MAX); 615 ATF_REQUIRE(!prop_number_ulonglong_value(n_llong_min, &val.v_ullong)); 616 ATF_REQUIRE(prop_number_ulonglong_value(n_ullong_max, &val.v_ullong) && 617 val.v_ullong == ULLONG_MAX); 618 619 /* int8_t / uint8_t */ 620 ATF_REQUIRE(prop_number_int8_value(n_int8_max, &val.v_int8) && 621 val.v_int8 == INT8_MAX); 622 ATF_REQUIRE(prop_number_int8_value(n_int8_min, &val.v_int8) && 623 val.v_int8 == INT8_MIN); 624 ATF_REQUIRE(!prop_number_int8_value(n_uint8_max, &val.v_int8)); 625 626 ATF_REQUIRE(prop_number_uint8_value(n_int8_max, &val.v_uint8) && 627 val.v_uint8 == INT8_MAX); 628 ATF_REQUIRE(!prop_number_uint8_value(n_int8_min, &val.v_uint8)); 629 ATF_REQUIRE(prop_number_uint8_value(n_uint8_max, &val.v_uint8) && 630 val.v_uint8 == UINT8_MAX); 631 632 ATF_REQUIRE(!prop_number_int8_value(n_int16_min, &val.v_int8)); 633 ATF_REQUIRE(!prop_number_uint8_value(n_int16_max, &val.v_uint8)); 634 635 /* int16_t / uint16_t */ 636 ATF_REQUIRE(prop_number_int16_value(n_uint8_max, &val.v_int16) && 637 val.v_int16 == UINT8_MAX); 638 639 ATF_REQUIRE(prop_number_int16_value(n_int16_max, &val.v_int16) && 640 val.v_int16 == INT16_MAX); 641 ATF_REQUIRE(prop_number_int16_value(n_int16_min, &val.v_int16) && 642 val.v_int16 == INT16_MIN); 643 ATF_REQUIRE(!prop_number_int16_value(n_uint16_max, &val.v_int16)); 644 645 ATF_REQUIRE(prop_number_uint16_value(n_int16_max, &val.v_uint16) && 646 val.v_uint16 == INT16_MAX); 647 ATF_REQUIRE(!prop_number_uint16_value(n_int16_min, &val.v_uint16)); 648 ATF_REQUIRE(prop_number_uint16_value(n_uint16_max, &val.v_uint16) && 649 val.v_uint16 == UINT16_MAX); 650 651 ATF_REQUIRE(!prop_number_int16_value(n_int32_min, &val.v_int16)); 652 ATF_REQUIRE(!prop_number_uint16_value(n_int32_max, &val.v_uint16)); 653 654 /* int32_t / uint32_t */ 655 ATF_REQUIRE(prop_number_int32_value(n_uint16_max, &val.v_int32) && 656 val.v_int32 == UINT16_MAX); 657 658 ATF_REQUIRE(prop_number_int32_value(n_int32_max, &val.v_int32) && 659 val.v_int32 == INT32_MAX); 660 ATF_REQUIRE(prop_number_int32_value(n_int32_min, &val.v_int32) && 661 val.v_int32 == INT32_MIN); 662 ATF_REQUIRE(!prop_number_int32_value(n_uint32_max, &val.v_int32)); 663 664 ATF_REQUIRE(prop_number_uint32_value(n_int32_max, &val.v_uint32) && 665 val.v_uint32 == INT32_MAX); 666 ATF_REQUIRE(!prop_number_uint32_value(n_int32_min, &val.v_uint32)); 667 ATF_REQUIRE(prop_number_uint32_value(n_uint32_max, &val.v_uint32) && 668 val.v_uint32 == UINT32_MAX); 669 670 ATF_REQUIRE(!prop_number_int32_value(n_int64_min, &val.v_int32)); 671 ATF_REQUIRE(!prop_number_uint32_value(n_int64_max, &val.v_uint32)); 672 673 /* int64_t / uint64_t */ 674 ATF_REQUIRE(prop_number_int64_value(n_uint32_max, &val.v_int64) && 675 val.v_int64 == UINT32_MAX); 676 677 ATF_REQUIRE(prop_number_int64_value(n_int64_max, &val.v_int64) && 678 val.v_int64 == INT64_MAX); 679 ATF_REQUIRE(prop_number_int64_value(n_int64_min, &val.v_int64) && 680 val.v_int64 == INT64_MIN); 681 ATF_REQUIRE(!prop_number_int64_value(n_uint64_max, &val.v_int64)); 682 683 ATF_REQUIRE(prop_number_uint64_value(n_int64_max, &val.v_uint64) && 684 val.v_uint64 == INT64_MAX); 685 ATF_REQUIRE(!prop_number_uint64_value(n_int64_min, &val.v_uint64)); 686 ATF_REQUIRE(prop_number_uint64_value(n_uint64_max, &val.v_uint64) && 687 val.v_uint64 == UINT64_MAX); 688 689 prop_object_release(n_schar_max); 690 prop_object_release(n_schar_min); 691 prop_object_release(n_uchar_max); 692 693 prop_object_release(n_shrt_max); 694 prop_object_release(n_shrt_min); 695 prop_object_release(n_ushrt_max); 696 697 prop_object_release(n_int_max); 698 prop_object_release(n_int_min); 699 prop_object_release(n_uint_max); 700 701 prop_object_release(n_long_max); 702 prop_object_release(n_long_min); 703 prop_object_release(n_ulong_max); 704 705 prop_object_release(n_llong_max); 706 prop_object_release(n_llong_min); 707 prop_object_release(n_ullong_max); 708 709 prop_object_release(n_intptr_max); 710 prop_object_release(n_intptr_min); 711 prop_object_release(n_uintptr_max); 712 713 prop_object_release(n_int8_max); 714 prop_object_release(n_int8_min); 715 prop_object_release(n_uint8_max); 716 717 prop_object_release(n_int16_max); 718 prop_object_release(n_int16_min); 719 prop_object_release(n_uint16_max); 720 721 prop_object_release(n_int32_max); 722 prop_object_release(n_int32_min); 723 prop_object_release(n_uint32_max); 724 725 prop_object_release(n_int64_max); 726 prop_object_release(n_int64_min); 727 prop_object_release(n_uint64_max); 728 } 729 730 ATF_TC(prop_string_basic); 731 ATF_TC_HEAD(prop_string_basic, tc) 732 { 733 atf_tc_set_md_var(tc, "descr", "tests prop_string basics"); 734 } 735 ATF_TC_BODY(prop_string_basic, tc) 736 { 737 prop_string_t s1, s2, s3; 738 prop_number_t num; 739 char buf[sizeof(const_string1)]; 740 741 /* 742 * This test exercises implementation details, not only 743 * API contract. 744 */ 745 746 s1 = prop_string_create_nocopy(const_string1); 747 ATF_REQUIRE(s1 != NULL); 748 s2 = prop_string_create_copy(const_string1); 749 ATF_REQUIRE(s2 != NULL); 750 ATF_REQUIRE(s2 == s1); 751 ATF_REQUIRE(prop_string_value(s1) == const_string1); 752 prop_object_release(s1); 753 prop_object_release(s2); 754 755 s1 = prop_string_create_copy(const_string1); 756 ATF_REQUIRE(s1 != NULL); 757 s2 = prop_string_create_nocopy(const_string1); 758 ATF_REQUIRE(s2 != NULL); 759 ATF_REQUIRE(s2 == s1); 760 ATF_REQUIRE(prop_string_value(s1) != const_string1); 761 prop_object_release(s1); 762 prop_object_release(s2); 763 764 s1 = prop_string_create_format("%d-%d", 12345, 67890); 765 ATF_REQUIRE(s1 != NULL); 766 ATF_REQUIRE(strcmp(prop_string_value(s1), "12345-67890") == 0); 767 ATF_REQUIRE(prop_string_equals_string(s1, "12345-67890")); 768 prop_object_release(s1); 769 770 s1 = prop_string_create_nocopy(const_string1); 771 ATF_REQUIRE(s1 != NULL); 772 s2 = prop_string_create_nocopy(const_string2); 773 ATF_REQUIRE(s2 != NULL); 774 ATF_REQUIRE(prop_string_size(s1) == strlen(const_string1)); 775 ATF_REQUIRE(prop_string_size(s2) == strlen(const_string2)); 776 ATF_REQUIRE(prop_string_copy_value(s1, buf, sizeof(buf))); 777 ATF_REQUIRE(!prop_string_copy_value(s2, buf, sizeof(buf))); 778 prop_object_release(s1); 779 prop_object_release(s2); 780 781 s1 = prop_string_create_copy("a"); 782 ATF_REQUIRE(s1 != NULL); 783 s2 = prop_string_create_copy("b"); 784 ATF_REQUIRE(s2 != NULL); 785 s3 = prop_string_copy(s2); 786 ATF_REQUIRE(s3 != NULL); 787 ATF_REQUIRE(s3 == s2); 788 num = prop_number_create_signed(666); 789 ATF_REQUIRE(num != NULL); 790 ATF_REQUIRE(!prop_string_equals(s1, s2)); 791 ATF_REQUIRE(prop_string_equals(s2, s3)); 792 ATF_REQUIRE(prop_string_compare(s1, s2) < 0); 793 ATF_REQUIRE(prop_string_compare(s2, s1) > 0); 794 ATF_REQUIRE(prop_string_compare(s2, s3) == 0); 795 ATF_REQUIRE(prop_string_compare_string(s1, "b") < 0); 796 ATF_REQUIRE(prop_string_compare_string(s2, "a") > 0); 797 ATF_REQUIRE(prop_string_compare_string(s3, "b") == 0); 798 ATF_REQUIRE(prop_string_compare(s1, (prop_string_t)num) != 0); 799 ATF_REQUIRE(prop_string_compare((prop_string_t)num, s1) != 0); 800 ATF_REQUIRE(prop_string_compare_string((prop_string_t)num, "666") != 0); 801 prop_object_release(s1); 802 prop_object_release(s2); 803 prop_object_release(s3); 804 prop_object_release(num); 805 } 806 807 ATF_TC(prop_dict_util); 808 ATF_TC_HEAD(prop_dict_util, tc) 809 { 810 atf_tc_set_md_var(tc, "descr", "tests prop_dictionary_util basics"); 811 } 812 ATF_TC_BODY(prop_dict_util, tc) 813 { 814 union { 815 signed char v_schar; 816 short v_shrt; 817 int v_int; 818 long v_long; 819 long long v_llong; 820 intptr_t v_intptr; 821 int8_t v_int8; 822 int16_t v_int16; 823 int32_t v_int32; 824 int64_t v_int64; 825 826 unsigned char v_uchar; 827 unsigned short v_ushrt; 828 unsigned int v_uint; 829 unsigned long v_ulong; 830 unsigned long long v_ullong; 831 uintptr_t v_uintptr; 832 uint8_t v_uint8; 833 uint16_t v_uint16; 834 uint32_t v_uint32; 835 uint64_t v_uint64; 836 } val; 837 prop_dictionary_t dict; 838 const char *cp; 839 const void *v; 840 size_t size; 841 842 dict = prop_dictionary_create(); 843 ATF_REQUIRE(dict != NULL); 844 845 ATF_REQUIRE(prop_dictionary_set_schar(dict, "schar", SCHAR_MIN)); 846 ATF_REQUIRE(prop_dictionary_get_schar(dict, "schar", &val.v_schar)); 847 ATF_REQUIRE(val.v_schar == SCHAR_MIN); 848 849 ATF_REQUIRE(prop_dictionary_set_short(dict, "shrt", SHRT_MIN)); 850 ATF_REQUIRE(prop_dictionary_get_short(dict, "shrt", &val.v_shrt)); 851 ATF_REQUIRE(val.v_shrt == SHRT_MIN); 852 853 ATF_REQUIRE(prop_dictionary_set_int(dict, "int", INT_MIN)); 854 ATF_REQUIRE(prop_dictionary_get_int(dict, "int", &val.v_int)); 855 ATF_REQUIRE(val.v_int == INT_MIN); 856 857 ATF_REQUIRE(prop_dictionary_set_long(dict, "long", LONG_MIN)); 858 ATF_REQUIRE(prop_dictionary_get_long(dict, "long", &val.v_long)); 859 ATF_REQUIRE(val.v_long == LONG_MIN); 860 861 ATF_REQUIRE(prop_dictionary_set_longlong(dict, "longlong", LLONG_MIN)); 862 ATF_REQUIRE(prop_dictionary_get_longlong(dict, "longlong", 863 &val.v_llong)); 864 ATF_REQUIRE(val.v_llong == LLONG_MIN); 865 866 ATF_REQUIRE(prop_dictionary_set_intptr(dict, "intptr", INTPTR_MIN)); 867 ATF_REQUIRE(prop_dictionary_get_intptr(dict, "intptr", &val.v_intptr)); 868 ATF_REQUIRE(val.v_intptr == INTPTR_MIN); 869 870 ATF_REQUIRE(prop_dictionary_set_int8(dict, "int8", INT8_MIN)); 871 ATF_REQUIRE(prop_dictionary_get_int8(dict, "int8", &val.v_int8)); 872 ATF_REQUIRE(val.v_int8 == INT8_MIN); 873 874 ATF_REQUIRE(prop_dictionary_set_int16(dict, "int16", INT16_MIN)); 875 ATF_REQUIRE(prop_dictionary_get_int16(dict, "int16", &val.v_int16)); 876 ATF_REQUIRE(val.v_int16 == INT16_MIN); 877 878 ATF_REQUIRE(prop_dictionary_set_int32(dict, "int32", INT32_MIN)); 879 ATF_REQUIRE(prop_dictionary_get_int32(dict, "int32", &val.v_int32)); 880 ATF_REQUIRE(val.v_int32 == INT32_MIN); 881 882 ATF_REQUIRE(prop_dictionary_set_int64(dict, "int64", INT64_MIN)); 883 ATF_REQUIRE(prop_dictionary_get_int64(dict, "int64", &val.v_int64)); 884 ATF_REQUIRE(val.v_int64 == INT64_MIN); 885 886 887 ATF_REQUIRE(prop_dictionary_set_uchar(dict, "uchar", UCHAR_MAX)); 888 ATF_REQUIRE(prop_dictionary_get_uchar(dict, "uchar", &val.v_uchar)); 889 ATF_REQUIRE(val.v_uchar == UCHAR_MAX); 890 891 ATF_REQUIRE(prop_dictionary_set_ushort(dict, "ushrt", USHRT_MAX)); 892 ATF_REQUIRE(prop_dictionary_get_ushort(dict, "ushrt", &val.v_ushrt)); 893 ATF_REQUIRE(val.v_ushrt == USHRT_MAX); 894 895 ATF_REQUIRE(prop_dictionary_set_uint(dict, "uint", UINT_MAX)); 896 ATF_REQUIRE(prop_dictionary_get_uint(dict, "uint", &val.v_uint)); 897 ATF_REQUIRE(val.v_uint == UINT_MAX); 898 899 ATF_REQUIRE(prop_dictionary_set_ulong(dict, "ulong", ULONG_MAX)); 900 ATF_REQUIRE(prop_dictionary_get_ulong(dict, "ulong", &val.v_ulong)); 901 ATF_REQUIRE(val.v_ulong == ULONG_MAX); 902 903 ATF_REQUIRE(prop_dictionary_set_ulonglong(dict, "ulonglong", 904 ULLONG_MAX)); 905 ATF_REQUIRE(prop_dictionary_get_ulonglong(dict, "ulonglong", 906 &val.v_ullong)); 907 ATF_REQUIRE(val.v_ullong == ULLONG_MAX); 908 909 ATF_REQUIRE(prop_dictionary_set_uintptr(dict, "uintptr", UINTPTR_MAX)); 910 ATF_REQUIRE(prop_dictionary_get_uintptr(dict, "uintptr", 911 &val.v_uintptr)); 912 ATF_REQUIRE(val.v_uintptr == UINTPTR_MAX); 913 914 ATF_REQUIRE(prop_dictionary_set_uint8(dict, "uint8", UINT8_MAX)); 915 ATF_REQUIRE(prop_dictionary_get_uint8(dict, "uint8", &val.v_uint8)); 916 ATF_REQUIRE(val.v_uint8 == UINT8_MAX); 917 918 ATF_REQUIRE(prop_dictionary_set_uint16(dict, "uint16", UINT16_MAX)); 919 ATF_REQUIRE(prop_dictionary_get_uint16(dict, "uint16", &val.v_uint16)); 920 ATF_REQUIRE(val.v_uint16 == UINT16_MAX); 921 922 ATF_REQUIRE(prop_dictionary_set_uint32(dict, "uint32", UINT32_MAX)); 923 ATF_REQUIRE(prop_dictionary_get_uint32(dict, "uint32", &val.v_uint32)); 924 ATF_REQUIRE(val.v_uint32 == UINT32_MAX); 925 926 ATF_REQUIRE(prop_dictionary_set_uint64(dict, "uint64", UINT64_MAX)); 927 ATF_REQUIRE(prop_dictionary_get_uint64(dict, "uint64", &val.v_uint64)); 928 ATF_REQUIRE(val.v_uint64 == UINT64_MAX); 929 930 ATF_REQUIRE(prop_dictionary_set_string_nocopy(dict, "string", 931 const_string1)); 932 ATF_REQUIRE(prop_dictionary_get_string(dict, "string", &cp)); 933 ATF_REQUIRE(cp == const_string1); 934 prop_dictionary_remove(dict, "string"); 935 936 ATF_REQUIRE(prop_dictionary_set_string(dict, "string", const_string1)); 937 ATF_REQUIRE(prop_dictionary_get_string(dict, "string", &cp)); 938 ATF_REQUIRE(cp != const_string1); 939 ATF_REQUIRE(strcmp(cp, const_string1) == 0); 940 941 ATF_REQUIRE(prop_dictionary_set_data_nocopy(dict, "data", 942 const_data1, 943 sizeof(const_data1))); 944 ATF_REQUIRE(prop_dictionary_get_data(dict, "data", &v, NULL)); 945 ATF_REQUIRE(v == const_data1); 946 prop_dictionary_remove(dict, "data"); 947 948 size = 0xdeadbeef; 949 ATF_REQUIRE(prop_dictionary_set_data(dict, "data", const_data1, 950 sizeof(const_data1))); 951 ATF_REQUIRE(prop_dictionary_get_data(dict, "data", &v, &size)); 952 ATF_REQUIRE(v != const_data1); 953 ATF_REQUIRE(size == sizeof(const_data1)); 954 ATF_REQUIRE(memcmp(v, const_data1, size) == 0); 955 956 prop_object_release(dict); 957 } 958 959 ATF_TP_ADD_TCS(tp) 960 { 961 962 ATF_TP_ADD_TC(tp, prop_basic); 963 ATF_TP_ADD_TC(tp, prop_dictionary_equals); 964 ATF_TP_ADD_TC(tp, prop_dictionary_internalize_base64); 965 ATF_TP_ADD_TC(tp, prop_dict_util); 966 ATF_TP_ADD_TC(tp, prop_data_basic); 967 ATF_TP_ADD_TC(tp, prop_number_basic); 968 ATF_TP_ADD_TC(tp, prop_number_range_check); 969 ATF_TP_ADD_TC(tp, prop_string_basic); 970 971 return atf_no_error(); 972 } 973