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