/*
 * 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_node.h"

#define NODE_COUNT 3

#define NODE1_ADDR "192.168.0.0"
#define NODE1_MASK "255.255.255.0"
#define NODE1_PROTO SEPOL_PROTO_IP4
#define NODE1_CONTEXT "system_u:object_r:first_node_t:s0"

#define NODE2_ADDR "2001:db8:85a3::8a2e:370:7334"
#define NODE2_MASK "2001:db8:85a3::8a2e:370:7334"
#define NODE2_PROTO SEPOL_PROTO_IP6
#define NODE2_CONTEXT "system_u:object_r:second_node_t:s0"

#define NODE3_ADDR "127.0.0.1"
#define NODE3_MASK "255.255.0.0"
#define NODE3_PROTO SEPOL_PROTO_IP4
#define NODE3_CONTEXT "system_u:object_r:third_node_t:s0"

/* node_record.h */
static void test_node_compare(void);
static void test_node_compare2(void);
static void test_node_key_create(void);
static void test_node_key_extract(void);
static void test_node_get_set_addr(void);
static void test_node_get_set_addr_bytes(void);
static void test_node_get_set_mask(void);
static void test_node_get_set_mask_bytes(void);
static void test_node_get_set_proto(void);
static void test_node_get_proto_str(void);
static void test_node_get_set_con(void);
static void test_node_create(void);
static void test_node_clone(void);

/* nodes_policy.h */
static void test_node_query(void);
static void test_node_exists(void);
static void test_node_count(void);
static void test_node_iterate(void);
static void test_node_list(void);

/* nodes_local.h */
static void test_node_modify_del_query_local(void);
static void test_node_exists_local(void);
static void test_node_count_local(void);
static void test_node_iterate_local(void);
static void test_node_list_local(void);

extern semanage_handle_t *sh;

int node_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_node.policy") < 0) {
		fprintf(stderr, "Could not write test policy\n");
		return 1;
	}

	return 0;
}

int node_test_cleanup(void)
{
	if (destroy_test_store() < 0) {
		fprintf(stderr, "Could destroy test store\n");
		return 1;
	}

	return 0;
}

int node_add_tests(CU_pSuite suite)
{
	CU_add_test(suite, "node_compare", test_node_compare);
	CU_add_test(suite, "node_compare2", test_node_compare2);
	CU_add_test(suite, "node_key_create", test_node_key_create);
	CU_add_test(suite, "node_key_extract", test_node_key_extract);
	CU_add_test(suite, "node_get_set_addr", test_node_get_set_addr);
	CU_add_test(suite, "node_get_set_addr_bytes",
		    test_node_get_set_addr_bytes);
	CU_add_test(suite, "node_get_set_mask", test_node_get_set_mask);
	CU_add_test(suite, "node_get_set_mask_bytes",
		    test_node_get_set_mask_bytes);
	CU_add_test(suite, "node_get_set_proto", test_node_get_set_proto);
	CU_add_test(suite, "node_get_proto_str", test_node_get_proto_str);
	CU_add_test(suite, "node_get_set_con", test_node_get_set_con);
	CU_add_test(suite, "node_create", test_node_create);
	CU_add_test(suite, "node_clone", test_node_clone);

	CU_add_test(suite, "node_query", test_node_query);
	CU_add_test(suite, "node_exists", test_node_exists);
	CU_add_test(suite, "node_count", test_node_count);
	CU_add_test(suite, "node_iterate", test_node_iterate);
	CU_add_test(suite, "node_list", test_node_list);

	CU_add_test(suite, "node_modify_del_query_local",
		    test_node_modify_del_query_local);
	CU_add_test(suite, "node_exists_local", test_node_exists_local);
	CU_add_test(suite, "node_count_local", test_node_count_local);
	CU_add_test(suite, "node_iterate_local", test_node_iterate_local);
	CU_add_test(suite, "node_list_local", test_node_list_local);

	return 0;
}

/* Helpers */

static semanage_node_t *get_node_nth(int idx)
{
	semanage_node_t **records;
	semanage_node_t *node;
	unsigned int count;

	if (idx == I_NULL)
		return NULL;

	CU_ASSERT_FATAL(semanage_node_list(sh, &records, &count) >= 0);
	CU_ASSERT_FATAL(count >= (unsigned int) idx + 1);

	node = records[idx];

	for (unsigned int i = 0; i < count; i++)
		if (i != (unsigned int) idx)
			semanage_node_free(records[i]);

	free(records);

	return node;
}

