1 /* $NetBSD: t_proplib.c,v 1.4 2020/06/24 14:28:10 thorpej 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.4 2020/06/24 14:28:10 thorpej 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_data_basic); 213 ATF_TC_HEAD(prop_data_basic, tc) 214 { 215 atf_tc_set_md_var(tc, "descr", "tests prop_data basics"); 216 } 217 ATF_TC_BODY(prop_data_basic, tc) 218 { 219 prop_data_t d1, d2; 220 char buf[sizeof(const_data1)]; 221 222 /* 223 * This test exercises implementation details, not only 224 * API contract. 225 */ 226 227 d1 = prop_data_create_copy(const_data1, 0); 228 ATF_REQUIRE(d1 != NULL); 229 ATF_REQUIRE(prop_data_value(d1) == NULL); 230 prop_object_release(d1); 231 232 d1 = prop_data_create_copy(NULL, sizeof(const_data1)); 233 ATF_REQUIRE(d1 != NULL); 234 ATF_REQUIRE(prop_data_value(d1) == NULL); 235 prop_object_release(d1); 236 237 d1 = prop_data_create_nocopy(const_data1, 0); 238 ATF_REQUIRE(d1 != NULL); 239 ATF_REQUIRE(prop_data_value(d1) == NULL); 240 prop_object_release(d1); 241 242 d1 = prop_data_create_nocopy(NULL, sizeof(const_data1)); 243 ATF_REQUIRE(d1 != NULL); 244 ATF_REQUIRE(prop_data_value(d1) == NULL); 245 prop_object_release(d1); 246 247 d1 = prop_data_create_nocopy(const_data1, sizeof(const_data1)); 248 ATF_REQUIRE(d1 != NULL); 249 ATF_REQUIRE(prop_data_value(d1) == const_data1); 250 d2 = prop_data_copy(d1); 251 ATF_REQUIRE(d2 != NULL); 252 ATF_REQUIRE(d2 == d1); 253 prop_object_release(d1); 254 prop_object_release(d2); 255 256 d1 = prop_data_create_copy(const_data1, sizeof(const_data1)); 257 ATF_REQUIRE(d1 != NULL); 258 ATF_REQUIRE(prop_data_value(d1) != const_data1); 259 d2 = prop_data_copy(d1); 260 ATF_REQUIRE(d2 != NULL); 261 ATF_REQUIRE(d2 == d1); 262 ATF_REQUIRE(prop_data_equals(d1, d2)); 263 prop_object_release(d2); 264 265 d2 = prop_data_create_copy(const_data2, sizeof(const_data2)); 266 ATF_REQUIRE(d2 != NULL); 267 ATF_REQUIRE(prop_data_value(d2) != const_data2); 268 ATF_REQUIRE(!prop_data_equals(d1, d2)); 269 270 ATF_REQUIRE(prop_data_size(d1) == sizeof(const_data1)); 271 ATF_REQUIRE(prop_data_size(d2) == sizeof(const_data2)); 272 273 ATF_REQUIRE(prop_data_copy_value(d1, buf, sizeof(buf))); 274 ATF_REQUIRE(memcmp(buf, const_data1, sizeof(buf)) == 0); 275 ATF_REQUIRE(!prop_data_copy_value(d2, buf, sizeof(buf))); 276 277 prop_object_release(d1); 278 prop_object_release(d2); 279 } 280 281 ATF_TC(prop_number_basic); 282 ATF_TC_HEAD(prop_number_basic, tc) 283 { 284 atf_tc_set_md_var(tc, "descr", "tests prop_number basics"); 285 } 286 ATF_TC_BODY(prop_number_basic, tc) 287 { 288 prop_number_t s1, s2, u1, u2, u3, u4; 289 290 /* 291 * This test exercises implementation details, not only 292 * API contract. 293 */ 294 295 s1 = prop_number_create_signed(INTMAX_MAX); 296 ATF_REQUIRE(s1 != NULL); 297 ATF_REQUIRE(prop_number_unsigned(s1) == false); 298 ATF_REQUIRE(prop_number_signed_value(s1) == INTMAX_MAX); 299 ATF_REQUIRE(prop_number_unsigned_value(s1) == INTMAX_MAX); 300 ATF_REQUIRE(prop_number_equals_signed(s1, INTMAX_MAX) == true); 301 302 s2 = prop_number_create_signed(INTMAX_MAX); 303 ATF_REQUIRE(s2 == s1); 304 ATF_REQUIRE(prop_number_unsigned(s2) == false); 305 306 u1 = prop_number_create_unsigned(UINTMAX_MAX); 307 ATF_REQUIRE(u1 != NULL); 308 ATF_REQUIRE(prop_number_unsigned(u1) == true); 309 ATF_REQUIRE(prop_number_unsigned_value(u1) == UINTMAX_MAX); 310 ATF_REQUIRE(prop_number_equals_unsigned(u1, UINTMAX_MAX) == true); 311 312 u2 = prop_number_create_unsigned(0); 313 ATF_REQUIRE(u2 != NULL); 314 ATF_REQUIRE(u2 != u1); 315 ATF_REQUIRE(prop_number_unsigned(u2) == true); 316 ATF_REQUIRE(prop_number_unsigned_value(u2) == 0); 317 318 u3 = prop_number_copy(u1); 319 ATF_REQUIRE(u3 == u1); 320 ATF_REQUIRE(prop_number_unsigned(u3) == true); 321 ATF_REQUIRE(prop_number_unsigned_value(u3) == UINTMAX_MAX); 322 323 u4 = prop_number_create_unsigned(INTMAX_MAX); 324 ATF_REQUIRE(u4 != NULL); 325 ATF_REQUIRE(u4 != s1); 326 ATF_REQUIRE(prop_number_equals_signed(u4, INTMAX_MAX) == true); 327 ATF_REQUIRE(prop_number_equals_unsigned(u4, INTMAX_MAX) == true); 328 329 prop_object_release(s1); 330 prop_object_release(s2); 331 332 prop_object_release(u1); 333 prop_object_release(u2); 334 prop_object_release(u3); 335 prop_object_release(u4); 336 } 337 338 ATF_TC(prop_number_range_check); 339 ATF_TC_HEAD(prop_number_range_check, tc) 340 { 341 atf_tc_set_md_var(tc, "descr", "tests prop_number range checking"); 342 } 343 ATF_TC_BODY(prop_number_range_check, tc) 344 { 345 union { 346 signed char v_schar; 347 short v_shrt; 348 int v_int; 349 long v_long; 350 long long v_llong; 351 intptr_t v_intptr; 352 int8_t v_int8; 353 int16_t v_int16; 354 int32_t v_int32; 355 int64_t v_int64; 356 357 unsigned char v_uchar; 358 unsigned short v_ushrt; 359 unsigned int v_uint; 360 unsigned long v_ulong; 361 unsigned long long v_ullong; 362 uintptr_t v_uintptr; 363 uint8_t v_uint8; 364 uint16_t v_uint16; 365 uint32_t v_uint32; 366 uint64_t v_uint64; 367 } val; 368 369 prop_number_t n_schar_max = prop_number_create_signed(SCHAR_MAX); 370 prop_number_t n_schar_min = prop_number_create_signed(SCHAR_MIN); 371 prop_number_t n_uchar_max = prop_number_create_unsigned(UCHAR_MAX); 372 ATF_REQUIRE(n_schar_max != NULL); 373 ATF_REQUIRE(n_schar_min != NULL); 374 ATF_REQUIRE(n_uchar_max != NULL); 375 376 prop_number_t n_shrt_max = prop_number_create_signed(SHRT_MAX); 377 prop_number_t n_shrt_min = prop_number_create_signed(SHRT_MIN); 378 prop_number_t n_ushrt_max = prop_number_create_unsigned(USHRT_MAX); 379 ATF_REQUIRE(n_shrt_max != NULL); 380 ATF_REQUIRE(n_shrt_min != NULL); 381 ATF_REQUIRE(n_ushrt_max != NULL); 382 383 prop_number_t n_int_max = prop_number_create_signed(INT_MAX); 384 prop_number_t n_int_min = prop_number_create_signed(INT_MIN); 385 prop_number_t n_uint_max = prop_number_create_unsigned(UINT_MAX); 386 ATF_REQUIRE(n_int_max != NULL); 387 ATF_REQUIRE(n_int_min != NULL); 388 ATF_REQUIRE(n_uint_max != NULL); 389 390 prop_number_t n_long_max = prop_number_create_signed(LONG_MAX); 391 prop_number_t n_long_min = prop_number_create_signed(LONG_MIN); 392 prop_number_t n_ulong_max = prop_number_create_unsigned(ULONG_MAX); 393 ATF_REQUIRE(n_long_max != NULL); 394 ATF_REQUIRE(n_long_min != NULL); 395 ATF_REQUIRE(n_ulong_max != NULL); 396 397 prop_number_t n_llong_max = prop_number_create_signed(LLONG_MAX); 398 prop_number_t n_llong_min = prop_number_create_signed(LLONG_MIN); 399 prop_number_t n_ullong_max = prop_number_create_unsigned(ULLONG_MAX); 400 ATF_REQUIRE(n_llong_max != NULL); 401 ATF_REQUIRE(n_llong_min != NULL); 402 ATF_REQUIRE(n_ullong_max != NULL); 403 404 prop_number_t n_intptr_max = prop_number_create_signed(INTPTR_MAX); 405 prop_number_t n_intptr_min = prop_number_create_signed(INTPTR_MIN); 406 prop_number_t n_uintptr_max = prop_number_create_unsigned(UINTPTR_MAX); 407 ATF_REQUIRE(n_intptr_max != NULL); 408 ATF_REQUIRE(n_intptr_min != NULL); 409 ATF_REQUIRE(n_uintptr_max != NULL); 410 411 prop_number_t n_int8_max = prop_number_create_signed(INT8_MAX); 412 prop_number_t n_int8_min = prop_number_create_signed(INT8_MIN); 413 prop_number_t n_uint8_max = prop_number_create_unsigned(UINT8_MAX); 414 ATF_REQUIRE(n_int8_max != NULL); 415 ATF_REQUIRE(n_int8_min != NULL); 416 ATF_REQUIRE(n_uint8_max != NULL); 417 418 prop_number_t n_int16_max = prop_number_create_signed(INT16_MAX); 419 prop_number_t n_int16_min = prop_number_create_signed(INT16_MIN); 420 prop_number_t n_uint16_max = prop_number_create_unsigned(UINT16_MAX); 421 ATF_REQUIRE(n_int16_max != NULL); 422 ATF_REQUIRE(n_int16_min != NULL); 423 ATF_REQUIRE(n_uint16_max != NULL); 424 425 prop_number_t n_int32_max = prop_number_create_signed(INT32_MAX); 426 prop_number_t n_int32_min = prop_number_create_signed(INT32_MIN); 427 prop_number_t n_uint32_max = prop_number_create_unsigned(UINT32_MAX); 428 ATF_REQUIRE(n_int32_max != NULL); 429 ATF_REQUIRE(n_int32_min != NULL); 430 ATF_REQUIRE(n_uint32_max != NULL); 431 432 prop_number_t n_int64_max = prop_number_create_signed(INT64_MAX); 433 prop_number_t n_int64_min = prop_number_create_signed(INT64_MIN); 434 prop_number_t n_uint64_max = prop_number_create_unsigned(UINT64_MAX); 435 ATF_REQUIRE(n_int64_max != NULL); 436 ATF_REQUIRE(n_int64_min != NULL); 437 ATF_REQUIRE(n_uint64_max != NULL); 438 439 /* signed / unsigned char */ 440 ATF_REQUIRE(prop_number_schar_value(n_schar_max, &val.v_schar) && 441 val.v_schar == SCHAR_MAX); 442 ATF_REQUIRE(prop_number_schar_value(n_schar_min, &val.v_schar) && 443 val.v_schar == SCHAR_MIN); 444 ATF_REQUIRE(!prop_number_schar_value(n_uchar_max, &val.v_schar)); 445 446 ATF_REQUIRE(prop_number_uchar_value(n_schar_max, &val.v_uchar) && 447 val.v_uchar == SCHAR_MAX); 448 ATF_REQUIRE(!prop_number_uchar_value(n_schar_min, &val.v_uchar)); 449 ATF_REQUIRE(prop_number_uchar_value(n_uchar_max, &val.v_uchar) && 450 val.v_uchar == UCHAR_MAX); 451 452 ATF_REQUIRE(!prop_number_schar_value(n_shrt_min, &val.v_schar)); 453 ATF_REQUIRE(!prop_number_uchar_value(n_shrt_max, &val.v_uchar)); 454 455 /* short / unsigned short */ 456 ATF_REQUIRE(prop_number_short_value(n_uchar_max, &val.v_shrt) && 457 val.v_shrt == UCHAR_MAX); 458 459 ATF_REQUIRE(prop_number_short_value(n_shrt_max, &val.v_shrt) && 460 val.v_shrt == SHRT_MAX); 461 ATF_REQUIRE(prop_number_short_value(n_shrt_min, &val.v_shrt) && 462 val.v_shrt == SHRT_MIN); 463 ATF_REQUIRE(!prop_number_short_value(n_ushrt_max, &val.v_shrt)); 464 465 ATF_REQUIRE(prop_number_ushort_value(n_shrt_max, &val.v_ushrt) && 466 val.v_ushrt == SHRT_MAX); 467 ATF_REQUIRE(!prop_number_ushort_value(n_shrt_min, &val.v_ushrt)); 468 ATF_REQUIRE(prop_number_ushort_value(n_ushrt_max, &val.v_ushrt) && 469 val.v_ushrt == USHRT_MAX); 470 471 ATF_REQUIRE(!prop_number_short_value(n_int_min, &val.v_shrt)); 472 ATF_REQUIRE(!prop_number_ushort_value(n_int_max, &val.v_ushrt)); 473 474 /* int / unsigned int */ 475 ATF_REQUIRE(prop_number_int_value(n_ushrt_max, &val.v_int) && 476 val.v_int == USHRT_MAX); 477 478 ATF_REQUIRE(prop_number_int_value(n_int_max, &val.v_int) && 479 val.v_int == INT_MAX); 480 ATF_REQUIRE(prop_number_int_value(n_int_min, &val.v_int) && 481 val.v_int == INT_MIN); 482 ATF_REQUIRE(!prop_number_int_value(n_uint_max, &val.v_int)); 483 484 ATF_REQUIRE(prop_number_uint_value(n_int_max, &val.v_uint) && 485 val.v_uint == INT_MAX); 486 ATF_REQUIRE(!prop_number_uint_value(n_int_min, &val.v_uint)); 487 ATF_REQUIRE(prop_number_uint_value(n_uint_max, &val.v_uint) && 488 val.v_uint == UINT_MAX); 489 490 #ifdef _LP64 491 ATF_REQUIRE(!prop_number_int_value(n_long_min, &val.v_int)); 492 ATF_REQUIRE(!prop_number_uint_value(n_long_max, &val.v_uint)); 493 #else 494 ATF_REQUIRE(!prop_number_int_value(n_llong_min, &val.v_int)); 495 ATF_REQUIRE(!prop_number_uint_value(n_llong_max, &val.v_uint)); 496 #endif /* _LP64 */ 497 498 /* long / unsigned long */ 499 #ifdef _LP64 500 ATF_REQUIRE(prop_number_long_value(n_uint_max, &val.v_long) && 501 val.v_long == UINT_MAX); 502 #endif 503 504 ATF_REQUIRE(prop_number_long_value(n_long_max, &val.v_long) && 505 val.v_long == LONG_MAX); 506 ATF_REQUIRE(prop_number_long_value(n_long_min, &val.v_long) && 507 val.v_long == LONG_MIN); 508 ATF_REQUIRE(!prop_number_long_value(n_ulong_max, &val.v_long)); 509 510 ATF_REQUIRE(prop_number_ulong_value(n_long_max, &val.v_ulong) && 511 val.v_ulong == LONG_MAX); 512 ATF_REQUIRE(!prop_number_ulong_value(n_long_min, &val.v_ulong)); 513 ATF_REQUIRE(prop_number_ulong_value(n_ulong_max, &val.v_ulong) && 514 val.v_ulong == ULONG_MAX); 515 516 #ifndef _LP64 517 ATF_REQUIRE(!prop_number_long_value(n_llong_min, &val.v_long)); 518 ATF_REQUIRE(!prop_number_ulong_value(n_llong_max, &val.v_ulong)); 519 #endif 520 521 /* intptr_t / uintptr_t */ 522 #ifdef _LP64 523 ATF_REQUIRE(prop_number_intptr_value(n_uint_max, &val.v_intptr) && 524 val.v_intptr == UINT_MAX); 525 #endif 526 527 ATF_REQUIRE(prop_number_intptr_value(n_intptr_max, &val.v_intptr) && 528 val.v_intptr == INTPTR_MAX); 529 ATF_REQUIRE(prop_number_intptr_value(n_intptr_min, &val.v_intptr) && 530 val.v_intptr == INTPTR_MIN); 531 ATF_REQUIRE(!prop_number_intptr_value(n_uintptr_max, &val.v_intptr)); 532 533 ATF_REQUIRE(prop_number_uintptr_value(n_intptr_max, &val.v_uintptr) && 534 val.v_uintptr == INTPTR_MAX); 535 ATF_REQUIRE(!prop_number_uintptr_value(n_intptr_min, &val.v_uintptr)); 536 ATF_REQUIRE(prop_number_uintptr_value(n_uintptr_max, &val.v_uintptr) && 537 val.v_uintptr == UINTPTR_MAX); 538 539 #ifndef _LP64 540 ATF_REQUIRE(!prop_number_intptr_value(n_llong_min, &val.v_intptr)); 541 ATF_REQUIRE(!prop_number_uintptr_value(n_llong_max, &val.v_uintptr)); 542 #endif 543 544 /* long long / unsigned long long */ 545 #ifdef _LP64 546 ATF_REQUIRE(prop_number_longlong_value(n_uint_max, &val.v_llong) && 547 val.v_llong == UINT_MAX); 548 #else 549 ATF_REQUIRE(prop_number_longlong_value(n_ulong_max, &val.v_llong) && 550 val.v_llong == ULONG_MAX); 551 #endif 552 553 ATF_REQUIRE(prop_number_longlong_value(n_llong_max, &val.v_llong) && 554 val.v_llong == LLONG_MAX); 555 ATF_REQUIRE(prop_number_longlong_value(n_llong_min, &val.v_llong) && 556 val.v_llong == LLONG_MIN); 557 ATF_REQUIRE(!prop_number_longlong_value(n_ullong_max, &val.v_llong)); 558 559 ATF_REQUIRE(prop_number_ulonglong_value(n_llong_max, &val.v_ullong) && 560 val.v_ullong == LLONG_MAX); 561 ATF_REQUIRE(!prop_number_ulonglong_value(n_llong_min, &val.v_ullong)); 562 ATF_REQUIRE(prop_number_ulonglong_value(n_ullong_max, &val.v_ullong) && 563 val.v_ullong == ULLONG_MAX); 564 565 /* int8_t / uint8_t */ 566 ATF_REQUIRE(prop_number_int8_value(n_int8_max, &val.v_int8) && 567 val.v_int8 == INT8_MAX); 568 ATF_REQUIRE(prop_number_int8_value(n_int8_min, &val.v_int8) && 569 val.v_int8 == INT8_MIN); 570 ATF_REQUIRE(!prop_number_int8_value(n_uint8_max, &val.v_int8)); 571 572 ATF_REQUIRE(prop_number_uint8_value(n_int8_max, &val.v_uint8) && 573 val.v_uint8 == INT8_MAX); 574 ATF_REQUIRE(!prop_number_uint8_value(n_int8_min, &val.v_uint8)); 575 ATF_REQUIRE(prop_number_uint8_value(n_uint8_max, &val.v_uint8) && 576 val.v_uint8 == UINT8_MAX); 577 578 ATF_REQUIRE(!prop_number_int8_value(n_int16_min, &val.v_int8)); 579 ATF_REQUIRE(!prop_number_uint8_value(n_int16_max, &val.v_uint8)); 580 581 /* int16_t / uint16_t */ 582 ATF_REQUIRE(prop_number_int16_value(n_uint8_max, &val.v_int16) && 583 val.v_int16 == UINT8_MAX); 584 585 ATF_REQUIRE(prop_number_int16_value(n_int16_max, &val.v_int16) && 586 val.v_int16 == INT16_MAX); 587 ATF_REQUIRE(prop_number_int16_value(n_int16_min, &val.v_int16) && 588 val.v_int16 == INT16_MIN); 589 ATF_REQUIRE(!prop_number_int16_value(n_uint16_max, &val.v_int16)); 590 591 ATF_REQUIRE(prop_number_uint16_value(n_int16_max, &val.v_uint16) && 592 val.v_uint16 == INT16_MAX); 593 ATF_REQUIRE(!prop_number_uint16_value(n_int16_min, &val.v_uint16)); 594 ATF_REQUIRE(prop_number_uint16_value(n_uint16_max, &val.v_uint16) && 595 val.v_uint16 == UINT16_MAX); 596 597 ATF_REQUIRE(!prop_number_int16_value(n_int32_min, &val.v_int16)); 598 ATF_REQUIRE(!prop_number_uint16_value(n_int32_max, &val.v_uint16)); 599 600 /* int32_t / uint32_t */ 601 ATF_REQUIRE(prop_number_int32_value(n_uint16_max, &val.v_int32) && 602 val.v_int32 == UINT16_MAX); 603 604 ATF_REQUIRE(prop_number_int32_value(n_int32_max, &val.v_int32) && 605 val.v_int32 == INT32_MAX); 606 ATF_REQUIRE(prop_number_int32_value(n_int32_min, &val.v_int32) && 607 val.v_int32 == INT32_MIN); 608 ATF_REQUIRE(!prop_number_int32_value(n_uint32_max, &val.v_int32)); 609 610 ATF_REQUIRE(prop_number_uint32_value(n_int32_max, &val.v_uint32) && 611 val.v_uint32 == INT32_MAX); 612 ATF_REQUIRE(!prop_number_uint32_value(n_int32_min, &val.v_uint32)); 613 ATF_REQUIRE(prop_number_uint32_value(n_uint32_max, &val.v_uint32) && 614 val.v_uint32 == UINT32_MAX); 615 616 ATF_REQUIRE(!prop_number_int32_value(n_int64_min, &val.v_int32)); 617 ATF_REQUIRE(!prop_number_uint32_value(n_int64_max, &val.v_uint32)); 618 619 /* int64_t / uint64_t */ 620 ATF_REQUIRE(prop_number_int64_value(n_uint32_max, &val.v_int64) && 621 val.v_int64 == UINT32_MAX); 622 623 ATF_REQUIRE(prop_number_int64_value(n_int64_max, &val.v_int64) && 624 val.v_int64 == INT64_MAX); 625 ATF_REQUIRE(prop_number_int64_value(n_int64_min, &val.v_int64) && 626 val.v_int64 == INT64_MIN); 627 ATF_REQUIRE(!prop_number_int64_value(n_uint64_max, &val.v_int64)); 628 629 ATF_REQUIRE(prop_number_uint64_value(n_int64_max, &val.v_uint64) && 630 val.v_uint64 == INT64_MAX); 631 ATF_REQUIRE(!prop_number_uint64_value(n_int64_min, &val.v_uint64)); 632 ATF_REQUIRE(prop_number_uint64_value(n_uint64_max, &val.v_uint64) && 633 val.v_uint64 == UINT64_MAX); 634 635 prop_object_release(n_schar_max); 636 prop_object_release(n_schar_min); 637 prop_object_release(n_uchar_max); 638 639 prop_object_release(n_shrt_max); 640 prop_object_release(n_shrt_min); 641 prop_object_release(n_ushrt_max); 642 643 prop_object_release(n_int_max); 644 prop_object_release(n_int_min); 645 prop_object_release(n_uint_max); 646 647 prop_object_release(n_long_max); 648 prop_object_release(n_long_min); 649 prop_object_release(n_ulong_max); 650 651 prop_object_release(n_llong_max); 652 prop_object_release(n_llong_min); 653 prop_object_release(n_ullong_max); 654 655 prop_object_release(n_intptr_max); 656 prop_object_release(n_intptr_min); 657 prop_object_release(n_uintptr_max); 658 659 prop_object_release(n_int8_max); 660 prop_object_release(n_int8_min); 661 prop_object_release(n_uint8_max); 662 663 prop_object_release(n_int16_max); 664 prop_object_release(n_int16_min); 665 prop_object_release(n_uint16_max); 666 667 prop_object_release(n_int32_max); 668 prop_object_release(n_int32_min); 669 prop_object_release(n_uint32_max); 670 671 prop_object_release(n_int64_max); 672 prop_object_release(n_int64_min); 673 prop_object_release(n_uint64_max); 674 } 675 676 ATF_TC(prop_string_basic); 677 ATF_TC_HEAD(prop_string_basic, tc) 678 { 679 atf_tc_set_md_var(tc, "descr", "tests prop_string basics"); 680 } 681 ATF_TC_BODY(prop_string_basic, tc) 682 { 683 prop_string_t s1, s2, s3; 684 prop_number_t num; 685 char buf[sizeof(const_string1)]; 686 687 /* 688 * This test exercises implementation details, not only 689 * API contract. 690 */ 691 692 s1 = prop_string_create_nocopy(const_string1); 693 ATF_REQUIRE(s1 != NULL); 694 s2 = prop_string_create_copy(const_string1); 695 ATF_REQUIRE(s2 != NULL); 696 ATF_REQUIRE(s2 == s1); 697 ATF_REQUIRE(prop_string_value(s1) == const_string1); 698 prop_object_release(s1); 699 prop_object_release(s2); 700 701 s1 = prop_string_create_copy(const_string1); 702 ATF_REQUIRE(s1 != NULL); 703 s2 = prop_string_create_nocopy(const_string1); 704 ATF_REQUIRE(s2 != NULL); 705 ATF_REQUIRE(s2 == s1); 706 ATF_REQUIRE(prop_string_value(s1) != const_string1); 707 prop_object_release(s1); 708 prop_object_release(s2); 709 710 s1 = prop_string_create_format("%d-%d", 12345, 67890); 711 ATF_REQUIRE(s1 != NULL); 712 ATF_REQUIRE(strcmp(prop_string_value(s1), "12345-67890") == 0); 713 ATF_REQUIRE(prop_string_equals_string(s1, "12345-67890")); 714 prop_object_release(s1); 715 716 s1 = prop_string_create_nocopy(const_string1); 717 ATF_REQUIRE(s1 != NULL); 718 s2 = prop_string_create_nocopy(const_string2); 719 ATF_REQUIRE(s2 != NULL); 720 ATF_REQUIRE(prop_string_size(s1) == strlen(const_string1)); 721 ATF_REQUIRE(prop_string_size(s2) == strlen(const_string2)); 722 ATF_REQUIRE(prop_string_copy_value(s1, buf, sizeof(buf))); 723 ATF_REQUIRE(!prop_string_copy_value(s2, buf, sizeof(buf))); 724 prop_object_release(s1); 725 prop_object_release(s2); 726 727 s1 = prop_string_create_copy("a"); 728 ATF_REQUIRE(s1 != NULL); 729 s2 = prop_string_create_copy("b"); 730 ATF_REQUIRE(s2 != NULL); 731 s3 = prop_string_copy(s2); 732 ATF_REQUIRE(s3 != NULL); 733 ATF_REQUIRE(s3 == s2); 734 num = prop_number_create_signed(666); 735 ATF_REQUIRE(num != NULL); 736 ATF_REQUIRE(!prop_string_equals(s1, s2)); 737 ATF_REQUIRE(prop_string_equals(s2, s3)); 738 ATF_REQUIRE(prop_string_compare(s1, s2) < 0); 739 ATF_REQUIRE(prop_string_compare(s2, s1) > 0); 740 ATF_REQUIRE(prop_string_compare(s2, s3) == 0); 741 ATF_REQUIRE(prop_string_compare_string(s1, "b") < 0); 742 ATF_REQUIRE(prop_string_compare_string(s2, "a") > 0); 743 ATF_REQUIRE(prop_string_compare_string(s3, "b") == 0); 744 ATF_REQUIRE(prop_string_compare(s1, (prop_string_t)num) != 0); 745 ATF_REQUIRE(prop_string_compare((prop_string_t)num, s1) != 0); 746 ATF_REQUIRE(prop_string_compare_string((prop_string_t)num, "666") != 0); 747 prop_object_release(s1); 748 prop_object_release(s2); 749 prop_object_release(s3); 750 prop_object_release(num); 751 } 752 753 ATF_TC(prop_dict_util); 754 ATF_TC_HEAD(prop_dict_util, tc) 755 { 756 atf_tc_set_md_var(tc, "descr", "tests prop_dictionary_util basics"); 757 } 758 ATF_TC_BODY(prop_dict_util, tc) 759 { 760 union { 761 signed char v_schar; 762 short v_shrt; 763 int v_int; 764 long v_long; 765 long long v_llong; 766 intptr_t v_intptr; 767 int8_t v_int8; 768 int16_t v_int16; 769 int32_t v_int32; 770 int64_t v_int64; 771 772 unsigned char v_uchar; 773 unsigned short v_ushrt; 774 unsigned int v_uint; 775 unsigned long v_ulong; 776 unsigned long long v_ullong; 777 uintptr_t v_uintptr; 778 uint8_t v_uint8; 779 uint16_t v_uint16; 780 uint32_t v_uint32; 781 uint64_t v_uint64; 782 } val; 783 prop_dictionary_t dict; 784 const char *cp; 785 const void *v; 786 size_t size; 787 788 dict = prop_dictionary_create(); 789 ATF_REQUIRE(dict != NULL); 790 791 ATF_REQUIRE(prop_dictionary_set_schar(dict, "schar", SCHAR_MIN)); 792 ATF_REQUIRE(prop_dictionary_get_schar(dict, "schar", &val.v_schar)); 793 ATF_REQUIRE(val.v_schar == SCHAR_MIN); 794 795 ATF_REQUIRE(prop_dictionary_set_short(dict, "shrt", SHRT_MIN)); 796 ATF_REQUIRE(prop_dictionary_get_short(dict, "shrt", &val.v_shrt)); 797 ATF_REQUIRE(val.v_shrt == SHRT_MIN); 798 799 ATF_REQUIRE(prop_dictionary_set_int(dict, "int", INT_MIN)); 800 ATF_REQUIRE(prop_dictionary_get_int(dict, "int", &val.v_int)); 801 ATF_REQUIRE(val.v_int == INT_MIN); 802 803 ATF_REQUIRE(prop_dictionary_set_long(dict, "long", LONG_MIN)); 804 ATF_REQUIRE(prop_dictionary_get_long(dict, "long", &val.v_long)); 805 ATF_REQUIRE(val.v_long == LONG_MIN); 806 807 ATF_REQUIRE(prop_dictionary_set_longlong(dict, "longlong", LLONG_MIN)); 808 ATF_REQUIRE(prop_dictionary_get_longlong(dict, "longlong", 809 &val.v_llong)); 810 ATF_REQUIRE(val.v_llong == LLONG_MIN); 811 812 ATF_REQUIRE(prop_dictionary_set_intptr(dict, "intptr", INTPTR_MIN)); 813 ATF_REQUIRE(prop_dictionary_get_intptr(dict, "intptr", &val.v_intptr)); 814 ATF_REQUIRE(val.v_intptr == INTPTR_MIN); 815 816 ATF_REQUIRE(prop_dictionary_set_int8(dict, "int8", INT8_MIN)); 817 ATF_REQUIRE(prop_dictionary_get_int8(dict, "int8", &val.v_int8)); 818 ATF_REQUIRE(val.v_int8 == INT8_MIN); 819 820 ATF_REQUIRE(prop_dictionary_set_int16(dict, "int16", INT16_MIN)); 821 ATF_REQUIRE(prop_dictionary_get_int16(dict, "int16", &val.v_int16)); 822 ATF_REQUIRE(val.v_int16 == INT16_MIN); 823 824 ATF_REQUIRE(prop_dictionary_set_int32(dict, "int32", INT32_MIN)); 825 ATF_REQUIRE(prop_dictionary_get_int32(dict, "int32", &val.v_int32)); 826 ATF_REQUIRE(val.v_int32 == INT32_MIN); 827 828 ATF_REQUIRE(prop_dictionary_set_int64(dict, "int64", INT64_MIN)); 829 ATF_REQUIRE(prop_dictionary_get_int64(dict, "int64", &val.v_int64)); 830 ATF_REQUIRE(val.v_int64 == INT64_MIN); 831 832 833 ATF_REQUIRE(prop_dictionary_set_uchar(dict, "uchar", UCHAR_MAX)); 834 ATF_REQUIRE(prop_dictionary_get_uchar(dict, "uchar", &val.v_uchar)); 835 ATF_REQUIRE(val.v_uchar == UCHAR_MAX); 836 837 ATF_REQUIRE(prop_dictionary_set_ushort(dict, "ushrt", USHRT_MAX)); 838 ATF_REQUIRE(prop_dictionary_get_ushort(dict, "ushrt", &val.v_ushrt)); 839 ATF_REQUIRE(val.v_ushrt == USHRT_MAX); 840 841 ATF_REQUIRE(prop_dictionary_set_uint(dict, "uint", UINT_MAX)); 842 ATF_REQUIRE(prop_dictionary_get_uint(dict, "uint", &val.v_uint)); 843 ATF_REQUIRE(val.v_uint == UINT_MAX); 844 845 ATF_REQUIRE(prop_dictionary_set_ulong(dict, "ulong", ULONG_MAX)); 846 ATF_REQUIRE(prop_dictionary_get_ulong(dict, "ulong", &val.v_ulong)); 847 ATF_REQUIRE(val.v_ulong == ULONG_MAX); 848 849 ATF_REQUIRE(prop_dictionary_set_ulonglong(dict, "ulonglong", 850 ULLONG_MAX)); 851 ATF_REQUIRE(prop_dictionary_get_ulonglong(dict, "ulonglong", 852 &val.v_ullong)); 853 ATF_REQUIRE(val.v_ullong == ULLONG_MAX); 854 855 ATF_REQUIRE(prop_dictionary_set_uintptr(dict, "uintptr", UINTPTR_MAX)); 856 ATF_REQUIRE(prop_dictionary_get_uintptr(dict, "uintptr", 857 &val.v_uintptr)); 858 ATF_REQUIRE(val.v_uintptr == UINTPTR_MAX); 859 860 ATF_REQUIRE(prop_dictionary_set_uint8(dict, "uint8", UINT8_MAX)); 861 ATF_REQUIRE(prop_dictionary_get_uint8(dict, "uint8", &val.v_uint8)); 862 ATF_REQUIRE(val.v_uint8 == UINT8_MAX); 863 864 ATF_REQUIRE(prop_dictionary_set_uint16(dict, "uint16", UINT16_MAX)); 865 ATF_REQUIRE(prop_dictionary_get_uint16(dict, "uint16", &val.v_uint16)); 866 ATF_REQUIRE(val.v_uint16 == UINT16_MAX); 867 868 ATF_REQUIRE(prop_dictionary_set_uint32(dict, "uint32", UINT32_MAX)); 869 ATF_REQUIRE(prop_dictionary_get_uint32(dict, "uint32", &val.v_uint32)); 870 ATF_REQUIRE(val.v_uint32 == UINT32_MAX); 871 872 ATF_REQUIRE(prop_dictionary_set_uint64(dict, "uint64", UINT64_MAX)); 873 ATF_REQUIRE(prop_dictionary_get_uint64(dict, "uint64", &val.v_uint64)); 874 ATF_REQUIRE(val.v_uint64 == UINT64_MAX); 875 876 ATF_REQUIRE(prop_dictionary_set_string_nocopy(dict, "string", 877 const_string1)); 878 ATF_REQUIRE(prop_dictionary_get_string(dict, "string", &cp)); 879 ATF_REQUIRE(cp == const_string1); 880 prop_dictionary_remove(dict, "string"); 881 882 ATF_REQUIRE(prop_dictionary_set_string(dict, "string", const_string1)); 883 ATF_REQUIRE(prop_dictionary_get_string(dict, "string", &cp)); 884 ATF_REQUIRE(cp != const_string1); 885 ATF_REQUIRE(strcmp(cp, const_string1) == 0); 886 887 ATF_REQUIRE(prop_dictionary_set_data_nocopy(dict, "data", 888 const_data1, 889 sizeof(const_data1))); 890 ATF_REQUIRE(prop_dictionary_get_data(dict, "data", &v, NULL)); 891 ATF_REQUIRE(v == const_data1); 892 prop_dictionary_remove(dict, "data"); 893 894 size = 0xdeadbeef; 895 ATF_REQUIRE(prop_dictionary_set_data(dict, "data", const_data1, 896 sizeof(const_data1))); 897 ATF_REQUIRE(prop_dictionary_get_data(dict, "data", &v, &size)); 898 ATF_REQUIRE(v != const_data1); 899 ATF_REQUIRE(size == sizeof(const_data1)); 900 ATF_REQUIRE(memcmp(v, const_data1, size) == 0); 901 902 prop_object_release(dict); 903 } 904 905 ATF_TP_ADD_TCS(tp) 906 { 907 908 ATF_TP_ADD_TC(tp, prop_basic); 909 ATF_TP_ADD_TC(tp, prop_dictionary_equals); 910 ATF_TP_ADD_TC(tp, prop_dict_util); 911 ATF_TP_ADD_TC(tp, prop_data_basic); 912 ATF_TP_ADD_TC(tp, prop_number_basic); 913 ATF_TP_ADD_TC(tp, prop_number_range_check); 914 ATF_TP_ADD_TC(tp, prop_string_basic); 915 916 return atf_no_error(); 917 } 918