summaryrefslogtreecommitdiff
path: root/tests/unit/plugins/irc/test-irc-protocol.cpp
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2020-03-28 16:06:45 +0100
committerSébastien Helleu <flashcode@flashtux.org>2020-03-28 16:06:45 +0100
commit8738196b68a64c104c0607e897042472dc80df10 (patch)
treeb3a4d1978d57a07ba515ef235d41e176a5106ce3 /tests/unit/plugins/irc/test-irc-protocol.cpp
parentf072eb8d78e7b879add462071ee029d3da893618 (diff)
downloadweechat-8738196b68a64c104c0607e897042472dc80df10.zip
tests: add tests on remaining IRC protocol functions and callbacks
Diffstat (limited to 'tests/unit/plugins/irc/test-irc-protocol.cpp')
-rw-r--r--tests/unit/plugins/irc/test-irc-protocol.cpp1888
1 files changed, 1857 insertions, 31 deletions
diff --git a/tests/unit/plugins/irc/test-irc-protocol.cpp b/tests/unit/plugins/irc/test-irc-protocol.cpp
index 55aa6d5d2..185c4299c 100644
--- a/tests/unit/plugins/irc/test-irc-protocol.cpp
+++ b/tests/unit/plugins/irc/test-irc-protocol.cpp
@@ -235,19 +235,12 @@ TEST_GROUP(IrcProtocolWithServer)
static int signal_cb (const void *pointer, void *data, const char *signal,
const char *type_data, void *signal_data)
{
- char *ptr_data;
-
/* make C++ compiler happy */
+ (void) pointer;
(void) signal;
(void) type_data;
- if (pointer)
- {
- STRCMP_EQUAL((const char *)pointer, (const char *)signal_data);
- }
-
- ptr_data = (char *)data;
- ptr_data[0] = 1;
+ snprintf ((char *)data, 1024, "%s", (const char *)signal_data);
return WEECHAT_RC_OK;
}
@@ -255,23 +248,22 @@ TEST_GROUP(IrcProtocolWithServer)
void server_recv_check_response (const char *command,
const char *expected_response)
{
- char *data, str_error[4096];
- int signal_called;
+ char *data, response_sent[1024], str_error[4096];
struct t_hook *ptr_hook;
- data = (char *)malloc (1);
- data[0] = 0;
+ data = (char *)malloc (1024);
+ data[0] = '\0';
ptr_hook = hook_signal (NULL, IRC_FAKE_SERVER ",irc_out1_*",
&signal_cb, expected_response, data);
server_recv (command);
- signal_called = (data[0] == 1);
+ snprintf (response_sent, sizeof (response_sent), "%s", data);
unhook (ptr_hook);
- if (expected_response && !signal_called)
+ if (expected_response && !response_sent[0])
{
snprintf (str_error, sizeof (str_error),
"Message received: \"%s\", expected response was "
@@ -281,14 +273,21 @@ TEST_GROUP(IrcProtocolWithServer)
FAIL(str_error);
}
- if (!expected_response && signal_called)
+ if (!expected_response && response_sent[0])
{
snprintf (str_error, sizeof (str_error),
"Message received: \"%s\", expected no response, but "
- "an unexpected response was sent to the IRC server",
- command);
+ "an unexpected response was sent to the IRC server: "
+ "\"%s\"",
+ command,
+ response_sent);
FAIL(str_error);
}
+
+ if (expected_response)
+ {
+ STRCMP_EQUAL(expected_response, response_sent);
+ }
}
void setup ()
@@ -388,6 +387,41 @@ TEST(IrcProtocolWithServer, NickAddress)
/*
* Tests functions:
+ * irc_protocol_recv_command (command not found)
+ */
+
+TEST(IrcProtocolWithServer, recv_command_not_found)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host XYZ");
+ server_recv (":alice!user@host XYZ abc def");
+
+ server_recv (":alice!user@host 099");
+ server_recv (":alice!user@host 099 abc def");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_recv_command (invalid message)
+ */
+
+TEST(IrcProtocolWithServer, recv_command_invalid_message)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":");
+ server_recv ("abc");
+ server_recv (":");
+ server_recv (":alice!user@host");
+ server_recv ("@");
+ server_recv ("@test");
+ server_recv ("@test :");
+ server_recv ("@test :abc");
+}
+
+/*
+ * Tests functions:
* irc_protocol_cb_account (without account-notify capability)
*/
@@ -444,6 +478,22 @@ TEST(IrcProtocolWithServer, account_with_account_notify_cap)
/*
* Tests functions:
+ * irc_protocol_cb_authenticate
+ */
+
+TEST(IrcProtocolWithServer, authenticate)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv ("AUTHENTICATE");
+
+ server_recv ("AUTHENTICATE "
+ "QQDaUzXAmVffxuzFy77XWBGwABBQAgdinelBrKZaR3wE7nsIETuTVY=");
+}
+
+/*
+ * Tests functions:
* irc_protocol_cb_away
*/
@@ -458,7 +508,10 @@ TEST(IrcProtocolWithServer, away)
LONGS_EQUAL(0, ptr_nick->away);
- server_recv (":alice!user@host AWAY :Holidays!");
+ server_recv (":alice!user@host AWAY Bye");
+ LONGS_EQUAL(1, ptr_nick->away);
+
+ server_recv (":alice!user@host AWAY :Holidays now!");
LONGS_EQUAL(1, ptr_nick->away);
server_recv (":alice!user@host AWAY");
@@ -467,17 +520,42 @@ TEST(IrcProtocolWithServer, away)
/*
* Tests functions:
+ * irc_protocol_cb_cap
+ */
+
+TEST(IrcProtocolWithServer, cap)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server CAP");
+ server_recv (":server CAP *");
+
+ server_recv (":server CAP * LS :identify-msg multi-prefix sasl");
+ server_recv (":server CAP * LS * :identify-msg multi-prefix sasl");
+ server_recv (":server CAP * LIST :identify-msg multi-prefix sasl");
+ server_recv (":server CAP * LIST * :identify-msg multi-prefix sasl");
+ server_recv (":server CAP * NEW :identify-msg multi-prefix sasl");
+ server_recv (":server CAP * DEL :identify-msg multi-prefix sasl");
+ server_recv (":server CAP * ACK :sasl");
+ server_recv (":server CAP * NAK :sasl");
+}
+
+/*
+ * Tests functions:
* irc_protocol_cb_chghost
*/
TEST(IrcProtocolWithServer, chghost)
{
- struct t_irc_nick *ptr_nick;
+ struct t_irc_nick *ptr_nick, *ptr_nick2;
server_recv (":server 001 alice");
server_recv (":alice!user@host JOIN #test");
+ server_recv (":bob!user@host JOIN #test");
ptr_nick = ptr_server->channels->nicks;
+ ptr_nick2 = ptr_server->channels->last_nick;
STRCMP_EQUAL("user@host", ptr_nick->host);
@@ -486,11 +564,48 @@ TEST(IrcProtocolWithServer, chghost)
server_recv (":alice!user@host CHGHOST user2");
STRCMP_EQUAL("user@host", ptr_nick->host);
+ /* self nick */
+ server_recv (":alice!user@host CHGHOST user2 host2");
+ STRCMP_EQUAL("user2@host2", ptr_nick->host);
+
server_recv (":alice!user@host CHGHOST user2 host2");
STRCMP_EQUAL("user2@host2", ptr_nick->host);
server_recv (":alice!user2@host2 CHGHOST user3 :host3");
STRCMP_EQUAL("user3@host3", ptr_nick->host);
+
+ /* another nick */
+ server_recv (":bob!user@host CHGHOST user_bob_2 host_bob_2");
+ STRCMP_EQUAL("user_bob_2@host_bob_2", ptr_nick2->host);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_error
+ */
+
+TEST(IrcProtocolWithServer, error)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv ("ERROR");
+
+ server_recv ("ERROR test");
+ server_recv ("ERROR :Closing Link: irc.server.org (Bad Password)");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_invite
+ */
+
+TEST(IrcProtocolWithServer, invite)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":bob!user@host INVITE alice #channel");
+ server_recv (":bob!user@host INVITE xxx #channel");
}
/*
@@ -511,6 +626,9 @@ TEST(IrcProtocolWithServer, join)
server_recv (":alice!user@host JOIN");
POINTERS_EQUAL(NULL, ptr_server->channels);
+ /* join of a user while the channel does not yet exist in local */
+ server_recv (":bob!user@host JOIN #test");
+
server_recv (":alice!user@host JOIN #test");
ptr_channel = ptr_server->channels;
@@ -548,6 +666,36 @@ TEST(IrcProtocolWithServer, join)
CHECK(ptr_nick->color);
CHECK(ptr_channel->buffer);
+
+ server_recv (":bob!user@host JOIN #test * :Bob Name");
+
+ ptr_nick = ptr_channel->last_nick;
+
+ LONGS_EQUAL(2, ptr_channel->nicks_count);
+ CHECK(ptr_nick);
+ STRCMP_EQUAL("bob", ptr_nick->name);
+ STRCMP_EQUAL("user@host", ptr_nick->host);
+ STRCMP_EQUAL(" ", ptr_nick->prefixes);
+ STRCMP_EQUAL(" ", ptr_nick->prefix);
+ LONGS_EQUAL(0, ptr_nick->away);
+ POINTERS_EQUAL(NULL, ptr_nick->account);
+ STRCMP_EQUAL("Bob Name", ptr_nick->realname);
+ CHECK(ptr_nick->color);
+
+ server_recv (":carol!user@host JOIN #test carol_account :Carol Name");
+
+ ptr_nick = ptr_channel->last_nick;
+
+ LONGS_EQUAL(3, ptr_channel->nicks_count);
+ CHECK(ptr_nick);
+ STRCMP_EQUAL("carol", ptr_nick->name);
+ STRCMP_EQUAL("user@host", ptr_nick->host);
+ STRCMP_EQUAL(" ", ptr_nick->prefixes);
+ STRCMP_EQUAL(" ", ptr_nick->prefix);
+ LONGS_EQUAL(0, ptr_nick->away);
+ STRCMP_EQUAL("carol_account", ptr_nick->account);
+ STRCMP_EQUAL("Carol Name", ptr_nick->realname);
+ CHECK(ptr_nick->color);
}
/*
@@ -579,10 +727,26 @@ TEST(IrcProtocolWithServer, kick)
server_recv (":alice!user@host KICK #test");
STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name);
- server_recv (":alice!user@host KICK #test bob :no spam here!");
+ /* channel not found */
+ server_recv (":alice!user@host KICK #xyz");
+ /* without kick reason */
+ server_recv (":alice!user@host KICK #test bob");
STRCMP_EQUAL("alice", ptr_channel->nicks->name);
POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick);
+
+ server_recv (":bob!user@host JOIN #test");
+
+ /* with kick reason */
+ server_recv (":alice!user@host KICK #test bob :no spam here!");
+ STRCMP_EQUAL("alice", ptr_channel->nicks->name);
+ POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick);
+
+ server_recv (":bob!user@host JOIN #test");
+
+ /* kick of self nick */
+ server_recv (":bob!user@host KICK #test alice :no spam here!");
+ POINTERS_EQUAL(NULL, ptr_channel->nicks);
}
/*
@@ -613,10 +777,23 @@ TEST(IrcProtocolWithServer, kill)
server_recv (":alice!user@host KILL");
STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name);
- server_recv (":alice!user@host KILL bob :killed by admin");
+ /* without kill reason */
+ server_recv (":alice!user@host KILL bob");
+ STRCMP_EQUAL("alice", ptr_channel->nicks->name);
+ POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick);
+ server_recv (":bob!user@host JOIN #test");
+
+ /* with kill reason */
+ server_recv (":alice!user@host KILL bob :killed by admin");
STRCMP_EQUAL("alice", ptr_channel->nicks->name);
POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick);
+
+ server_recv (":bob!user@host JOIN #test");
+
+ /* kill of self nick */
+ server_recv (":bob!user@host KILL alice :killed by admin");
+ POINTERS_EQUAL(NULL, ptr_channel->nicks);
}
/*
@@ -661,25 +838,38 @@ TEST(IrcProtocolWithServer, mode)
server_recv (":admin MODE #test -t");
POINTERS_EQUAL(NULL, ptr_channel->modes);
- /* nick mode '@' */
+ /* nick mode '@' on channel #test */
server_recv (":admin MODE #test +o alice");
STRCMP_EQUAL("@ ", ptr_nick->prefixes);
STRCMP_EQUAL("@", ptr_nick->prefix);
- /* another nick mode '+' */
+ /* another nick mode '+' on channel #test */
server_recv (":admin MODE #test +v alice");
STRCMP_EQUAL("@+", ptr_nick->prefixes);
STRCMP_EQUAL("@", ptr_nick->prefix);
- /* nick mode '@' removed */
+ /* nick mode '@' removed on channel #test */
server_recv (":admin MODE #test -o alice");
STRCMP_EQUAL(" +", ptr_nick->prefixes);
STRCMP_EQUAL("+", ptr_nick->prefix);
- /* nick mode '+' removed */
+ /* nick mode '+' removed on channel #test */
server_recv (":admin MODE #test -v alice");
STRCMP_EQUAL(" ", ptr_nick->prefixes);
STRCMP_EQUAL(" ", ptr_nick->prefix);
+
+ /* nick mode 'i' */
+ POINTERS_EQUAL(NULL, ptr_server->nick_modes);
+ server_recv (":admin MODE alice +i");
+ STRCMP_EQUAL("i", ptr_server->nick_modes);
+
+ /* nick mode 'R' */
+ server_recv (":admin MODE alice +R");
+ STRCMP_EQUAL("iR", ptr_server->nick_modes);
+
+ /* remove nick mode 'i' */
+ server_recv (":admin MODE alice -i");
+ STRCMP_EQUAL("R", ptr_server->nick_modes);
}
/*
@@ -699,6 +889,8 @@ TEST(IrcProtocolWithServer, nick)
server_recv (":alice!user@host JOIN #test");
server_recv (":bob!user@host JOIN #test");
+ server_recv (":bob!user@host PRIVMSG alice :hi Alice!");
+
ptr_channel = ptr_server->channels;
CHECK(ptr_channel);
ptr_nick1 = ptr_channel->nicks;
@@ -728,6 +920,82 @@ TEST(IrcProtocolWithServer, nick)
/* new nick for bob_away (with ":") */
server_recv (":bob_away!user@host NICK :bob2");
STRCMP_EQUAL("bob2", ptr_nick2->name);
+
+ STRCMP_EQUAL("bob2", ptr_server->last_channel->name);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_notice
+ */
+
+TEST(IrcProtocolWithServer, notice)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv ("NOTICE");
+ server_recv ("NOTICE AUTH");
+ server_recv (":bob!user@host NOTICE");
+ server_recv (":bob!user@host NOTICE #test");
+ server_recv (":bob!user@host NOTICE alice");
+
+ /* notice from server */
+ server_recv ("NOTICE AUTH :*** Looking up your hostname...");
+
+ /* notice to channel/user */
+ server_recv (":bob!user@host NOTICE #test :this is the notice");
+ server_recv (":bob!user@host NOTICE alice :this is the notice");
+
+ /* notice to ops of channel */
+ server_recv (":bob!user@host NOTICE @#test :this is the notice");
+
+ /* notice from self nick (case of bouncer) */
+ server_recv (":alice!user@host NOTICE alice :this is the notice");
+
+ /* notice with channel name at beginning */
+ server_recv (":bob!user@host NOTICE alice :[#test] this is the notice");
+ server_recv (":bob!user@host NOTICE alice :(#test) this is the notice");
+ server_recv (":bob!user@host NOTICE alice :{#test} this is the notice");
+ server_recv (":bob!user@host NOTICE alice :<#test> this is the notice");
+
+ /* broken CTCP to channel */
+ server_recv (":bob!user@host NOTICE #test :\01");
+ server_recv (":bob!user@host NOTICE #test :\01TEST");
+ server_recv (":bob!user@host NOTICE #test :\01ACTION");
+ server_recv (":bob!user@host NOTICE #test :\01ACTION is testing");
+ server_recv (":bob!user@host NOTICE #test :\01VERSION");
+ server_recv (":bob!user@host NOTICE #test :\01DCC");
+ server_recv (":bob!user@host NOTICE #test :\01DCC SEND");
+ server_recv (":bob!user@host NOTICE #test :\01DCC SEND file.txt");
+ server_recv (":bob!user@host NOTICE #test :\01DCC SEND file.txt 1 2 3");
+
+ /* broken CTCP to user */
+ server_recv (":bob!user@host NOTICE alice :\01");
+ server_recv (":bob!user@host NOTICE alice :\01TEST");
+ server_recv (":bob!user@host NOTICE alice :\01ACTION");
+ server_recv (":bob!user@host NOTICE alice :\01ACTION is testing");
+ server_recv (":bob!user@host NOTICE alice :\01VERSION");
+ server_recv (":bob!user@host NOTICE alice :\01DCC");
+ server_recv (":bob!user@host NOTICE alice :\01DCC SEND");
+ server_recv (":bob!user@host NOTICE alice :\01DCC SEND file.txt");
+ server_recv (":bob!user@host NOTICE alice :\01DCC SEND file.txt 1 2 3");
+
+ /* valid CTCP to channel */
+ server_recv (":bob!user@host NOTICE #test :\01TEST\01");
+ server_recv (":bob!user@host NOTICE #test :\01ACTION\01");
+ server_recv (":bob!user@host NOTICE #test :\01ACTION is testing\01");
+ server_recv (":bob!user@host NOTICE #test :\01VERSION\01");
+ server_recv (":bob!user@host NOTICE #test :\01DCC SEND file.txt 1 2 3\01");
+
+ /* valid CTCP to user */
+ server_recv (":bob!user@host NOTICE alice :\01TEST\01");
+ server_recv (":bob!user@host NOTICE alice :\01ACTION\01");
+ server_recv (":bob!user@host NOTICE alice :\01ACTION is testing\01");
+ server_recv (":bob!user@host NOTICE alice :\01VERSION\01");
+ server_recv (":bob!user@host NOTICE alice :\01DCC SEND file.txt 1 2 3\01");
}
/*
@@ -759,6 +1027,22 @@ TEST(IrcProtocolWithServer, part)
STRCMP_EQUAL("#test", ptr_server->channels->name);
POINTERS_EQUAL(NULL, ptr_server->channels->nicks);
LONGS_EQUAL(1, ptr_server->channels->part);
+
+ server_recv (":alice!user@host JOIN #test");
+
+ server_recv (":alice!user@host PART #test :part message");
+ STRCMP_EQUAL("#test", ptr_server->channels->name);
+ POINTERS_EQUAL(NULL, ptr_server->channels->nicks);
+ LONGS_EQUAL(1, ptr_server->channels->part);
+
+ server_recv (":alice!user@host JOIN #test");
+ server_recv (":bob!user@host JOIN #test");
+
+ /* part from another user */
+ server_recv (":bob!user@host PART #test :part message");
+ STRCMP_EQUAL("#test", ptr_server->channels->name);
+ CHECK(ptr_server->channels->nicks == ptr_server->channels->last_nick);
+ LONGS_EQUAL(0, ptr_server->channels->part);
}
/*
@@ -778,7 +1062,197 @@ TEST(IrcProtocolWithServer, ping)
/*
* Tests functions:
- * irc_protocol_cb_001 (empty)
+ * irc_protocol_cb_pong
+ */
+
+TEST(IrcProtocolWithServer, pong)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":server PONG");
+ server_recv (":server PONG server");
+ server_recv (":server PONG server :server");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_privmsg
+ */
+
+TEST(IrcProtocolWithServer, privmsg)
+{
+ char *info, message[1024];
+
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+ server_recv (":bob!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":bob!user@host PRIVMSG");
+ server_recv (":bob!user@host PRIVMSG #test");
+ server_recv (":bob!user@host PRIVMSG alice");
+
+ /* message to channel/user */
+ server_recv (":bob!user@host PRIVMSG #test :this is the message");
+ server_recv (":bob!user@host PRIVMSG alice :this is the message");
+
+ /* message with tags to channel/user */
+ server_recv ("@tag1=value1;tag2=value2 :bob!user@host PRIVMSG #test "
+ ":this is the message");
+ server_recv ("@tag1=value1;tag2=value2 :bob!user@host PRIVMSG alice "
+ ":this is the message");
+
+ /* message to ops of channel */
+ server_recv (":bob!user@host PRIVMSG @#test :this is the message");
+
+ /* message from self nick (case of bouncer) */
+ server_recv (":alice!user@host PRIVMSG alice :this is the message");
+
+ /* broken CTCP to channel */
+ server_recv (":bob!user@host PRIVMSG #test :\01");
+ server_recv (":bob!user@host PRIVMSG #test :\01TEST");
+ server_recv (":bob!user@host PRIVMSG #test :\01ACTION");
+ server_recv (":bob!user@host PRIVMSG #test :\01ACTION is testing");
+ server_recv (":bob!user@host PRIVMSG #test :\01VERSION");
+ server_recv (":bob!user@host PRIVMSG #test :\01DCC");
+ server_recv (":bob!user@host PRIVMSG #test :\01DCC SEND");
+ server_recv (":bob!user@host PRIVMSG #test :\01DCC SEND file.txt");
+ server_recv (":bob!user@host PRIVMSG #test :\01DCC SEND file.txt 1 2 3");
+
+ /* broken CTCP to user */
+ server_recv (":bob!user@host PRIVMSG alice :\01");
+ server_recv (":bob!user@host PRIVMSG alice :\01TEST");
+ server_recv (":bob!user@host PRIVMSG alice :\01ACTION");
+ server_recv (":bob!user@host PRIVMSG alice :\01ACTION is testing");
+ server_recv (":bob!user@host PRIVMSG alice :\01VERSION");
+ server_recv (":bob!user@host PRIVMSG alice :\01DCC");
+ server_recv (":bob!user@host PRIVMSG alice :\01DCC SEND");
+ server_recv (":bob!user@host PRIVMSG alice :\01DCC SEND file.txt");
+ server_recv (":bob!user@host PRIVMSG alice :\01DCC SEND file.txt 1 2 3");
+
+ /* valid CTCP to channel */
+ server_recv (":bob!user@host PRIVMSG #test :\01TEST\01");
+ server_recv (":bob!user@host PRIVMSG #test :\01ACTION\01");
+ server_recv (":bob!user@host PRIVMSG #test :\01ACTION is testing\01");
+ server_recv (":bob!user@host PRIVMSG #test :\01VERSION\01");
+ server_recv (":bob!user@host PRIVMSG #test :\01DCC SEND file.txt 1 2 3\01");
+
+ /* valid CTCP to user */
+ server_recv_check_response (
+ ":bob!user@host PRIVMSG alice :\01TEST\01", NULL);
+ server_recv_check_response (
+ ":bob!user@host PRIVMSG alice :\01ACTION\01", NULL);
+ server_recv_check_response (
+ ":bob!user@host PRIVMSG alice :\01ACTION is testing\01", NULL);
+ server_recv (":bob!user@host PRIVMSG alice :\01VERSION\01");
+ info = hook_info_get (NULL, "weechat_site_download", "");
+ snprintf (message, sizeof (message),
+ "NOTICE bob :\01SOURCE %s\01", info);
+ server_recv_check_response (
+ ":bob!user@host PRIVMSG alice :\01SOURCE\01", message);
+ free (info);
+ server_recv_check_response (
+ ":bob!user@host PRIVMSG alice :\01DCC SEND file.txt 1 2 3\01", NULL);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_quit
+ */
+
+TEST(IrcProtocolWithServer, quit)
+{
+ struct t_irc_channel *ptr_channel;
+
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+ server_recv (":bob!user@host PRIVMSG alice :hi Alice!");
+
+ ptr_channel = ptr_server->channels;
+
+ server_recv (":bob!user@host JOIN #test");
+ LONGS_EQUAL(2, ptr_channel->nicks_count);
+ STRCMP_EQUAL("alice", ptr_channel->nicks->name);
+ STRCMP_EQUAL("bob", ptr_channel->last_nick->name);
+
+ /* without quit message */
+ server_recv (":bob!user@host QUIT");
+ LONGS_EQUAL(1, ptr_channel->nicks_count);
+ STRCMP_EQUAL("alice", ptr_channel->nicks->name);
+ POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick);
+
+ server_recv (":bob!user@host JOIN #test");
+ LONGS_EQUAL(2, ptr_channel->nicks_count);
+ STRCMP_EQUAL("alice", ptr_channel->nicks->name);
+ STRCMP_EQUAL("bob", ptr_channel->last_nick->name);
+
+ /* with quit message */
+ server_recv (":bob!user@host QUIT :quit message");
+ LONGS_EQUAL(1, ptr_channel->nicks_count);
+ STRCMP_EQUAL("alice", ptr_channel->nicks->name);
+ POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_topic
+ */
+
+TEST(IrcProtocolWithServer, topic)
+{
+ struct t_irc_channel *ptr_channel;
+
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ ptr_channel = ptr_server->channels;
+ POINTERS_EQUAL(NULL, ptr_channel->topic);
+
+ /* not enough arguments */
+ server_recv (":alice!user@host TOPIC");
+ POINTERS_EQUAL(NULL, ptr_channel->topic);
+
+ /* not a channel */
+ server_recv (":alice!user@host TOPIC bob");
+
+ /* empty topic */
+ server_recv (":alice!user@host TOPIC #test");
+ POINTERS_EQUAL(NULL, ptr_channel->topic);
+
+ /* new topic */
+ server_recv (":alice!user@host TOPIC #test :new topic");
+ STRCMP_EQUAL("new topic", ptr_channel->topic);
+
+ /* another new topic */
+ server_recv (":alice!user@host TOPIC #test :another new topic");
+ STRCMP_EQUAL("another new topic", ptr_channel->topic);
+
+ /* empty topic */
+ server_recv (":alice!user@host TOPIC #test");
+ POINTERS_EQUAL(NULL, ptr_channel->topic);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_wallops
+ */
+
+TEST(IrcProtocolWithServer, wallops)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":alice!user@host WALLOPS");
+
+ server_recv (":alice!user@host WALLOPS :message from admin");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_001 (connected to IRC server, empty)
*/
TEST(IrcProtocolWithServer, 001_empty)
@@ -794,7 +1268,7 @@ TEST(IrcProtocolWithServer, 001_empty)
/*
* Tests functions:
- * irc_protocol_cb_001 (welcome)
+ * irc_protocol_cb_001 (connected to IRC server, welcome message)
*/
TEST(IrcProtocolWithServer, 001_welcome)
@@ -815,7 +1289,7 @@ TEST(IrcProtocolWithServer, 001_welcome)
/*
* Tests functions:
- * irc_protocol_cb_005 (empty)
+ * irc_protocol_cb_005 (infos from server, empty)
*/
TEST(IrcProtocolWithServer, 005_empty)
@@ -833,7 +1307,7 @@ TEST(IrcProtocolWithServer, 005_empty)
/*
* Tests functions:
- * irc_protocol_cb_005 (full)
+ * irc_protocol_cb_005 (infos from server, full)
*/
TEST(IrcProtocolWithServer, 005_full)
@@ -864,11 +1338,14 @@ TEST(IrcProtocolWithServer, 005_full)
LONGS_EQUAL(100, ptr_server->monitor);
CHECK(ptr_server->isupport[0] == ' ');
STRCMP_EQUAL(IRC_MSG_005, ptr_server->isupport + 1);
+
+ /* check that realloc of info is OK if we receive the message again */
+ server_recv (":server 005 alice " IRC_MSG_005 " :are supported");
}
/*
* Tests functions:
- * irc_protocol_cb_005 (multiple messages)
+ * irc_protocol_cb_005 (infos from server, multiple messages)
*/
TEST(IrcProtocolWithServer, 005_multiple_messages)
@@ -888,3 +1365,1352 @@ TEST(IrcProtocolWithServer, 005_multiple_messages)
LONGS_EQUAL(24, ptr_server->host_max_length);
STRCMP_EQUAL(" PREFIX=(ohv)@%+ HOSTLEN=24", ptr_server->isupport);
}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_008 (server notice mask)
+ */
+
+TEST(IrcProtocolWithServer, 008)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 008");
+ server_recv (":server 008 alice");
+
+ server_recv (":server 008 alice +Zbfkrsuy :Server notice mask");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_221 (user mode string)
+ */
+
+TEST(IrcProtocolWithServer, 221)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 221");
+ server_recv (":server 221 alice");
+
+ POINTERS_EQUAL(NULL, ptr_server->nick_modes);
+
+ server_recv (":server 221 alice :+abc");
+ STRCMP_EQUAL("abc", ptr_server->nick_modes);
+
+ server_recv (":server 221 alice :-abc");
+ POINTERS_EQUAL(NULL, ptr_server->nick_modes);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_whois_nick_msg
+ *
+ * Messages:
+ * 223: whois (charset is)
+ * 264: whois (is using encrypted connection)
+ * 275: whois (secure connection)
+ * 276: whois (has client certificate fingerprint)
+ * 307: whois (registered nick)
+ * 310: whois (help mode)
+ * 313: whois (operator)
+ * 318: whois (end)
+ * 319: whois (channels)
+ * 320: whois (identified user)
+ * 326: whois (has oper privs)
+ * 335: is a bot on
+ * 378: whois (connecting from)
+ * 379: whois (using modes)
+ * 671: whois (secure connection)
+ */
+
+TEST(IrcProtocolWithServer, whois_nick_msg)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 223");
+ server_recv (":server 223 alice");
+ server_recv (":server 223 alice bob");
+
+ server_recv (":server 223 alice bob UTF-8");
+ server_recv (":server 223 alice bob :UTF-8");
+ server_recv (":server 264 alice bob :is using encrypted connection");
+ server_recv (":server 275 alice bob :is using secure connection");
+ server_recv (":server 276 alice bob :has client certificate fingerprint");
+ server_recv (":server 307 alice bob :registered nick");
+ server_recv (":server 310 alice bob :help mode");
+ server_recv (":server 313 alice bob :operator");
+ server_recv (":server 318 alice bob :end");
+ server_recv (":server 319 alice bob :channels");
+ server_recv (":server 320 alice bob :identified user");
+ server_recv (":server 326 alice bob :has oper privs");
+ server_recv (":server 335 alice bob :is a bot");
+ server_recv (":server 378 alice bob :connecting from");
+ server_recv (":server 379 alice bob :using modes");
+ server_recv (":server 671 alice bob :secure connection");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_whowas_nick_msg
+ *
+ * Messages:
+ * 369: whowas (end)
+ */
+
+TEST(IrcProtocolWithServer, whowas_nick_msg)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 369");
+ server_recv (":server 369 alice");
+ server_recv (":server 369 alice bob");
+
+ server_recv (":server 369 alice bob end");
+ server_recv (":server 369 alice bob :end");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_301 (away message)
+ */
+
+TEST(IrcProtocolWithServer, 301)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":bob!user@host PRIVMSG alice :hi Alice!");
+
+ /* not enough arguments */
+ server_recv (":server 301");
+
+ POINTERS_EQUAL(NULL, ptr_server->channels->away_message);
+
+ server_recv (":server 301 alice bob");
+ POINTERS_EQUAL(NULL, ptr_server->channels->away_message);
+
+ server_recv (":server 301 alice bob :I am away");
+ STRCMP_EQUAL("I am away", ptr_server->channels->away_message);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_303 (ison)
+ */
+
+TEST(IrcProtocolWithServer, 303)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 303");
+ server_recv (":server 303 alice");
+
+ server_recv (":server 303 alice :nick1 nick2");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_305 (unaway)
+ * irc_protocol_cb_306 (away)
+ */
+
+TEST(IrcProtocolWithServer, 305_306)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":bob!user@host PRIVMSG alice :hi Alice!");
+
+ /* not enough arguments */
+ server_recv (":server 305");
+ server_recv (":server 306");
+
+ POINTERS_EQUAL(NULL, ptr_server->channels->away_message);
+
+ server_recv (":server 306 alice"); /* now away */
+ LONGS_EQUAL(1, ptr_server->is_away);
+
+ server_recv (":server 305 alice");
+ LONGS_EQUAL(0, ptr_server->is_away);
+
+ server_recv (":server 306 alice :We'll miss you"); /* now away */
+ LONGS_EQUAL(1, ptr_server->is_away);
+
+ server_recv (":server 305 alice :Does this mean you're really back?");
+ LONGS_EQUAL(0, ptr_server->is_away);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_311 (whois, user)
+ */
+
+TEST(IrcProtocolWithServer, 311)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 311");
+ server_recv (":server 311 alice");
+ server_recv (":server 311 alice bob");
+ server_recv (":server 311 alice bob user");
+ server_recv (":server 311 alice bob user host");
+ server_recv (":server 311 alice bob user host *");
+
+ server_recv (":server 311 alice bob user host * :real name");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_312 (whois, server)
+ */
+
+TEST(IrcProtocolWithServer, 312)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 312");
+ server_recv (":server 312 alice");
+ server_recv (":server 312 alice bob");
+ server_recv (":server 312 alice bob server");
+
+ server_recv (":server 312 alice bob server :https://example.com/");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_314 (whowas)
+ */
+
+TEST(IrcProtocolWithServer, 314)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 314");
+ server_recv (":server 314 alice");
+ server_recv (":server 314 alice bob");
+ server_recv (":server 314 alice bob user");
+ server_recv (":server 314 alice bob user host");
+ server_recv (":server 314 alice bob user host *");
+
+ server_recv (":server 314 alice bob user host * :real name");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_315 (end of /who)
+ */
+
+TEST(IrcProtocolWithServer, 315)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 315");
+ server_recv (":server 315 alice");
+ server_recv (":server 315 alice #test");
+
+ server_recv (":server 315 alice #test End of /WHO list.");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_317 (whois, idle)
+ */
+
+TEST(IrcProtocolWithServer, 317)
+{
+ time_t time;
+ char message[1024];
+
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 317");
+ server_recv (":server 317 alice");
+ server_recv (":server 317 alice bob");
+ server_recv (":server 317 alice bob 122877");
+
+ /* signon at 03/12/2008 @ 1:18pm (UTC) */
+ server_recv (":server 317 alice bob 122877 1205327880");
+ server_recv (":server 317 alice bob 122877 1205327880 "
+ ":seconds idle, signon time");
+
+ /* signon 2 minutes ago */
+ time = time_t (NULL);
+ time -= 120;
+ snprintf (message, sizeof (message),
+ ":server 317 alice bob 30 %lld :seconds idle, signon time",
+ (long long)time);
+ server_recv (message);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_321 (/list start)
+ */
+
+TEST(IrcProtocolWithServer, 321)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 321");
+ server_recv (":server 321 alice");
+
+ server_recv (":server 321 alice #test");
+ server_recv (":server 321 alice #test Users");
+ server_recv (":server 321 alice #test :Users Name");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_322 (channel for /list)
+ */
+
+TEST(IrcProtocolWithServer, 322)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 322");
+ server_recv (":server 322 alice");
+ server_recv (":server 322 alice #test");
+
+ server_recv (":server 322 alice #test 3");
+ server_recv (":server 322 alice #test 3 :topic of channel");
+
+ run_cmd ("/list -server " IRC_FAKE_SERVER " -re #test.*");
+
+ server_recv (":server 322 alice #test 3");
+ server_recv (":server 322 alice #test 3 :topic of channel");
+
+ server_recv (":server 322 alice #xyz 3");
+ server_recv (":server 322 alice #xyz 3 :topic of channel");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_323 (end of /list)
+ */
+
+TEST(IrcProtocolWithServer, 323)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 323");
+
+ server_recv (":server 323 alice");
+ server_recv (":server 323 alice end");
+ server_recv (":server 323 alice :End of /LIST");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_324 (channel mode)
+ */
+
+TEST(IrcProtocolWithServer, 324)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ POINTERS_EQUAL(NULL, ptr_server->channels->modes);
+
+ /* not enough arguments */
+ server_recv (":server 324");
+ server_recv (":server 324 alice");
+
+ server_recv (":server 324 alice #test +nt");
+ STRCMP_EQUAL("+nt", ptr_server->channels->modes);
+
+ server_recv (":server 324 alice #test");
+ POINTERS_EQUAL(NULL, ptr_server->channels->modes);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_327 (whois, host)
+ */
+
+TEST(IrcProtocolWithServer, 327)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 327");
+ server_recv (":server 327 alice");
+ server_recv (":server 327 alice bob");
+ server_recv (":server 327 alice bob host");
+
+ server_recv (":server 327 alice bob host 1.2.3.4");
+ server_recv (":server 327 alice bob host 1.2.3.4 :real name");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_328 (channel URL)
+ */
+
+TEST(IrcProtocolWithServer, 328)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 328");
+ server_recv (":server 328 alice");
+ server_recv (":server 328 alice #test");
+
+ server_recv (":server 328 alice #test :https://example.com/");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_329 (channel creation date)
+ */
+
+TEST(IrcProtocolWithServer, 329)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 329");
+ server_recv (":server 329 alice");
+ server_recv (":server 329 alice #test");
+
+ server_recv (":server 329 alice #test 1205327894");
+ server_recv (":server 329 alice #test :1205327894");
+
+ /* channel not found */
+ server_recv (":server 329 alice #xyz 1205327894");
+ server_recv (":server 329 alice #xyz :1205327894");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_330 (whois, is logged in as)
+ * irc_protocol_cb_343 (whois, is opered as)
+ */
+
+TEST(IrcProtocolWithServer, 330_343)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 330");
+ server_recv (":server 330 alice");
+ server_recv (":server 330 alice bob");
+
+ /* not enough arguments */
+ server_recv (":server 343");
+ server_recv (":server 343 alice");
+ server_recv (":server 343 alice bob");
+
+ server_recv (":server 330 alice bob bob2");
+ server_recv (":server 330 alice bob bob2 :is logged in as");
+
+ server_recv (":server 343 alice bob bob2");
+ server_recv (":server 343 alice bob bob2 :is opered in as");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_331 (no topic for channel)
+ */
+
+TEST(IrcProtocolWithServer, 331)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 331");
+ server_recv (":server 331 alice");
+
+ server_recv (":server 331 alice #test");
+
+ /* channel not found */
+ server_recv (":server 331 alice #xyz");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_332 (topic of channel)
+ */
+
+TEST(IrcProtocolWithServer, 332)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 332");
+ server_recv (":server 332 alice");
+ server_recv (":server 332 alice #test");
+
+ POINTERS_EQUAL(NULL, ptr_server->channels->topic);
+
+ server_recv (":server 332 alice #test :the new topic");
+ STRCMP_EQUAL("the new topic", ptr_server->channels->topic);
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_333 (infos about topic (nick / date))
+ */
+
+TEST(IrcProtocolWithServer, 333)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 333");
+ server_recv (":server 333 alice");
+ server_recv (":server 333 alice #test");
+
+ server_recv (":server 333 alice #test nick!user@host");
+ server_recv (":server 333 alice #test nick!user@host 1205428096");
+ server_recv (":server 333 alice #test 1205428096");
+
+ /* channel not found */
+ server_recv (":server 333 alice #xyz nick!user@host");
+ server_recv (":server 333 alice #xyz nick!user@host 1205428096");
+ server_recv (":server 333 alice #xyz 1205428096");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_338 (whois, host)
+ */
+
+TEST(IrcProtocolWithServer, 338)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 338");
+ server_recv (":server 338 alice");
+ server_recv (":server 338 alice bob");
+ server_recv (":server 338 alice bob host");
+
+ server_recv (":server 338 alice bob host :actually using host");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_341 (inviting)
+ */
+
+TEST(IrcProtocolWithServer, 341)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 341");
+ server_recv (":server 341 alice");
+ server_recv (":server 341 alice bob");
+
+ server_recv (":server 341 alice bob #test");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_344 (channel reop)
+ */
+
+TEST(IrcProtocolWithServer, 344)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 344");
+ server_recv (":server 344 alice");
+ server_recv (":server 344 alice #test");
+
+ server_recv (":server 344 alice #test nick!user@host");
+
+ /* channel not found */
+ server_recv (":server 344 alice #xyz nick!user@host");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_345 (end of channel reop)
+ */
+
+TEST(IrcProtocolWithServer, 345)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 345");
+ server_recv (":server 345 alice");
+ server_recv (":server 345 alice #test");
+
+ server_recv (":server 345 alice #test end");
+ server_recv (":server 345 alice #test :End of Channel Reop List");
+
+ /* channel not found */
+ server_recv (":server 345 alice #xyz end");
+ server_recv (":server 345 alice #xyz :End of Channel Reop List");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_346 (channel invite list)
+ */
+
+TEST(IrcProtocolWithServer, 346)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 346");
+ server_recv (":server 346 alice");
+ server_recv (":server 346 alice #test");
+
+ server_recv (":server 346 alice #test invitemask");
+ server_recv (":server 346 alice #test invitemask nick!user@host");
+ server_recv (":server 346 alice #test invitemask nick!user@host 1205590879");
+
+ /* channel not found */
+ server_recv (":server 346 alice #xyz invitemask");
+ server_recv (":server 346 alice #xyz invitemask nick!user@host");
+ server_recv (":server 346 alice #xyz invitemask nick!user@host 1205590879");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_347 (end of channel invite list)
+ */
+
+TEST(IrcProtocolWithServer, 347)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 347");
+ server_recv (":server 347 alice");
+
+ server_recv (":server 347 alice #test");
+ server_recv (":server 347 alice #test end");
+ server_recv (":server 347 alice #test :End of Channel Invite List");
+
+ /* channel not found */
+ server_recv (":server 347 alice #xyz");
+ server_recv (":server 347 alice #xyz end");
+ server_recv (":server 347 alice #xyz :End of Channel Invite List");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_348 (channel exception list)
+ */
+
+TEST(IrcProtocolWithServer, 348)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 348");
+ server_recv (":server 348 alice");
+ server_recv (":server 348 alice #test");
+
+ server_recv (":server 348 alice #test nick1!user1@host1");
+ server_recv (":server 348 alice #test nick1!user1@host1 nick2!user2@host2");
+ server_recv (":server 348 alice #test nick1!user1@host1 nick2!user2@host2 "
+ "1205585109");
+
+ /* channel not found */
+ server_recv (":server 348 alice #xyz nick1!user1@host1");
+ server_recv (":server 348 alice #xyz nick1!user1@host1 nick2!user2@host2");
+ server_recv (":server 348 alice #xyz nick1!user1@host1 nick2!user2@host2 "
+ "1205585109");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_349 (end of channel exception list)
+ */
+
+TEST(IrcProtocolWithServer, 349)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 349");
+ server_recv (":server 349 alice");
+
+ server_recv (":server 349 alice #test");
+ server_recv (":server 349 alice #test end");
+ server_recv (":server 349 alice #test :End of Channel Exception List");
+
+ /* channel not found */
+ server_recv (":server 349 alice #xyz");
+ server_recv (":server 349 alice #xyz end");
+ server_recv (":server 349 alice #xyz :End of Channel Exception List");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_351 (server version)
+ */
+
+TEST(IrcProtocolWithServer, 351)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 351");
+ server_recv (":server 351 alice");
+ server_recv (":server 351 alice dancer-ircd-1.0");
+
+ server_recv (":server 351 alice dancer-ircd-1.0 server");
+ server_recv (":server 351 alice dancer-ircd-1.0 server :iMZ dncrTS/v4");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_352 (who)
+ */
+
+TEST(IrcProtocolWithServer, 352)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+ server_recv (":bob!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 352");
+ server_recv (":server 352 alice");
+ server_recv (":server 352 alice #test");
+
+ server_recv (":server 352 alice #test user");
+ server_recv (":server 352 alice #test user host");
+ server_recv (":server 352 alice #test user host server");
+ server_recv (":server 352 alice #test user host server bob");
+ server_recv (":server 352 alice #test user host server bob *");
+ server_recv (":server 352 alice #test user host server bob * :0 nick");
+ server_recv (":server 352 alice #test user host server bob H :0 nick");
+ server_recv (":server 352 alice #test user host server bob G :0 nick");
+
+ /* channel not found */
+ server_recv (":server 352 alice #xyz user");
+ server_recv (":server 352 alice #xyz user host");
+ server_recv (":server 352 alice #xyz user host server");
+ server_recv (":server 352 alice #xyz user host server bob");
+ server_recv (":server 352 alice #xyz user host server bob *");
+ server_recv (":server 352 alice #xyz user host server bob * :0 nick");
+ server_recv (":server 352 alice #xyz user host server bob H :0 nick");
+ server_recv (":server 352 alice #xyz user host server bob G :0 nick");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_353 (list of users on a channel)
+ */
+
+TEST(IrcProtocolWithServer, 353)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+ server_recv (":bob!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 353");
+ server_recv (":server 353 alice");
+ server_recv (":server 353 alice #test");
+ server_recv (":server 353 alice =");
+
+ server_recv (":server 353 alice #test");
+ server_recv (":server 353 alice #test :alice");
+ server_recv (":server 353 alice #test :alice bob @carol +dan!user@host");
+
+ server_recv (":server 353 alice = #test");
+ server_recv (":server 353 alice = #test :alice");
+ server_recv (":server 353 alice = #test :alice bob @carol +dan!user@host");
+
+ /* channel not found */
+ server_recv (":server 353 alice #xyz");
+ server_recv (":server 353 alice #xyz :alice");
+ server_recv (":server 353 alice #xyz :alice bob @carol +dan!user@host");
+
+ /* channel not found */
+ server_recv (":server 353 alice = #xyz");
+ server_recv (":server 353 alice = #xyz :alice");
+ server_recv (":server 353 alice = #xyz :alice bob @carol +dan!user@host");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_354 (WHOX output)
+ */
+
+TEST(IrcProtocolWithServer, 354)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+ server_recv (":bob!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 354");
+ server_recv (":server 354 alice");
+
+ server_recv (":server 354 alice #test");
+ server_recv (":server 354 alice #test user2");
+ server_recv (":server 354 alice #test user2 host2");
+ server_recv (":server 354 alice #test user2 host2 server");
+ server_recv (":server 354 alice #test user2 host2 server bob");
+ server_recv (":server 354 alice #test user2 host2 server bob status");
+ server_recv (":server 354 alice #test user2 host2 server bob status "
+ "hopcount");
+ server_recv (":server 354 alice #test user2 host2 server bob status "
+ "hopcount account");
+ server_recv (":server 354 alice #test user2 host2 server bob status "
+ "hopcount account :real name");
+
+ /* channel not found */
+ server_recv (":server 354 alice #xyz");
+ server_recv (":server 354 alice #xyz user2");
+ server_recv (":server 354 alice #xyz user2 host2");
+ server_recv (":server 354 alice #xyz user2 host2 server");
+ server_recv (":server 354 alice #xyz user2 host2 server bob");
+ server_recv (":server 354 alice #xyz user2 host2 server bob status");
+ server_recv (":server 354 alice #xyz user2 host2 server bob status "
+ "hopcount");
+ server_recv (":server 354 alice #xyz user2 host2 server bob status "
+ "hopcount account");
+ server_recv (":server 354 alice #xyz user2 host2 server bob status "
+ "hopcount account :real name");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_366 (end of /names list)
+ */
+
+TEST(IrcProtocolWithServer, 366)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+ server_recv (":bob!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 366");
+ server_recv (":server 366 alice");
+ server_recv (":server 366 alice #test");
+
+ server_recv (":server 366 alice #test end");
+ server_recv (":server 366 alice #test :End of /NAMES list");
+
+ /* channel not found */
+ server_recv (":server 366 alice #xyz end");
+ server_recv (":server 366 alice #xyz :End of /NAMES list");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_367 (banlist)
+ */
+
+TEST(IrcProtocolWithServer, 367)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 367");
+ server_recv (":server 367 alice");
+ server_recv (":server 367 alice #test");
+
+ server_recv (":server 367 alice #test nick1!user1@host1");
+ server_recv (":server 367 alice #test nick1!user1@host1 nick2!user2@host2");
+ server_recv (":server 367 alice #test nick1!user1@host1 nick2!user2@host2 "
+ "1205585109");
+
+ /* channel not found */
+ server_recv (":server 367 alice #xyz nick1!user1@host1");
+ server_recv (":server 367 alice #xyz nick1!user1@host1 nick2!user2@host2");
+ server_recv (":server 367 alice #xyz nick1!user1@host1 nick2!user2@host2 "
+ "1205585109");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_368 (end of banlist)
+ */
+
+TEST(IrcProtocolWithServer, 368)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 368");
+ server_recv (":server 368 alice");
+
+ server_recv (":server 368 alice #test");
+ server_recv (":server 368 alice #test end");
+ server_recv (":server 368 alice #test :End of Channel Ban List");
+
+ /* channel not found */
+ server_recv (":server 368 alice #xyz");
+ server_recv (":server 368 alice #xyz end");
+ server_recv (":server 368 alice #xyz :End of Channel Ban List");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_432 (erroneous nickname, not connected)
+ */
+
+TEST(IrcProtocolWithServer, 432_not_connected)
+{
+ server_recv (":server 432 * alice error");
+ server_recv (":server 432 * :alice error");
+ server_recv (":server 432 * alice :Erroneous Nickname");
+ server_recv (":server 432 * alice1 :Erroneous Nickname");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_432 (erroneous nickname, connected)
+ */
+
+TEST(IrcProtocolWithServer, 432_connected)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 432");
+ server_recv (":server 432 alice");
+
+ server_recv (":server 432 * alice");
+ server_recv (":server 432 * alice error");
+ server_recv (":server 432 * alice :Erroneous Nickname");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_433 (nickname already in use, not connected)
+ */
+
+TEST(IrcProtocolWithServer, 433_not_connected)
+{
+ server_recv (":server 433 * alice error");
+ server_recv (":server 433 * alice :Nickname is already in use.");
+ server_recv (":server 433 * alice1 :Nickname is already in use.");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_433 (nickname already in use, connected)
+ */
+
+TEST(IrcProtocolWithServer, 433_connected)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 433");
+ server_recv (":server 433 alice");
+
+ server_recv (":server 433 * alice");
+ server_recv (":server 433 * alice error");
+ server_recv (":server 433 * alice :Nickname is already in use.");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_437 (nick/channel temporarily unavailable, not connected)
+ */
+
+TEST(IrcProtocolWithServer, 437_not_connected)
+{
+ server_recv (":server 437 * alice error");
+ server_recv (":server 437 * alice :Nick/channel is temporarily unavailable");
+ server_recv (":server 437 * alice1 :Nick/channel is temporarily unavailable");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_437 (nick/channel temporarily unavailable, connected)
+ */
+
+TEST(IrcProtocolWithServer, 437_connected)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 437");
+ server_recv (":server 437 alice");
+
+ server_recv (":server 437 * alice");
+ server_recv (":server 437 * alice error");
+ server_recv (":server 437 * alice :Nick/channel is temporarily unavailable");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_438 (not authorized to change nickname)
+ */
+
+TEST(IrcProtocolWithServer, 438)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 438");
+ server_recv (":server 438 alice");
+
+ server_recv (":server 438 alice alice2");
+ server_recv (":server 438 alice alice2 error");
+ server_recv (":server 438 alice alice2 :Nick change too fast. Please wait 30 seconds.");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_470 (forwarding to another channel)
+ */
+
+TEST(IrcProtocolWithServer, 470)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 470");
+ server_recv (":server 470 alice");
+ server_recv (":server 470 alice #test");
+
+ server_recv (":server 470 alice #test #test2");
+ server_recv (":server 470 alice #test #test2 forwarding");
+ server_recv (":server 470 alice #test #test2 :Forwarding to another channel");
+
+ server_recv (":server 438 alice alice2");
+ server_recv (":server 438 alice alice2 error");
+ server_recv (":server 438 alice alice2 :Nick change too fast. Please wait 30 seconds.");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_728 (quietlist)
+ */
+
+TEST(IrcProtocolWithServer, 728)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 728");
+ server_recv (":server 728 alice");
+ server_recv (":server 728 alice #test q");
+
+ server_recv (":server 728 alice #test q nick1!user1@host1");
+ server_recv (":server 728 alice #test q nick1!user1@host1 alice!user@host");
+ server_recv (":server 728 alice #test q nick1!user1@host1 alice!user@host "
+ "1351350090");
+
+ /* channel not found */
+ server_recv (":server 728 alice #xyz q nick1!user1@host1");
+ server_recv (":server 728 alice #xyz q nick1!user1@host1 alice!user@host");
+ server_recv (":server 728 alice #xyz q nick1!user1@host1 alice!user@host "
+ "1351350090");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_729 (end of quietlist)
+ */
+
+TEST(IrcProtocolWithServer, 729)
+{
+ server_recv (":server 001 alice");
+
+ server_recv (":alice!user@host JOIN #test");
+
+ /* not enough arguments */
+ server_recv (":server 729");
+ server_recv (":server 729 alice");
+ server_recv (":server 729 alice #test");
+
+ server_recv (":server 729 alice #test q");
+ server_recv (":server 729 alice #test q end");
+ server_recv (":server 729 alice #test q :End of Channel Quiet List");
+
+ /* channel not found */
+ server_recv (":server 729 alice #xyz q");
+ server_recv (":server 729 alice #xyz q end");
+ server_recv (":server 729 alice #xyz q :End of Channel Quiet List");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_730 (monitored nicks are online (RPL_MONONLINE))
+ */
+
+TEST(IrcProtocolWithServer, 730)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 730");
+ server_recv (":server 730 alice");
+
+ server_recv (":server 730 alice :nick1!user1@host1,nick2!user2@host2");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_731 (monitored nicks are offline (RPL_MONOFFLINE))
+ */
+
+TEST(IrcProtocolWithServer, 731)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 731");
+ server_recv (":server 731 alice");
+
+ server_recv (":server 731 alice :nick1!user1@host1,nick2!user2@host2");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_732 (list of monitored nicks (RPL_MONLIST))
+ */
+
+TEST(IrcProtocolWithServer, 732)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 732");
+
+ server_recv (":server 732 alice");
+ server_recv (":server 732 alice :nick1!user1@host1,nick2!user2@host2");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_733 (end of a monitor list (RPL_ENDOFMONLIST))
+ */
+
+TEST(IrcProtocolWithServer, 733)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 733");
+
+ server_recv (":server 733 alice");
+ server_recv (":server 733 alice end");
+ server_recv (":server 733 alice :End of MONITOR list");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_734 (monitor list is full (ERR_MONLISTFULL))
+ */
+
+TEST(IrcProtocolWithServer, 734)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 734");
+ server_recv (":server 734 alice");
+ server_recv (":server 734 alice 10");
+
+ server_recv (":server 734 alice 10 nick1,nick2");
+ server_recv (":server 734 alice 10 nick1,nick2 full");
+ server_recv (":server 734 alice 10 nick1,nick2 :Monitor list is full");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_900 (logged in as (SASL))
+ */
+
+TEST(IrcProtocolWithServer, 900)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 900");
+ server_recv (":server 900 alice");
+ server_recv (":server 900 alice alice!user@host");
+ server_recv (":server 900 alice alice!user@host alice");
+
+ server_recv (":server 900 alice alice!user@host alice logged");
+ server_recv (":server 900 alice alice!user@host alice "
+ ":You are now logged in as mynick");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_901 (you are now logged in)
+ */
+
+TEST(IrcProtocolWithServer, 901)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 901");
+ server_recv (":server 901 alice");
+ server_recv (":server 901 alice user");
+ server_recv (":server 901 alice user host");
+
+ server_recv (":server 901 alice user host logged");
+ server_recv (":server 901 alice user host "
+ ":You are now logged in as mynick");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_903 (SASL OK)
+ * irc_protocol_cb_907 (SASL OK)
+ */
+
+TEST(IrcProtocolWithServer, 903_907)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 903");
+
+ /* not enough arguments */
+ server_recv (":server 907");
+
+ server_recv (":server 903 alice ok");
+ server_recv (":server 903 alice :SASL authentication successful");
+
+ server_recv (":server 907 alice ok");
+ server_recv (":server 907 alice :SASL authentication successful");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_902 (SASL failed)
+ * irc_protocol_cb_904 (SASL failed)
+ * irc_protocol_cb_905 (SASL failed)
+ * irc_protocol_cb_906 (SASL failed)
+ */
+
+TEST(IrcProtocolWithServer, 902_904_905_906)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 902");
+
+ /* not enough arguments */
+ server_recv (":server 904");
+
+ /* not enough arguments */
+ server_recv (":server 905");
+
+ /* not enough arguments */
+ server_recv (":server 906");
+
+ server_recv (":server 902 alice error");
+ server_recv (":server 902 alice :SASL authentication failed");
+
+ server_recv (":server 904 alice error");
+ server_recv (":server 904 alice :SASL authentication failed");
+
+ server_recv (":server 905 alice error");
+ server_recv (":server 905 alice :SASL authentication failed");
+
+ server_recv (":server 906 alice error");
+ server_recv (":server 906 alice :SASL authentication failed");
+}
+
+/*
+ * Tests functions:
+ * irc_protocol_cb_server_mode_reason
+ *
+ * Messages:
+ * 973: whois (secure connection)
+ * 974: whois (secure connection)
+ * 975: whois (secure connection)
+ */
+
+TEST(IrcProtocolWithServer, server_mode_reason)
+{
+ server_recv (":server 001 alice");
+
+ /* not enough arguments */
+ server_recv (":server 973");
+
+ server_recv (":server 973 alice");
+ server_recv (":server 973 alice mode");
+ server_recv (":server 973 alice mode test");
+ server_recv (":server 973 alice mode :test");
+
+ server_recv (":server 974 alice");
+ server_recv (":server 974 alice mode");
+ server_recv (":server 974 alice mode test");
+ server_recv (":server 974 alice mode :test");
+
+ server_recv (":server 975 alice");
+ server_recv (":server 975 alice mode");
+ server_recv (":server 975 alice mode test");
+ server_recv (":server 975 alice mode :test");
+
+ server_recv (":server 973 bob");
+ server_recv (":server 973 bob mode");
+ server_recv (":server 973 bob mode test");
+ server_recv (":server 973 bob mode :test");
+
+ server_recv (":server 974 bob");
+ server_recv (":server 974 bob mode");
+ server_recv (":server 974 bob mode test");
+ server_recv (":server 974 bob mode :test");
+
+ server_recv (":server 975 bob");
+ server_recv (":server 975 bob mode");
+ server_recv (":server 975 bob mode test");
+ server_recv (":server 975 bob mode :test");
+}