8 static const char *malformed[] = {
10 ":bar :bar PRIVMSG foo",
17 START_TEST(parser_malformed)
22 for (j = 0; malformed[j]; j++) {
23 l = irc_parse_line(malformed[j]);
25 raw = irc_line_string(l);
33 START_TEST(parser_random)
37 FILE *f = fopen("/dev/urandom", "r");
40 fail_if (!f, "Couldn't open /dev/urandom");
42 for (j = 0; j < 200; j++) {
43 fail_if (!fgets(buf, sizeof(buf)-2, f), "error reading random data");
45 l = irc_parse_line(buf);
47 raw = irc_line_string(l);
55 START_TEST(parser_vargs)
56 struct line *l = irc_parse_line_args( "FOO", "x", "y", NULL);
59 fail_if (strcmp(l->origin, "FOO") != 0);
60 fail_if (l->argc != 2);
61 fail_if (strcmp(l->args[0], "x") != 0);
62 fail_if (strcmp(l->args[1], "y") != 0);
65 START_TEST( parser_stringnl)
68 char *args[] = { "x", "y", "z", NULL };
72 l.has_endcolon = WITHOUT_COLON;
74 ret = irc_line_string_nl(&l);
76 fail_if (strcmp(ret, ":foobar x y z\r\n") != 0);
79 START_TEST(parser_get_nick)
84 nick = line_get_nick(&l);
85 fail_if (strcmp(nick, "foobar") != 0);
86 l.origin = "foobar!~username@userhost";
88 nick = line_get_nick(&l);
89 fail_if (strcmp(nick, "foobar") != 0);
93 START_TEST(parser_recv_line)
94 GIOChannel *ch1, *ch2;
98 g_io_channel_pair(&ch1, &ch2);
99 g_io_channel_set_flags(ch1, G_IO_FLAG_NONBLOCK, NULL);
100 g_io_channel_set_flags(ch2, G_IO_FLAG_NONBLOCK, NULL);
102 iconv = g_iconv_open("UTF-8", "UTF-8");
104 g_io_channel_write_chars(ch2, "PRIVMSG :bla\r\nFOO", -1, NULL, NULL);
105 g_io_channel_flush(ch2, NULL);
107 fail_unless(irc_recv_line(ch1, iconv, NULL, &l) == G_IO_STATUS_NORMAL);
108 fail_unless(l->argc == 2);
109 fail_unless(!strcmp(l->args[0], "PRIVMSG"));
110 fail_unless(!strcmp(l->args[1], "bla"));
111 fail_unless(irc_recv_line(ch1, iconv, NULL, &l) == G_IO_STATUS_AGAIN);
113 g_iconv_close(iconv);
116 START_TEST(parser_recv_line_invalid)
117 GIOChannel *ch1, *ch2;
121 g_io_channel_pair(&ch1, &ch2);
122 g_io_channel_set_flags(ch1, G_IO_FLAG_NONBLOCK, NULL);
123 g_io_channel_set_flags(ch2, G_IO_FLAG_NONBLOCK, NULL);
124 g_io_channel_set_encoding(ch1, NULL, NULL);
125 g_io_channel_set_encoding(ch2, NULL, NULL);
127 iconv = g_iconv_open("ISO8859-1", "UTF-8");
129 g_io_channel_write_chars(ch2, "PRIVMSG :bl\366a\r\n", -1, NULL, NULL);
130 g_io_channel_flush(ch2, NULL);
132 fail_unless(irc_recv_line(ch1, iconv, NULL, &l) == G_IO_STATUS_NORMAL);
133 fail_unless(l->argc == 2);
134 fail_unless(!strcmp(l->args[0], "PRIVMSG"));
135 fail_unless(!strcmp(l->args[1], "bla"));
136 fail_unless(irc_recv_line(ch1, iconv, NULL, &l) == G_IO_STATUS_AGAIN);
138 g_iconv_close(iconv);
143 START_TEST(parser_recv_line_iso8859)
144 GIOChannel *ch1, *ch2;
148 g_io_channel_pair(&ch1, &ch2);
149 g_io_channel_set_flags(ch1, G_IO_FLAG_NONBLOCK, NULL);
150 g_io_channel_set_flags(ch2, G_IO_FLAG_NONBLOCK, NULL);
151 g_io_channel_set_encoding(ch1, NULL, NULL);
152 g_io_channel_set_encoding(ch2, NULL, NULL);
154 iconv = g_iconv_open("UTF-8", "ISO8859-1");
156 fail_if(iconv == (GIConv)-1);
158 g_io_channel_write_chars(ch2, "PRIVMSG \366 p\r\n", -1, NULL, NULL);
159 g_io_channel_flush(ch2, NULL);
161 fail_unless(irc_recv_line(ch1, iconv, NULL, &l) == G_IO_STATUS_NORMAL);
162 fail_unless(l->argc == 3);
163 fail_unless(!strcmp(l->args[0], "PRIVMSG"));
164 fail_unless(!strcmp(l->args[1], "ö"));
165 fail_unless(irc_recv_line(ch1, iconv, NULL, &l) == G_IO_STATUS_AGAIN);
167 g_iconv_close(iconv);
172 START_TEST(parser_dup)
174 char *args[] = { "x", "y", "z", NULL };
183 fail_if (l.is_private != m->is_private);
184 fail_if (strcmp(l.origin, m->origin));
185 fail_if (l.argc != m->argc);
186 fail_if (strcmp(l.args[0], m->args[0]));
187 fail_if (strcmp(l.args[1], m->args[1]));
188 fail_if (strcmp(l.args[2], m->args[2]));
195 START_TEST(send_args)
196 GIOChannel *ch1, *ch2;
199 g_io_channel_pair(&ch1, &ch2);
200 g_io_channel_set_flags(ch1, G_IO_FLAG_NONBLOCK, NULL);
201 g_io_channel_set_flags(ch2, G_IO_FLAG_NONBLOCK, NULL);
202 g_io_channel_set_encoding(ch1, NULL, NULL);
203 g_io_channel_set_encoding(ch2, NULL, NULL);
205 irc_send_args(ch1, (GIConv)-1, NULL, "PRIVMSG", "foo", NULL);
207 g_io_channel_read_line(ch2, &str, NULL, NULL, NULL);
209 fail_unless(!strcmp(str, "PRIVMSG :foo\r\n"));
212 START_TEST(send_args_utf8)
213 GIOChannel *ch1, *ch2;
217 iconv = g_iconv_open("ISO8859-1", "UTF-8");
219 g_io_channel_pair(&ch1, &ch2);
220 g_io_channel_set_flags(ch1, G_IO_FLAG_NONBLOCK, NULL);
221 g_io_channel_set_flags(ch2, G_IO_FLAG_NONBLOCK, NULL);
222 g_io_channel_set_encoding(ch1, NULL, NULL);
223 g_io_channel_set_encoding(ch2, NULL, NULL);
225 irc_send_args(ch1, iconv, NULL, "PRIVMSG", "fooö", NULL);
227 g_iconv_close(iconv);
229 g_io_channel_read_line(ch2, &str, NULL, NULL, NULL);
231 fail_unless(!strcmp(str, "PRIVMSG :foo\366\r\n"));
234 Suite *parser_suite(void)
236 Suite *s = suite_create("parser");
237 TCase *tcase = tcase_create("core");
238 suite_add_tcase(s, tcase);
239 tcase_add_test(tcase, parser_vargs);
240 tcase_add_test(tcase, parser_stringnl);
241 tcase_add_test(tcase, parser_malformed);
242 tcase_add_test(tcase, parser_random);
243 tcase_add_test(tcase, parser_get_nick);
244 tcase_add_test(tcase, parser_dup);
245 tcase_add_test(tcase, parser_recv_line);
246 tcase_add_test(tcase, parser_recv_line_iso8859);
247 tcase_add_test(tcase, parser_recv_line_invalid);
248 tcase_add_test(tcase, send_args);
249 tcase_add_test(tcase, send_args_utf8);