16cd6a6acSopenharmony_ci/*
26cd6a6acSopenharmony_ci * Author: Joshua Brindle <jbrindle@tresys.com>
36cd6a6acSopenharmony_ci *
46cd6a6acSopenharmony_ci * Copyright (C) 2006 Tresys Technology, LLC
56cd6a6acSopenharmony_ci *
66cd6a6acSopenharmony_ci *  This library is free software; you can redistribute it and/or
76cd6a6acSopenharmony_ci *  modify it under the terms of the GNU Lesser General Public
86cd6a6acSopenharmony_ci *  License as published by the Free Software Foundation; either
96cd6a6acSopenharmony_ci *  version 2.1 of the License, or (at your option) any later version.
106cd6a6acSopenharmony_ci *
116cd6a6acSopenharmony_ci *  This library is distributed in the hope that it will be useful,
126cd6a6acSopenharmony_ci *  but WITHOUT ANY WARRANTY; without even the implied warranty of
136cd6a6acSopenharmony_ci *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
146cd6a6acSopenharmony_ci *  Lesser General Public License for more details.
156cd6a6acSopenharmony_ci *
166cd6a6acSopenharmony_ci *  You should have received a copy of the GNU Lesser General Public
176cd6a6acSopenharmony_ci *  License along with this library; if not, write to the Free Software
186cd6a6acSopenharmony_ci *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
196cd6a6acSopenharmony_ci */
206cd6a6acSopenharmony_ci
216cd6a6acSopenharmony_ci/* This is where the linker tests should go, including:
226cd6a6acSopenharmony_ci * - check role, type, bool, user, attr mapping
236cd6a6acSopenharmony_ci * - check for properly enabled optional
246cd6a6acSopenharmony_ci * - check for properly disabled optional
256cd6a6acSopenharmony_ci * - check for non-optional disabled blocks
266cd6a6acSopenharmony_ci * - properly add symbols declared in optionals
276cd6a6acSopenharmony_ci */
286cd6a6acSopenharmony_ci
296cd6a6acSopenharmony_ci#include "test-linker.h"
306cd6a6acSopenharmony_ci#include "parse_util.h"
316cd6a6acSopenharmony_ci#include "helpers.h"
326cd6a6acSopenharmony_ci#include "test-common.h"
336cd6a6acSopenharmony_ci#include "test-linker-roles.h"
346cd6a6acSopenharmony_ci#include "test-linker-types.h"
356cd6a6acSopenharmony_ci#include "test-linker-cond-map.h"
366cd6a6acSopenharmony_ci
376cd6a6acSopenharmony_ci#include <sepol/policydb/policydb.h>
386cd6a6acSopenharmony_ci#include <sepol/policydb/link.h>
396cd6a6acSopenharmony_ci#include <sepol/policydb/conditional.h>
406cd6a6acSopenharmony_ci#include <sepol/policydb/expand.h>
416cd6a6acSopenharmony_ci#include <limits.h>
426cd6a6acSopenharmony_ci#include <stdlib.h>
436cd6a6acSopenharmony_ci
446cd6a6acSopenharmony_ci#define NUM_MODS 2
456cd6a6acSopenharmony_ci#define NUM_POLICIES NUM_MODS+1
466cd6a6acSopenharmony_ci
476cd6a6acSopenharmony_ci#define BASEMOD NUM_MODS
486cd6a6acSopenharmony_ciconst char *policies[NUM_POLICIES] = {
496cd6a6acSopenharmony_ci	"module1.conf",
506cd6a6acSopenharmony_ci	"module2.conf",
516cd6a6acSopenharmony_ci	"small-base.conf",
526cd6a6acSopenharmony_ci};
536cd6a6acSopenharmony_ci
546cd6a6acSopenharmony_cistatic policydb_t basenomods;
556cd6a6acSopenharmony_cistatic policydb_t linkedbase;
566cd6a6acSopenharmony_cistatic policydb_t *modules[NUM_MODS];
576cd6a6acSopenharmony_ciextern int mls;
586cd6a6acSopenharmony_ci
596cd6a6acSopenharmony_ciint linker_test_init(void)
606cd6a6acSopenharmony_ci{
616cd6a6acSopenharmony_ci	int i;
626cd6a6acSopenharmony_ci
636cd6a6acSopenharmony_ci	if (test_load_policy(&linkedbase, POLICY_BASE, mls, "test-linker", policies[BASEMOD]))
646cd6a6acSopenharmony_ci		return -1;
656cd6a6acSopenharmony_ci
666cd6a6acSopenharmony_ci	if (test_load_policy(&basenomods, POLICY_BASE, mls, "test-linker", policies[BASEMOD]))
676cd6a6acSopenharmony_ci		return -1;
686cd6a6acSopenharmony_ci
696cd6a6acSopenharmony_ci	for (i = 0; i < NUM_MODS; i++) {
706cd6a6acSopenharmony_ci
716cd6a6acSopenharmony_ci		modules[i] = calloc(1, sizeof(*modules[i]));
726cd6a6acSopenharmony_ci		if (!modules[i]) {
736cd6a6acSopenharmony_ci			fprintf(stderr, "out of memory!\n");
746cd6a6acSopenharmony_ci			return -1;
756cd6a6acSopenharmony_ci		}
766cd6a6acSopenharmony_ci
776cd6a6acSopenharmony_ci		if (test_load_policy(modules[i], POLICY_MOD, mls, "test-linker", policies[i]))
786cd6a6acSopenharmony_ci			return -1;
796cd6a6acSopenharmony_ci
806cd6a6acSopenharmony_ci	}
816cd6a6acSopenharmony_ci
826cd6a6acSopenharmony_ci	if (link_modules(NULL, &linkedbase, modules, NUM_MODS, 0)) {
836cd6a6acSopenharmony_ci		fprintf(stderr, "link modules failed\n");
846cd6a6acSopenharmony_ci		return -1;
856cd6a6acSopenharmony_ci	}
866cd6a6acSopenharmony_ci
876cd6a6acSopenharmony_ci	if (link_modules(NULL, &basenomods, NULL, 0, 0)) {
886cd6a6acSopenharmony_ci		fprintf(stderr, "link modules failed\n");
896cd6a6acSopenharmony_ci		return -1;
906cd6a6acSopenharmony_ci	}
916cd6a6acSopenharmony_ci
926cd6a6acSopenharmony_ci	return 0;
936cd6a6acSopenharmony_ci}
946cd6a6acSopenharmony_ci
956cd6a6acSopenharmony_ciint linker_test_cleanup(void)
966cd6a6acSopenharmony_ci{
976cd6a6acSopenharmony_ci	int i;
986cd6a6acSopenharmony_ci
996cd6a6acSopenharmony_ci	policydb_destroy(&basenomods);
1006cd6a6acSopenharmony_ci	policydb_destroy(&linkedbase);
1016cd6a6acSopenharmony_ci
1026cd6a6acSopenharmony_ci	for (i = 0; i < NUM_MODS; i++) {
1036cd6a6acSopenharmony_ci		policydb_destroy(modules[i]);
1046cd6a6acSopenharmony_ci		free(modules[i]);
1056cd6a6acSopenharmony_ci	}
1066cd6a6acSopenharmony_ci	return 0;
1076cd6a6acSopenharmony_ci}
1086cd6a6acSopenharmony_ci
1096cd6a6acSopenharmony_cistatic void test_linker_indexes(void)
1106cd6a6acSopenharmony_ci{
1116cd6a6acSopenharmony_ci	test_policydb_indexes(&linkedbase);
1126cd6a6acSopenharmony_ci}
1136cd6a6acSopenharmony_ci
1146cd6a6acSopenharmony_cistatic void test_linker_roles(void)
1156cd6a6acSopenharmony_ci{
1166cd6a6acSopenharmony_ci	base_role_tests(&basenomods);
1176cd6a6acSopenharmony_ci	base_role_tests(&linkedbase);
1186cd6a6acSopenharmony_ci	module_role_tests(&linkedbase);
1196cd6a6acSopenharmony_ci}
1206cd6a6acSopenharmony_ci
1216cd6a6acSopenharmony_cistatic void test_linker_types(void)
1226cd6a6acSopenharmony_ci{
1236cd6a6acSopenharmony_ci	base_type_tests(&basenomods);
1246cd6a6acSopenharmony_ci	base_type_tests(&linkedbase);
1256cd6a6acSopenharmony_ci	module_type_tests(&linkedbase);
1266cd6a6acSopenharmony_ci}
1276cd6a6acSopenharmony_ci
1286cd6a6acSopenharmony_cistatic void test_linker_cond(void)
1296cd6a6acSopenharmony_ci{
1306cd6a6acSopenharmony_ci	base_cond_tests(&basenomods);
1316cd6a6acSopenharmony_ci	base_cond_tests(&linkedbase);
1326cd6a6acSopenharmony_ci	module_cond_tests(&linkedbase);
1336cd6a6acSopenharmony_ci}
1346cd6a6acSopenharmony_ci
1356cd6a6acSopenharmony_ciint linker_add_tests(CU_pSuite suite)
1366cd6a6acSopenharmony_ci{
1376cd6a6acSopenharmony_ci	if (NULL == CU_add_test(suite, "linker_indexes", test_linker_indexes)) {
1386cd6a6acSopenharmony_ci		CU_cleanup_registry();
1396cd6a6acSopenharmony_ci		return CU_get_error();
1406cd6a6acSopenharmony_ci	}
1416cd6a6acSopenharmony_ci	if (NULL == CU_add_test(suite, "linker_types", test_linker_types)) {
1426cd6a6acSopenharmony_ci		CU_cleanup_registry();
1436cd6a6acSopenharmony_ci		return CU_get_error();
1446cd6a6acSopenharmony_ci	}
1456cd6a6acSopenharmony_ci	if (NULL == CU_add_test(suite, "linker_roles", test_linker_roles)) {
1466cd6a6acSopenharmony_ci		CU_cleanup_registry();
1476cd6a6acSopenharmony_ci		return CU_get_error();
1486cd6a6acSopenharmony_ci	}
1496cd6a6acSopenharmony_ci	if (NULL == CU_add_test(suite, "linker_cond", test_linker_cond)) {
1506cd6a6acSopenharmony_ci		CU_cleanup_registry();
1516cd6a6acSopenharmony_ci		return CU_get_error();
1526cd6a6acSopenharmony_ci	}
1536cd6a6acSopenharmony_ci	return 0;
1546cd6a6acSopenharmony_ci}
155