Blame tests/test_semanage_store.c

Packit 366192
/* Authors: Christopher Ashworth <cashworth@tresys.com>
Packit 366192
 *          Caleb Case <ccase@tresys.com>
Packit 366192
 *          Chris PeBenito <cpebenito@tresys.com>
Packit 366192
 *
Packit 366192
 * Copyright (C) 2006 Tresys Technology, LLC
Packit 366192
 *
Packit 366192
 *  This library is free software; you can redistribute it and/or
Packit 366192
 *  modify it under the terms of the GNU Lesser General Public
Packit 366192
 *  License as published by the Free Software Foundation; either
Packit 366192
 *  version 2.1 of the License, or (at your option) any later version.
Packit 366192
 *
Packit 366192
 *  This library is distributed in the hope that it will be useful,
Packit 366192
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 366192
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 366192
 *  Lesser General Public License for more details.
Packit 366192
 *
Packit 366192
 *  You should have received a copy of the GNU Lesser General Public
Packit 366192
 *  License along with this library; if not, write to the Free Software
Packit 366192
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit 366192
 */
Packit 366192
Packit 366192
/*  The purpose of this file is to provide unit tests of the functions in:
Packit 366192
 *
Packit 366192
 *  libsemanage/src/semanage_store.c
Packit 366192
 *
Packit 366192
 */
Packit 366192
Packit 366192
#include "handle.h"
Packit 366192
#include "semanage_store.h"
Packit 366192
Packit 366192
#include "utilities.h"
Packit 366192
#include "test_semanage_store.h"
Packit 366192
Packit 366192
#include <libgen.h>
Packit 366192
#include <limits.h>
Packit 366192
#include <stdio.h>
Packit 366192
#include <stdlib.h>
Packit 366192
#include <string.h>
Packit 366192
#include <sys/mman.h>
Packit 366192
#include <sys/types.h>
Packit 366192
#include <sys/stat.h>
Packit 366192
#include <fcntl.h>
Packit 366192
#include <unistd.h>
Packit 366192
#include <CUnit/Basic.h>
Packit 366192
Packit 366192
semanage_handle_t *sh = NULL;
Packit 366192
const char *rootpath = "./test-policy";
Packit 366192
const char *polpath = "./test-policy/store/";
Packit 366192
const char *readlockpath = "./test-policy/store/semanage.read.LOCK";
Packit 366192
const char *translockpath = "./test-policy/store/semanage.trans.LOCK";
Packit 366192
const char *actpath = "./test-policy/store/active";
Packit 366192
const char *modpath = "./test-policy/store/active/modules";
Packit 366192
Packit 366192
/* The suite initialization function.
Packit 366192
 * Returns zero on success, non-zero otherwise.
Packit 366192
 */
