Home | History | Annotate | Download | only in tests
      1 /* Authors: Mark Goldman <mgoldman (at) tresys.com>
      2  *
      3  * Copyright (C) 2007 Tresys Technology, LLC
      4  *
      5  *  This library is free software; you can redistribute it and/or
      6  *  modify it under the terms of the GNU Lesser General Public
      7  *  License as published by the Free Software Foundation; either
      8  *  version 2.1 of the License, or (at your option) any later version.
      9  *
     10  *  This library is distributed in the hope that it will be useful,
     11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  *  Lesser General Public License for more details.
     14  *
     15  *  You should have received a copy of the GNU Lesser General Public
     16  *  License along with this library; if not, write to the Free Software
     17  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     18  */
     19 
     20 /*  The purpose of this file is to provide unit tests of the functions in:
     21  *
     22  *  libsemanage/src/utilities.c
     23  *
     24  */
     25 
     26 #include <CUnit/Basic.h>
     27 #include <CUnit/Console.h>
     28 #include <CUnit/TestDB.h>
     29 
     30 #include <utilities.h>
     31 #include <stdio.h>
     32 #include <getopt.h>
     33 #include <stdlib.h>
     34 #include <string.h>
     35 #include <unistd.h>
     36 
     37 void test_semanage_is_prefix(void);
     38 void test_semanage_split_on_space(void);
     39 void test_semanage_split(void);
     40 void test_semanage_list(void);
     41 void test_semanage_str_count(void);
     42 void test_semanage_rtrim(void);
     43 void test_semanage_str_replace(void);
     44 void test_semanage_findval(void);
     45 void test_slurp_file_filter(void);
     46 
     47 char fname[] = {
     48 	'T', 'E', 'S', 'T', '_', 'T', 'E', 'M', 'P', '_', 'X', 'X', 'X', 'X',
     49 	'X', 'X', '\0'
     50 };
     51 int fd;
     52 FILE *fptr;
     53 
     54 int semanage_utilities_test_init(void)
     55 {
     56 	fd = mkstemp(fname);
     57 
     58 	if (fd < 0) {
     59 		perror("test_semanage_findval: ");
     60 		CU_FAIL_FATAL
     61 		    ("Error opening temporary file, test cannot start.");
     62 	}
     63 
     64 	fptr = fdopen(fd, "w+");
     65 	if (!fptr) {
     66 		perror("test_semanage_findval file: ");
     67 		CU_FAIL_FATAL("Error opening file stream, test cannot start.");
     68 	}
     69 
     70 	fprintf(fptr, "one\ntwo\nthree\nsigma=foo\n#boo\n#bar\n");
     71 
     72 	rewind(fptr);
     73 	return 0;
     74 }
     75 
     76 int semanage_utilities_test_cleanup(void)
     77 {
     78 	unlink(fname);
     79 	return 0;
     80 }
     81 
     82 int semanage_utilities_add_tests(CU_pSuite suite)
     83 {
     84 	if (NULL == CU_add_test(suite, "semanage_is_prefix",
     85 				test_semanage_is_prefix)) {
     86 		goto err;
     87 	}
     88 	if (NULL == CU_add_test(suite, "semanage_split_on_space",
     89 				test_semanage_split_on_space)) {
     90 		goto err;
     91 	}
     92 	if (NULL == CU_add_test(suite, "semanage_split", test_semanage_split)) {
     93 		goto err;
     94 	}
     95 	if (NULL == CU_add_test(suite, "semanage_list", test_semanage_list)) {
     96 		goto err;
     97 	}
     98 	if (NULL == CU_add_test(suite, "semanage_str_count",
     99 				test_semanage_str_count)) {
    100 		goto err;
    101 	}
    102 	if (NULL == CU_add_test(suite, "semanage_rtrim", test_semanage_rtrim)) {
    103 		goto err;
    104 	}
    105 	if (NULL == CU_add_test(suite, "semanage_str_replace",
    106 				test_semanage_str_replace)) {
    107 		goto err;
    108 	}
    109 	if (NULL == CU_add_test(suite, "semanage_findval",
    110 				test_semanage_findval)) {
    111 		goto err;
    112 	}
    113 	if (NULL == CU_add_test(suite, "slurp_file_filter",
    114 				test_slurp_file_filter)) {
    115 		goto err;
    116 	}
    117 	return 0;
    118       err:
    119 	CU_cleanup_registry();
    120 	return CU_get_error();
    121 }
    122 
    123 void test_semanage_is_prefix(void)
    124 {
    125 	const char *str = "some string";
    126 	const char *pre = "some";
    127 	const char *not_pre = "not this";
    128 
    129 	CU_ASSERT_TRUE(semanage_is_prefix(str, pre));
    130 	CU_ASSERT_TRUE(semanage_is_prefix(str, ""));
    131 	CU_ASSERT_TRUE(semanage_is_prefix(str, NULL));
    132 	CU_ASSERT_FALSE(semanage_is_prefix(str, not_pre));
    133 }
    134 
    135 void test_semanage_split_on_space(void)
    136 {
    137 	char *str = strdup("   foo   bar    baz");
    138 	char *temp;
    139 
    140 	if (!str) {
    141 		CU_FAIL
    142 		    ("semanage_split_on_space: unable to perform test, no memory");
    143 	}
    144 	temp = semanage_split_on_space(str);
    145 	CU_ASSERT_STRING_EQUAL(temp, "bar    baz");
    146 	free(str);
    147 	str = temp;
    148 
    149 	temp = semanage_split_on_space(str);
    150 	CU_ASSERT_STRING_EQUAL(temp, "baz");
    151 	free(str);
    152 	str = temp;
    153 
    154 	temp = semanage_split_on_space(str);
    155 	CU_ASSERT_STRING_EQUAL(temp, "");
    156 	free(str);
    157 	free(temp);
    158 }
    159 
    160 void test_semanage_split(void)
    161 {
    162 	char *str = strdup("foo1 foo2   foo:bar:");
    163 	char *temp;
    164 
    165 	if (!str) {
    166 		CU_FAIL
    167 		    ("semanage_split_on_space: unable to perform test, no memory");
    168 		return;
    169 	}
    170 	temp = semanage_split(str, NULL);
    171 	CU_ASSERT_STRING_EQUAL(temp, "foo2   foo:bar:");
    172 	free(str);
    173 	str = temp;
    174 
    175 	temp = semanage_split(str, "");
    176 	CU_ASSERT_STRING_EQUAL(temp, "foo:bar:");
    177 	free(str);
    178 	str = temp;
    179 
    180 	temp = semanage_split(str, ":");
    181 	CU_ASSERT_STRING_EQUAL(temp, "bar:");
    182 	free(str);
    183 	str = temp;
    184 
    185 	temp = semanage_split(str, ":");
    186 	CU_ASSERT_STRING_EQUAL(temp, "");
    187 	free(str);
    188 	free(temp);
    189 }
    190 
    191 void test_semanage_list(void)
    192 {
    193 	semanage_list_t *list = NULL;
    194 	semanage_list_t *ptr = NULL;
    195 	char *temp = NULL;
    196 	int retval = 0;
    197 
    198 	CU_ASSERT_FALSE(semanage_list_push(&list, "foo"));
    199 	CU_ASSERT_PTR_NOT_NULL(list);
    200 	CU_ASSERT_FALSE(semanage_list_push(&list, "bar"));
    201 	CU_ASSERT_FALSE(semanage_list_push(&list, "gonk"));
    202 	CU_ASSERT_FALSE(semanage_list_push(&list, "zebra"));
    203 
    204 	for (ptr = list; ptr; ptr = ptr->next)
    205 		retval++;
    206 	CU_ASSERT_EQUAL(retval, 4);
    207 
    208 	temp = semanage_list_pop(&list);
    209 	CU_ASSERT_STRING_EQUAL(temp, "zebra");
    210 	CU_ASSERT_FALSE(semanage_list_push(&list, temp));
    211 	free(temp);
    212 	temp = NULL;
    213 
    214 	retval = 0;
    215 	for (ptr = list; ptr; ptr = ptr->next)
    216 		retval++;
    217 	CU_ASSERT_EQUAL(retval, 4);
    218 
    219 	retval = semanage_list_sort(&list);
    220 	if (retval) {
    221 		CU_FAIL
    222 		    ("semanage_list_sort: error unrelated to sort (memory?)");
    223 		goto past_sort;
    224 	}
    225 	CU_ASSERT_STRING_EQUAL(list->data, "bar");
    226 	CU_ASSERT_STRING_EQUAL(list->next->data, "foo");
    227 	CU_ASSERT_STRING_EQUAL(list->next->next->data, "gonk");
    228 	CU_ASSERT_STRING_EQUAL(list->next->next->next->data, "zebra");
    229 
    230       past_sort:
    231 	ptr = semanage_list_find(list, "zebra");
    232 	CU_ASSERT_PTR_NOT_NULL(ptr);
    233 	ptr = semanage_list_find(list, "bogus");
    234 	CU_ASSERT_PTR_NULL(ptr);
    235 
    236 	semanage_list_destroy(&list);
    237 	CU_ASSERT_PTR_NULL(list);
    238 }
    239 
    240 void test_semanage_str_count(void)
    241 {
    242 	const char *test_string = "abaababbaaaba";
    243 
    244 	CU_ASSERT_EQUAL(semanage_str_count(test_string, 'z'), 0);
    245 	CU_ASSERT_EQUAL(semanage_str_count(test_string, 'a'), 8);
    246 	CU_ASSERT_EQUAL(semanage_str_count(test_string, 'b'), 5);
    247 }
    248 
    249 void test_semanage_rtrim(void)
    250 {
    251 	char *str = strdup("/blah/foo/bar/baz/");
    252 
    253 	CU_ASSERT_PTR_NOT_NULL_FATAL(str);
    254 
    255 	semanage_rtrim(str, 'Q');
    256 	CU_ASSERT_STRING_EQUAL(str, "/blah/foo/bar/baz/");
    257 	semanage_rtrim(str, 'a');
    258 	CU_ASSERT_STRING_EQUAL(str, "/blah/foo/bar/b");
    259 	semanage_rtrim(str, '/');
    260 	CU_ASSERT_STRING_EQUAL(str, "/blah/foo/bar");
    261 
    262 	free(str);
    263 }
    264 
    265 void test_semanage_str_replace(void)
    266 {
    267 	const char *test_str = "Hello, I am %{USERNAME} and my id is %{USERID}";
    268 	char *str1, *str2;
    269 
    270 	str1 = semanage_str_replace("%{USERNAME}", "root", test_str, 0);
    271 	CU_ASSERT_STRING_EQUAL(str1, "Hello, I am root and my id is %{USERID}");
    272 
    273 	str2 = semanage_str_replace("%{USERID}", "0", str1, 1);
    274 	CU_ASSERT_STRING_EQUAL(str2, "Hello, I am root and my id is 0");
    275 	free(str1);
    276 	free(str2);
    277 
    278 	str1 = semanage_str_replace(":(", ";)", "Test :( :) ! :(:(:))(:(", 0);
    279 	CU_ASSERT_STRING_EQUAL(str1, "Test ;) :) ! ;);):))(;)");
    280 	free(str1);
    281 
    282 	str1 = semanage_str_replace(":(", ";)", "Test :( :) ! :(:(:))(:(", 3);
    283 	CU_ASSERT_STRING_EQUAL(str1, "Test ;) :) ! ;);):))(:(");
    284 	free(str1);
    285 
    286 	str1 = semanage_str_replace("", "empty search string", "test", 0);
    287 	CU_ASSERT_EQUAL(str1, NULL);
    288 
    289 	str1 = semanage_str_replace("a", "", "abracadabra", 0);
    290 	CU_ASSERT_STRING_EQUAL(str1, "brcdbr");
    291 	free(str1);
    292 }
    293 
    294 void test_semanage_findval(void)
    295 {
    296 	char *tok;
    297 	if (!fptr) {
    298 		CU_FAIL_FATAL("Temporary file was not created, aborting test.");
    299 	}
    300 	tok = semanage_findval(fname, "one", NULL);
    301 	CU_ASSERT_STRING_EQUAL(tok, "");
    302 	free(tok);
    303 	rewind(fptr);
    304 	tok = semanage_findval(fname, "one", "");
    305 	CU_ASSERT_STRING_EQUAL(tok, "");
    306 	free(tok);
    307 	rewind(fptr);
    308 	tok = semanage_findval(fname, "sigma", "=");
    309 	CU_ASSERT_STRING_EQUAL(tok, "foo");
    310 	free(tok);
    311 }
    312 
    313 int PREDICATE(const char *str)
    314 {
    315 	return semanage_is_prefix(str, "#");
    316 }
    317 
    318 void test_slurp_file_filter(void)
    319 {
    320 	semanage_list_t *data, *tmp;
    321 	int cnt = 0;
    322 
    323 	if (!fptr) {
    324 		CU_FAIL_FATAL("Temporary file was not created, aborting test.");
    325 	}
    326 	rewind(fptr);
    327 	data = semanage_slurp_file_filter(fptr, PREDICATE);
    328 	CU_ASSERT_PTR_NOT_NULL_FATAL(data);
    329 	for (tmp = data; tmp; tmp = tmp->next)
    330 		cnt++;
    331 	CU_ASSERT_EQUAL(cnt, 2);
    332 
    333 	semanage_list_destroy(&data);
    334 }
    335