static semanage_node_key_t *get_node_key_nth(int idx)
{
	semanage_node_key_t *key;
	semanage_node_t *node;
	int res;

	if (idx == I_NULL)
		return NULL;

	node = get_node_nth(idx);

	res = semanage_node_key_extract(sh, node, &key);

	CU_ASSERT_FATAL(res >= 0);
	CU_ASSERT_PTR_NOT_NULL_FATAL(key);

	semanage_node_free(node);

	return key;
}

static void add_local_node(int idx)
{
	semanage_node_t *node;
	semanage_node_key_t *key = NULL;

	node = get_node_nth(idx);

	CU_ASSERT_FATAL(semanage_node_key_extract(sh, node, &key) >= 0);
	CU_ASSERT_PTR_NOT_NULL_FATAL(key);

	CU_ASSERT_FATAL(semanage_node_modify_local(sh, key, node) >= 0);

	/* cleanup */
	semanage_node_key_free(key);
	semanage_node_free(node);
}

static void delete_local_node(int idx)
{
	semanage_node_key_t *key = NULL;

	key = get_node_key_nth(idx);

	CU_ASSERT_FATAL(semanage_node_del_local(sh, key) >= 0);

	/* cleanup */
	semanage_node_key_free(key);
}

/* Function semanage_node_compare */
static void test_node_compare(void)
{
	semanage_node_t *node = NULL;
	semanage_node_key_t *key1 = NULL;
	semanage_node_key_t *key2 = NULL;
	int res = 42;

	/* setup */
	setup_handle(SH_CONNECT);
	node = get_node_nth(I_FIRST);
	key1 = get_node_key_nth(I_FIRST);
	CU_ASSERT(semanage_node_key_create(sh, "192.168.0.1", "255.255.0.0",
					   SEMANAGE_PROTO_IP4, &key2) >= 0);
	CU_ASSERT_PTR_NOT_NULL(key2);

	/* test */
	res = semanage_node_compare(node, key1);
	CU_ASSERT(res == 0);
	res = semanage_node_compare(node, key2);
	CU_ASSERT(res != 0);

	/* cleanup */
	semanage_node_free(node);
	semanage_node_key_free(key1);
	semanage_node_key_free(key2);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_compare2 */
static void test_node_compare2(void)
{
	semanage_node_t *node1 = NULL;
	semanage_node_t *node2 = NULL;
	semanage_node_t *node3 = NULL;
	int res = 42;

	/* setup */
	setup_handle(SH_CONNECT);
	node1 = get_node_nth(I_FIRST);
	node2 = get_node_nth(I_FIRST);
	node3 = get_node_nth(I_SECOND);

	/* test */
	res = semanage_node_compare2(node1, node2);
	CU_ASSERT(res == 0);
	res = semanage_node_compare2(node1, node3);
	CU_ASSERT(res != 0);

	/* cleanup */
	semanage_node_free(node1);
	semanage_node_free(node2);
	semanage_node_free(node3);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_key_create */
static void test_node_key_create(void)
{
	semanage_node_key_t *key = NULL;

	/* setup */
	setup_handle(SH_CONNECT);

	/* test */
	CU_ASSERT(semanage_node_key_create(sh, "127.0.0.1", "255.255.255.255",
					   SEMANAGE_PROTO_IP4, &key) >= 0);
	CU_ASSERT_PTR_NOT_NULL(key);

	/* cleanup */
	semanage_node_key_free(key);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_key_extract */
static void test_node_key_extract(void)
{
	semanage_node_t *node = NULL;
	semanage_node_key_t *key = NULL;

	/* setup */
	setup_handle(SH_CONNECT);
	node = get_node_nth(I_FIRST);

	/* test */
	CU_ASSERT(semanage_node_key_extract(sh, node, &key) >= 0);
	CU_ASSERT_PTR_NOT_NULL(key);

	/* cleanup */
	semanage_node_free(node);
	semanage_node_key_free(key);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_get_addr, semanage_node_set_addr */
static void test_node_get_set_addr(void)
{
	semanage_node_t *node = NULL;
	char *addr = NULL;

	/* setup */
	setup_handle(SH_CONNECT);
	CU_ASSERT(semanage_node_create(sh, &node) >= 0);

	/* test */
	CU_ASSERT(semanage_node_set_addr(sh, node, SEMANAGE_PROTO_IP4,
					 "192.168.0.1") == 0);
	CU_ASSERT(semanage_node_get_addr(sh, node, &addr) >= 0);
	CU_ASSERT_PTR_NOT_NULL(addr);
	assert(addr);
	CU_ASSERT_STRING_EQUAL(addr, "192.168.0.1");

	/* cleanup */
	free(addr);
	semanage_node_free(node);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_get_addr_bytes, semanage_node_set_addr_bytes */
static void test_node_get_set_addr_bytes(void)
{
	semanage_node_t *node = NULL;
	char addr1[] = { 192, 168, 0, 1 };
	size_t addr1_size = sizeof(addr1);
	char *addr2 = NULL;
	size_t addr2_size = 0;

	/* setup */
	setup_handle(SH_CONNECT);
	CU_ASSERT(semanage_node_create(sh, &node) >= 0);

	/* test */
	CU_ASSERT(semanage_node_set_addr_bytes(sh, node, addr1,
					       addr1_size) == 0);
	CU_ASSERT(semanage_node_get_addr_bytes(sh, node, &addr2,
					       &addr2_size) >= 0);
	CU_ASSERT_PTR_NOT_NULL(addr2);
	assert(addr2);

	for (size_t i = 0; i < addr2_size; i++)
		CU_ASSERT(addr1[i] == addr2[i]);

	/* cleanup */
	free(addr2);
	semanage_node_free(node);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_get_mask, semanage_node_set_mask */
static void test_node_get_set_mask(void)
{
	semanage_node_t *node = NULL;
	char *mask = NULL;

	/* setup */
	setup_handle(SH_CONNECT);
	CU_ASSERT(semanage_node_create(sh, &node) >= 0);

	/* test */
	CU_ASSERT(semanage_node_set_mask(sh, node, SEMANAGE_PROTO_IP4,
					 "255.255.255.0") == 0);
	CU_ASSERT(semanage_node_get_mask(sh, node, &mask) >= 0);
	CU_ASSERT_PTR_NOT_NULL(mask);
	assert(mask);
	CU_ASSERT_STRING_EQUAL(mask, "255.255.255.0");

	/* cleanup */
	free(mask);
	semanage_node_free(node);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_get_mask_bytes, semanage_node_set_mask_bytes */
static void test_node_get_set_mask_bytes(void)
{
	semanage_node_t *node = NULL;
	char mask1[] = { 255, 255, 255, 0 };
	size_t mask1_size = sizeof(mask1);
	char *mask2 = NULL;
	size_t mask2_size = 0;

	/* setup */
	setup_handle(SH_CONNECT);
	CU_ASSERT(semanage_node_create(sh, &node) >= 0);

	/* test */
	CU_ASSERT(semanage_node_set_mask_bytes(sh, node, mask1,
					       mask1_size) == 0);
	CU_ASSERT(semanage_node_get_mask_bytes(sh, node, &mask2,
					       &mask2_size) >= 0);
	CU_ASSERT_PTR_NOT_NULL(mask2);
	assert(mask2);

	for (size_t i = 0; i < mask2_size; i++)
		CU_ASSERT(mask1[i] == mask2[i]);

	/* cleanup */
	free(mask2);
	semanage_node_free(node);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_get_proto, semanage_node_set_proto */
static void test_node_get_set_proto(void)
{
	semanage_node_t *node = NULL;

	/* setup */
	setup_handle(SH_CONNECT);
	CU_ASSERT(semanage_node_create(sh, &node) >= 0);

	/* test */
	semanage_node_set_proto(node, SEMANAGE_PROTO_IP4);
	CU_ASSERT(semanage_node_get_proto(node) == SEMANAGE_PROTO_IP4);

	/* cleanup */
	semanage_node_free(node);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_get_proto_str */
static void test_node_get_proto_str(void)
{
	CU_ASSERT_STRING_EQUAL(semanage_node_get_proto_str(SEMANAGE_PROTO_IP4),
							   "ipv4");
	CU_ASSERT_STRING_EQUAL(semanage_node_get_proto_str(SEMANAGE_PROTO_IP6),
							   "ipv6");
}

/* Function semanage_node_get_con, semanage_node_set_con */
static void test_node_get_set_con(void)
{
	semanage_node_t *node = NULL;
	semanage_context_t *con1 = NULL;
	semanage_context_t *con2 = NULL;

	/* setup */
	setup_handle(SH_CONNECT);
	CU_ASSERT(semanage_node_create(sh, &node) >= 0);
	CU_ASSERT(semanage_context_from_string(sh,
			       "my_user_u:my_role_r:my_type_t:s0", &con1) >= 0);

	/* test */
	CU_ASSERT(semanage_node_set_con(sh, node, con1) == 0);
	con2 = semanage_node_get_con(node);
	CU_ASSERT_CONTEXT_EQUAL(con1, con2);

	/* cleanup */
	semanage_context_free(con1);
	semanage_node_free(node);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_create */
static void test_node_create(void)
{
	semanage_node_t *node = NULL;
	semanage_context_t *con = NULL;

	/* setup */
	setup_handle(SH_CONNECT);

	/* test */
	CU_ASSERT(semanage_node_create(sh, &node) >= 0);
	CU_ASSERT(semanage_node_set_addr(sh, node, SEMANAGE_PROTO_IP4,
					 "127.0.0.1") >= 0);
	CU_ASSERT(semanage_node_set_mask(sh, node, SEMANAGE_PROTO_IP4,
					 "255.255.255.0") >= 0);
	semanage_node_set_proto(node, SEMANAGE_PROTO_IP4);
	CU_ASSERT(semanage_context_from_string(sh, "user_u:role_r:type_t:s0",
					       &con) >= 0);
	CU_ASSERT(semanage_node_set_con(sh, node, con) >= 0);

	/* cleanup */
	semanage_context_free(con);
	semanage_node_free(node);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_clone */
static void test_node_clone(void)
{
	semanage_node_t *node = NULL;
	semanage_node_t *node_clone = NULL;
	semanage_context_t *con = NULL;
	semanage_context_t *con2 = NULL;
	const char *addr1 = "127.0.0.1";
	char *addr2 = NULL;
	const char *mask1 = "255.255.255.0";
	char *mask2 = NULL;

	/* setup */
	setup_handle(SH_CONNECT);
	CU_ASSERT(semanage_node_create(sh, &node) >= 0);
	CU_ASSERT(semanage_node_set_addr(sh, node, SEMANAGE_PROTO_IP4,
					 addr1) >= 0);
	CU_ASSERT(semanage_node_set_mask(sh, node, SEMANAGE_PROTO_IP4,
					 mask1) >= 0);
	semanage_node_set_proto(node, SEMANAGE_PROTO_IP4);
	CU_ASSERT(semanage_context_from_string(sh, "user_u:role_r:type_t:s0",
					       &con) >= 0);
	CU_ASSERT(semanage_node_set_con(sh, node, con) >= 0);

	/* test */
	CU_ASSERT(semanage_node_clone(sh, node, &node_clone) >= 0);

	CU_ASSERT(semanage_node_get_addr(sh, node_clone, &addr2) >= 0);
	CU_ASSERT_PTR_NOT_NULL(addr2);
	assert(addr2);
	CU_ASSERT_STRING_EQUAL(addr1, addr2);

	CU_ASSERT(semanage_node_get_mask(sh, node_clone, &mask2) >= 0);
	CU_ASSERT_PTR_NOT_NULL(mask2);
	assert(mask2);
	CU_ASSERT_STRING_EQUAL(mask1, mask2);

	CU_ASSERT(semanage_node_get_proto(node_clone) == SEMANAGE_PROTO_IP4);

	con2 = semanage_node_get_con(node_clone);
	CU_ASSERT_CONTEXT_EQUAL(con, con2);

	/* cleanup */
	free(mask2);
	free(addr2);
	semanage_context_free(con);
	semanage_node_free(node);
	semanage_node_free(node_clone);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_query */
static void test_node_query(void)
{
	semanage_node_t *node = NULL;
	semanage_node_t *node_exp = NULL;
	semanage_node_key_t *key = NULL;
	char *str = NULL;
	char *str_exp = NULL;
	semanage_context_t *con = NULL;
	semanage_context_t *con_exp = NULL;

	/* setup */
	setup_handle(SH_CONNECT);
	key = get_node_key_nth(I_FIRST);
	node_exp = get_node_nth(I_FIRST);

	/* test */
	CU_ASSERT(semanage_node_query(sh, key, &node) >= 0);

	CU_ASSERT(semanage_node_get_addr(sh, node, &str) >= 0);
	CU_ASSERT(semanage_node_get_addr(sh, node_exp, &str_exp) >= 0);
	CU_ASSERT_STRING_EQUAL(str, str_exp);
	free(str);
	free(str_exp);

	CU_ASSERT(semanage_node_get_mask(sh, node, &str) >= 0);
	CU_ASSERT(semanage_node_get_mask(sh, node_exp, &str_exp) >= 0);
	CU_ASSERT_STRING_EQUAL(str, str_exp);
	free(str);
	free(str_exp);

	CU_ASSERT(semanage_node_get_proto(node) ==
			  semanage_node_get_proto(node_exp));

	con = semanage_node_get_con(node);
	con_exp = semanage_node_get_con(node_exp);
	CU_ASSERT_CONTEXT_EQUAL(con, con_exp);

	/* cleanup */
	semanage_node_key_free(key);
	semanage_node_free(node_exp);
	semanage_node_free(node);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_exists */
static void test_node_exists(void)
{
	semanage_node_key_t *key1 = NULL;
	semanage_node_key_t *key2 = NULL;
	int resp = 42;

	/* setup */
	setup_handle(SH_CONNECT);
	key1 = get_node_key_nth(I_FIRST);
	CU_ASSERT(semanage_node_key_create(sh, "1.2.3.4", "255.255.0.0",
					   SEMANAGE_PROTO_IP4, &key2) >= 0);

	/* test */
	CU_ASSERT(semanage_node_exists(sh, key1, &resp) >= 0);
	CU_ASSERT(resp);
	CU_ASSERT(semanage_node_exists(sh, key2, &resp) >= 0);
	CU_ASSERT(!resp);

	/* cleanup */
	semanage_node_key_free(key1);
	semanage_node_key_free(key2);
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_count */
static void test_node_count(void)
{
	unsigned int count = 42;

	/* setup */
	setup_handle(SH_CONNECT);

	/* test */
	CU_ASSERT(semanage_node_count(sh, &count) >= 0);
	CU_ASSERT(count == NODE_COUNT);

	/* cleanup */
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_iterate */
unsigned int counter_node_iterate = 0;

static int handler_node_iterate(const semanage_node_t *record, void *varg)
{
	counter_node_iterate++;
	return 0;
}

static void test_node_iterate(void)
{
	/* setup */
	setup_handle(SH_CONNECT);

	/* test */
	semanage_node_iterate(sh, handler_node_iterate, NULL);
	CU_ASSERT(counter_node_iterate == NODE_COUNT);

	/* cleanup */
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_list */
static void test_node_list(void)
{
	semanage_node_t **records = NULL;
	unsigned int count = 42;

	/* setup */
	setup_handle(SH_CONNECT);

	/* test */
	CU_ASSERT(semanage_node_list(sh, &records, &count) >= 0);
	CU_ASSERT(count == NODE_COUNT);

	for (unsigned int i = 0; i < count; i++)
		CU_ASSERT_PTR_NOT_NULL(records[i]);

	for (unsigned int i = 0; i < count; i++)
		semanage_node_free(records[i]);

	free(records);

	/* cleanup */
	cleanup_handle(SH_CONNECT);
}

/* Function semanage_node_modify_local, semanage_node_del_local,
 * semanage_node_query_local
 */
static void test_node_modify_del_query_local(void)
{
	semanage_node_t *node;
	semanage_node_t *node_local;
	semanage_node_t *node_tmp;
	semanage_node_key_t *key = NULL;
	semanage_node_key_t *key_tmp = NULL;

	/* setup */
	setup_handle(SH_TRANS);
	node = get_node_nth(I_FIRST);
	CU_ASSERT(semanage_node_key_extract(sh, node, &key) >= 0);
	CU_ASSERT_PTR_NOT_NULL(key);

	/* add second record, so that semanage_node_compare2_qsort
	 * will be called
	 */
	node_tmp = get_node_nth(I_FIRST);

	CU_ASSERT(semanage_node_set_addr(sh, node_tmp, SEMANAGE_PROTO_IP4,
					 "10.0.0.1") >= 0);
	CU_ASSERT(semanage_node_key_extract(sh, node_tmp, &key_tmp) >= 0);
	CU_ASSERT_PTR_NOT_NULL(key_tmp);

	/* test */
	CU_ASSERT(semanage_node_modify_local(sh, key, node) >= 0);
	CU_ASSERT(semanage_node_modify_local(sh, key_tmp, node_tmp) >= 0);

	/* write changes to file */
	helper_commit();
	helper_begin_transaction();

	CU_ASSERT(semanage_node_query_local(sh, key, &node_local) >= 0);
	CU_ASSERT_PTR_NOT_NULL_FATAL(node_local);
	semanage_node_free(node_local);

	CU_ASSERT(semanage_node_del_local(sh, key) >= 0);
	CU_ASSERT(semanage_node_del_local(sh, key_tmp) >= 0);

	CU_ASSERT(semanage_node_query_local(sh, key, &node_local) < 0);

	/* cleanup */
	semanage_node_key_free(key_tmp);
	semanage_node_key_free(key);
	semanage_node_free(node);
	semanage_node_free(node_tmp);
	cleanup_handle(SH_TRANS);
}

/* Function semanage_node_exists_local */
static void test_node_exists_local(void)
{
	semanage_node_key_t *key1 = NULL;
	semanage_node_key_t *key2 = NULL;
	int resp = 42;

	/* setup */
	setup_handle(SH_TRANS);
	add_local_node(I_FIRST);
	key1 = get_node_key_nth(I_FIRST);
	key2 = get_node_key_nth(I_SECOND);

	/* test */
	CU_ASSERT(semanage_node_exists_local(sh, key1, &resp) >= 0);
	CU_ASSERT(resp);
	CU_ASSERT(semanage_node_exists_local(sh, key2, &resp) >= 0);
	CU_ASSERT(!resp);

	/* cleanup */
	CU_ASSERT(semanage_node_del_local(sh, key1) >= 0);
	semanage_node_key_free(key1);
	semanage_node_key_free(key2);
	cleanup_handle(SH_TRANS);
}

/* Function semanage_node_count_local */
static void test_node_count_local(void)
{
	unsigned int count = 42;

	/* setup */
	setup_handle(SH_TRANS);

	/* test */
	CU_ASSERT(semanage_node_count_local(sh, &count) >= 0);
	CU_ASSERT(count == 0);

	add_local_node(I_FIRST);
	CU_ASSERT(semanage_node_count_local(sh, &count) >= 0);
	CU_ASSERT(count == 1);

	add_local_node(I_SECOND);
	CU_ASSERT(semanage_node_count_local(sh, &count) >= 0);
	CU_ASSERT(count == 2);

	delete_local_node(I_SECOND);
	CU_ASSERT(semanage_node_count_local(sh, &count) >= 0);
	CU_ASSERT(count == 1);

	delete_local_node(I_FIRST);
	CU_ASSERT(semanage_node_count_local(sh, &count) >= 0);
	CU_ASSERT(count == 0);

	/* cleanup */
	cleanup_handle(SH_TRANS);
}

/* Function semanage_node_iterate_local */
unsigned int counter_node_iterate_local = 0;

static int handler_node_iterate_local(const semanage_node_t *record, void *varg)
{
	counter_node_iterate_local++;
	return 0;
}

static void test_node_iterate_local(void)
{
	/* setup */
	setup_handle(SH_TRANS);
	add_local_node(I_FIRST);
	add_local_node(I_SECOND);
	add_local_node(I_THIRD);

	/* test */
	semanage_node_iterate_local(sh, handler_node_iterate_local, NULL);
	CU_ASSERT(counter_node_iterate_local == 3);

	/* cleanup */
	delete_local_node(I_FIRST);
	delete_local_node(I_SECOND);
	delete_local_node(I_THIRD);
	cleanup_handle(SH_TRANS);
}

/* Function semanage_node_list_local */
static void test_node_list_local(void)
{
	semanage_node_t **records = NULL;
	unsigned int count = 42;

	/* setup */
	setup_handle(SH_TRANS);
	add_local_node(I_FIRST);
	add_local_node(I_SECOND);
	add_local_node(I_THIRD);

	/* test */
	CU_ASSERT(semanage_node_list_local(sh, &records, &count) >= 0);
	CU_ASSERT(count == 3);

	for (unsigned int i = 0; i < count; i++)
		CU_ASSERT_PTR_NOT_NULL(records[i]);

	/* cleanup */
	for (unsigned int i = 0; i < count; i++)
		semanage_node_free(records[i]);

	free(records);

	delete_local_node(I_FIRST);
	delete_local_node(I_SECOND);
	delete_local_node(I_THIRD);
	cleanup_handle(SH_TRANS);
}
