selinux/libsemanage/tests/test_handle.c

330 lines
7.9 KiB
C

/*
* Authors: Jan Zarsky <jzarsky@redhat.com>
*
* Copyright (C) 2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "utilities.h"
#include "test_handle.h"
static void test_handle_create(void);
static void test_connect(void);
static void test_disconnect(void);
static void test_transaction(void);
static void test_commit(void);
static void test_is_connected(void);
static void test_access_check(void);
static void test_is_managed(void);
static void test_mls_enabled(void);
static void test_msg_set_callback(void);
static void test_root(void);
static void test_select_store(void);
extern semanage_handle_t *sh;
int handle_test_init(void)
{
if (create_test_store() < 0) {
fprintf(stderr, "Could not create test store\n");
return 1;
}
if (write_test_policy_from_file("test_handle.policy") < 0) {
fprintf(stderr, "Could not write test policy\n");
return 1;
}
return 0;
}
int handle_test_cleanup(void)
{
if (destroy_test_store() < 0) {
fprintf(stderr, "Could not destroy test store\n");
return 1;
}
return 0;
}
int handle_add_tests(CU_pSuite suite)
{
CU_add_test(suite, "test_handle_create", test_handle_create);
CU_add_test(suite, "test_connect", test_connect);
CU_add_test(suite, "test_disconnect", test_disconnect);
CU_add_test(suite, "test_transaction", test_transaction);
CU_add_test(suite, "test_commit", test_commit);
CU_add_test(suite, "test_is_connected", test_is_connected);
CU_add_test(suite, "test_access_check", test_access_check);
CU_add_test(suite, "test_is_managed", test_is_managed);
CU_add_test(suite, "test_mls_enabled", test_mls_enabled);
CU_add_test(suite, "msg_set_callback", test_msg_set_callback);
CU_add_test(suite, "test_root", test_root);
CU_add_test(suite, "test_select_store", test_select_store);
return 0;
}
/* Function semanage_handle_create */
static void test_handle_create(void)
{
sh = semanage_handle_create();
CU_ASSERT_PTR_NOT_NULL(sh);
semanage_handle_destroy(sh);
}
/* Function semanage_connect */
static void test_connect(void)
{
/* test handle created */
setup_handle(SH_HANDLE);
CU_ASSERT(semanage_connect(sh) >= 0);
CU_ASSERT(semanage_disconnect(sh) >= 0);
cleanup_handle(SH_HANDLE);
/* test invalid store */
setup_handle_invalid_store(SH_HANDLE);
CU_ASSERT(semanage_connect(sh) < 0);
cleanup_handle(SH_HANDLE);
/* test normal use */
setup_handle(SH_HANDLE);
CU_ASSERT(semanage_connect(sh) >= 0);
CU_ASSERT(semanage_disconnect(sh) >= 0);
cleanup_handle(SH_HANDLE);
}
/* Function semanage_disconnect */
static void test_disconnect(void)
{
setup_handle(SH_CONNECT);
CU_ASSERT(semanage_disconnect(sh) >= 0);
cleanup_handle(SH_HANDLE);
}
/* Function semanage_begin_transaction */
static void test_transaction(void)
{
/* test disconnected */
setup_handle(SH_CONNECT);
helper_disconnect();
CU_ASSERT(semanage_begin_transaction(sh) < 0);
cleanup_handle(SH_HANDLE);
/* test normal use */
setup_handle(SH_CONNECT);
CU_ASSERT(semanage_begin_transaction(sh) >= 0);
CU_ASSERT(semanage_commit(sh) >= 0);
cleanup_handle(SH_CONNECT);
}
/* Function semanage_commit */
static void test_commit(void)
{
/* test without transaction */
setup_handle(SH_CONNECT);
CU_ASSERT(semanage_commit(sh) < 0);
/* test with transaction */
helper_begin_transaction();
CU_ASSERT(semanage_commit(sh) >= 0);
cleanup_handle(SH_CONNECT);
}
/* Function semanage_is_connected */
static void test_is_connected(void)
{
/* test disconnected */
setup_handle(SH_HANDLE);
CU_ASSERT(semanage_is_connected(sh) == 0);
/* test connected */
helper_connect();
CU_ASSERT(semanage_is_connected(sh) == 1);
/* test in transaction */
helper_begin_transaction();
CU_ASSERT(semanage_is_connected(sh) == 1);
cleanup_handle(SH_TRANS);
}
/* Function semanage_access_check */
static void test_access_check(void)
{
int res = 0;
/* test with handle */
setup_handle(SH_HANDLE);
res = semanage_access_check(sh);
CU_ASSERT(res == 0 || res == SEMANAGE_CAN_READ
|| res == SEMANAGE_CAN_WRITE);
cleanup_handle(SH_HANDLE);
/* test with invalid store */
setup_handle_invalid_store(SH_HANDLE);
CU_ASSERT(semanage_access_check(sh) < 0);
cleanup_handle(SH_HANDLE);
/* test connected */
setup_handle(SH_CONNECT);
res = semanage_access_check(sh);
CU_ASSERT(res == 0 || res == SEMANAGE_CAN_READ
|| res == SEMANAGE_CAN_WRITE);
cleanup_handle(SH_CONNECT);
}
/* Function semanage_is_managed */
static void test_is_managed(void)
{
int res = 0;
/* test with handle */
setup_handle(SH_HANDLE);
res = semanage_is_managed(sh);
CU_ASSERT(res == 0 || res == 1);
/* test connected */
helper_connect();
res = semanage_is_managed(sh);
CU_ASSERT(res < 0);
cleanup_handle(SH_CONNECT);
}
/* Function semanage_mls_enabled */
static void test_mls_enabled(void)
{
int res = 0;
/* test with handle */
setup_handle(SH_HANDLE);
res = semanage_mls_enabled(sh);
CU_ASSERT(res == 0 || res == 1);
cleanup_handle(SH_HANDLE);
/* test with invalid store */
setup_handle_invalid_store(SH_HANDLE);
CU_ASSERT(semanage_mls_enabled(sh) < 0);
cleanup_handle(SH_HANDLE);
/* test connected */
setup_handle(SH_CONNECT);
res = semanage_mls_enabled(sh);
CU_ASSERT(res == 0 || res == 1);
cleanup_handle(SH_CONNECT);
}
/* Function semanage_set_callback */
int msg_set_callback_count = 0;
static void helper_msg_set_callback(void *varg, semanage_handle_t *handle,
const char *fmt, ...)
{
msg_set_callback_count++;
}
static void test_msg_set_callback(void)
{
setup_handle(SH_CONNECT);
semanage_msg_set_callback(sh, helper_msg_set_callback, NULL);
/* produce error message */
semanage_commit(sh);
CU_ASSERT(msg_set_callback_count == 1);
semanage_msg_set_callback(sh, NULL, NULL);
/* produce error message */
semanage_commit(sh);
CU_ASSERT(msg_set_callback_count == 1);
cleanup_handle(SH_CONNECT);
}
/* Function semanage_root, semanage_set_root */
static void helper_root(void)
{
const char *root = NULL;
CU_ASSERT(semanage_set_root("asdf") >= 0);
root = semanage_root();
CU_ASSERT_STRING_EQUAL(root, "asdf");
CU_ASSERT(semanage_set_root("") >= 0);
root = semanage_root();
CU_ASSERT_STRING_EQUAL(root, "");
}
static void test_root(void)
{
/* test without handle */
setup_handle(SH_NULL);
helper_root();
/* test with handle */
helper_handle_create();
helper_root();
/* test connected */
helper_connect();
helper_root();
cleanup_handle(SH_CONNECT);
}
/* Function semanage_select_store */
static void helper_select_store(const char *name, enum semanage_connect_type type,
int exp_res)
{
setup_handle(SH_HANDLE);
/* FIXME: the storename parameter of semanage_select_store should be
* 'const char *'
*/
semanage_select_store(sh, (char *) name, type);
int res = semanage_connect(sh);
if (exp_res < 0) {
CU_ASSERT(res < 0);
} else {
CU_ASSERT(res >= 0);
}
if (res >= 0)
cleanup_handle(SH_CONNECT);
else
cleanup_handle(SH_HANDLE);
}
static void test_select_store(void)
{
helper_select_store("asdf", SEMANAGE_CON_INVALID - 1, -1);
helper_select_store("asdf", SEMANAGE_CON_POLSERV_REMOTE + 1, -1);
helper_select_store("", SEMANAGE_CON_DIRECT, 0);
helper_select_store("asdf", SEMANAGE_CON_INVALID, -1);
helper_select_store("asdf", SEMANAGE_CON_DIRECT, 0);
helper_select_store("asdf", SEMANAGE_CON_POLSERV_LOCAL, -1);
helper_select_store("asdf", SEMANAGE_CON_POLSERV_REMOTE, -1);
}