944
|
1 /* |
|
2 * test-rule.c -- test rule.h functions |
|
3 * |
|
4 * Copyright (c) 2013-2021 David Demelier <markand@malikania.fr> |
|
5 * |
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
|
7 * purpose with or without fee is hereby granted, provided that the above |
|
8 * copyright notice and this permission notice appear in all copies. |
|
9 * |
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
17 */ |
|
18 |
|
19 #define GREATEST_USE_ABBREVS 0 |
|
20 #include <greatest.h> |
|
21 |
|
22 #include <irccd/rule.h> |
|
23 #include <irccd/irccd.h> |
|
24 |
|
25 static void |
|
26 clean(void *udata) |
|
27 { |
|
28 (void)udata; |
|
29 |
|
30 memset(&irc, 0, sizeof (irc)); |
|
31 } |
|
32 |
|
33 GREATEST_TEST |
|
34 basics_insert(void) |
|
35 { |
|
36 struct irc_rule r1 = {0}, r2 = {0}; |
|
37 |
|
38 irc_rule_add(r1.servers, "s1"); |
|
39 irc_rule_add(r2.servers, "s2"); |
|
40 |
|
41 irc_bot_insert_rule(&r1, 0); |
|
42 irc_bot_insert_rule(&r2, 0); |
|
43 |
|
44 GREATEST_ASSERT_EQ(2U, irc.rulesz); |
|
45 GREATEST_ASSERT(memcmp(&irc.rules[0], &r2, sizeof (r2)) == 0); |
|
46 GREATEST_ASSERT(memcmp(&irc.rules[1], &r1, sizeof (r1)) == 0); |
|
47 GREATEST_PASS(); |
|
48 } |
|
49 |
|
50 GREATEST_TEST |
|
51 basics_remove(void) |
|
52 { |
|
53 struct irc_rule r1 = {0}, r2 = {0}, r3 = {0}; |
|
54 |
|
55 irc_rule_add(r1.servers, "s1"); |
|
56 irc_rule_add(r2.servers, "s2"); |
|
57 irc_rule_add(r3.servers, "s3"); |
|
58 |
|
59 irc_bot_insert_rule(&r1, -1); |
|
60 irc_bot_insert_rule(&r2, -1); |
|
61 irc_bot_insert_rule(&r3, -1); |
|
62 irc_bot_remove_rule(1); |
|
63 |
|
64 GREATEST_ASSERT_EQ(2U, irc.rulesz); |
|
65 GREATEST_ASSERT(memcmp(&irc.rules[0], &r1, sizeof (r1)) == 0); |
|
66 GREATEST_ASSERT(memcmp(&irc.rules[1], &r3, sizeof (r3)) == 0); |
|
67 |
|
68 irc_bot_remove_rule(1); |
|
69 GREATEST_ASSERT_EQ(1U, irc.rulesz); |
|
70 GREATEST_ASSERT(memcmp(&irc.rules[0], &r1, sizeof (r1)) == 0); |
|
71 |
|
72 irc_bot_remove_rule(0); |
|
73 GREATEST_ASSERT_EQ(0U, irc.rulesz); |
|
74 |
|
75 GREATEST_PASS(); |
|
76 } |
|
77 |
|
78 /* |
|
79 * Simulate the following rules configuration: |
|
80 * |
|
81 * # |
|
82 * # On all servers, each channel #staff can't use the onCommand event, |
|
83 * # everything else is allowed. |
|
84 * # |
|
85 * [rule] #1 |
|
86 * servers = "" |
|
87 * channels = "#staff" |
|
88 * events = "onCommand" |
|
89 * action = drop |
|
90 * |
|
91 * # |
|
92 * # However, the same onCommand on #staff is allowed on server "unsafe" |
|
93 * # |
|
94 * [rule] #2 |
|
95 * servers = "unsafe" |
|
96 * channels = "#staff" |
|
97 * events = "onCommand" |
|
98 * action = accept |
|
99 * |
|
100 * # |
|
101 * # Plugin game is only allowed on server "malikania" and "localhost", |
|
102 * # channel "#games" and events "onMessage, onCommand". |
|
103 * # |
|
104 * # The first rule #3-1 disable the plugin game for every server, it is |
|
105 * # reenabled again with the #3-2. |
|
106 * # |
|
107 * [rule] #3-1 |
|
108 * plugins = "game" |
|
109 * action = drop |
|
110 * |
|
111 * [rule] #3-2 |
|
112 * servers = "malikania localhost" |
|
113 * channels = "#games" |
|
114 * plugins = "game" |
|
115 * events = "onMessage onCommand" |
|
116 * action = accept |
|
117 */ |
|
118 |
|
119 static void |
|
120 set(void *udata) |
|
121 { |
|
122 (void)udata; |
|
123 |
|
124 struct irc_rule r1 = {0}, r2 = {0}, r31 = {0}, r32 = {0}; |
|
125 |
|
126 /* Deinit irccd first. */ |
|
127 memset(&irc, 0, sizeof (irc)); |
|
128 |
|
129 /* #1 */ |
|
130 r1.action = IRC_RULE_DROP; |
|
131 irc_rule_add(r1.channels, "#staff"); |
|
132 irc_rule_add(r1.events, "onCommand"); |
|
133 irc_bot_insert_rule(&r1, -1); |
|
134 |
|
135 /* #2 */ |
|
136 r2.action = IRC_RULE_ACCEPT; |
|
137 irc_rule_add(r2.servers, "unsafe"); |
|
138 irc_rule_add(r2.channels, "#staff"); |
|
139 irc_rule_add(r2.events, "onCommand"); |
|
140 irc_bot_insert_rule(&r2, -1); |
|
141 |
|
142 /* #3-1 */ |
|
143 r31.action = IRC_RULE_DROP; |
|
144 irc_rule_add(r31.plugins, "game"); |
|
145 irc_bot_insert_rule(&r31, -1); |
|
146 |
|
147 /* #3-2 */ |
|
148 r32.action = IRC_RULE_ACCEPT; |
|
149 irc_rule_add(r32.servers, "malikania"); |
|
150 irc_rule_add(r32.servers, "localhost"); |
|
151 irc_rule_add(r32.channels, "#games"); |
|
152 irc_rule_add(r32.plugins, "game"); |
|
153 irc_rule_add(r32.events, "onCommand"); |
|
154 irc_rule_add(r32.events, "onMessage"); |
|
155 irc_bot_insert_rule(&r32, -1); |
|
156 }; |
|
157 |
|
158 GREATEST_TEST |
|
159 solve_match1(void) |
|
160 { |
|
161 struct irc_rule m = {0}; |
|
162 |
|
163 GREATEST_ASSERT(irc_rule_match(&m, "freenode", "#test", "a", "", "")); |
|
164 GREATEST_ASSERT(irc_rule_match(&m, "", "", "", "", "")); |
|
165 GREATEST_PASS(); |
|
166 } |
|
167 |
|
168 GREATEST_TEST |
|
169 solve_match2(void) |
|
170 { |
|
171 struct irc_rule m = {0}; |
|
172 |
|
173 irc_rule_add(m.servers, "freenode"); |
|
174 |
|
175 GREATEST_ASSERT(irc_rule_match(&m, "FreeNode", "#test", "a", "", "")); |
|
176 GREATEST_ASSERT(!irc_rule_match(&m, "malikania", "#test", "a", "", "")); |
|
177 GREATEST_ASSERT(irc_rule_match(&m, "freenode", "", "jean", "", "onMessage")); |
|
178 GREATEST_PASS(); |
|
179 } |
|
180 |
|
181 GREATEST_TEST |
|
182 solve_match3(void) |
|
183 { |
|
184 struct irc_rule m = {0}; |
|
185 |
|
186 irc_rule_add(m.servers, "freenode"); |
|
187 irc_rule_add(m.channels, "#staff"); |
|
188 |
|
189 GREATEST_ASSERT(irc_rule_match(&m, "freenode", "#staff", "a", "", "")); |
|
190 GREATEST_ASSERT(!irc_rule_match(&m, "freenode", "#test", "a", "", "")); |
|
191 GREATEST_ASSERT(!irc_rule_match(&m, "malikania", "#staff", "a", "", "")); |
|
192 GREATEST_PASS(); |
|
193 } |
|
194 |
|
195 GREATEST_TEST |
|
196 solve_match4(void) |
|
197 { |
|
198 struct irc_rule m = {0}; |
|
199 |
|
200 irc_rule_add(m.servers, "malikania"); |
|
201 irc_rule_add(m.channels, "#staff"); |
|
202 irc_rule_add(m.origins, "a"); |
|
203 |
|
204 GREATEST_ASSERT(irc_rule_match(&m, "malikania", "#staff", "a", "","")); |
|
205 GREATEST_ASSERT(!irc_rule_match(&m, "malikania", "#staff", "b", "", "")); |
|
206 GREATEST_ASSERT(!irc_rule_match(&m, "freenode", "#staff", "a", "", "")); |
|
207 GREATEST_PASS(); |
|
208 } |
|
209 |
|
210 GREATEST_TEST |
|
211 solve_match5(void) |
|
212 { |
|
213 struct irc_rule m = {0}; |
|
214 |
|
215 irc_rule_add(m.servers, "malikania"); |
|
216 irc_rule_add(m.servers, "freenode"); |
|
217 |
|
218 GREATEST_ASSERT(irc_rule_match(&m, "malikania", "", "", "", "")); |
|
219 GREATEST_ASSERT(irc_rule_match(&m, "freenode", "", "", "", "")); |
|
220 GREATEST_ASSERT(!irc_rule_match(&m, "no", "", "", "", "")); |
|
221 GREATEST_PASS(); |
|
222 } |
|
223 |
|
224 GREATEST_TEST |
|
225 solve_match6(void) |
|
226 { |
|
227 struct irc_rule m = {0}; |
|
228 |
|
229 irc_rule_add(m.servers, "malikania"); |
|
230 irc_rule_add(m.origins, "markand"); |
|
231 |
|
232 GREATEST_ASSERT(irc_rule_match(&m, "malikania", "#staff", "markand", "system", "onCommand")); |
|
233 GREATEST_ASSERT(!irc_rule_match(&m, "malikania", "#staff", "", "system", "onNames")); |
|
234 GREATEST_ASSERT(!irc_rule_match(&m, "malikania", "#staff", "jean", "system", "onMessage")); |
|
235 GREATEST_PASS(); |
|
236 } |
|
237 |
|
238 GREATEST_TEST |
|
239 solve_match7(void) |
|
240 { |
|
241 /* Allowed */ |
|
242 GREATEST_ASSERT(irc_rule_matchlist(irc.rules, irc.rulesz, "malikania", "#staff", "", "a", "onMessage")); |
|
243 |
|
244 /* Allowed */ |
|
245 GREATEST_ASSERT(irc_rule_matchlist(irc.rules, irc.rulesz, "freenode", "#staff", "", "b", "onTopic")); |
|
246 |
|
247 /* Not allowed */ |
|
248 GREATEST_ASSERT(!irc_rule_matchlist(irc.rules, irc.rulesz, "malikania", "#staff", "", "", "onCommand")); |
|
249 |
|
250 /* Not allowed */ |
|
251 GREATEST_ASSERT(!irc_rule_matchlist(irc.rules, irc.rulesz, "freenode", "#staff", "", "c", "onCommand")); |
|
252 |
|
253 /* Allowed */ |
|
254 GREATEST_ASSERT(irc_rule_matchlist(irc.rules, irc.rulesz, "unsafe", "#staff", "", "c", "onCommand")); |
|
255 |
|
256 GREATEST_PASS(); |
|
257 } |
|
258 |
|
259 GREATEST_TEST |
|
260 solve_match8(void) |
|
261 { |
|
262 /* Allowed */ |
|
263 GREATEST_ASSERT(irc_rule_matchlist(irc.rules, irc.rulesz, "malikania", "#games", "", "game", "onMessage")); |
|
264 |
|
265 /* Allowed */ |
|
266 GREATEST_ASSERT(irc_rule_matchlist(irc.rules, irc.rulesz, "localhost", "#games", "", "game", "onMessage")); |
|
267 |
|
268 /* Allowed */ |
|
269 GREATEST_ASSERT(irc_rule_matchlist(irc.rules, irc.rulesz, "malikania", "#games", "", "game", "onCommand")); |
|
270 |
|
271 /* Not allowed */ |
|
272 GREATEST_ASSERT(!irc_rule_matchlist(irc.rules, irc.rulesz, "malikania", "#games", "", "game", "onQuery")); |
|
273 |
|
274 /* Not allowed */ |
|
275 GREATEST_ASSERT(!irc_rule_matchlist(irc.rules, irc.rulesz, "freenode", "#no", "", "game", "onMessage")); |
|
276 |
|
277 /* Not allowed */ |
|
278 GREATEST_ASSERT(!irc_rule_matchlist(irc.rules, irc.rulesz, "malikania", "#test", "", "game", "onMessage")); |
|
279 GREATEST_PASS(); |
|
280 } |
|
281 |
|
282 GREATEST_TEST |
|
283 solve_match9(void) |
|
284 { |
|
285 GREATEST_ASSERT(!irc_rule_matchlist(irc.rules, irc.rulesz, "MALIKANIA", "#STAFF", "", "SYSTEM", "onCommand")); |
|
286 GREATEST_PASS(); |
|
287 } |
|
288 |
|
289 GREATEST_SUITE(suite_basics) |
|
290 { |
|
291 GREATEST_SET_SETUP_CB(clean, NULL); |
|
292 GREATEST_RUN_TEST(basics_insert); |
|
293 GREATEST_RUN_TEST(basics_remove); |
|
294 } |
|
295 |
|
296 GREATEST_SUITE(suite_solve) |
|
297 { |
|
298 GREATEST_SET_SETUP_CB(set, NULL); |
|
299 GREATEST_RUN_TEST(solve_match1); |
|
300 GREATEST_RUN_TEST(solve_match2); |
|
301 GREATEST_RUN_TEST(solve_match3); |
|
302 GREATEST_RUN_TEST(solve_match4); |
|
303 GREATEST_RUN_TEST(solve_match5); |
|
304 GREATEST_RUN_TEST(solve_match6); |
|
305 GREATEST_RUN_TEST(solve_match7); |
|
306 GREATEST_RUN_TEST(solve_match8); |
|
307 GREATEST_RUN_TEST(solve_match9); |
|
308 } |
|
309 |
|
310 GREATEST_MAIN_DEFS(); |
|
311 |
|
312 int |
|
313 main(int argc, char **argv) |
|
314 { |
|
315 GREATEST_MAIN_BEGIN(); |
|
316 GREATEST_RUN_SUITE(suite_basics); |
|
317 GREATEST_RUN_SUITE(suite_solve); |
|
318 GREATEST_MAIN_END(); |
|
319 |
|
320 return 0; |
|
321 } |