Change license to GPLv3.
[jelmer/ctrlproxy.git] / testsuite / test-state.c
1 /*
2     ircdtorture: an IRC RFC compliancy tester
3         (c) 2005 Jelmer Vernooij <jelmer@nl.linux.org>
4
5         This program is free software; you can redistribute it and/or modify
6         it under the terms of the GNU General Public License as published by
7         the Free Software Foundation; either version 3 of the License, or
8         (at your option) any later version.
9
10         This program 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
13         GNU General Public License for more details.
14
15         You should have received a copy of the GNU General Public License
16         along with this program; if not, write to the Free Software
17         Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #include <stdio.h>
21 #include <unistd.h>
22 #include <string.h>
23 #include <check.h>
24 #include "ctrlproxy.h"
25
26 gboolean network_nick_set_nick(struct network_nick *, const char *);
27 gboolean network_nick_set_hostmask(struct network_nick *, const char *);
28 struct network_nick *find_add_network_nick(struct network_state *n, const char *name);
29
30 START_TEST(state_init)
31         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
32
33         fail_if(ns == NULL, "network_state_init returned NULL");
34
35         fail_unless (strcmp(ns->me.nick, "bla") == 0);
36         fail_unless (strcmp(ns->me.username, "Gebruikersnaam") == 0);
37         fail_unless (strcmp(ns->me.hostname, "Computernaam") == 0);
38
39         fail_unless (g_list_length(ns->channels) == 0);
40 END_TEST
41
42 void state_process(struct network_state *ns, const char *line)
43 {
44         struct line *l;
45         l = irc_parse_line(line);
46         g_assert(l);
47         g_assert(state_handle_data(ns, l));
48         free_line(l);
49 }
50
51 START_TEST(state_join_me)
52         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
53         struct channel_state *cs;
54
55         fail_if (!ns);
56
57         state_process(ns, ":bla!user@host JOIN #examplechannel");
58
59         fail_unless (g_list_length(ns->channels) == 1);
60         
61         cs = ns->channels->data;
62
63         fail_unless (strcmp(cs->name, "#examplechannel") == 0);
64 END_TEST
65
66 START_TEST(state_join_other)
67         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
68         struct channel_state *cs;
69
70         fail_if (!ns);
71
72         state_process(ns, ":bla!user@host JOIN #examplechannel");
73         state_process(ns, ":foo!userx@host JOIN #examplechannel");
74
75         fail_unless (g_list_length(ns->channels) == 1);
76         
77         cs = ns->channels->data;
78         fail_unless (g_list_length(cs->nicks) == 2);
79 END_TEST
80
81
82 START_TEST(state_topic)
83         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
84         struct channel_state *cs;
85
86         fail_if (!ns);
87
88         state_process(ns, ":bla!user@host JOIN #examplechannel");
89         state_process(ns, ":bla!user@host TOPIC #examplechannel :This is the topic");
90
91         cs = ns->channels->data;
92
93         fail_unless (strcmp(cs->topic, "This is the topic") == 0);
94         fail_unless (abs(cs->topic_set_time - time(NULL)) < 5);
95         fail_unless (strcmp(cs->topic_set_by, "bla") == 0);
96 END_TEST
97
98
99 START_TEST(state_part)
100         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
101         struct channel_state *cs;
102
103         fail_if (!ns);
104
105         state_process(ns, ":bla!user@host JOIN #examplechannel");
106
107         fail_unless (g_list_length(ns->channels) == 1);
108         
109         cs = ns->channels->data;
110
111         fail_unless (strcmp(cs->name, "#examplechannel") == 0);
112         
113         state_process(ns, ":bla!user@host PART #examplechannel");
114
115         fail_unless (g_list_length(ns->channels) == 0);
116 END_TEST
117
118 START_TEST(state_cycle)
119         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
120         struct channel_state *cs;
121
122         fail_if (!ns);
123
124         state_process(ns, ":bla!user@host JOIN #examplechannel");
125
126         fail_unless (g_list_length(ns->channels) == 1);
127         
128         cs = ns->channels->data;
129
130         fail_unless (strcmp(cs->name, "#examplechannel") == 0);
131         
132         state_process(ns, ":bla!user@host PART #examplechannel");
133
134         fail_unless (g_list_length(ns->channels) == 0);
135
136         state_process(ns, ":bla!user@host JOIN #examplechannel");
137
138         fail_unless (g_list_length(ns->channels) == 1);
139 END_TEST
140
141 START_TEST(state_kick)
142         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
143         struct channel_state *cs;
144
145         fail_if (!ns);
146
147         state_process(ns, ":bla!user@host JOIN #examplechannel");
148
149         fail_unless (g_list_length(ns->channels) == 1);
150         
151         cs = ns->channels->data;
152
153         fail_unless (strcmp(cs->name, "#examplechannel") == 0);
154         
155         state_process(ns, ":bloe!anotheruser@host KICK #examplechannel bla :Doei");
156
157         fail_unless (g_list_length(ns->channels) == 0);
158 END_TEST
159
160 START_TEST(state_nick_change_my)
161         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
162
163         fail_if(ns == NULL);
164
165         state_process(ns, ":bla!user@host NICK blie");
166
167         fail_unless(strcmp(ns->me.nick, "blie") == 0);
168 END_TEST
169
170 START_TEST(state_nick_change_other)
171         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
172
173         fail_if(ns == NULL);
174
175         state_process(ns, ":foo!user@bar PRIVMSG bla :Hi");
176
177         state_process(ns, ":foo!user@bar NICK blie");
178
179         fail_if (find_network_nick(ns, "foo") != NULL);
180         fail_if (find_network_nick(ns, "blie") == NULL);
181 END_TEST
182
183 START_TEST(state_set_nick)
184         struct network_nick nn;
185         memset(&nn, 0, sizeof(nn));
186         
187         fail_if (!network_nick_set_nick(&nn, "mynick"));
188         fail_unless (strcmp(nn.nick, "mynick") == 0);
189         fail_unless (strcmp(nn.hostmask, "mynick!(null)@(null)") == 0);
190         fail_if (!network_nick_set_nick(&nn, "mynick"));
191         fail_unless (strcmp(nn.nick, "mynick") == 0);
192         fail_unless (strcmp(nn.hostmask, "mynick!(null)@(null)") == 0);
193         fail_if (network_nick_set_nick(NULL, NULL));
194 END_TEST
195
196 START_TEST(state_set_hostmask)
197         struct network_nick nn;
198         memset(&nn, 0, sizeof(nn));
199
200         fail_if (!network_nick_set_hostmask(&nn, "ikke!~uname@uhost"));
201         fail_if (!nn.nick || strcmp(nn.nick, "ikke") != 0);
202         fail_if (!nn.username || strcmp(nn.username, "~uname") != 0);
203         fail_if (!nn.hostname || strcmp(nn.hostname, "uhost") != 0);
204         fail_if (!network_nick_set_hostmask(&nn, "ikke!~uname@uhost"));
205         fail_if (network_nick_set_hostmask(NULL, NULL));
206         fail_if (network_nick_set_hostmask(&nn, NULL));
207
208         fail_if (network_nick_set_hostmask(&nn, "ikkeongeldig"));
209         fail_if (network_nick_set_hostmask(&nn, "ikke!ongeldig"));
210 END_TEST
211
212 START_TEST(state_find_network_nick)
213         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
214
215         fail_if(ns == NULL);
216
217         state_process(ns, ":foo!user@host PRIVMSG bla :Hoi");
218
219         fail_unless(find_network_nick(ns, "foo") != NULL);
220         fail_unless(find_network_nick(ns, "foobla") == NULL);
221 END_TEST
222
223 START_TEST(state_find_add_network_nick)
224         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
225
226         fail_if(ns == NULL);
227
228         fail_if (find_add_network_nick(ns, "foo") == NULL);
229         fail_if (find_add_network_nick(ns, "foo") == NULL);
230 END_TEST
231
232 START_TEST(state_handle_state_data)
233         struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
234         struct line l;
235         char *args1[] = {"JOIN", "#bla", NULL};
236         char *args2[] = {"UNKNOWN", "#bla", NULL};
237
238         memset(&l, 0, sizeof(l));
239         l.origin = "foo";
240
241         fail_if(ns == NULL);
242
243         fail_unless (state_handle_data(ns, NULL) == FALSE);
244         fail_unless (state_handle_data(ns, &l) == FALSE);
245         l.argc = 2;
246         l.args = args1;
247         fail_unless (state_handle_data(ns, &l) == TRUE);
248         l.argc = 2;
249         l.args = args2;
250         fail_unless (state_handle_data(ns, &l) == FALSE);
251 END_TEST
252
253 Suite *state_suite(void)
254 {
255         Suite *s = suite_create("state");
256         TCase *tc_core = tcase_create("Core");
257         suite_add_tcase(s, tc_core);
258         tcase_add_test(tc_core, state_init);
259         tcase_add_test(tc_core, state_join_me);
260         tcase_add_test(tc_core, state_join_other);
261         tcase_add_test(tc_core, state_topic);
262         tcase_add_test(tc_core, state_part);
263         tcase_add_test(tc_core, state_cycle);
264         tcase_add_test(tc_core, state_kick);
265         tcase_add_test(tc_core, state_set_nick);
266         tcase_add_test(tc_core, state_set_nick);
267         tcase_add_test(tc_core, state_set_hostmask);
268         tcase_add_test(tc_core, state_nick_change_my);
269         tcase_add_test(tc_core, state_nick_change_other);
270         tcase_add_test(tc_core, state_find_network_nick);
271         tcase_add_test(tc_core, state_find_add_network_nick);
272         tcase_add_test(tc_core, state_handle_state_data);
273         return s;
274 }