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