]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/netbsd-tests/lib/libppath/t_ppath.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / netbsd-tests / lib / libppath / t_ppath.c
1 /* $Id: t_ppath.c,v 1.1 2011/08/25 19:09:46 dyoung Exp $ */
2
3 /* Copyright (c) 2010 David Young.  All rights reserved. */
4
5 #include <sys/cdefs.h>
6 __RCSID("$Id: t_ppath.c,v 1.1 2011/08/25 19:09:46 dyoung Exp $");
7
8 #include <assert.h>
9 #include <atf-c.h>
10 #include <errno.h>
11 #include <stdlib.h>
12 #include <string.h>
13
14 #include <ppath/ppath.h>
15 #include "personnel.h"
16
17 void test_ppath_extant_inc(void);
18 void test_ppath_extant_dec(void);
19 void test_ppath_component_extant_inc(void);
20 void test_ppath_component_extant_dec(void);
21
22 __strong_alias(ppath_extant_inc, test_ppath_extant_inc);
23 __strong_alias(ppath_extant_dec, test_ppath_extant_dec);
24 __strong_alias(ppath_component_extant_inc, test_ppath_component_extant_inc);
25 __strong_alias(ppath_component_extant_dec, test_ppath_component_extant_dec);
26
27 static uint64_t nppath = 0, nppath_component = 0;
28
29 static bool
30 dictionary_equals(prop_dictionary_t ld, prop_dictionary_t rd)
31 {
32         bool eq;
33         char *lt, *rt;
34
35         lt = prop_dictionary_externalize(ld);
36         rt = prop_dictionary_externalize(rd);
37
38         assert(lt != NULL && rt != NULL);
39
40         eq = (strcmp(lt, rt) == 0);
41
42         free(lt);
43         free(rt);
44
45         return eq;
46 }
47
48 static void
49 assert_no_ppath_extant(void)
50 {
51         ATF_CHECK_EQ(nppath, 0);
52 }
53
54 static void
55 assert_no_ppath_component_extant(void)
56 {
57         ATF_CHECK_EQ(nppath_component, 0);
58 }
59
60 void
61 test_ppath_extant_inc(void)
62 {
63         if (++nppath == 0)
64                 atf_tc_fail("count of extant paths overflowed");
65 }
66
67 void
68 test_ppath_extant_dec(void)
69 {
70         if (nppath-- == 0)
71                 atf_tc_fail("count of extant path underflowed");
72 }
73
74 void
75 test_ppath_component_extant_inc(void)
76 {
77         if (++nppath_component == 0)
78                 atf_tc_fail("count of extant path components overflowed");
79 }
80
81 void
82 test_ppath_component_extant_dec(void)
83 {
84         if (nppath_component-- == 0)
85                 atf_tc_fail("count of extant path components underflowed");
86 }
87
88 ATF_TC(push_until_full);
89
90 ATF_TC_HEAD(push_until_full, tc)
91 {
92         atf_tc_set_md_var(tc, "descr", "check ppath_push() returns error "
93             "after ppath_t reaches maximum length");
94 }
95
96 ATF_TC_BODY(push_until_full, tc)
97 {
98         ppath_t *p, *rp;
99         ppath_component_t *pc;
100         int i;
101
102         assert_no_ppath_extant();
103         assert_no_ppath_component_extant();
104
105         if ((p = ppath_create()) == NULL)
106                 atf_tc_fail("ppath_create failed");
107
108         if ((pc = ppath_idx(0)) == NULL)
109                 atf_tc_fail("ppath_idx failed");
110
111         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
112                 rp = ppath_push(p, pc);
113                 ATF_CHECK_EQ(rp, p);
114         }
115
116         rp = ppath_push(p, pc);
117         ATF_CHECK_EQ(rp, NULL);
118
119         rp = ppath_push(p, pc);
120         ATF_CHECK_EQ(rp, NULL);
121
122         ppath_component_release(pc);
123         ppath_release(p);
124
125         assert_no_ppath_extant();
126         assert_no_ppath_component_extant();
127 }
128
129 ATF_TC(pop_until_empty);
130 ATF_TC_HEAD(pop_until_empty, tc)
131 {
132         atf_tc_set_md_var(tc, "descr", "check ppath_pop() returns error "
133             "after ppath_t is empty");
134 }
135
136 ATF_TC_BODY(pop_until_empty, tc)
137 {
138         ppath_t *p, *rp;
139         ppath_component_t *pc, *rpc;
140         int i;
141
142         assert_no_ppath_extant();
143         assert_no_ppath_component_extant();
144
145         if ((p = ppath_create()) == NULL)
146                 atf_tc_fail("ppath_create failed");
147
148         if ((pc = ppath_idx(0)) == NULL)
149                 atf_tc_fail("ppath_idx failed");
150
151         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
152                 rp = ppath_push(p, pc);
153                 ATF_CHECK_EQ(rp, p);
154         }
155
156         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
157                 rp = ppath_pop(p, &rpc);
158                 ATF_CHECK_EQ(rp, p);
159                 ATF_CHECK_EQ(rpc, pc);
160                 ppath_component_release(rpc);
161         }
162
163         rp = ppath_pop(p, &rpc);
164         ATF_CHECK_EQ(rp, NULL);
165         rp = ppath_pop(p, &rpc);
166         ATF_CHECK_EQ(rp, NULL);
167
168         ppath_component_release(pc);
169         ppath_release(p);
170
171         assert_no_ppath_extant();
172         assert_no_ppath_component_extant();
173 }
174
175 ATF_TC(length);
176
177 ATF_TC_HEAD(length, tc)
178 {
179         atf_tc_set_md_var(tc, "descr", "check that ppath_push() "
180             "and ppath_pop() affect ppath_length() correctly");
181 }
182
183 ATF_TC_BODY(length, tc)
184 {
185         ppath_t *p, *rp;
186         ppath_component_t *pc;
187         unsigned int i, len;
188
189         assert_no_ppath_extant();
190         assert_no_ppath_component_extant();
191
192         if ((p = ppath_create()) == NULL)
193                 atf_tc_fail("ppath_create failed");
194
195         if ((pc = ppath_idx(0)) == NULL)
196                 atf_tc_fail("ppath_idx failed");
197
198         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
199                 len = ppath_length(p);
200                 ATF_CHECK_EQ(len, i);
201                 rp = ppath_push(p, pc);
202                 ATF_CHECK_EQ(rp, p);
203         }
204
205         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
206                 len = ppath_length(p);
207                 ATF_CHECK_EQ(len, PPATH_MAX_COMPONENTS - i);
208                 rp = ppath_pop(p, NULL);
209                 ATF_CHECK_EQ(rp, p);
210         }
211         ppath_component_release(pc);
212         ppath_release(p);
213
214         assert_no_ppath_extant();
215         assert_no_ppath_component_extant();
216 }
217
218 ATF_TC(component_at);
219
220 ATF_TC_HEAD(component_at, tc)
221 {
222         atf_tc_set_md_var(tc, "descr", "check that ppath_component_at() "
223             "returns the expected component");
224 }
225
226 ATF_TC_BODY(component_at, tc)
227 {
228         ppath_t *p, *rp;
229         ppath_component_t *pc;
230         unsigned int i;
231
232         assert_no_ppath_extant();
233         assert_no_ppath_component_extant();
234
235         if ((p = ppath_create()) == NULL)
236                 atf_tc_fail("ppath_create failed");
237
238         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
239                 if ((pc = ppath_idx(i)) == NULL)
240                         atf_tc_fail("ppath_idx failed");
241                 rp = ppath_push(p, pc);
242                 ppath_component_release(pc);
243                 ATF_CHECK_EQ(rp, p);
244         }
245
246         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
247                 pc = ppath_component_at(p, i);
248                 ATF_CHECK_EQ(ppath_component_idx(pc), (int)i);
249                 ppath_component_release(pc);
250         }
251         ppath_release(p);
252
253         assert_no_ppath_extant();
254         assert_no_ppath_component_extant();
255 }
256
257 ATF_TC(get_idx_key);
258
259 ATF_TC_HEAD(get_idx_key, tc)
260 {
261         atf_tc_set_md_var(tc, "descr", "check that ppath_component_idx() "
262             "and ppath_component_key() return -1 and NULL, respectively, if "
263             "the component is a key or an index, respectively.");
264 }
265
266 ATF_TC_BODY(get_idx_key, tc)
267 {
268         ppath_component_t *idx, *key;
269
270         assert_no_ppath_extant();
271         assert_no_ppath_component_extant();
272
273         if ((idx = ppath_idx(0)) == NULL)
274                 atf_tc_fail("ppath_idx failed");
275         if ((key = ppath_key("key")) == NULL)
276                 atf_tc_fail("ppath_idx failed");
277
278         ATF_CHECK_EQ(ppath_component_key(idx), NULL);
279         ATF_CHECK_EQ(ppath_component_idx(key), -1);
280
281         ppath_component_release(idx);
282         ppath_component_release(key);
283
284         assert_no_ppath_extant();
285         assert_no_ppath_component_extant();
286 }
287
288 ATF_TC(ppath_copy);
289
290 ATF_TC_HEAD(ppath_copy, tc)
291 {
292         atf_tc_set_md_var(tc, "descr", "check that ppath_copy() "
293             "creates an exact replica of a path, and that no "
294             "resources are leaked.");
295 }
296
297 ATF_TC_BODY(ppath_copy, tc)
298 {
299         ppath_component_t *pc, *cpc;
300         ppath_t *p, *cp, *rp;
301         unsigned int i;
302
303         assert_no_ppath_extant();
304         assert_no_ppath_component_extant();
305
306         if ((p = ppath_create()) == NULL)
307                 atf_tc_fail("ppath_create failed");
308
309         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
310                 if ((pc = ppath_idx(i)) == NULL)
311                         atf_tc_fail("ppath_idx failed");
312                 rp = ppath_push(p, pc);
313                 ppath_component_release(pc);
314                 ATF_CHECK_EQ(rp, p);
315         }
316
317         if ((cp = ppath_copy(p)) == NULL)
318                 atf_tc_fail("ppath_copy failed");
319
320         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
321                 pc = ppath_component_at(p, i);
322                 cpc = ppath_component_at(cp, i);
323                 ATF_CHECK_EQ(pc, cpc);
324                 ppath_component_release(pc);
325                 ppath_component_release(cpc);
326         }
327
328         ppath_release(cp);
329         ppath_release(p);
330
331         assert_no_ppath_extant();
332         assert_no_ppath_component_extant();
333 }
334
335 ATF_TC(replace);
336
337 ATF_TC_HEAD(replace, tc)
338 {
339         atf_tc_set_md_var(tc, "descr", "check that ppath_replace_idx() "
340             "and ppath_replace_key() produce the paths we expect without "
341             "leaking resources.");
342 }
343
344 ATF_TC_BODY(replace, tc)
345 {
346         ppath_component_t *pc;
347         ppath_t *p, *cp, *rp;
348         unsigned int i;
349
350         assert_no_ppath_extant();
351         assert_no_ppath_component_extant();
352
353         if ((p = ppath_create()) == NULL)
354                 atf_tc_fail("ppath_create failed");
355
356         /* index replacement fails on an empty path */
357         rp = ppath_replace_idx(p, 0);
358         ATF_CHECK_EQ(rp, NULL);
359
360         /* key replacement fails on an empty path */
361         rp = ppath_replace_key(p, "key");
362         ATF_CHECK_EQ(rp, NULL);
363
364         for (i = 0; i < PPATH_MAX_COMPONENTS; i++) {
365                 if ((pc = ppath_idx(i)) == NULL)
366                         atf_tc_fail("ppath_idx failed");
367                 rp = ppath_push(p, pc);
368                 ppath_component_release(pc);
369                 ATF_CHECK_EQ(rp, p);
370         }
371
372         if ((cp = ppath_copy(p)) == NULL)
373                 atf_tc_fail("ppath_copy failed");
374
375         rp = ppath_pop(cp, NULL);
376         ATF_CHECK_EQ(rp, cp);
377         rp = ppath_push_key(cp, "key");
378         ATF_CHECK_EQ(rp, cp);
379
380         ppath_replace_idx(p, 0);
381
382         if ((pc = ppath_component_at(p, PPATH_MAX_COMPONENTS - 1)) == NULL)
383                 atf_tc_fail("ppath_idx failed");
384         ATF_CHECK_EQ(ppath_component_idx(pc), 0);
385         ppath_component_release(pc);
386
387         for (i = 0; i < PPATH_MAX_COMPONENTS - 1; i++) {
388                 if ((pc = ppath_component_at(p, i)) == NULL)
389                         atf_tc_fail("ppath_idx failed");
390                 ATF_CHECK_EQ(ppath_component_idx(pc), (int)i);
391                 ppath_component_release(pc);
392         }
393
394         for (i = 0; i < PPATH_MAX_COMPONENTS - 1; i++) {
395                 if ((pc = ppath_component_at(cp, i)) == NULL)
396                         atf_tc_fail("ppath_idx failed");
397                 ATF_CHECK_EQ(ppath_component_idx(pc), (int)i);
398                 ppath_component_release(pc);
399         }
400
401         if ((pc = ppath_component_at(cp, PPATH_MAX_COMPONENTS - 1)) == NULL)
402                 atf_tc_fail("ppath_idx failed");
403         if (ppath_component_key(pc) == NULL ||
404             strcmp(ppath_component_key(pc), "key") != 0)
405                 atf_tc_fail("last path component expected to be \"key\"");
406         ppath_component_release(pc);
407         ppath_release(p);
408         ppath_release(cp);
409
410         assert_no_ppath_extant();
411         assert_no_ppath_component_extant();
412 }
413
414 ATF_TC(copyset_object_twice_success);
415
416 ATF_TC_HEAD(copyset_object_twice_success, tc)
417 {
418         atf_tc_set_md_var(tc, "descr",
419             "check that after back-to-back ppath_copyset_object() calls, "
420             "changing the \"u.s. citizen\" property and the first property "
421             "in \"children\" in the \"John Doe\" record in the "
422             "\"personnel\" property list, the properties are changed "
423             "in the new dictionary and unchanged in the old dictionary");
424 }
425
426 ATF_TC_BODY(copyset_object_twice_success, tc)
427 {
428         const char *s;
429         char *oext, *next;
430         int rc;
431         bool v = false;
432         prop_dictionary_t d, od;
433         prop_object_t nd = NULL, ond;
434         prop_object_t r, or;
435         ppath_t *p, *p2, *p3;
436
437         assert_no_ppath_extant();
438         assert_no_ppath_component_extant();
439
440         if ((d = prop_dictionary_internalize(personnel)) == NULL)
441                 atf_tc_fail("prop_dictionary_internalize failed");
442         od = prop_dictionary_copy(d);
443
444         if (!dictionary_equals(od, d)) {
445                 oext = prop_dictionary_externalize(od);
446                 next = prop_dictionary_externalize(d);
447                 atf_tc_fail("dictionaries are unequal from the outset, argh! "
448                     "original\n%s\nnew\n%s", oext, next);
449                 free(oext);
450                 free(next);
451         }
452
453         if ((p = ppath_create()) == NULL || (p2 = ppath_create()) == NULL ||
454             (p3 = ppath_create()) == NULL)
455                 atf_tc_fail("ppath_create failed");
456
457         if (ppath_push_key(p, "John Doe") == NULL)
458                 atf_tc_fail("ppath_push_key failed");
459         if (ppath_push_key(p, "u.s. citizen") == NULL)
460                 atf_tc_fail("ppath_push_key failed");
461
462         if (ppath_push_key(p2, "John Doe") == NULL)
463                 atf_tc_fail("ppath_push_key failed");
464         if (ppath_push_key(p2, "children") == NULL)
465                 atf_tc_fail("ppath_push_key failed");
466         if (ppath_push_idx(p2, 0) == NULL)
467                 atf_tc_fail("ppath_push_idx failed");
468
469         if (ppath_push_key(p3, "John Doe") == NULL)
470                 atf_tc_fail("ppath_push_key failed");
471
472         v = false;
473         rc = ppath_get_bool(d, p, &v);
474         ATF_CHECK_EQ(rc, 0);
475         ATF_CHECK_EQ(v, true);
476
477         s = "";
478         rc = ppath_get_string(d, p2, &s);
479         ATF_CHECK_EQ(rc, 0);
480         ATF_CHECK_STREQ(s, "Jane Doe");
481
482         rc = ppath_copyset_bool(d, &nd, p, false);
483         ATF_CHECK_EQ(rc, 0);
484
485         rc = ppath_get_object(nd, p3, &r);
486         ATF_CHECK_EQ(rc, 0);
487
488         ond = nd;
489
490         rc = ppath_copyset_string(d, &nd, p2, "Martha Doe");
491         ATF_CHECK_EQ(rc, 0);
492
493         ATF_CHECK_EQ(nd, ond);
494
495         rc = ppath_get_object(nd, p3, &or);
496         ATF_CHECK_EQ(rc, 0);
497
498         ATF_CHECK_EQ(r, or);
499
500         v = true;
501         rc = ppath_get_bool(nd, p, &v);
502         ATF_CHECK_EQ(rc, 0);
503         ATF_CHECK_EQ(v, false);
504
505         s = "";
506         rc = ppath_get_string(nd, p2, &s);
507         ATF_CHECK_EQ(rc, 0);
508         ATF_CHECK_STREQ(s, "Martha Doe");
509
510         if (!dictionary_equals(od, d)) {
511                 oext = prop_dictionary_externalize(od);
512                 next = prop_dictionary_externalize(d);
513                 atf_tc_fail("copydel modified original dictionary, "
514                     "original\n%s\nnew\n%s", oext, next);
515                 free(oext);
516                 free(next);
517         }
518
519         if (dictionary_equals(od, nd)) {
520                 oext = prop_dictionary_externalize(od);
521                 next = prop_dictionary_externalize(nd);
522                 atf_tc_fail("copydel made no change to the new "
523                     "dictionary, original\n%s\nnew\n%s", oext, next);
524                 free(oext);
525                 free(next);
526         }
527
528         rc = ppath_set_bool(od, p, false);
529         ATF_CHECK_EQ(rc, 0);
530
531         rc = ppath_set_string(od, p2, "Martha Doe");
532         ATF_CHECK_EQ(rc, 0);
533
534         if (!dictionary_equals(od, nd)) {
535                 oext = prop_dictionary_externalize(od);
536                 next = prop_dictionary_externalize(nd);
537                 atf_tc_fail("copydel made an out-of-bounds change to the new "
538                     "dictionary, original\n%s\nnew\n%s", oext, next);
539                 free(oext);
540                 free(next);
541         }
542
543         ppath_release(p);
544         ppath_release(p2);
545         ppath_release(p3);
546         prop_object_release(d);
547         prop_object_release(od);
548         prop_object_release(nd);
549         assert_no_ppath_extant();
550         assert_no_ppath_component_extant();
551 }
552
553 ATF_TC(copydel_object_twice_success);
554
555 ATF_TC_HEAD(copydel_object_twice_success, tc)
556 {
557         atf_tc_set_md_var(tc, "descr",
558             "check that after back-to-back ppath_copydel_object() calls, "
559             "removing the \"u.s. citizen\" property and the first property "
560             "in \"children\" from the \"John Doe\" record in the "
561             "\"personnel\" property list, the properties are missing "
562             "from the new dictionary and unchanged in the old dictionary");
563 }
564
565 ATF_TC_BODY(copydel_object_twice_success, tc)
566 {
567         const char *s;
568         char *oext, *next;
569         int rc;
570         bool v = false;
571         prop_dictionary_t d, od;
572         prop_object_t nd = NULL, ond;
573         prop_object_t r, or;
574         ppath_t *p, *p2, *p3;
575
576         assert_no_ppath_extant();
577         assert_no_ppath_component_extant();
578
579         if ((d = prop_dictionary_internalize(personnel)) == NULL)
580                 atf_tc_fail("prop_dictionary_internalize failed");
581         od = prop_dictionary_copy(d);
582
583         if (!dictionary_equals(od, d)) {
584                 oext = prop_dictionary_externalize(od);
585                 next = prop_dictionary_externalize(d);
586                 atf_tc_fail("dictionaries are unequal from the outset, argh! "
587                     "original\n%s\nnew\n%s", oext, next);
588                 free(oext);
589                 free(next);
590         }
591
592         if ((p = ppath_create()) == NULL || (p2 = ppath_create()) == NULL ||
593             (p3 = ppath_create()) == NULL)
594                 atf_tc_fail("ppath_create failed");
595
596         if (ppath_push_key(p, "John Doe") == NULL)
597                 atf_tc_fail("ppath_push_key failed");
598         if (ppath_push_key(p, "u.s. citizen") == NULL)
599                 atf_tc_fail("ppath_push_key failed");
600
601         if (ppath_push_key(p2, "John Doe") == NULL)
602                 atf_tc_fail("ppath_push_key failed");
603         if (ppath_push_key(p2, "children") == NULL)
604                 atf_tc_fail("ppath_push_key failed");
605         if (ppath_push_idx(p2, 0) == NULL)
606                 atf_tc_fail("ppath_push_idx failed");
607
608         if (ppath_push_key(p3, "John Doe") == NULL)
609                 atf_tc_fail("ppath_push_key failed");
610
611         v = false;
612         rc = ppath_get_bool(d, p, &v);
613         ATF_CHECK_EQ(rc, 0);
614         ATF_CHECK_EQ(v, true);
615
616         s = "";
617         rc = ppath_get_string(d, p2, &s);
618         ATF_CHECK_EQ(rc, 0);
619         ATF_CHECK_STREQ(s, "Jane Doe");
620
621         rc = ppath_copydel_bool(d, &nd, p);
622         ATF_CHECK_EQ(rc, 0);
623
624         ond = nd;
625
626         rc = ppath_get_object(nd, p3, &r);
627         ATF_CHECK_EQ(rc, 0);
628
629         rc = ppath_copydel_string(d, &nd, p2);
630         ATF_CHECK_EQ(rc, 0);
631
632         ATF_CHECK_EQ(nd, ond);
633
634         rc = ppath_get_object(nd, p3, &or);
635         ATF_CHECK_EQ(rc, 0);
636
637         ATF_CHECK_EQ(r, or);
638
639         v = true;
640         rc = ppath_get_bool(nd, p, &v);
641         ATF_CHECK_EQ(rc, ENOENT);
642         ATF_CHECK_EQ(v, true);
643
644         if (!dictionary_equals(od, d)) {
645                 oext = prop_dictionary_externalize(od);
646                 next = prop_dictionary_externalize(d);
647                 atf_tc_fail("copydel modified original dictionary, "
648                     "original\n%s\nnew\n%s", oext, next);
649                 free(oext);
650                 free(next);
651         }
652
653         if (dictionary_equals(od, nd)) {
654                 oext = prop_dictionary_externalize(od);
655                 next = prop_dictionary_externalize(nd);
656                 atf_tc_fail("copydel made no change to the new "
657                     "dictionary, original\n%s\nnew\n%s", oext, next);
658                 free(oext);
659                 free(next);
660         }
661
662         rc = ppath_delete_bool(od, p);
663         ATF_CHECK_EQ(rc, 0);
664
665         rc = ppath_delete_string(od, p2);
666         ATF_CHECK_EQ(rc, 0);
667
668         if (!dictionary_equals(od, nd)) {
669                 oext = prop_dictionary_externalize(od);
670                 next = prop_dictionary_externalize(nd);
671                 atf_tc_fail("copydel made an out-of-bounds change to the new "
672                     "dictionary, original\n%s\nnew\n%s", oext, next);
673                 free(oext);
674                 free(next);
675         }
676
677         ppath_release(p);
678         ppath_release(p2);
679         ppath_release(p3);
680         prop_object_release(d);
681         prop_object_release(od);
682         prop_object_release(nd);
683         assert_no_ppath_extant();
684         assert_no_ppath_component_extant();
685 }
686
687 ATF_TC(copydel_bool_success);
688
689 ATF_TC_HEAD(copydel_bool_success, tc)
690 {
691         atf_tc_set_md_var(tc, "descr", "check ppath_copydel_bool() deletes "
692             "the \"u.s. citizen\" property in the \"John Doe\" record in the "
693             "\"personnel\" property list and verifies the value is missing "
694             "from the new dictionary and unchanged in the old dictionary");
695 }
696
697 ATF_TC_BODY(copydel_bool_success, tc)
698 {
699         char *oext, *next;
700         int rc;
701         bool v = false;
702         prop_dictionary_t d, od;
703         prop_object_t nd = NULL;
704         ppath_t *p;
705
706         assert_no_ppath_extant();
707         assert_no_ppath_component_extant();
708
709         if ((d = prop_dictionary_internalize(personnel)) == NULL)
710                 atf_tc_fail("prop_dictionary_internalize failed");
711         od = prop_dictionary_copy(d);
712
713         if (!dictionary_equals(od, d)) {
714                 oext = prop_dictionary_externalize(od);
715                 next = prop_dictionary_externalize(d);
716                 atf_tc_fail("dictionaries are unequal from the outset, argh! "
717                     "original\n%s\nnew\n%s", oext, next);
718                 free(oext);
719                 free(next);
720         }
721
722         if ((p = ppath_create()) == NULL)
723                 atf_tc_fail("ppath_create failed");
724
725         if (ppath_push_key(p, "John Doe") == NULL)
726                 atf_tc_fail("ppath_push_key failed");
727         if (ppath_push_key(p, "u.s. citizen") == NULL)
728                 atf_tc_fail("ppath_push_key failed");
729
730         v = false;
731         rc = ppath_get_bool(d, p, &v);
732         ATF_CHECK_EQ(rc, 0);
733         ATF_CHECK_EQ(v, true);
734
735         rc = ppath_copydel_bool(d, &nd, p);
736         ATF_CHECK_EQ(rc, 0);
737
738         v = true;
739         rc = ppath_get_bool(nd, p, &v);
740         ATF_CHECK_EQ(rc, ENOENT);
741         ATF_CHECK_EQ(v, true);
742
743         if (!dictionary_equals(od, d)) {
744                 oext = prop_dictionary_externalize(od);
745                 next = prop_dictionary_externalize(d);
746                 atf_tc_fail("copydel modified original dictionary, "
747                     "original\n%s\nnew\n%s", oext, next);
748                 free(oext);
749                 free(next);
750         }
751
752         if (dictionary_equals(od, nd)) {
753                 oext = prop_dictionary_externalize(od);
754                 next = prop_dictionary_externalize(nd);
755                 atf_tc_fail("copydel made no change to the new "
756                     "dictionary, original\n%s\nnew\n%s", oext, next);
757                 free(oext);
758                 free(next);
759         }
760
761         rc = ppath_delete_bool(od, p);
762         ATF_CHECK_EQ(rc, 0);
763
764         if (!dictionary_equals(od, nd)) {
765                 oext = prop_dictionary_externalize(od);
766                 next = prop_dictionary_externalize(nd);
767                 atf_tc_fail("copydel made an out-of-bounds change to the new "
768                     "dictionary, original\n%s\nnew\n%s", oext, next);
769                 free(oext);
770                 free(next);
771         }
772
773         ppath_release(p);
774         prop_object_release(d);
775         prop_object_release(od);
776         prop_object_release(nd);
777         assert_no_ppath_extant();
778         assert_no_ppath_component_extant();
779 }
780
781 ATF_TC(copyset_bool_success);
782
783 ATF_TC_HEAD(copyset_bool_success, tc)
784 {
785         atf_tc_set_md_var(tc, "descr", "check ppath_copyset_bool() sets "
786             "the \"u.s. citizen\" property in the \"John Doe\" record in the "
787             "\"personnel\" property list to false and verifies the new value "
788             "in the new dictionary and that the old dictionary is unchanged");
789 }
790
791 ATF_TC_BODY(copyset_bool_success, tc)
792 {
793         char *oext, *next;
794         int rc;
795         bool v = false;
796         prop_dictionary_t d, od;
797         prop_object_t nd = NULL;
798         ppath_t *p;
799
800         assert_no_ppath_extant();
801         assert_no_ppath_component_extant();
802
803         if ((d = prop_dictionary_internalize(personnel)) == NULL)
804                 atf_tc_fail("prop_dictionary_internalize failed");
805         od = prop_dictionary_copy(d);
806
807         if (!dictionary_equals(od, d)) {
808                 oext = prop_dictionary_externalize(od);
809                 next = prop_dictionary_externalize(d);
810                 atf_tc_fail("dictionaries are unequal from the outset, argh! "
811                     "original\n%s\nnew\n%s", oext, next);
812                 free(oext);
813                 free(next);
814         }
815
816         if ((p = ppath_create()) == NULL)
817                 atf_tc_fail("ppath_create failed");
818
819         if (ppath_push_key(p, "John Doe") == NULL)
820                 atf_tc_fail("ppath_push_key failed");
821         if (ppath_push_key(p, "u.s. citizen") == NULL)
822                 atf_tc_fail("ppath_push_key failed");
823
824         v = false;
825         rc = ppath_get_bool(d, p, &v);
826         ATF_CHECK_EQ(rc, 0);
827         ATF_CHECK_EQ(v, true);
828
829         rc = ppath_copyset_bool(d, &nd, p, false);
830         ATF_CHECK_EQ(rc, 0);
831
832         v = true;
833         rc = ppath_get_bool(nd, p, &v);
834         ATF_CHECK_EQ(rc, 0);
835         ATF_CHECK_EQ(v, false);
836
837         if (!dictionary_equals(od, d)) {
838                 oext = prop_dictionary_externalize(od);
839                 next = prop_dictionary_externalize(d);
840                 atf_tc_fail("copyset modified original dictionary, "
841                     "original\n%s\nnew\n%s", oext, next);
842                 free(oext);
843                 free(next);
844         }
845
846         if (dictionary_equals(od, nd)) {
847                 oext = prop_dictionary_externalize(od);
848                 next = prop_dictionary_externalize(nd);
849                 atf_tc_fail("copyset made no change to the new "
850                     "dictionary, original\n%s\nnew\n%s", oext, next);
851                 free(oext);
852                 free(next);
853         }
854
855         rc = ppath_set_bool(nd, p, true);
856         ATF_CHECK_EQ(rc, 0);
857
858         if (!dictionary_equals(od, nd)) {
859                 oext = prop_dictionary_externalize(od);
860                 next = prop_dictionary_externalize(nd);
861                 atf_tc_fail("copyset made an out-of-bounds change to the new "
862                     "dictionary, original\n%s\nnew\n%s", oext, next);
863                 free(oext);
864                 free(next);
865         }
866
867         ppath_release(p);
868         prop_object_release(d);
869         prop_object_release(od);
870         prop_object_release(nd);
871         assert_no_ppath_extant();
872         assert_no_ppath_component_extant();
873 }
874
875 ATF_TC(set_bool_eftype);
876
877 ATF_TC_HEAD(set_bool_eftype, tc)
878 {
879         atf_tc_set_md_var(tc, "descr", "check ppath_set_bool() does not "
880             "overwrite with a bool "
881             "the \"job title\" property in the \"John Doe\" record in "
882             "the "
883             "\"personnel\" property list");
884 }
885
886 ATF_TC_BODY(set_bool_eftype, tc)
887 {
888         int rc;
889         bool v = false;
890         prop_dictionary_t d;
891         ppath_t *p;
892
893         assert_no_ppath_extant();
894         assert_no_ppath_component_extant();
895
896         if ((d = prop_dictionary_internalize(personnel)) == NULL)
897                 atf_tc_fail("prop_dictionary_internalize failed");
898
899         if ((p = ppath_create()) == NULL)
900                 atf_tc_fail("ppath_create failed");
901
902         if (ppath_push_key(p, "John Doe") == NULL)
903                 atf_tc_fail("ppath_push_key failed");
904         if (ppath_push_key(p, "job title") == NULL)
905                 atf_tc_fail("ppath_push_key failed");
906
907         v = false;
908         rc = ppath_get_bool(d, p, &v);
909         ATF_CHECK_EQ(rc, EFTYPE);
910         ATF_CHECK_EQ(v, false);
911
912         rc = ppath_set_bool(d, p, false);
913         ATF_CHECK_EQ(rc, EFTYPE);
914
915         v = true;
916         rc = ppath_get_bool(d, p, &v);
917         ATF_CHECK_EQ(rc, EFTYPE);
918         ATF_CHECK_EQ(v, true);
919
920         ppath_release(p);
921         prop_object_release(d);
922         assert_no_ppath_extant();
923         assert_no_ppath_component_extant();
924 }
925
926 ATF_TC(set_bool_enoent);
927
928 ATF_TC_HEAD(set_bool_enoent, tc)
929 {
930         atf_tc_set_md_var(tc, "descr", "check ppath_set_bool() does not create "
931             "the \"russian citizen\" property in the \"John Doe\" record in "
932             "the "
933             "\"personnel\" property list");
934 }
935
936 ATF_TC_BODY(set_bool_enoent, tc)
937 {
938         int rc;
939         bool v = false;
940         prop_dictionary_t d;
941         ppath_t *p;
942
943         assert_no_ppath_extant();
944         assert_no_ppath_component_extant();
945
946         if ((d = prop_dictionary_internalize(personnel)) == NULL)
947                 atf_tc_fail("prop_dictionary_internalize failed");
948
949         if ((p = ppath_create()) == NULL)
950                 atf_tc_fail("ppath_create failed");
951
952         if (ppath_push_key(p, "John Doe") == NULL)
953                 atf_tc_fail("ppath_push_key failed");
954         if (ppath_push_key(p, "russian citizen") == NULL)
955                 atf_tc_fail("ppath_push_key failed");
956
957         v = false;
958         rc = ppath_get_bool(d, p, &v);
959         ATF_CHECK_EQ(rc, ENOENT);
960         ATF_CHECK_EQ(v, false);
961
962         rc = ppath_set_bool(d, p, false);
963         ATF_CHECK_EQ(rc, ENOENT);
964
965         v = true;
966         rc = ppath_get_bool(d, p, &v);
967         ATF_CHECK_EQ(rc, ENOENT);
968         ATF_CHECK_EQ(v, true);
969
970         ppath_release(p);
971         prop_object_release(d);
972         assert_no_ppath_extant();
973         assert_no_ppath_component_extant();
974 }
975
976 ATF_TC(create_bool_eexist);
977
978 ATF_TC_HEAD(create_bool_eexist, tc)
979 {
980         atf_tc_set_md_var(tc, "descr", "check ppath_create_bool() returns "
981             "EEXIST because the \"u.s. citizen\" property in the "
982             "\"John Doe\" record in the \"personnel\" property list "
983             "already exists");
984 }
985
986 ATF_TC_BODY(create_bool_eexist, tc)
987 {
988         int rc;
989         bool v = false;
990         prop_dictionary_t d;
991         ppath_t *p;
992
993         assert_no_ppath_extant();
994         assert_no_ppath_component_extant();
995
996         if ((d = prop_dictionary_internalize(personnel)) == NULL)
997                 atf_tc_fail("prop_dictionary_internalize failed");
998
999         if ((p = ppath_create()) == NULL)
1000                 atf_tc_fail("ppath_create failed");
1001
1002         if (ppath_push_key(p, "John Doe") == NULL)
1003                 atf_tc_fail("ppath_push_key failed");
1004         if (ppath_push_key(p, "u.s. citizen") == NULL)
1005                 atf_tc_fail("ppath_push_key failed");
1006
1007         v = false;
1008         rc = ppath_get_bool(d, p, &v);
1009         ATF_CHECK_EQ(rc, 0);
1010         ATF_CHECK_EQ(v, true);
1011
1012         rc = ppath_create_bool(d, p, false);
1013         ATF_CHECK_EQ(rc, EEXIST);
1014
1015         v = false;
1016         rc = ppath_get_bool(d, p, &v);
1017         ATF_CHECK_EQ(rc, 0);
1018         ATF_CHECK_EQ(v, true);
1019
1020         ppath_release(p);
1021         prop_object_release(d);
1022         assert_no_ppath_extant();
1023         assert_no_ppath_component_extant();
1024 }
1025
1026 ATF_TC(create_bool_success);
1027
1028 ATF_TC_HEAD(create_bool_success, tc)
1029 {
1030         atf_tc_set_md_var(tc, "descr", "check ppath_create_bool() creates "
1031             "the \"russian citizen\" property in the \"John Doe\" record in "
1032             "the \"personnel\" property list and sets it to false");
1033 }
1034
1035 ATF_TC_BODY(create_bool_success, tc)
1036 {
1037         int rc;
1038         bool v = false;
1039         prop_dictionary_t d;
1040         ppath_t *p;
1041
1042         assert_no_ppath_extant();
1043         assert_no_ppath_component_extant();
1044
1045         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1046                 atf_tc_fail("prop_dictionary_internalize failed");
1047
1048         if ((p = ppath_create()) == NULL)
1049                 atf_tc_fail("ppath_create failed");
1050
1051         if (ppath_push_key(p, "John Doe") == NULL)
1052                 atf_tc_fail("ppath_push_key failed");
1053         if (ppath_push_key(p, "russian citizen") == NULL)
1054                 atf_tc_fail("ppath_push_key failed");
1055
1056         v = false;
1057         rc = ppath_get_bool(d, p, &v);
1058         ATF_CHECK_EQ(rc, ENOENT);
1059         ATF_CHECK_EQ(v, false);
1060
1061         rc = ppath_create_bool(d, p, false);
1062         ATF_CHECK_EQ(rc, 0);
1063
1064         v = true;
1065         rc = ppath_get_bool(d, p, &v);
1066         ATF_CHECK_EQ(rc, 0);
1067         ATF_CHECK_EQ(v, false);
1068
1069         ppath_release(p);
1070         prop_object_release(d);
1071         assert_no_ppath_extant();
1072         assert_no_ppath_component_extant();
1073 }
1074
1075 ATF_TC(set_bool_success);
1076
1077 ATF_TC_HEAD(set_bool_success, tc)
1078 {
1079         atf_tc_set_md_var(tc, "descr", "check ppath_set_bool() sets "
1080             "the \"u.s. citizen\" property in the \"John Doe\" record in the "
1081             "\"personnel\" property list to false and verifies the new value");
1082 }
1083
1084 ATF_TC_BODY(set_bool_success, tc)
1085 {
1086         int rc;
1087         bool v = false;
1088         prop_dictionary_t d;
1089         ppath_t *p;
1090
1091         assert_no_ppath_extant();
1092         assert_no_ppath_component_extant();
1093
1094         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1095                 atf_tc_fail("prop_dictionary_internalize failed");
1096
1097         if ((p = ppath_create()) == NULL)
1098                 atf_tc_fail("ppath_create failed");
1099
1100         if (ppath_push_key(p, "John Doe") == NULL)
1101                 atf_tc_fail("ppath_push_key failed");
1102         if (ppath_push_key(p, "u.s. citizen") == NULL)
1103                 atf_tc_fail("ppath_push_key failed");
1104
1105         v = false;
1106         rc = ppath_get_bool(d, p, &v);
1107         ATF_CHECK_EQ(rc, 0);
1108         ATF_CHECK_EQ(v, true);
1109
1110         rc = ppath_set_bool(d, p, v);
1111         ATF_CHECK_EQ(rc, 0);
1112
1113         v = true;
1114         rc = ppath_get_bool(d, p, &v);
1115         ATF_CHECK_EQ(rc, 0);
1116         ATF_CHECK_EQ(v, true);
1117
1118         ppath_release(p);
1119         prop_object_release(d);
1120         assert_no_ppath_extant();
1121         assert_no_ppath_component_extant();
1122 }
1123
1124 ATF_TC(get_bool_success);
1125
1126 ATF_TC_HEAD(get_bool_success, tc)
1127 {
1128         atf_tc_set_md_var(tc, "descr", "check ppath_get_bool() fetches "
1129             "the \"u.s. citizen\" property from the \"John Doe\" record in the "
1130             "\"personnel\" property list, and compares it with the expected "
1131             "value, true");
1132 }
1133
1134 ATF_TC_BODY(get_bool_success, tc)
1135 {
1136         int rc;
1137         bool v = false;
1138         prop_dictionary_t d;
1139         ppath_t *p;
1140
1141         assert_no_ppath_extant();
1142         assert_no_ppath_component_extant();
1143
1144         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1145                 atf_tc_fail("prop_dictionary_internalize failed");
1146
1147         if ((p = ppath_create()) == NULL)
1148                 atf_tc_fail("ppath_create failed");
1149
1150         if (ppath_push_key(p, "John Doe") == NULL)
1151                 atf_tc_fail("ppath_push_key failed");
1152         if (ppath_push_key(p, "u.s. citizen") == NULL)
1153                 atf_tc_fail("ppath_push_key failed");
1154
1155         rc = ppath_get_bool(d, p, &v);
1156         ATF_CHECK_EQ(rc, 0);
1157         ATF_CHECK_EQ(v, true);
1158
1159         ppath_release(p);
1160         prop_object_release(d);
1161         assert_no_ppath_extant();
1162         assert_no_ppath_component_extant();
1163 }
1164
1165 ATF_TC(delete_bool_success);
1166
1167 ATF_TC_HEAD(delete_bool_success, tc)
1168 {
1169         atf_tc_set_md_var(tc, "descr", "check ppath_delete_bool() succeeds "
1170             "for the path (\"John Doe\", \"u.s. citizen\") in the "
1171             "\"personnel\" property list");
1172 }
1173
1174 ATF_TC_BODY(delete_bool_success, tc)
1175 {
1176         int rc;
1177         prop_dictionary_t d;
1178         ppath_t *p;
1179
1180         assert_no_ppath_extant();
1181         assert_no_ppath_component_extant();
1182
1183         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1184                 atf_tc_fail("prop_dictionary_internalize failed");
1185
1186         if ((p = ppath_create()) == NULL)
1187                 atf_tc_fail("ppath_create failed");
1188
1189         if (ppath_push_key(p, "John Doe") == NULL)
1190                 atf_tc_fail("ppath_push_key failed");
1191         if (ppath_push_key(p, "u.s. citizen") == NULL)
1192                 atf_tc_fail("ppath_push_key failed");
1193
1194         rc = ppath_delete_bool(d, p);
1195         ATF_CHECK_EQ(rc, 0);
1196
1197         rc = ppath_get_bool(d, p, NULL);
1198         ATF_CHECK_EQ(rc, ENOENT);
1199
1200         ppath_release(p);
1201         prop_object_release(d);
1202         assert_no_ppath_extant();
1203         assert_no_ppath_component_extant();
1204 }
1205
1206 ATF_TC(delete_bool_eftype);
1207
1208 ATF_TC_HEAD(delete_bool_eftype, tc)
1209 {
1210         atf_tc_set_md_var(tc, "descr", "check ppath_delete_bool() returns "
1211             "EFTYPE for the path (\"John Doe\", \"job title\") in the "
1212             "\"personnel\" property list and does not delete the path");
1213 }
1214
1215 ATF_TC_BODY(delete_bool_eftype, tc)
1216 {
1217         int rc;
1218         prop_dictionary_t d;
1219         ppath_t *p;
1220
1221         assert_no_ppath_extant();
1222         assert_no_ppath_component_extant();
1223
1224         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1225                 atf_tc_fail("prop_dictionary_internalize failed");
1226
1227         if ((p = ppath_create()) == NULL)
1228                 atf_tc_fail("ppath_create failed");
1229
1230         if (ppath_push_key(p, "John Doe") == NULL)
1231                 atf_tc_fail("ppath_push_key failed");
1232         if (ppath_push_key(p, "job title") == NULL)
1233                 atf_tc_fail("ppath_push_key failed");
1234
1235         rc = ppath_delete_bool(d, p);
1236         ATF_CHECK_EQ(rc, EFTYPE);
1237
1238         rc = ppath_get_object(d, p, NULL);
1239         ATF_CHECK_EQ(rc, 0);
1240
1241         ppath_release(p);
1242         prop_object_release(d);
1243         assert_no_ppath_extant();
1244         assert_no_ppath_component_extant();
1245 }
1246
1247 ATF_TC(delete_bool_enoent);
1248
1249 ATF_TC_HEAD(delete_bool_enoent, tc)
1250 {
1251         atf_tc_set_md_var(tc, "descr", "check ppath_delete_bool() returns "
1252             "ENOENT for the path (\"John Doe\", \"citizen\") in the "
1253             "\"personnel\" property list");
1254 }
1255
1256 ATF_TC_BODY(delete_bool_enoent, tc)
1257 {
1258         int rc;
1259         prop_dictionary_t d;
1260         ppath_t *p;
1261
1262         assert_no_ppath_extant();
1263         assert_no_ppath_component_extant();
1264
1265         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1266                 atf_tc_fail("prop_dictionary_internalize failed");
1267
1268         if ((p = ppath_create()) == NULL)
1269                 atf_tc_fail("ppath_create failed");
1270
1271         if (ppath_push_key(p, "John Doe") == NULL)
1272                 atf_tc_fail("ppath_push_key failed");
1273         if (ppath_push_key(p, "citizen") == NULL)
1274                 atf_tc_fail("ppath_push_key failed");
1275
1276         rc = ppath_delete_bool(d, p);
1277         ATF_CHECK_EQ(rc, ENOENT);
1278
1279         ppath_release(p);
1280         prop_object_release(d);
1281         assert_no_ppath_extant();
1282         assert_no_ppath_component_extant();
1283 }
1284
1285 ATF_TC(get_bool_enoent);
1286
1287 ATF_TC_HEAD(get_bool_enoent, tc)
1288 {
1289         atf_tc_set_md_var(tc, "descr", "check ppath_get_bool() returns "
1290             "ENOENT for the path (\"John Doe\", \"citizen\") in the "
1291             "\"personnel\" property list, and the bool * argument is "
1292             "unchanged");
1293 }
1294
1295 ATF_TC_BODY(get_bool_enoent, tc)
1296 {
1297         int rc;
1298         bool v;
1299         prop_dictionary_t d;
1300         ppath_t *p;
1301
1302         assert_no_ppath_extant();
1303         assert_no_ppath_component_extant();
1304
1305         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1306                 atf_tc_fail("prop_dictionary_internalize failed");
1307
1308         if ((p = ppath_create()) == NULL)
1309                 atf_tc_fail("ppath_create failed");
1310
1311         if (ppath_push_key(p, "John Doe") == NULL)
1312                 atf_tc_fail("ppath_push_key failed");
1313         if (ppath_push_key(p, "citizen") == NULL)
1314                 atf_tc_fail("ppath_push_key failed");
1315
1316         v = true;
1317         rc = ppath_get_bool(d, p, &v);
1318         ATF_CHECK_EQ(rc, ENOENT);
1319         ATF_CHECK_EQ(v, true);
1320
1321         v = false;
1322         rc = ppath_get_bool(d, p, &v);
1323         ATF_CHECK_EQ(rc, ENOENT);
1324         ATF_CHECK_EQ(v, false);
1325
1326         ppath_release(p);
1327         prop_object_release(d);
1328         assert_no_ppath_extant();
1329         assert_no_ppath_component_extant();
1330 }
1331
1332 ATF_TC(get_bool_eftype);
1333
1334 ATF_TC_HEAD(get_bool_eftype, tc)
1335 {
1336         atf_tc_set_md_var(tc, "descr", "check ppath_get_bool() returns "
1337             "EFTYPE for the path (\"John Doe\", \"job title\") in the "
1338             "\"personnel\" property list, and the bool * argument is "
1339             "unchanged");
1340 }
1341
1342 ATF_TC_BODY(get_bool_eftype, tc)
1343 {
1344         int rc;
1345         bool v;
1346         prop_dictionary_t d;
1347         ppath_t *p;
1348
1349         assert_no_ppath_extant();
1350         assert_no_ppath_component_extant();
1351
1352         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1353                 atf_tc_fail("prop_dictionary_internalize failed");
1354
1355         if ((p = ppath_create()) == NULL)
1356                 atf_tc_fail("ppath_create failed");
1357
1358         if (ppath_push_key(p, "John Doe") == NULL)
1359                 atf_tc_fail("ppath_push_key failed");
1360         if (ppath_push_key(p, "job title") == NULL)
1361                 atf_tc_fail("ppath_push_key failed");
1362
1363         v = true;
1364         rc = ppath_get_bool(d, p, &v);
1365         ATF_CHECK_EQ(rc, EFTYPE);
1366         ATF_CHECK_EQ(v, true);
1367
1368         v = false;
1369         rc = ppath_get_bool(d, p, &v);
1370         ATF_CHECK_EQ(rc, EFTYPE);
1371         ATF_CHECK_EQ(v, false);
1372
1373         ppath_release(p);
1374         prop_object_release(d);
1375         assert_no_ppath_extant();
1376         assert_no_ppath_component_extant();
1377 }
1378
1379 ATF_TC(get_string_eftype);
1380
1381 ATF_TC_HEAD(get_string_eftype, tc)
1382 {
1383         atf_tc_set_md_var(tc, "descr", "check ppath_get_string() returns "
1384             "EFTYPE for the path (\"John Doe\", \"u.s. citizen\") in the "
1385             "\"personnel\" property list, and the const char ** argument is "
1386             "unchanged");
1387 }
1388
1389 ATF_TC_BODY(get_string_eftype, tc)
1390 {
1391         int rc;
1392         const char *v;
1393         prop_dictionary_t d;
1394         ppath_t *p;
1395
1396         assert_no_ppath_extant();
1397         assert_no_ppath_component_extant();
1398
1399         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1400                 atf_tc_fail("prop_dictionary_internalize failed");
1401
1402         if ((p = ppath_create()) == NULL)
1403                 atf_tc_fail("ppath_create failed");
1404
1405         if (ppath_push_key(p, "John Doe") == NULL)
1406                 atf_tc_fail("ppath_push_key failed");
1407         if (ppath_push_key(p, "u.s. citizen") == NULL)
1408                 atf_tc_fail("ppath_push_key failed");
1409
1410         v = NULL;
1411         rc = ppath_get_string(d, p, &v);
1412         ATF_CHECK_EQ(rc, EFTYPE);
1413         ATF_CHECK_EQ(v, NULL);
1414
1415         v = "xyz";
1416         rc = ppath_get_string(d, p, &v);
1417         ATF_CHECK_EQ(rc, EFTYPE);
1418         ATF_CHECK_STREQ(v, "xyz");
1419
1420         ppath_release(p);
1421         prop_object_release(d);
1422         assert_no_ppath_extant();
1423         assert_no_ppath_component_extant();
1424 }
1425
1426 ATF_TC(get_string_enoent);
1427
1428 ATF_TC_HEAD(get_string_enoent, tc)
1429 {
1430         atf_tc_set_md_var(tc, "descr", "check ppath_get_string() returns "
1431             "ENOENT for the path (\"John Doe\", \"title\") in the "
1432             "\"personnel\" property list, and the const char ** argument is "
1433             "unchanged");
1434 }
1435
1436 ATF_TC_BODY(get_string_enoent, tc)
1437 {
1438         int rc;
1439         const char *v;
1440         prop_dictionary_t d;
1441         ppath_t *p;
1442
1443         assert_no_ppath_extant();
1444         assert_no_ppath_component_extant();
1445
1446         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1447                 atf_tc_fail("prop_dictionary_internalize failed");
1448
1449         if ((p = ppath_create()) == NULL)
1450                 atf_tc_fail("ppath_create failed");
1451
1452         if (ppath_push_key(p, "John Doe") == NULL)
1453                 atf_tc_fail("ppath_push_key failed");
1454         if (ppath_push_key(p, "title") == NULL)
1455                 atf_tc_fail("ppath_push_key failed");
1456
1457         v = NULL;
1458         rc = ppath_get_string(d, p, &v);
1459         ATF_CHECK_EQ(rc, ENOENT);
1460         ATF_CHECK_EQ(v, NULL);
1461
1462         v = "xyz";
1463         rc = ppath_get_string(d, p, &v);
1464         ATF_CHECK_EQ(rc, ENOENT);
1465         ATF_CHECK_STREQ(v, "xyz");
1466
1467         ppath_release(p);
1468         prop_object_release(d);
1469         assert_no_ppath_extant();
1470         assert_no_ppath_component_extant();
1471 }
1472
1473 ATF_TC(get_string_success);
1474
1475 ATF_TC_HEAD(get_string_success, tc)
1476 {
1477         atf_tc_set_md_var(tc, "descr", "check ppath_get_string() fetches "
1478             "the \"job title\" property from the \"John Doe\" record in the "
1479             "\"personnel\" property list and compares it with the expected "
1480             "value, \"computer programmer\"");
1481 }
1482
1483 ATF_TC_BODY(get_string_success, tc)
1484 {
1485         int rc;
1486         const char *v = NULL;;
1487         prop_dictionary_t d;
1488         ppath_t *p;
1489
1490         assert_no_ppath_extant();
1491         assert_no_ppath_component_extant();
1492
1493         if ((d = prop_dictionary_internalize(personnel)) == NULL)
1494                 atf_tc_fail("prop_dictionary_internalize failed");
1495
1496         if ((p = ppath_create()) == NULL)
1497                 atf_tc_fail("ppath_create failed");
1498
1499         if (ppath_push_key(p, "John Doe") == NULL)
1500                 atf_tc_fail("ppath_push_key failed");
1501         if (ppath_push_key(p, "job title") == NULL)
1502                 atf_tc_fail("ppath_push_key failed");
1503
1504         rc = ppath_get_string(d, p, &v);
1505         ATF_CHECK_EQ(rc, 0);
1506         ATF_CHECK_STREQ(v, "computer programmer");
1507
1508         ppath_release(p);
1509         prop_object_release(d);
1510         assert_no_ppath_extant();
1511         assert_no_ppath_component_extant();
1512 }
1513
1514 ATF_TP_ADD_TCS(tp)
1515 {
1516
1517         ATF_TP_ADD_TC(tp, push_until_full);
1518         ATF_TP_ADD_TC(tp, pop_until_empty);
1519         ATF_TP_ADD_TC(tp, length);
1520         ATF_TP_ADD_TC(tp, component_at);
1521         ATF_TP_ADD_TC(tp, get_idx_key);
1522         ATF_TP_ADD_TC(tp, ppath_copy);
1523         ATF_TP_ADD_TC(tp, replace);
1524
1525         ATF_TP_ADD_TC(tp, delete_bool_eftype);
1526         ATF_TP_ADD_TC(tp, delete_bool_enoent);
1527         ATF_TP_ADD_TC(tp, delete_bool_success);
1528
1529         ATF_TP_ADD_TC(tp, get_bool_eftype);
1530         ATF_TP_ADD_TC(tp, get_bool_enoent);
1531         ATF_TP_ADD_TC(tp, get_bool_success);
1532
1533         ATF_TP_ADD_TC(tp, copydel_bool_success);
1534         ATF_TP_ADD_TC(tp, copydel_object_twice_success);
1535         ATF_TP_ADD_TC(tp, copyset_object_twice_success);
1536         ATF_TP_ADD_TC(tp, copyset_bool_success);
1537         ATF_TP_ADD_TC(tp, create_bool_eexist);
1538         ATF_TP_ADD_TC(tp, create_bool_success);
1539         ATF_TP_ADD_TC(tp, set_bool_enoent);
1540         ATF_TP_ADD_TC(tp, set_bool_eftype);
1541         ATF_TP_ADD_TC(tp, set_bool_success);
1542
1543         ATF_TP_ADD_TC(tp, get_string_eftype);
1544         ATF_TP_ADD_TC(tp, get_string_enoent);
1545         ATF_TP_ADD_TC(tp, get_string_success);
1546
1547         return atf_no_error();
1548 }