Home | History | Annotate | Line # | Download | only in libprop
      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