113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/*
213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Author: Joshua Brindle <jbrindle@tresys.com>
313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *
413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Copyright (C) 2006 Tresys Technology, LLC
513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *
613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  This library is free software; you can redistribute it and/or
713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  modify it under the terms of the GNU Lesser General Public
813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  License as published by the Free Software Foundation; either
913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  version 2.1 of the License, or (at your option) any later version.
1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *
1113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  This library is distributed in the hope that it will be useful,
1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  but WITHOUT ANY WARRANTY; without even the implied warranty of
1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  Lesser General Public License for more details.
1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *
1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  You should have received a copy of the GNU Lesser General Public
1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  License along with this library; if not, write to the Free Software
1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */
2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "parse_util.h"
2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "helpers.h"
2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "test-common.h"
2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sepol/policydb/policydb.h>
2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sepol/policydb/link.h>
2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <CUnit/Basic.h>
2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdlib.h>
3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Tests for roles:
3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Test for each of these for
3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role in appropriate symtab (global and decl)
3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - datum in the decl symtab has correct type_set
3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - scope datum has correct decl ids
3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - dominates bitmap is correct
3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Tests:
3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role in base, no modules
3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role in base optional, no modules
4013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base, b in module
4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base and module (additive)
4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base and 2 module
4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base optional, b in module
4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base, b in module optional
4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base optional, b in module optional
4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base optional and module
4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base and module optional
4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base optional and module optional
4913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a in base optional and 2 modules
5013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * - role a and b in base, b dom a, are types correct (TODO)
5113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */
5213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
5313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* this simply tests whether the passed in role only has its own
5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * value in its dominates ebitmap */
5513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestatic void only_dominates_self(policydb_t * p, role_datum_t * role)
5613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
5713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	ebitmap_node_t *tnode;
5813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	unsigned int i;
5913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int found = 0;
6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	ebitmap_for_each_bit(&role->dominates, tnode, i) {
6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (ebitmap_node_get_bit(tnode, i)) {
6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			found++;
6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			CU_ASSERT(i == role->s.value - 1);
6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		}
6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	CU_ASSERT(found == 1);
6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid base_role_tests(policydb_t * base)
7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	avrule_decl_t *decl;
7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role_datum_t *role;
7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	unsigned int decls[2];
75c33fd02db5012b5b3582778f80e68b703441a215Nicolas Iooss	const char *types[2];
7613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
7713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* These tests look at roles in the base only, the desire is to ensure that
7813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * roles are not destroyed or otherwise removed during the link process */
7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for g_b_role_1 in base and decl 1 (global) ****/
8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_b"))->decl_id;
8213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test_sym_presence(base, "g_b_role_1", SYM_ROLES, SCOPE_DECL, decls, 1);
8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* make sure it has the correct type set (g_b_type_1, no negset, no flags) */
8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "g_b_type_1";
8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "g_b_role_1", NULL, types, 1, 0);
8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* This role should only dominate itself */
8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for o1_b_role_1 in optional (decl 2) ****/
9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decl = test_find_decl_by_sym(base, SYM_TYPES, "tag_o1_b");
9113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = decl->decl_id;
9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test_sym_presence(base, "o1_b_role_1", SYM_ROLES, SCOPE_DECL, decls, 1);
9313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* make sure it has the correct type set (o1_b_type_1, no negset, no flags) */
9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "o1_b_type_1";
9513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "o1_b_role_1", decl, types, 1, 0);
9613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* and only dominates itself */
9713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
9813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
9913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
10013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid module_role_tests(policydb_t * base)
10113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
10213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role_datum_t *role;
10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	avrule_decl_t *decl;
10444035fcab4fbaf5a382ad6fb70bc4ecd65e77f18Nicolas Iooss	unsigned int decls[3];
105c33fd02db5012b5b3582778f80e68b703441a215Nicolas Iooss	const char *types[3];
10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* These tests are run when the base is linked with 2 modules,
10813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * They should test whether the roles get copied correctly from the
10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * modules into the base */
11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for role in module 1 (global) ****/
11213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_m1"))->decl_id;
11313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test_sym_presence(base, "g_m1_role_1", SYM_ROLES, SCOPE_DECL, decls, 1);
11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* make sure it has the correct type set (g_m1_type_1, no negset, no flags) */
11513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "g_m1_type_1";
11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "g_m1_role_1", NULL, types, 1, 0);
11713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* and only dominates itself */
11813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
11913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
12013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for role in module 1 (optional) ****/
12113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decl = test_find_decl_by_sym(base, SYM_TYPES, "tag_o1_m1");
12213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = decl->decl_id;
12313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test_sym_presence(base, "o1_m1_role_1", SYM_ROLES, SCOPE_DECL, decls, 1);
12413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* make sure it has the correct type set (o1_m1_type_1, no negset, no flags) */
12513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "o1_m1_type_1";
12613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "o1_m1_role_1", decl, types, 1, 0);
12713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* and only dominates itself */
12813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
12913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
13013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* These test whether the type sets are copied to the right place and
13113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * correctly unioned when they should be */
13213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
13313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for type added to base role in module 1 (global) ****/
13413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_b"))->decl_id;
1353666bd9a99b1453aaba021741ddaf9798a5cee64Nicolas Iooss	test_sym_presence(base, "g_b_role_2", SYM_ROLES, SCOPE_DECL, decls, 1);
13613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* make sure it has the correct type set (g_m1_type_1, no negset, no flags) */
13713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "g_b_type_2";	/* added in base when declared */
13813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[1] = "g_m1_type_1";	/* added in module */
13913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "g_b_role_2", NULL, types, 2, 0);
14013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* and only dominates itself */
14113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
14213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
14313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for type added to base role in module 1 & 2 (global) ****/
14413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_b"))->decl_id;
14513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[1] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_m1"))->decl_id;
14613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[2] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_m2"))->decl_id;
14713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test_sym_presence(base, "g_b_role_3", SYM_ROLES, SCOPE_DECL, decls, 3);
14813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* make sure it has the correct type set (g_b_type_2, g_m1_type_2, g_m2_type_2, no negset, no flags) */
14913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "g_b_type_2";	/* added in base when declared */
15013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[1] = "g_m1_type_2";	/* added in module 1 */
15113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[2] = "g_m2_type_2";	/* added in module 2 */
15213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "g_b_role_3", NULL, types, 3, 0);
15313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* and only dominates itself */
15413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
15513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
15613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for role in base optional and module 1 (additive) ****/
15713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_o1_b"))->decl_id;
15813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[1] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_m1"))->decl_id;
15913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test_sym_presence(base, "o1_b_role_2", SYM_ROLES, SCOPE_DECL, decls, 2);
16013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* this one will have 2 type sets, one in the global symtab and one in the base optional 1 */
16113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "g_m1_type_1";
16213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "o1_b_role_2", NULL, types, 1, 0);
16313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "o1_b_type_1";
16413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "o1_b_role_2", test_find_decl_by_sym(base, SYM_TYPES, "tag_o1_b"), types, 1, 0);
16513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* and only dominates itself */
16613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
16713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
16813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for role in base and module 1 optional (additive) ****/
16913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_b"))->decl_id;
17013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[1] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_o2_m1"))->decl_id;
17113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test_sym_presence(base, "g_b_role_4", SYM_ROLES, SCOPE_DECL, decls, 2);
17213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* this one will have 2 type sets, one in the global symtab and one in the base optional 1 */
17313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "g_b_type_2";
17413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "g_b_role_4", NULL, types, 1, 0);
17513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "g_m1_type_2";
17613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "g_b_role_4", test_find_decl_by_sym(base, SYM_TYPES, "tag_o2_m1"), types, 1, 0);
17713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* and only dominates itself */
17813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
17913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
18013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for role in base and module 1 optional (additive) ****/
18113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_o3_b"))->decl_id;
18213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[1] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_o3_m1"))->decl_id;
18313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test_sym_presence(base, "o3_b_role_1", SYM_ROLES, SCOPE_DECL, decls, 2);
18413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* this one will have 2 type sets, one in the 3rd base optional and one in the 3rd module optional */
18513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "o3_b_type_1";
18613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "o3_b_role_1", test_find_decl_by_sym(base, SYM_TYPES, "tag_o3_b"), types, 1, 0);
18713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "o3_m1_type_1";
18813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "o3_b_role_1", test_find_decl_by_sym(base, SYM_TYPES, "tag_o3_m1"), types, 1, 0);
18913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* and only dominates itself */
19013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
19113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
19213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/**** test for role in base and module 1 optional (additive) ****/
19313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[0] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_o4_b"))->decl_id;
19413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[1] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_m1"))->decl_id;
19513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	decls[2] = (test_find_decl_by_sym(base, SYM_TYPES, "tag_g_m2"))->decl_id;
19613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test_sym_presence(base, "o4_b_role_1", SYM_ROLES, SCOPE_DECL, decls, 3);
19713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* this one will have 2 type sets, one in the global symtab (with both module types) and one in the 4th optional of base */
19813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "g_m1_type_1";
19913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "o4_b_role_1", test_find_decl_by_sym(base, SYM_TYPES, "tag_o4_b"), types, 1, 0);
20013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[0] = "g_m2_type_1";
20113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	types[1] = "g_m1_type_2";
20213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role = test_role_type_set(base, "o4_b_role_1", NULL, types, 2, 0);
20313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* and only dominates itself */
20413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	only_dominates_self(base, role);
20513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
206