2 ircdtorture: an IRC RFC compliancy tester
3 (c) 2005 Jelmer Vernooij <jelmer@nl.linux.org>
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.
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.
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.
24 #include "ctrlproxy.h"
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);
30 START_TEST(state_init)
31 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
33 fail_if(ns == NULL, "network_state_init returned NULL");
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);
39 fail_unless (g_list_length(ns->channels) == 0);
42 void state_process(struct network_state *ns, const char *line)
45 l = irc_parse_line(line);
47 g_assert(state_handle_data(ns, l));
51 START_TEST(state_join_me)
52 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
53 struct channel_state *cs;
57 state_process(ns, ":bla!user@host JOIN #examplechannel");
59 fail_unless (g_list_length(ns->channels) == 1);
61 cs = ns->channels->data;
63 fail_unless (strcmp(cs->name, "#examplechannel") == 0);
66 START_TEST(state_join_other)
67 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
68 struct channel_state *cs;
72 state_process(ns, ":bla!user@host JOIN #examplechannel");
73 state_process(ns, ":foo!userx@host JOIN #examplechannel");
75 fail_unless (g_list_length(ns->channels) == 1);
77 cs = ns->channels->data;
78 fail_unless (g_list_length(cs->nicks) == 2);
82 START_TEST(state_topic)
83 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
84 struct channel_state *cs;
88 state_process(ns, ":bla!user@host JOIN #examplechannel");
89 state_process(ns, ":bla!user@host TOPIC #examplechannel :This is the topic");
91 cs = ns->channels->data;
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);
99 START_TEST(state_part)
100 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
101 struct channel_state *cs;
105 state_process(ns, ":bla!user@host JOIN #examplechannel");
107 fail_unless (g_list_length(ns->channels) == 1);
109 cs = ns->channels->data;
111 fail_unless (strcmp(cs->name, "#examplechannel") == 0);
113 state_process(ns, ":bla!user@host PART #examplechannel");
115 fail_unless (g_list_length(ns->channels) == 0);
118 START_TEST(state_cycle)
119 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
120 struct channel_state *cs;
124 state_process(ns, ":bla!user@host JOIN #examplechannel");
126 fail_unless (g_list_length(ns->channels) == 1);
128 cs = ns->channels->data;
130 fail_unless (strcmp(cs->name, "#examplechannel") == 0);
132 state_process(ns, ":bla!user@host PART #examplechannel");
134 fail_unless (g_list_length(ns->channels) == 0);
136 state_process(ns, ":bla!user@host JOIN #examplechannel");
138 fail_unless (g_list_length(ns->channels) == 1);
141 START_TEST(state_kick)
142 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
143 struct channel_state *cs;
147 state_process(ns, ":bla!user@host JOIN #examplechannel");
149 fail_unless (g_list_length(ns->channels) == 1);
151 cs = ns->channels->data;
153 fail_unless (strcmp(cs->name, "#examplechannel") == 0);
155 state_process(ns, ":bloe!anotheruser@host KICK #examplechannel bla :Doei");
157 fail_unless (g_list_length(ns->channels) == 0);
160 START_TEST(state_nick_change_my)
161 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
165 state_process(ns, ":bla!user@host NICK blie");
167 fail_unless(strcmp(ns->me.nick, "blie") == 0);
170 START_TEST(state_nick_change_other)
171 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
175 state_process(ns, ":foo!user@bar PRIVMSG bla :Hi");
177 state_process(ns, ":foo!user@bar NICK blie");
179 fail_if (find_network_nick(ns, "foo") != NULL);
180 fail_if (find_network_nick(ns, "blie") == NULL);
183 START_TEST(state_set_nick)
184 struct network_nick nn;
185 memset(&nn, 0, sizeof(nn));
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));
196 START_TEST(state_set_hostmask)
197 struct network_nick nn;
198 memset(&nn, 0, sizeof(nn));
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));
208 fail_if (network_nick_set_hostmask(&nn, "ikkeongeldig"));
209 fail_if (network_nick_set_hostmask(&nn, "ikke!ongeldig"));
212 START_TEST(state_find_network_nick)
213 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
217 state_process(ns, ":foo!user@host PRIVMSG bla :Hoi");
219 fail_unless(find_network_nick(ns, "foo") != NULL);
220 fail_unless(find_network_nick(ns, "foobla") == NULL);
223 START_TEST(state_find_add_network_nick)
224 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
228 fail_if (find_add_network_nick(ns, "foo") == NULL);
229 fail_if (find_add_network_nick(ns, "foo") == NULL);
232 START_TEST(state_handle_state_data)
233 struct network_state *ns = network_state_init("bla", "Gebruikersnaam", "Computernaam");
235 char *args1[] = {"JOIN", "#bla", NULL};
236 char *args2[] = {"UNKNOWN", "#bla", NULL};
238 memset(&l, 0, sizeof(l));
243 fail_unless (state_handle_data(ns, NULL) == FALSE);
244 fail_unless (state_handle_data(ns, &l) == FALSE);
247 fail_unless (state_handle_data(ns, &l) == TRUE);
250 fail_unless (state_handle_data(ns, &l) == FALSE);
253 Suite *state_suite(void)
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);