xref: /aosp_15_r20/external/selinux/libsepol/tests/test-common.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /*
2*2d543d20SAndroid Build Coastguard Worker  * Author: Joshua Brindle <[email protected]>
3*2d543d20SAndroid Build Coastguard Worker  *         Chad Sellers <[email protected]>
4*2d543d20SAndroid Build Coastguard Worker  *         Chris PeBenito <[email protected]>
5*2d543d20SAndroid Build Coastguard Worker  *
6*2d543d20SAndroid Build Coastguard Worker  * Copyright (C) 2006 Tresys Technology, LLC
7*2d543d20SAndroid Build Coastguard Worker  *
8*2d543d20SAndroid Build Coastguard Worker  *  This library is free software; you can redistribute it and/or
9*2d543d20SAndroid Build Coastguard Worker  *  modify it under the terms of the GNU Lesser General Public
10*2d543d20SAndroid Build Coastguard Worker  *  License as published by the Free Software Foundation; either
11*2d543d20SAndroid Build Coastguard Worker  *  version 2.1 of the License, or (at your option) any later version.
12*2d543d20SAndroid Build Coastguard Worker  *
13*2d543d20SAndroid Build Coastguard Worker  *  This library is distributed in the hope that it will be useful,
14*2d543d20SAndroid Build Coastguard Worker  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15*2d543d20SAndroid Build Coastguard Worker  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16*2d543d20SAndroid Build Coastguard Worker  *  Lesser General Public License for more details.
17*2d543d20SAndroid Build Coastguard Worker  *
18*2d543d20SAndroid Build Coastguard Worker  *  You should have received a copy of the GNU Lesser General Public
19*2d543d20SAndroid Build Coastguard Worker  *  License along with this library; if not, write to the Free Software
20*2d543d20SAndroid Build Coastguard Worker  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
21*2d543d20SAndroid Build Coastguard Worker  */
22*2d543d20SAndroid Build Coastguard Worker 
23*2d543d20SAndroid Build Coastguard Worker /* This has tests that are common between test suites*/
24*2d543d20SAndroid Build Coastguard Worker 
25*2d543d20SAndroid Build Coastguard Worker #include <sepol/policydb/avrule_block.h>
26*2d543d20SAndroid Build Coastguard Worker 
27*2d543d20SAndroid Build Coastguard Worker #include <CUnit/Basic.h>
28*2d543d20SAndroid Build Coastguard Worker 
29*2d543d20SAndroid Build Coastguard Worker #include "test-common.h"
30*2d543d20SAndroid Build Coastguard Worker #include "helpers.h"
31*2d543d20SAndroid Build Coastguard Worker 
test_sym_presence(policydb_t * p,const char * id,int sym_type,unsigned int scope_type,unsigned int * decls,unsigned int len)32*2d543d20SAndroid Build Coastguard Worker void test_sym_presence(policydb_t * p, const char *id, int sym_type, unsigned int scope_type, unsigned int *decls, unsigned int len)
33*2d543d20SAndroid Build Coastguard Worker {
34*2d543d20SAndroid Build Coastguard Worker 	scope_datum_t *scope;
35*2d543d20SAndroid Build Coastguard Worker 	int found;
36*2d543d20SAndroid Build Coastguard Worker 	unsigned int i, j;
37*2d543d20SAndroid Build Coastguard Worker 	/* make sure it is in global symtab */
38*2d543d20SAndroid Build Coastguard Worker 	if (!hashtab_search(p->symtab[sym_type].table, id)) {
39*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "symbol %s not found in table %d\n", id, sym_type);
40*2d543d20SAndroid Build Coastguard Worker 		CU_FAIL_FATAL();
41*2d543d20SAndroid Build Coastguard Worker 	}
42*2d543d20SAndroid Build Coastguard Worker 	/* make sure its scope is correct */
43*2d543d20SAndroid Build Coastguard Worker 	scope = hashtab_search(p->scope[sym_type].table, id);
44*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT_FATAL(scope != NULL);
45*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(scope->scope == scope_type);
46*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(scope->decl_ids_len == len);
47*2d543d20SAndroid Build Coastguard Worker 	if (scope->decl_ids_len != len)
48*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "sym %s has %d decls, %d expected\n", id, scope->decl_ids_len, len);
49*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < len; i++) {
50*2d543d20SAndroid Build Coastguard Worker 		found = 0;
51*2d543d20SAndroid Build Coastguard Worker 		for (j = 0; j < len; j++) {
52*2d543d20SAndroid Build Coastguard Worker 			if (decls[i] == scope->decl_ids[j])
53*2d543d20SAndroid Build Coastguard Worker 				found++;
54*2d543d20SAndroid Build Coastguard Worker 		}
55*2d543d20SAndroid Build Coastguard Worker 		CU_ASSERT(found == 1);
56*2d543d20SAndroid Build Coastguard Worker 	}
57*2d543d20SAndroid Build Coastguard Worker 
58*2d543d20SAndroid Build Coastguard Worker }
59*2d543d20SAndroid Build Coastguard Worker 
common_test_index(hashtab_key_t key,hashtab_datum_t datum,void * data)60*2d543d20SAndroid Build Coastguard Worker static int common_test_index(hashtab_key_t key, hashtab_datum_t datum, void *data)
61*2d543d20SAndroid Build Coastguard Worker {
62*2d543d20SAndroid Build Coastguard Worker 	common_datum_t *d = (common_datum_t *) datum;
63*2d543d20SAndroid Build Coastguard Worker 	policydb_t *p = (policydb_t *) data;
64*2d543d20SAndroid Build Coastguard Worker 
65*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->sym_val_to_name[SYM_COMMONS][d->s.value - 1] == (char *)key);
66*2d543d20SAndroid Build Coastguard Worker 	return 0;
67*2d543d20SAndroid Build Coastguard Worker }
68*2d543d20SAndroid Build Coastguard Worker 
class_test_index(hashtab_key_t key,hashtab_datum_t datum,void * data)69*2d543d20SAndroid Build Coastguard Worker static int class_test_index(hashtab_key_t key, hashtab_datum_t datum, void *data)
70*2d543d20SAndroid Build Coastguard Worker {
71*2d543d20SAndroid Build Coastguard Worker 	class_datum_t *d = (class_datum_t *) datum;
72*2d543d20SAndroid Build Coastguard Worker 	policydb_t *p = (policydb_t *) data;
73*2d543d20SAndroid Build Coastguard Worker 
74*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->sym_val_to_name[SYM_CLASSES][d->s.value - 1] == (char *)key);
75*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->class_val_to_struct[d->s.value - 1] == d);
76*2d543d20SAndroid Build Coastguard Worker 	return 0;
77*2d543d20SAndroid Build Coastguard Worker }
78*2d543d20SAndroid Build Coastguard Worker 
role_test_index(hashtab_key_t key,hashtab_datum_t datum,void * data)79*2d543d20SAndroid Build Coastguard Worker static int role_test_index(hashtab_key_t key, hashtab_datum_t datum, void *data)
80*2d543d20SAndroid Build Coastguard Worker {
81*2d543d20SAndroid Build Coastguard Worker 	role_datum_t *d = (role_datum_t *) datum;
82*2d543d20SAndroid Build Coastguard Worker 	policydb_t *p = (policydb_t *) data;
83*2d543d20SAndroid Build Coastguard Worker 
84*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->sym_val_to_name[SYM_ROLES][d->s.value - 1] == (char *)key);
85*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->role_val_to_struct[d->s.value - 1] == d);
86*2d543d20SAndroid Build Coastguard Worker 	return 0;
87*2d543d20SAndroid Build Coastguard Worker }
88*2d543d20SAndroid Build Coastguard Worker 
type_test_index(hashtab_key_t key,hashtab_datum_t datum,void * data)89*2d543d20SAndroid Build Coastguard Worker static int type_test_index(hashtab_key_t key, hashtab_datum_t datum, void *data)
90*2d543d20SAndroid Build Coastguard Worker {
91*2d543d20SAndroid Build Coastguard Worker 	type_datum_t *d = (type_datum_t *) datum;
92*2d543d20SAndroid Build Coastguard Worker 	policydb_t *p = (policydb_t *) data;
93*2d543d20SAndroid Build Coastguard Worker 
94*2d543d20SAndroid Build Coastguard Worker 	if (!d->primary)
95*2d543d20SAndroid Build Coastguard Worker 		return 0;
96*2d543d20SAndroid Build Coastguard Worker 
97*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->sym_val_to_name[SYM_TYPES][d->s.value - 1] == (char *)key);
98*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->type_val_to_struct[d->s.value - 1] == d);
99*2d543d20SAndroid Build Coastguard Worker 
100*2d543d20SAndroid Build Coastguard Worker 	return 0;
101*2d543d20SAndroid Build Coastguard Worker }
102*2d543d20SAndroid Build Coastguard Worker 
user_test_index(hashtab_key_t key,hashtab_datum_t datum,void * data)103*2d543d20SAndroid Build Coastguard Worker static int user_test_index(hashtab_key_t key, hashtab_datum_t datum, void *data)
104*2d543d20SAndroid Build Coastguard Worker {
105*2d543d20SAndroid Build Coastguard Worker 	user_datum_t *d = (user_datum_t *) datum;
106*2d543d20SAndroid Build Coastguard Worker 	policydb_t *p = (policydb_t *) data;
107*2d543d20SAndroid Build Coastguard Worker 
108*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->sym_val_to_name[SYM_USERS][d->s.value - 1] == (char *)key);
109*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->user_val_to_struct[d->s.value - 1] == d);
110*2d543d20SAndroid Build Coastguard Worker 	return 0;
111*2d543d20SAndroid Build Coastguard Worker }
112*2d543d20SAndroid Build Coastguard Worker 
cond_test_index(hashtab_key_t key,hashtab_datum_t datum,void * data)113*2d543d20SAndroid Build Coastguard Worker static int cond_test_index(hashtab_key_t key, hashtab_datum_t datum, void *data)
114*2d543d20SAndroid Build Coastguard Worker {
115*2d543d20SAndroid Build Coastguard Worker 	cond_bool_datum_t *d = (cond_bool_datum_t *) datum;
116*2d543d20SAndroid Build Coastguard Worker 	policydb_t *p = (policydb_t *) data;
117*2d543d20SAndroid Build Coastguard Worker 
118*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->sym_val_to_name[SYM_BOOLS][d->s.value - 1] == (char *)key);
119*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->bool_val_to_struct[d->s.value - 1] == d);
120*2d543d20SAndroid Build Coastguard Worker 	return 0;
121*2d543d20SAndroid Build Coastguard Worker }
122*2d543d20SAndroid Build Coastguard Worker 
level_test_index(hashtab_key_t key,hashtab_datum_t datum,void * data)123*2d543d20SAndroid Build Coastguard Worker static int level_test_index(hashtab_key_t key, hashtab_datum_t datum, void *data)
124*2d543d20SAndroid Build Coastguard Worker {
125*2d543d20SAndroid Build Coastguard Worker 	level_datum_t *d = (level_datum_t *) datum;
126*2d543d20SAndroid Build Coastguard Worker 	policydb_t *p = (policydb_t *) data;
127*2d543d20SAndroid Build Coastguard Worker 
128*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->sym_val_to_name[SYM_LEVELS][d->level->sens - 1] == (char *)key);
129*2d543d20SAndroid Build Coastguard Worker 	return 0;
130*2d543d20SAndroid Build Coastguard Worker }
131*2d543d20SAndroid Build Coastguard Worker 
cat_test_index(hashtab_key_t key,hashtab_datum_t datum,void * data)132*2d543d20SAndroid Build Coastguard Worker static int cat_test_index(hashtab_key_t key, hashtab_datum_t datum, void *data)
133*2d543d20SAndroid Build Coastguard Worker {
134*2d543d20SAndroid Build Coastguard Worker 	cat_datum_t *d = (cat_datum_t *) datum;
135*2d543d20SAndroid Build Coastguard Worker 	policydb_t *p = (policydb_t *) data;
136*2d543d20SAndroid Build Coastguard Worker 
137*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(p->sym_val_to_name[SYM_CATS][d->s.value - 1] == (char *)key);
138*2d543d20SAndroid Build Coastguard Worker 	return 0;
139*2d543d20SAndroid Build Coastguard Worker }
140*2d543d20SAndroid Build Coastguard Worker 
141*2d543d20SAndroid Build Coastguard Worker static int (*test_index_f[SYM_NUM]) (hashtab_key_t key, hashtab_datum_t datum, void *p) = {
142*2d543d20SAndroid Build Coastguard Worker common_test_index, class_test_index, role_test_index, type_test_index, user_test_index, cond_test_index, level_test_index, cat_test_index,};
143*2d543d20SAndroid Build Coastguard Worker 
test_policydb_indexes(policydb_t * p)144*2d543d20SAndroid Build Coastguard Worker void test_policydb_indexes(policydb_t * p)
145*2d543d20SAndroid Build Coastguard Worker {
146*2d543d20SAndroid Build Coastguard Worker 	int i;
147*2d543d20SAndroid Build Coastguard Worker 
148*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < SYM_NUM; i++) {
149*2d543d20SAndroid Build Coastguard Worker 		hashtab_map(p->symtab[i].table, test_index_f[i], p);
150*2d543d20SAndroid Build Coastguard Worker 	}
151*2d543d20SAndroid Build Coastguard Worker }
152*2d543d20SAndroid Build Coastguard Worker 
test_alias_datum(policydb_t * p,const char * id,const char * primary_id,char mode,unsigned int flavor)153*2d543d20SAndroid Build Coastguard Worker void test_alias_datum(policydb_t * p, const char *id, const char *primary_id, char mode, unsigned int flavor)
154*2d543d20SAndroid Build Coastguard Worker {
155*2d543d20SAndroid Build Coastguard Worker 	type_datum_t *type, *primary;
156*2d543d20SAndroid Build Coastguard Worker 	unsigned int my_primary, my_flavor, my_value;
157*2d543d20SAndroid Build Coastguard Worker 
158*2d543d20SAndroid Build Coastguard Worker 	type = hashtab_search(p->p_types.table, id);
159*2d543d20SAndroid Build Coastguard Worker 	primary = hashtab_search(p->p_types.table, primary_id);
160*2d543d20SAndroid Build Coastguard Worker 
161*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT_PTR_NOT_NULL(type);
162*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT_PTR_NOT_NULL(primary);
163*2d543d20SAndroid Build Coastguard Worker 
164*2d543d20SAndroid Build Coastguard Worker 	if (type && primary) {
165*2d543d20SAndroid Build Coastguard Worker 		if (mode) {
166*2d543d20SAndroid Build Coastguard Worker 			my_flavor = type->flavor;
167*2d543d20SAndroid Build Coastguard Worker 		} else {
168*2d543d20SAndroid Build Coastguard Worker 			my_flavor = flavor;
169*2d543d20SAndroid Build Coastguard Worker 		}
170*2d543d20SAndroid Build Coastguard Worker 
171*2d543d20SAndroid Build Coastguard Worker 		if (my_flavor == TYPE_TYPE) {
172*2d543d20SAndroid Build Coastguard Worker 			my_primary = 0;
173*2d543d20SAndroid Build Coastguard Worker 			my_value = primary->s.value;
174*2d543d20SAndroid Build Coastguard Worker 		} else {
175*2d543d20SAndroid Build Coastguard Worker 			CU_ASSERT(my_flavor == TYPE_ALIAS);
176*2d543d20SAndroid Build Coastguard Worker 			my_primary = primary->s.value;
177*2d543d20SAndroid Build Coastguard Worker 			CU_ASSERT_NOT_EQUAL(type->s.value, primary->s.value);
178*2d543d20SAndroid Build Coastguard Worker 			my_value = type->s.value;
179*2d543d20SAndroid Build Coastguard Worker 		}
180*2d543d20SAndroid Build Coastguard Worker 
181*2d543d20SAndroid Build Coastguard Worker 		CU_ASSERT(type->primary == my_primary);
182*2d543d20SAndroid Build Coastguard Worker 		CU_ASSERT(type->flavor == my_flavor);
183*2d543d20SAndroid Build Coastguard Worker 		CU_ASSERT(type->s.value == my_value);
184*2d543d20SAndroid Build Coastguard Worker 	}
185*2d543d20SAndroid Build Coastguard Worker }
186*2d543d20SAndroid Build Coastguard Worker 
test_role_type_set(policydb_t * p,const char * id,avrule_decl_t * decl,const char ** types,unsigned int len,unsigned int flags)187*2d543d20SAndroid Build Coastguard Worker role_datum_t *test_role_type_set(policydb_t * p, const char *id, avrule_decl_t * decl, const char **types, unsigned int len, unsigned int flags)
188*2d543d20SAndroid Build Coastguard Worker {
189*2d543d20SAndroid Build Coastguard Worker 	ebitmap_node_t *tnode;
190*2d543d20SAndroid Build Coastguard Worker 	unsigned int i, j, new, found = 0;
191*2d543d20SAndroid Build Coastguard Worker 	role_datum_t *role;
192*2d543d20SAndroid Build Coastguard Worker 
193*2d543d20SAndroid Build Coastguard Worker 	if (decl)
194*2d543d20SAndroid Build Coastguard Worker 		role = hashtab_search(decl->p_roles.table, id);
195*2d543d20SAndroid Build Coastguard Worker 	else
196*2d543d20SAndroid Build Coastguard Worker 		role = hashtab_search(p->p_roles.table, id);
197*2d543d20SAndroid Build Coastguard Worker 
198*2d543d20SAndroid Build Coastguard Worker 	if (!role)
199*2d543d20SAndroid Build Coastguard Worker 		printf("role %s can't be found! \n", id);
200*2d543d20SAndroid Build Coastguard Worker 
201*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT_FATAL(role != NULL);
202*2d543d20SAndroid Build Coastguard Worker 
203*2d543d20SAndroid Build Coastguard Worker 	ebitmap_for_each_positive_bit(&role->types.types, tnode, i) {
204*2d543d20SAndroid Build Coastguard Worker 		new = 0;
205*2d543d20SAndroid Build Coastguard Worker 		for (j = 0; j < len; j++) {
206*2d543d20SAndroid Build Coastguard Worker 			if (strcmp(p->sym_val_to_name[SYM_TYPES][i], types[j]) == 0) {
207*2d543d20SAndroid Build Coastguard Worker 				found++;
208*2d543d20SAndroid Build Coastguard Worker 				new = 1;
209*2d543d20SAndroid Build Coastguard Worker 			}
210*2d543d20SAndroid Build Coastguard Worker 		}
211*2d543d20SAndroid Build Coastguard Worker 		if (new == 0) {
212*2d543d20SAndroid Build Coastguard Worker 			printf("\nRole %s had type %s not in types array\n",
213*2d543d20SAndroid Build Coastguard Worker 			       id, p->sym_val_to_name[SYM_TYPES][i]);
214*2d543d20SAndroid Build Coastguard Worker 		}
215*2d543d20SAndroid Build Coastguard Worker 		CU_ASSERT(new == 1);
216*2d543d20SAndroid Build Coastguard Worker 	}
217*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(found == len);
218*2d543d20SAndroid Build Coastguard Worker 	if (found != len)
219*2d543d20SAndroid Build Coastguard Worker 		printf("\nrole %s has %d types, %d expected\n", p->sym_val_to_name[SYM_ROLES][role->s.value - 1], found, len);
220*2d543d20SAndroid Build Coastguard Worker 	/* roles should never have anything in the negset */
221*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(role->types.negset.highbit == 0);
222*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(role->types.flags == flags);
223*2d543d20SAndroid Build Coastguard Worker 
224*2d543d20SAndroid Build Coastguard Worker 	return role;
225*2d543d20SAndroid Build Coastguard Worker }
226*2d543d20SAndroid Build Coastguard Worker 
test_attr_types(policydb_t * p,const char * id,avrule_decl_t * decl,const char ** types,int len)227*2d543d20SAndroid Build Coastguard Worker void test_attr_types(policydb_t * p, const char *id, avrule_decl_t * decl, const char **types, int len)
228*2d543d20SAndroid Build Coastguard Worker {
229*2d543d20SAndroid Build Coastguard Worker 	ebitmap_node_t *tnode;
230*2d543d20SAndroid Build Coastguard Worker 	int j, new, found = 0;
231*2d543d20SAndroid Build Coastguard Worker 	unsigned int i;
232*2d543d20SAndroid Build Coastguard Worker 	type_datum_t *attr;
233*2d543d20SAndroid Build Coastguard Worker 
234*2d543d20SAndroid Build Coastguard Worker 	if (decl) {
235*2d543d20SAndroid Build Coastguard Worker 		attr = hashtab_search(decl->p_types.table, id);
236*2d543d20SAndroid Build Coastguard Worker 		if (attr == NULL)
237*2d543d20SAndroid Build Coastguard Worker 			printf("could not find attr %s in decl %d\n", id, decl->decl_id);
238*2d543d20SAndroid Build Coastguard Worker 	} else {
239*2d543d20SAndroid Build Coastguard Worker 		attr = hashtab_search(p->p_types.table, id);
240*2d543d20SAndroid Build Coastguard Worker 		if (attr == NULL)
241*2d543d20SAndroid Build Coastguard Worker 			printf("could not find attr %s in policy\n", id);
242*2d543d20SAndroid Build Coastguard Worker 	}
243*2d543d20SAndroid Build Coastguard Worker 
244*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT_FATAL(attr != NULL);
245*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(attr->flavor == TYPE_ATTRIB);
246*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(attr->primary == 1);
247*2d543d20SAndroid Build Coastguard Worker 
248*2d543d20SAndroid Build Coastguard Worker 	ebitmap_for_each_positive_bit(&attr->types, tnode, i) {
249*2d543d20SAndroid Build Coastguard Worker 		new = 0;
250*2d543d20SAndroid Build Coastguard Worker 		for (j = 0; j < len; j++) {
251*2d543d20SAndroid Build Coastguard Worker 			if (strcmp(p->sym_val_to_name[SYM_TYPES][i], types[j]) == 0) {
252*2d543d20SAndroid Build Coastguard Worker 				found++;
253*2d543d20SAndroid Build Coastguard Worker 				new = 1;
254*2d543d20SAndroid Build Coastguard Worker 			}
255*2d543d20SAndroid Build Coastguard Worker 		}
256*2d543d20SAndroid Build Coastguard Worker 		if (new == 0) {
257*2d543d20SAndroid Build Coastguard Worker 			printf("\nattr %s had type %s not in types array\n",
258*2d543d20SAndroid Build Coastguard Worker 			       id, p->sym_val_to_name[SYM_TYPES][i]);
259*2d543d20SAndroid Build Coastguard Worker 		}
260*2d543d20SAndroid Build Coastguard Worker 		CU_ASSERT(new == 1);
261*2d543d20SAndroid Build Coastguard Worker 	}
262*2d543d20SAndroid Build Coastguard Worker 	CU_ASSERT(found == len);
263*2d543d20SAndroid Build Coastguard Worker 	if (found != len)
264*2d543d20SAndroid Build Coastguard Worker 		printf("\nattr %s has %d types, %d expected\n", id, found, len);
265*2d543d20SAndroid Build Coastguard Worker }
266