Packit 366192
int semanage_store_test_init(void)
Packit 366192
{
Packit 366192
	int err;
Packit 366192
Packit 366192
	/* create directories */
Packit 366192
	err = mkdir(rootpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	if (err != 0)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	err = mkdir(polpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	if (err != 0)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	err = mkdir(actpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	if (err != 0)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	err = mkdir(modpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	if (err != 0)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	/* initialize the handle */
Packit 366192
	sh = semanage_handle_create();
Packit 366192
	if (sh == NULL)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	/* hide error messages */
Packit 366192
	sh->msg_callback = test_msg_handler;
Packit 366192
Packit 366192
	/* use our own policy store */
Packit 366192
	free(sh->conf->store_path);
Packit 366192
	sh->conf->store_path = strdup("store");
Packit 366192
Packit 366192
	/* initialize paths */
Packit 366192
	err = semanage_check_init(sh, rootpath);
Packit 366192
	if (err != 0)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	return 0;
Packit 366192
}
Packit 366192
Packit 366192
/* The suite cleanup function.
Packit 366192
 * Returns zero on success, non-zero otherwise.
Packit 366192
 */
Packit 366192
int semanage_store_test_cleanup(void)
Packit 366192
{
Packit 366192
	int err;
Packit 366192
Packit 366192
	/* remove the test policy directories */
Packit 366192
	err = rmdir(modpath);
Packit 366192
	if (err != 0)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	err = rmdir(actpath);
Packit 366192
	if (err != 0)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	err = rmdir(polpath);
Packit 366192
	if (err != 0)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	err = rmdir(rootpath);
Packit 366192
	if (err != 0)
Packit 366192
		return -1;
Packit 366192
Packit 366192
	/* cleanup the handle */
Packit 366192
	semanage_handle_destroy(sh);
Packit 366192
	return 0;
Packit 366192
}
Packit 366192
Packit 366192
/* Adds all the tests needed for this suite. 
Packit 366192
 */
Packit 366192
int semanage_store_add_tests(CU_pSuite suite)
Packit 366192
{
Packit 366192
	if (NULL ==
Packit 366192
	    CU_add_test(suite, "semanage_store_access_check",
Packit 366192
			test_semanage_store_access_check)) {
Packit 366192
		CU_cleanup_registry();
Packit 366192
		return CU_get_error();
Packit 366192
	}
Packit 366192
Packit 366192
	if (NULL ==
Packit 366192
	    CU_add_test(suite, "semanage_get_lock", test_semanage_get_lock)) {
Packit 366192
		CU_cleanup_registry();
Packit 366192
		return CU_get_error();
Packit 366192
	}
Packit 366192
Packit 366192
	if (NULL ==
Packit 366192
	    CU_add_test(suite, "semanage_nc_sort", test_semanage_nc_sort)) {
Packit 366192
		CU_cleanup_registry();
Packit 366192
		return CU_get_error();
Packit 366192
	}
Packit 366192
Packit 366192
	return 0;
Packit 366192
}
Packit 366192
Packit 366192
/* Tests the semanage_store_access_check function in semanage_store.c
Packit 366192
 */
Packit 366192
void test_semanage_store_access_check(void)
Packit 366192
{
Packit 366192
	int err;
Packit 366192
Packit 366192
	/* create lock file */
Packit 366192
	err = mknod(readlockpath, S_IRUSR | S_IWUSR, S_IFREG);
Packit 366192
Packit 366192
	/* check with permissions 000 */
Packit 366192
	err = chmod(modpath, 0);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(readlockpath, 0);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(polpath, 0);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	err = semanage_store_access_check();
Packit 366192
	CU_ASSERT(err == -1);
Packit 366192
Packit 366192
	/* check with permissions 500 */
Packit 366192
	err = chmod(polpath, S_IRUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(readlockpath, S_IRUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(modpath, S_IRUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	err = semanage_store_access_check();
Packit 366192
	CU_ASSERT(err == SEMANAGE_CAN_READ);
Packit 366192
Packit 366192
	/* check with permissions 700 */
Packit 366192
	err = chmod(polpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(readlockpath, S_IRUSR | S_IWUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(modpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	err = semanage_store_access_check();
Packit 366192
	CU_ASSERT(err == SEMANAGE_CAN_WRITE);
Packit 366192
Packit 366192
	/* check with lock file 000 and others 500 */
Packit 366192
	err = chmod(polpath, S_IRUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(readlockpath, 0);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(modpath, S_IRUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	err = semanage_store_access_check();
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* check with lock file 000 and others 700 */
Packit 366192
	err = chmod(polpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(readlockpath, 0);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(modpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	err = semanage_store_access_check();
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* remove lock file */
Packit 366192
	err = remove(readlockpath);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* check with no lock file and 000 */
Packit 366192
	err = chmod(modpath, 0);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(polpath, 0);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	err = semanage_store_access_check();
Packit 366192
	CU_ASSERT(err == -1);
Packit 366192
Packit 366192
	/* check with no lock file and 500 */
Packit 366192
	err = chmod(polpath, S_IRUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(modpath, S_IRUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	err = semanage_store_access_check();
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* check with no lock file but write in polpath */
Packit 366192
	err = chmod(polpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	err = semanage_store_access_check();
Packit 366192
	CU_ASSERT(err == SEMANAGE_CAN_READ);
Packit 366192
Packit 366192
	/* check with no lock file and 700 */
Packit 366192
	err = chmod(polpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = chmod(modpath, S_IRUSR | S_IWUSR | S_IXUSR);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	err = semanage_store_access_check();
Packit 366192
	CU_ASSERT(err == SEMANAGE_CAN_WRITE);
Packit 366192
}
Packit 366192
Packit 366192
/* Tests the semanage_get_lock functions in semanage_store.c
Packit 366192
 */
Packit 366192
void test_semanage_get_lock(void)
Packit 366192
{
Packit 366192
	int err;
Packit 366192
Packit 366192
	/* attempt to get an active lock */
Packit 366192
	err = semanage_get_active_lock(sh);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* attempt to get the lock again */
Packit 366192
	err = semanage_get_active_lock(sh);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* attempt to release the active lock */
Packit 366192
	semanage_release_active_lock(sh);
Packit 366192
Packit 366192
	/* attempt to get an active lock */
Packit 366192
	err = semanage_get_active_lock(sh);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* attempt to release the active lock */
Packit 366192
	semanage_release_active_lock(sh);
Packit 366192
Packit 366192
	/* attempt to get a trans lock */
Packit 366192
	err = semanage_get_trans_lock(sh);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* attempt to get the lock again */
Packit 366192
	err = semanage_get_trans_lock(sh);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* attempt to release the trans lock */
Packit 366192
	semanage_release_trans_lock(sh);
Packit 366192
Packit 366192
	/* attempt to get a trans lock */
Packit 366192
	err = semanage_get_trans_lock(sh);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
Packit 366192
	/* attempt to release the trans lock */
Packit 366192
	semanage_release_trans_lock(sh);
Packit 366192
Packit 366192
	/* remove the lock files */
Packit 366192
	err = remove(readlockpath);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
	err = remove(translockpath);
Packit 366192
	CU_ASSERT(err == 0);
Packit 366192
}
Packit 366192
Packit 366192
/* Tests the semanage_nc_sort function in semanage_store.c
Packit 366192
 */
Packit 366192
void test_semanage_nc_sort(void)
Packit 366192
{
Packit 366192
	char *source_buf, *sorted_buf = NULL, *good_buf, *bad_buf;
Packit 366192
	size_t source_buf_len, sorted_buf_len, good_buf_len, bad_buf_len;
Packit 366192
	int sourcefd, goodfd, badfd, err;
Packit 366192
	struct stat sb;
Packit 366192
Packit 366192
	/* open source file */
Packit 366192
	sourcefd = open("nc_sort_unsorted", O_RDONLY);
Packit 366192
	if (sourcefd < 0) {
Packit 366192
		CU_FAIL("Missing nc_sort_unsorted test file.");
Packit 366192
		return;
Packit 366192
	}
Packit 366192
	fstat(sourcefd, &sb);
Packit 366192
	source_buf_len = sb.st_size;
Packit 366192
	source_buf =
Packit 366192
	    (char *)mmap(NULL, source_buf_len, PROT_READ, MAP_PRIVATE, sourcefd,
Packit 366192
			 0);
Packit 366192
Packit 366192
	/* open good result file */
Packit 366192
	goodfd = open("nc_sort_sorted", O_RDONLY);
Packit 366192
	if (goodfd < 0) {
Packit 366192
		CU_FAIL("Missing nc_sort_sorted test file.");
Packit 366192
		goto out2;
Packit 366192
	}
Packit 366192
	fstat(goodfd, &sb);
Packit 366192
	good_buf_len = sb.st_size;
Packit 366192
	good_buf =
Packit 366192
	    (char *)mmap(NULL, good_buf_len, PROT_READ, MAP_PRIVATE, goodfd, 0);
Packit 366192
Packit 366192
	/* open malformed source file (missing priorities) */
Packit 366192
	badfd = open("nc_sort_malformed", O_RDONLY);
Packit 366192
	if (badfd < 0) {
Packit 366192
		CU_FAIL("Missing nc_sort_malformed test file.");
Packit 366192
		goto out1;
Packit 366192
	}
Packit 366192
	fstat(badfd, &sb);
Packit 366192
	bad_buf_len = sb.st_size;
Packit 366192
	bad_buf =
Packit 366192
	    (char *)mmap(NULL, bad_buf_len, PROT_READ, MAP_PRIVATE, badfd, 0);
Packit 366192
Packit 366192
	/* sort test file */
Packit 366192
	err =
Packit 366192
	    semanage_nc_sort(sh, source_buf, source_buf_len, &sorted_buf,
Packit 366192
			     &sorted_buf_len);
Packit 366192
	CU_ASSERT_FALSE(err);
Packit 366192
	CU_ASSERT_STRING_EQUAL(sorted_buf, good_buf);
Packit 366192
Packit 366192
	/* reset for reuse in next test */
Packit 366192
	free(sorted_buf);
Packit 366192
	sorted_buf = NULL;
Packit 366192
Packit 366192
	/* sort malformed source file */
Packit 366192
	err =
Packit 366192
	    semanage_nc_sort(sh, bad_buf, bad_buf_len, &sorted_buf,
Packit 366192
			     &sorted_buf_len);
Packit 366192
	CU_ASSERT_EQUAL(err, -1);
Packit 366192
Packit 366192
	free(sorted_buf);
Packit 366192
Packit 366192
	munmap(bad_buf, bad_buf_len);
Packit 366192
	close(badfd);
Packit 366192
      out1:
Packit 366192
	munmap(good_buf, good_buf_len);
Packit 366192
	close(goodfd);
Packit 366192
      out2:
Packit 366192
	munmap(source_buf, source_buf_len);
Packit 366192
	close(sourcefd);
Packit 366192
}