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