1 /* Authors: Mark Goldman <mgoldman@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_findval(void);
44 void test_slurp_file_filter(void);
45 
46 char fname[] = {
47 	'T', 'E', 'S', 'T', '_', 'T', 'E', 'M', 'P', '_', 'X', 'X', 'X', 'X',
48 	'X', 'X', '\0'
49 };
50 int fd;
51 FILE *fptr;
52 
semanage_utilities_test_init(void)53 int semanage_utilities_test_init(void)
54 {
55 	fd = mkstemp(fname);
56 
57 	if (fd < 0) {
58 		perror("test_semanage_findval: ");
59 		CU_FAIL_FATAL
60 		    ("Error opening temporary file, test cannot start.");
61 	}
62 
63 	fptr = fdopen(fd, "w+");
64 	if (!fptr) {
65 		perror("test_semanage_findval file: ");
66 		CU_FAIL_FATAL("Error opening file stream, test cannot start.");
67 	}
68 
69 	fprintf(fptr, "one\ntwo\nthree\nsigma=foo\n#boo\n#bar\n");
70 
71 	rewind(fptr);
72 	return 0;
73 }
74 
semanage_utilities_test_cleanup(void)75 int semanage_utilities_test_cleanup(void)
76 {
77 	unlink(fname);
78 	return 0;
79 }
80 
semanage_utilities_add_tests(CU_pSuite suite)81 int semanage_utilities_add_tests(CU_pSuite suite)
82 {
83 	if (NULL == CU_add_test(suite, "semanage_is_prefix",
84 				test_semanage_is_prefix)) {
85 		goto err;
86 	}
87 	if (NULL == CU_add_test(suite, "semanage_split_on_space",
88 				test_semanage_split_on_space)) {
89 		goto err;
90 	}
91 	if (NULL == CU_add_test(suite, "semanage_split", test_semanage_split)) {
92 		goto err;
93 	}
94 	if (NULL == CU_add_test(suite, "semanage_list", test_semanage_list)) {
95 		goto err;
96 	}
97 	if (NULL == CU_add_test(suite, "semanage_str_count",
98 				test_semanage_str_count)) {
99 		goto err;
100 	}
101 	if (NULL == CU_add_test(suite, "semanage_rtrim", test_semanage_rtrim)) {
102 		goto err;
103 	}
104 	if (NULL == CU_add_test(suite, "semanage_findval",
105 				test_semanage_findval)) {
106 		goto err;
107 	}
108 	if (NULL == CU_add_test(suite, "slurp_file_filter",
109 				test_slurp_file_filter)) {
110 		goto err;
111 	}
112 	return 0;
113       err:
114 	CU_cleanup_registry();
115 	return CU_get_error();
116 }
117 
test_semanage_is_prefix(void)118 void test_semanage_is_prefix(void)
119 {
120 	char *str = "some string";
121 	char *pre = "some";
122 	char *not_pre = "not this";
123 
124 	CU_ASSERT_TRUE(semanage_is_prefix(str, pre));
125 	CU_ASSERT_TRUE(semanage_is_prefix(str, ""));
126 	CU_ASSERT_TRUE(semanage_is_prefix(str, NULL));
127 	CU_ASSERT_FALSE(semanage_is_prefix(str, not_pre));
128 }
129 
test_semanage_split_on_space(void)130 void test_semanage_split_on_space(void)
131 {
132 	char *str = strdup("foo bar baz");
133 	char *temp;
134 
135 	if (!str) {
136 		CU_FAIL
137 		    ("semanage_split_on_space: unable to perform test, no memory");
138 	}
139 	temp = semanage_split_on_space(str);
140 	if (strncmp(temp, "bar", 3)) {
141 		CU_FAIL("semanage_split_on_space: token did not match");
142 	}
143 	temp = semanage_split_on_space(temp);
144 	if (strncmp(temp, "baz", 3)) {
145 		CU_FAIL("semanage_split_on_space: token did not match");
146 	}
147 	temp = semanage_split_on_space(temp);
148 	if (strcmp(temp, "")) {
149 		CU_FAIL("semanage_split_on_space: token did not match");
150 	}
151 
152 	free(str);
153 }
154 
test_semanage_split(void)155 void test_semanage_split(void)
156 {
157 	char *str = strdup("foo1 foo2 foo:bar");
158 	char *temp;
159 
160 	if (!str) {
161 		CU_FAIL
162 		    ("semanage_split_on_space: unable to perform test, no memory");
163 		return;
164 	}
165 	temp = semanage_split(str, NULL);
166 	CU_ASSERT_NSTRING_EQUAL(temp, "foo2", 4);
167 	temp = semanage_split(temp, "");
168 	CU_ASSERT_NSTRING_EQUAL(temp, "foo", 3);
169 	temp = semanage_split(temp, ":");
170 	CU_ASSERT_NSTRING_EQUAL(temp, "bar", 3);
171 
172 	free(str);
173 }
174 
test_semanage_list(void)175 void test_semanage_list(void)
176 {
177 	semanage_list_t *list = NULL;
178 	semanage_list_t *ptr = NULL;
179 	char *temp = NULL;
180 	int retval = 0;
181 
182 	CU_ASSERT_FALSE(semanage_list_push(&list, "foo"));
183 	CU_ASSERT_PTR_NOT_NULL(list);
184 	CU_ASSERT_FALSE(semanage_list_push(&list, "bar"));
185 	CU_ASSERT_FALSE(semanage_list_push(&list, "gonk"));
186 	CU_ASSERT_FALSE(semanage_list_push(&list, "zebra"));
187 
188 	for (ptr = list; ptr; ptr = ptr->next)
189 		retval++;
190 	CU_ASSERT_EQUAL(retval, 4);
191 
192 	temp = semanage_list_pop(&list);
193 	CU_ASSERT_STRING_EQUAL(temp, "zebra");
194 	CU_ASSERT_FALSE(semanage_list_push(&list, temp));
195 	free(temp);
196 	temp = NULL;
197 
198 	retval = 0;
199 	for (ptr = list; ptr; ptr = ptr->next)
200 		retval++;
201 	CU_ASSERT_EQUAL(retval, 4);
202 
203 	retval = semanage_list_sort(&list);
204 	if (retval) {
205 		CU_FAIL
206 		    ("semanage_list_sort: error unrelated to sort (memory?)");
207 		goto past_sort;
208 	}
209 	CU_ASSERT_STRING_EQUAL(list->data, "bar");
210 	CU_ASSERT_STRING_EQUAL(list->next->data, "foo");
211 	CU_ASSERT_STRING_EQUAL(list->next->next->data, "gonk");
212 	CU_ASSERT_STRING_EQUAL(list->next->next->next->data, "zebra");
213 
214       past_sort:
215 	ptr = semanage_list_find(list, "zebra");
216 	CU_ASSERT_PTR_NOT_NULL(ptr);
217 	ptr = semanage_list_find(list, "bogus");
218 	CU_ASSERT_PTR_NULL(ptr);
219 
220 	semanage_list_destroy(&list);
221 	CU_ASSERT_PTR_NULL(list);
222 }
223 
test_semanage_str_count(void)224 void test_semanage_str_count(void)
225 {
226 	char *test_string = "abaababbaaaba";
227 
228 	CU_ASSERT_EQUAL(semanage_str_count(test_string, 'z'), 0);
229 	CU_ASSERT_EQUAL(semanage_str_count(test_string, 'a'), 8);
230 	CU_ASSERT_EQUAL(semanage_str_count(test_string, 'b'), 5);
231 }
232 
test_semanage_rtrim(void)233 void test_semanage_rtrim(void)
234 {
235 	char *str = strdup("/blah/foo/bar/baz/");
236 
237 	CU_ASSERT_PTR_NOT_NULL_FATAL(str);
238 
239 	semanage_rtrim(str, 'Q');
240 	CU_ASSERT_STRING_EQUAL(str, "/blah/foo/bar/baz/");
241 	semanage_rtrim(str, 'a');
242 	CU_ASSERT_STRING_EQUAL(str, "/blah/foo/bar/b");
243 	semanage_rtrim(str, '/');
244 	CU_ASSERT_STRING_EQUAL(str, "/blah/foo/bar");
245 }
246 
test_semanage_findval(void)247 void test_semanage_findval(void)
248 {
249 	char *tok;
250 	if (!fptr) {
251 		CU_FAIL_FATAL("Temporary file was not created, aborting test.");
252 	}
253 	tok = semanage_findval(fname, "one", NULL);
254 	CU_ASSERT_STRING_EQUAL(tok, "");
255 	rewind(fptr);
256 	tok = semanage_findval(fname, "one", "");
257 	CU_ASSERT_STRING_EQUAL(tok, "");
258 	free(tok);
259 	rewind(fptr);
260 	tok = semanage_findval(fname, "sigma", "=");
261 	CU_ASSERT_STRING_EQUAL(tok, "foo");
262 }
263 
PREDICATE(const char * str)264 int PREDICATE(const char *str)
265 {
266 	return semanage_is_prefix(str, "#");
267 }
268 
test_slurp_file_filter(void)269 void test_slurp_file_filter(void)
270 {
271 	semanage_list_t *data, *tmp;
272 	int cnt = 0;
273 
274 	if (!fptr) {
275 		CU_FAIL_FATAL("Temporary file was not created, aborting test.");
276 	}
277 	rewind(fptr);
278 	data = semanage_slurp_file_filter(fptr, PREDICATE);
279 	CU_ASSERT_PTR_NOT_NULL_FATAL(data);
280 	for (tmp = data; tmp; tmp = tmp->next)
281 		cnt++;
282 	CU_ASSERT_EQUAL(cnt, 2);
283 
284 	semanage_list_destroy(&data);
285 }
286