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