/* * SPDX-FileCopyrightText: 2019-2026 Sébastien Helleu * * SPDX-License-Identifier: GPL-3.0-or-later * * This file is part of WeeChat, the extensible chat client. * * WeeChat is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * WeeChat is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with WeeChat. If not, see . */ /* Test IRC protocol functions */ #include "CppUTest/TestHarness.h" #include "tests.h" #include "tests-record.h" extern "C" { #include #include #include #include #include "src/core/core-arraylist.h" #include "src/core/core-config-file.h" #include "src/core/core-hashtable.h" #include "src/core/core-hook.h" #include "src/core/core-input.h" #include "src/core/core-string.h" #include "src/gui/gui-buffer.h" #include "src/gui/gui-color.h" #include "src/plugins/plugin.h" #include "src/plugins/irc/irc-batch.h" #include "src/plugins/irc/irc-ctcp.h" #include "src/plugins/irc/irc-protocol.h" #include "src/plugins/irc/irc-channel.h" #include "src/plugins/irc/irc-config.h" #include "src/plugins/irc/irc-nick.h" #include "src/plugins/irc/irc-server.h" #include "src/plugins/logger/logger-config.h" #include "src/plugins/typing/typing-config.h" #include "src/plugins/typing/typing-status.h" #include "src/plugins/xfer/xfer-buffer.h" extern int irc_protocol_is_numeric_command (const char *str); extern int irc_protocol_log_level_for_command (const char *command); extern const char *irc_protocol_nick_address (struct t_irc_server *server, int server_message, struct t_irc_nick *nick, const char *nickname, const char *address); extern char *irc_protocol_string_params (const char **params, int arg_start, int arg_end); extern char *irc_protocol_cap_to_enable (const char *capabilities, int sasl_requested); } #define IRC_FAKE_SERVER "fake" #define IRC_MSG_005 "PREFIX=(ohv)@%+ MAXLIST=bqeI:100 MODES=4 " \ "NETWORK=StaticBox STATUSMSG=@+ CALLERID=g " \ "CASEMAPPING=strict-rfc1459 LINELEN=4096 NICKLEN=30 MAXNICKLEN=31 " \ "USERLEN=16 HOSTLEN=32 CHANNELLEN=50 TOPICLEN=390 DEAF=D " \ "CHANTYPES=# CHANMODES=eIbq,k,flj,CFLMPQScgimnprstuz " \ "MONITOR=100 UTF8MAPPING=rfc8265 UTF8ONLY" #define IRC_ALL_CAPS "account-notify,account-tag,away-notify,batch," \ "cap-notify,chghost,draft/multiline,echo-message,extended-join," \ "invite-notify,message-tags,multi-prefix,server-time,setname," \ "userhost-in-names" #define WEE_CHECK_PROTOCOL_TAGS(__result, __server, __command, __tags, \ __extra_tags) \ ctxt.server = __server; \ ctxt.command = (char *)__command; \ ctxt.tags = __tags; \ STRCMP_EQUAL(__result, irc_protocol_tags (&ctxt, __extra_tags)); #define WEE_CHECK_CAP_TO_ENABLE(__result, __string, __sasl_requested) \ str = irc_protocol_cap_to_enable (__string, __sasl_requested); \ STRCMP_EQUAL(__result, str); \ free (str); #define RECV(__irc_msg) \ server_recv (__irc_msg); #define CHECK_CORE(__prefix, __message) \ if (!record_search ("core.weechat", __prefix, __message, NULL)) \ { \ char **msg = build_error ( \ "Core message not displayed", \ __prefix, \ __message, \ NULL, \ "All messages displayed"); \ record_dump (msg); \ FAIL(string_dyn_free (msg, 0)); \ } #define CHECK_SRV(__prefix, __message, __tags) \ if (!record_search ("irc.server." IRC_FAKE_SERVER, __prefix, \ __message, __tags)) \ { \ char **msg = build_error ( \ "Server message not displayed", \ __prefix, \ __message, \ __tags, \ "All messages displayed"); \ record_dump (msg); \ FAIL(string_dyn_free (msg, 0)); \ } #define CHECK_ERROR_PARAMS(__command, __params, __expected_params) \ CHECK_SRV("=!=", \ "irc: too few parameters received in command " \ "\"" __command "\" (received: " #__params ", " \ "expected: at least " #__expected_params ")", \ ""); #define CHECK_ERROR_NICK(__command) \ CHECK_SRV("=!=", \ "irc: command \"" __command "\" received without nick", \ ""); #define CHECK_ERROR_PARSE(__command, __message) \ CHECK_SRV("=!=", \ "irc: failed to parse command \"" __command "\" " \ "(please report to developers): \"" __message "\"", \ ""); #define CHECK_CHAN(__prefix, __message, __tags) \ if (!record_search ("irc." IRC_FAKE_SERVER ".#test", __prefix, \ __message, __tags)) \ { \ char **msg = build_error ( \ "Channel message not displayed", \ __prefix, \ __message, \ __tags, \ "All messages displayed"); \ record_dump (msg); \ FAIL(string_dyn_free (msg, 0)); \ } #define CHECK_CHAN_DATE_VALUE(__prefix, __message, __tags, \ __date_sec, __date_usec) \ { \ struct timeval tv_now; \ const char *ptr_date; \ long value; \ char *error; \ gettimeofday (&tv_now, NULL); \ struct t_hashtable *record = record_search ( \ "irc." IRC_FAKE_SERVER ".#test", \ __prefix, __message, __tags); \ if (!record) \ { \ char **msg = build_error ( \ "Channel message not displayed", \ __prefix, \ __message, \ __tags, \ "All messages displayed"); \ record_dump (msg); \ FAIL(string_dyn_free (msg, 0)); \ } \ ptr_date = (const char *)hashtable_get (record, "date"); \ CHECK(ptr_date); \ value = strtol (ptr_date, &error, 10); \ CHECK(error && !error[0]); \ LONGS_EQUAL(__date_sec, value); \ ptr_date = (const char *)hashtable_get (record, "date_usec"); \ CHECK(ptr_date); \ value = strtol (ptr_date, &error, 10); \ CHECK(error && !error[0]); \ LONGS_EQUAL(__date_usec, value); \ } #define CHECK_CHAN_DATE_NOW(__prefix, __message, __tags) \ { \ struct timeval tv_now; \ const char *ptr_date; \ long value; \ char *error; \ gettimeofday (&tv_now, NULL); \ struct t_hashtable *record = record_search ( \ "irc." IRC_FAKE_SERVER ".#test", \ __prefix, __message, __tags); \ if (!record) \ { \ char **msg = build_error ( \ "Channel message not displayed", \ __prefix, \ __message, \ __tags, \ "All messages displayed"); \ record_dump (msg); \ FAIL(string_dyn_free (msg, 0)); \ } \ ptr_date = (const char *)hashtable_get (record, "date"); \ CHECK(ptr_date); \ value = strtol (ptr_date, &error, 10); \ CHECK(error && !error[0]); \ CHECK(value >= tv_now.tv_sec - 5); \ CHECK(value <= tv_now.tv_sec + 5); \ } #define CHECK_PV(__nick, __prefix, __message, __tags) \ if (!record_search ("irc." IRC_FAKE_SERVER "." __nick, \ __prefix, __message, __tags)) \ { \ char **msg = build_error ( \ "Private message not displayed", \ __prefix, \ __message, \ __tags, \ "All messages displayed"); \ record_dump (msg); \ FAIL(string_dyn_free (msg, 0)); \ } #define CHECK_PV_CLOSE(__nick, __prefix, __message, __tags) \ CHECK_PV(__nick, __prefix, __message, __tags); \ gui_buffer_close ( \ gui_buffer_search_by_full_name ("irc." IRC_FAKE_SERVER \ "." __nick)); #define CHECK_NO_MSG \ if (arraylist_size (recorded_messages) > 0) \ { \ char **msg = build_error ( \ "Unexpected message(s) displayed", \ NULL, \ NULL, \ NULL, \ NULL); \ record_dump (msg); \ FAIL(string_dyn_free (msg, 0)); \ } #define CHECK_SENT(__message) \ if ((__message != NULL) \ && !arraylist_search (sent_messages, (void *)__message, \ NULL, NULL)) \ { \ char **msg = build_error ( \ "Message not sent to the IRC server", \ NULL, \ __message, \ NULL, \ "All messages sent"); \ sent_msg_dump (msg); \ FAIL(string_dyn_free (msg, 0)); \ } \ else if ((__message == NULL) \ && (arraylist_size (sent_messages) > 0)) \ { \ char **msg = build_error ( \ "Unexpected response(s) sent to the IRC server", \ NULL, \ NULL, \ NULL, \ NULL); \ sent_msg_dump (msg); \ FAIL(string_dyn_free (msg, 0)); \ } #define SRV_INIT \ RECV(":server 001 alice :Welcome on this server, alice!"); \ CHECK_SRV("--", "Welcome on this server, alice!", \ "irc_001,irc_numeric,nick_server,log3"); #define SRV_INIT_JOIN \ SRV_INIT; \ RECV(":alice!user_a@host_a JOIN #test"); \ CHECK_CHAN("-->", "alice (user_a@host_a) has joined #test", \ "irc_join,nick_alice,host_user_a@host_a,log4"); #define SRV_INIT_JOIN2 \ SRV_INIT_JOIN; \ RECV(":bob!user_b@host_b JOIN #test"); \ CHECK_CHAN("-->", "bob (user_b@host_b) has joined #test", \ "irc_join,irc_smart_filter,nick_bob,host_user_b@host_b," \ "log4"); TEST_GROUP(IrcProtocol) { }; TEST_GROUP(IrcProtocolWithServer) { struct t_irc_server *ptr_server = NULL; struct t_arraylist *sent_messages = NULL; struct t_hook *hook_signal_irc_out = NULL; void server_recv (const char *command) { char str_command[8192]; record_start (); arraylist_clear (sent_messages); snprintf (str_command, sizeof (str_command), "/command -buffer irc.server." IRC_FAKE_SERVER " irc " "/server fakerecv \"%s\"", command); run_cmd_quiet (str_command); record_stop (); } void server_input_data (const char *buffer, const char *data) { struct t_gui_buffer *ptr_buffer; record_start (); arraylist_clear (sent_messages); ptr_buffer = gui_buffer_search_by_full_name (buffer); if (ptr_buffer) input_data (ptr_buffer, data, NULL, 0, 0); record_stop (); } char **build_error (const char *msg1, const char *prefix, const char *message, const char *tags, const char *msg2) { char **msg; msg = string_dyn_alloc (1024); string_dyn_concat (msg, msg1, -1); if (message) { string_dyn_concat (msg, ": prefix=\"", -1); string_dyn_concat (msg, prefix, -1); string_dyn_concat (msg, "\", message=\"", -1); string_dyn_concat (msg, message, -1); string_dyn_concat (msg, "\", tags=\"", -1); string_dyn_concat (msg, tags, -1); string_dyn_concat (msg, "\"\n", -1); } else { string_dyn_concat (msg, ":\n", -1); } if (msg2) { string_dyn_concat (msg, msg2, -1); string_dyn_concat (msg, ":\n", -1); } return msg; } static int signal_irc_out_cb (const void *pointer, void *data, const char *signal, const char *type_data, void *signal_data) { /* make C++ compiler happy */ (void) data; (void) signal; (void) type_data; if (signal_data) { arraylist_add ((struct t_arraylist *)pointer, strdup ((const char *)signal_data)); } return WEECHAT_RC_OK; } static int sent_msg_cmp_cb (void *data, struct t_arraylist *arraylist, void *pointer1, void *pointer2) { /* make C++ compiler happy */ (void) data; (void) arraylist; return strcmp ((char *)pointer1, (char *)pointer2); } static void sent_msg_free_cb (void *data, struct t_arraylist *arraylist, void *pointer) { /* make C++ compiler happy */ (void) data; (void) arraylist; free (pointer); } void sent_msg_dump (char **msg) { int i; for (i = 0; i < arraylist_size (sent_messages); i++) { string_dyn_concat (msg, " \"", -1); string_dyn_concat (msg, (const char *)arraylist_get (sent_messages, i), -1); string_dyn_concat (msg, "\"\n", -1); } } void setup () { /* initialize list of messages sent to the server */ if (sent_messages) { arraylist_clear (sent_messages); } else { sent_messages = arraylist_new (16, 0, 1, &sent_msg_cmp_cb, NULL, &sent_msg_free_cb, NULL); } if (!hook_signal_irc_out) { hook_signal_irc_out = hook_signal ( NULL, IRC_FAKE_SERVER ",irc_out1_*", &signal_irc_out_cb, sent_messages, NULL); } /* * disable backlog feature during tests, so we are not polluted by * these messages when buffers are opened */ config_file_option_set (logger_config_look_backlog, "0", 1); /* create a fake server (no I/O) */ run_cmd_quiet ("/mute /server add " IRC_FAKE_SERVER " fake:127.0.0.1 " "-nicks=nick1,nick2,nick3"); /* connect to the fake server */ run_cmd_quiet ("/connect " IRC_FAKE_SERVER); /* get the server pointer */ ptr_server = irc_server_search (IRC_FAKE_SERVER); } void teardown () { /* disconnect and delete the fake server */ run_cmd_quiet ("/mute /disconnect " IRC_FAKE_SERVER); run_cmd_quiet ("/mute /server del " IRC_FAKE_SERVER); ptr_server = NULL; /* restore backlog feature */ config_file_option_reset (logger_config_look_backlog, 1); } }; /* * Test functions: * irc_protocol_is_numeric_command */ TEST(IrcProtocol, IsNumericCommand) { LONGS_EQUAL(0, irc_protocol_is_numeric_command (NULL)); LONGS_EQUAL(0, irc_protocol_is_numeric_command ("")); LONGS_EQUAL(0, irc_protocol_is_numeric_command ("abc")); LONGS_EQUAL(1, irc_protocol_is_numeric_command ("0")); LONGS_EQUAL(1, irc_protocol_is_numeric_command ("1")); LONGS_EQUAL(1, irc_protocol_is_numeric_command ("12")); LONGS_EQUAL(1, irc_protocol_is_numeric_command ("123")); } /* * Test functions: * irc_protocol_log_level_for_command */ TEST(IrcProtocol, LogLevelForCommand) { LONGS_EQUAL(0, irc_protocol_log_level_for_command (NULL)); LONGS_EQUAL(0, irc_protocol_log_level_for_command ("")); LONGS_EQUAL(1, irc_protocol_log_level_for_command ("privmsg")); LONGS_EQUAL(1, irc_protocol_log_level_for_command ("notice")); LONGS_EQUAL(2, irc_protocol_log_level_for_command ("nick")); LONGS_EQUAL(4, irc_protocol_log_level_for_command ("join")); LONGS_EQUAL(4, irc_protocol_log_level_for_command ("part")); LONGS_EQUAL(4, irc_protocol_log_level_for_command ("quit")); LONGS_EQUAL(4, irc_protocol_log_level_for_command ("nick_back")); LONGS_EQUAL(3, irc_protocol_log_level_for_command ("001")); LONGS_EQUAL(3, irc_protocol_log_level_for_command ("away")); LONGS_EQUAL(3, irc_protocol_log_level_for_command ("kick")); LONGS_EQUAL(3, irc_protocol_log_level_for_command ("topic")); } /* * Test functions: * irc_protocol_tags */ TEST(IrcProtocolWithServer, Tags) { struct t_irc_protocol_ctxt ctxt; struct t_hashtable *tags_empty, *tags_1, *tags_2; SRV_INIT; memset (&ctxt, 0, sizeof (ctxt)); ctxt.nick = strdup ("alice"); ctxt.nick_is_me = 1; ctxt.address = strdup ("user@example.com"); tags_empty = hashtable_new (32, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, NULL, NULL); tags_1 = hashtable_new (32, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, NULL, NULL); hashtable_set (tags_1, "key1", "value1"); tags_2 = hashtable_new (32, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, NULL, NULL); hashtable_set (tags_2, "key1", "value1"); hashtable_set (tags_2, "key_2,comma", "value2,comma"); hashtable_set (tags_2, "key_3_empty", ""); hashtable_set (tags_2, "key_4_null", NULL); WEE_CHECK_PROTOCOL_TAGS("nick_alice,host_user@example.com", NULL, NULL, NULL, NULL); /* command */ WEE_CHECK_PROTOCOL_TAGS("irc_privmsg,nick_alice,host_user@example.com,log1", NULL, "privmsg", NULL, NULL); WEE_CHECK_PROTOCOL_TAGS("irc_join,nick_alice,host_user@example.com,log4", NULL, "join", NULL, NULL); /* command + irc_msg_tags */ WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,nick_alice,host_user@example.com,log1", NULL, "privmsg", tags_empty, NULL); WEE_CHECK_PROTOCOL_TAGS( "irc_join,nick_alice,host_user@example.com,log4", NULL, "join", tags_empty, NULL); WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,irc_tag_key1=value1,nick_alice,host_user@example.com,log1", NULL, "privmsg", tags_1, NULL); WEE_CHECK_PROTOCOL_TAGS( "irc_join,irc_tag_key1=value1,nick_alice,host_user@example.com,log4", NULL, "join", tags_1, NULL); WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,irc_tag_key1=value1," "irc_tag_key_2;comma=value2;comma," "irc_tag_key_3_empty=,irc_tag_key_4_null,nick_alice," "host_user@example.com,log1", NULL, "privmsg", tags_2, NULL); WEE_CHECK_PROTOCOL_TAGS( "irc_join,irc_tag_key1=value1," "irc_tag_key_2;comma=value2;comma," "irc_tag_key_3_empty=,irc_tag_key_4_null,nick_alice," "host_user@example.com,log4", NULL, "join", tags_2, NULL); /* command + extra_tags */ WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,nick_alice,host_user@example.com,log1", NULL, "privmsg", NULL, ""); WEE_CHECK_PROTOCOL_TAGS( "irc_join,nick_alice,host_user@example.com,log4", NULL, "join", NULL, ""); WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,tag1,tag2,nick_alice,host_user@example.com,log1", NULL, "privmsg", NULL, "tag1,tag2"); WEE_CHECK_PROTOCOL_TAGS( "irc_join,tag1,tag2,nick_alice,host_user@example.com,log4", NULL, "join", NULL, "tag1,tag2"); /* command + irc_msg_tags + extra_tags + nick */ WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,irc_tag_key1=value1,irc_tag_key_2;comma=value2;comma," "irc_tag_key_3_empty=,irc_tag_key_4_null,tag1,tag2,nick_bob,log1", NULL, "privmsg", tags_2, "tag1,tag2,nick_bob"); /* command + irc_msg_tags + extra_tags + nick + address */ WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,irc_tag_key1=value1,irc_tag_key_2;comma=value2;comma," "irc_tag_key_3_empty=,irc_tag_key_4_null,tag1,tag2,nick_bob," "host_user@host,log1", NULL, "privmsg", tags_2, "tag1,tag2,nick_bob,host_user@host"); /* self message */ WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,self_msg,host_user@example.com,log1", NULL, "privmsg", NULL, "self_msg"); /* server + self message */ WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,self_msg,nick_alice,host_user@example.com,log1", ptr_server, "privmsg", NULL, "self_msg"); /* server + self message + host */ WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,self_msg,host_user@host,nick_alice,log1", ptr_server, "privmsg", NULL, "self_msg,host_user@host"); /* server + self message (other nick) + host */ ctxt.nick_is_me = 0; WEE_CHECK_PROTOCOL_TAGS( "irc_privmsg,self_msg,nick_bob,log1", ptr_server, "privmsg", NULL, "self_msg,nick_bob"); hashtable_free (tags_empty); hashtable_free (tags_1); hashtable_free (tags_2); free (ctxt.nick); free (ctxt.address); } /* * Test functions: * irc_protocol_string_params */ TEST(IrcProtocol, StringParams) { char *str; const char *params_empty[] = { "", NULL }; const char *params_1[] = { "param1", NULL }; const char *params_2[] = { "param1", "param2", NULL }; const char *params_3[] = { "param1", "param2", "param3", NULL }; /* invalid arguments */ WEE_TEST_STR("", irc_protocol_string_params (NULL, -1, -1)); WEE_TEST_STR("", irc_protocol_string_params (NULL, 0, 0)); WEE_TEST_STR("", irc_protocol_string_params (NULL, 0, -1)); WEE_TEST_STR("", irc_protocol_string_params (params_1, 1, 0)); /* empty parameter */ WEE_TEST_STR("", irc_protocol_string_params (params_empty, 0, 0)); WEE_TEST_STR("", irc_protocol_string_params (params_empty, 1, 1)); /* one parameter */ WEE_TEST_STR("param1", irc_protocol_string_params (params_1, 0, 0)); WEE_TEST_STR("", irc_protocol_string_params (params_1, 1, 1)); /* two parameters */ WEE_TEST_STR("param1 param2", irc_protocol_string_params (params_2, 0, 1)); WEE_TEST_STR("param2", irc_protocol_string_params (params_2, 1, 1)); WEE_TEST_STR("", irc_protocol_string_params (params_2, 2, 2)); /* three parameters */ WEE_TEST_STR("param1 param2 param3", irc_protocol_string_params (params_3, 0, 2)); WEE_TEST_STR("param2 param3", irc_protocol_string_params (params_3, 1, 2)); WEE_TEST_STR("param2", irc_protocol_string_params (params_3, 1, 1)); WEE_TEST_STR("param3", irc_protocol_string_params (params_3, 2, 2)); WEE_TEST_STR("", irc_protocol_string_params (params_3, 3, 3)); } /* * Tests send of messages to channel (STATUSMSG and normal) and nick, * without capability "echo-message" enabled: * - message (text) * - notice (/notice) * - action (/me + /ctcp) * - CTCP (/ctcp) */ TEST(IrcProtocolWithServer, SendMessagesWithoutEchoMessage) { const char *buffer_server = "irc.server." IRC_FAKE_SERVER; const char *buffer_chan = "irc." IRC_FAKE_SERVER ".#test"; const char *buffer_pv = "irc." IRC_FAKE_SERVER ".bob"; SRV_INIT_JOIN; /* open private buffer */ RECV(":bob!user@host PRIVMSG alice :hi Alice!"); /* message to channel (text in buffer) */ server_input_data (buffer_chan, "\002msg chan 1"); CHECK_SENT("PRIVMSG #test :\002msg chan 1"); CHECK_CHAN("alice", "msg chan 1", "irc_privmsg,self_msg,notify_none,no_highlight,prefix_nick_white," "nick_alice,log1"); /* message to channel (with /msg ) */ server_input_data (buffer_server, "/msg #test \002msg chan 2"); CHECK_SENT("PRIVMSG #test :\002msg chan 2"); CHECK_CHAN("alice", "msg chan 2", "irc_privmsg,self_msg,notify_none,no_highlight,prefix_nick_white," "nick_alice,log1"); /* message to channel (with /msg ), channel not joined */ server_input_data (buffer_server, "/msg #zzz \002msg chan not joined"); CHECK_SENT("PRIVMSG #zzz :\002msg chan not joined"); CHECK_SRV("--", "Msg(alice) -> #zzz: msg chan not joined", "irc_privmsg,self_msg,notify_none,no_highlight,nick_alice,log1"); /* STATUSMSG message to channel (with /msg @) */ server_input_data (buffer_server, "/msg @#test \002msg chan ops"); CHECK_SENT("PRIVMSG @#test :\002msg chan ops"); CHECK_CHAN("--", "Msg(alice) -> @#test: msg chan ops", "irc_privmsg,self_msg,notify_none,no_highlight,nick_alice,log1"); /* STATUSMSG message to channel (with /msg @), channel not joined */ server_input_data (buffer_server, "/msg @#zzz \002msg chan ops not joined"); CHECK_SENT("PRIVMSG @#zzz :\002msg chan ops not joined"); CHECK_SRV("--", "Msg(alice) -> @#zzz: msg chan ops not joined", "irc_privmsg,self_msg,notify_none,no_highlight,nick_alice,log1"); /* message to a nick (text in private buffer) */ server_input_data (buffer_pv, "\002msg pv 1"); CHECK_SENT("PRIVMSG bob :\002msg pv 1"); CHECK_PV("bob", "alice", "msg pv 1", "irc_privmsg,self_msg,notify_none,no_highlight,prefix_nick_white," "nick_alice,log1"); /* message to a nick (with /msg ) */ server_input_data (buffer_server, "/msg bob \002msg pv 2"); CHECK_SENT("PRIVMSG bob :\002msg pv 2"); CHECK_PV("bob", "alice", "msg pv 2", "irc_privmsg,self_msg,notify_none,no_highlight,prefix_nick_white," "nick_alice,log1"); /* message to a nick (with /msg ), hidden password */ server_input_data (buffer_server, "/msg nickserv identify secret"); CHECK_SENT("PRIVMSG nickserv :identify secret"); CHECK_SRV("--", "Msg(alice) -> nickserv: identify ******", "irc_privmsg,self_msg,notify_none,no_highlight,nick_alice,log1"); /* message to a nick (with /query ) */ server_input_data (buffer_server, "/query bob \002msg pv 3"); CHECK_SENT("PRIVMSG bob :\002msg pv 3"); CHECK_PV("bob", "alice", "msg pv 3", "irc_privmsg,self_msg,notify_none,no_highlight,prefix_nick_white," "nick_alice,log1"); /* message to a nick (with /query ), private buffer does not exist */ server_input_data (buffer_server, "/query bob_query \002msg pv 4"); CHECK_SENT("PRIVMSG bob_query :\002msg pv 4"); CHECK_PV("bob_query", "alice", "msg pv 4", "irc_privmsg,self_msg,notify_none,no_highlight,prefix_nick_white," "nick_alice,log1"); /* notice to channel */ server_input_data (buffer_server, "/notice #test \002notice chan"); CHECK_SENT("NOTICE #test :\002notice chan"); CHECK_CHAN("--", "Notice(alice) -> #test: notice chan", "irc_notice,self_msg,notify_none,no_highlight,nick_alice,log1"); /* STATUSMSG notice to channel */ server_input_data (buffer_server, "/notice @#test \002notice chan ops"); CHECK_SENT("NOTICE @#test :\002notice chan ops"); CHECK_CHAN("--", "Notice(alice) -> @#test: notice chan ops", "irc_notice,self_msg,notify_none,no_highlight,nick_alice,log1"); /* notice to a nick */ server_input_data (buffer_server, "/notice bob \002notice pv"); CHECK_SENT("NOTICE bob :\002notice pv"); CHECK_PV("bob", "--", "Notice(alice) -> bob: notice pv", "irc_notice,self_msg,notify_none,no_highlight,nick_alice,log1"); /* action on channel (with /me) */ server_input_data (buffer_chan, "/me \002action chan 1"); CHECK_SENT("PRIVMSG #test :\001ACTION \002action chan 1\001"); CHECK_CHAN(" *", "alice action chan 1", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action on channel (with /me), no message */ server_input_data (buffer_chan, "/me"); CHECK_SENT("PRIVMSG #test :\001ACTION\001"); CHECK_CHAN(" *", "alice", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action on channel (with raw code: "\001ACTION") */ server_input_data (buffer_chan, "\001ACTION \002is testing\001"); CHECK_SENT("PRIVMSG #test :\001ACTION \002is testing\001"); CHECK_CHAN(" *", "alice is testing", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action on channel (with raw code: "\001ACTION"), no message */ server_input_data (buffer_chan, "\001ACTION\001"); CHECK_SENT("PRIVMSG #test :\001ACTION\001"); CHECK_CHAN(" *", "alice", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action on channel (with /action *) */ server_input_data (buffer_chan, "/action * \002action chan 2"); CHECK_SENT("PRIVMSG #test :\001ACTION \002action chan 2\001"); CHECK_CHAN(" *", "alice action chan 2", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action on channel (with /action ) */ server_input_data (buffer_server, "/action #test \002action chan 3"); CHECK_SENT("PRIVMSG #test :\001ACTION \002action chan 3\001"); CHECK_CHAN(" *", "alice action chan 3", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action on channel (with /action ), no message */ server_input_data (buffer_chan, "/action #test"); CHECK_SENT("PRIVMSG #test :\001ACTION\001"); CHECK_CHAN(" *", "alice", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* STATUSMSG action on channel (with /action @) */ server_input_data (buffer_server, "/action @#test \002action chan 4"); CHECK_SENT("PRIVMSG @#test :\001ACTION \002action chan 4\001"); CHECK_CHAN("--", "Action -> @#test: alice action chan 4", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* STATUSMSG action on channel (with /action @), no message */ server_input_data (buffer_server, "/action @#test"); CHECK_SENT("PRIVMSG @#test :\001ACTION\001"); CHECK_CHAN("--", "Action -> @#test: alice", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action on channel (with /ctcp action) */ server_input_data (buffer_server, "/ctcp #test action \002action chan 5"); CHECK_SENT("PRIVMSG #test :\001ACTION \002action chan 5\001"); CHECK_CHAN(" *", "alice action chan 5", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action on channel (with /ctcp action), no message */ server_input_data (buffer_server, "/ctcp #test action"); CHECK_SENT("PRIVMSG #test :\001ACTION\001"); CHECK_CHAN(" *", "alice", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* STATUSMSG action on channel (with /ctcp @ action) */ server_input_data (buffer_server, "/ctcp @#test action \002action chan ops"); CHECK_SENT("PRIVMSG @#test :\001ACTION \002action chan ops\001"); CHECK_CHAN("--", "Action -> @#test: alice action chan ops", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action in private (with /me) */ server_input_data (buffer_pv, "/me \002action pv 1"); CHECK_SENT("PRIVMSG bob :\001ACTION \002action pv 1\001"); CHECK_PV("bob", " *", "alice action pv 1", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action in private (with /ctcp) */ server_input_data (buffer_server, "/ctcp bob action \002action pv 2"); CHECK_SENT("PRIVMSG bob :\001ACTION \002action pv 2\001"); CHECK_PV("bob", " *", "alice action pv 2", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* action in private (with /ctcp), without private buffer */ server_input_data (buffer_server, "/ctcp bob2 action \002action pv 3"); CHECK_SENT("PRIVMSG bob2 :\001ACTION \002action pv 3\001"); CHECK_SRV("--", "Action -> bob2: alice action pv 3", "irc_privmsg,irc_action,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* CTCP version to channel */ server_input_data (buffer_server, "/ctcp #test version"); CHECK_SENT("PRIVMSG #test :\001VERSION\001"); CHECK_CHAN("--", "CTCP query to #test: VERSION", "irc_privmsg,irc_ctcp,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* unknown CTCP to channel */ server_input_data (buffer_server, "/ctcp #test unknown1 \002some args"); CHECK_SENT("PRIVMSG #test :\001UNKNOWN1 \002some args\001"); CHECK_CHAN("--", "CTCP query to #test: UNKNOWN1 some args", "irc_privmsg,irc_ctcp,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* CTCP version to nick */ server_input_data (buffer_server, "/ctcp bob version"); CHECK_SENT("PRIVMSG bob :\001VERSION\001"); CHECK_PV("bob", "--", "CTCP query to bob: VERSION", "irc_privmsg,irc_ctcp,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* CTCP version to other nick (no private buffer) */ server_input_data (buffer_server, "/ctcp other_nick version"); CHECK_SENT("PRIVMSG other_nick :\001VERSION\001"); CHECK_SRV("--", "CTCP query to other_nick: VERSION", "irc_privmsg,irc_ctcp,self_msg,notify_none,no_highlight," "nick_alice,log1"); /* unknown CTCP to nick */ server_input_data (buffer_server, "/ctcp bob unknown2 \002some args"); CHECK_SENT("PRIVMSG bob :\001UNKNOWN2 \002some args\001"); CHECK_PV("bob", "--", "CTCP query to bob: UNKNOWN2 some args", "irc_privmsg,irc_ctcp,self_msg,notify_none,no_highlight," "nick_alice,log1"); } /* * Tests send of messages to channel (STATUSMSG and normal) and nick, * with capability "echo-message" enabled: * - message (text) * - notice (/notice) * - action (/me + /ctcp) * - CTCP (/ctcp) */ TEST(IrcProtocolWithServer, SendMessagesWithEchoMessage) { const char *buffer_server = "irc.server." IRC_FAKE_SERVER; const char *buffer_chan = "irc." IRC_FAKE_SERVER ".#test"; const char *buffer_pv = "irc." IRC_FAKE_SERVER ".bob"; /* assume "echo-message" capability is enabled in server */ hashtable_set (ptr_server->cap_list, "echo-message", NULL); SRV_INIT_JOIN; /* open private buffer */ RECV(":bob!user@host PRIVMSG alice :hi Alice!"); /* message to channel (text in buffer) */ server_input_data (buffer_chan, "\002msg chan 1"); CHECK_SENT("PRIVMSG #test :\002msg chan 1"); CHECK_NO_MSG; /* message to channel (with /msg ) */ server_input_data (buffer_server, "/msg #test \002msg chan 2"); CHECK_SENT("PRIVMSG #test :\002msg chan 2"); CHECK_NO_MSG; /* message to channel (with /msg ), channel not joined */ server_input_data (buffer_server, "/msg #zzz \002msg chan not joined"); CHECK_SENT("PRIVMSG #zzz :\002msg chan not joined"); CHECK_NO_MSG; /* STATUSMSG message to channel (with /msg @) */ server_input_data (buffer_server, "/msg @#test \002msg chan ops"); CHECK_SENT("PRIVMSG @#test :\002msg chan ops"); CHECK_NO_MSG; /* STATUSMSG message to channel (with /msg @), channel not joined */ server_input_data (buffer_server, "/msg @#zzz \002msg chan ops not joined"); CHECK_SENT("PRIVMSG @#zzz :\002msg chan ops not joined"); CHECK_NO_MSG; /* message to a nick (text in private buffer) */ server_input_data (buffer_pv, "\002msg pv 1"); CHECK_SENT("PRIVMSG bob :\002msg pv 1"); CHECK_NO_MSG; /* message to a nick (with /msg ) */ server_input_data (buffer_server, "/msg bob \002msg pv 2"); CHECK_SENT("PRIVMSG bob :\002msg pv 2"); CHECK_NO_MSG; /* message to a nick (with /msg ), hidden password */ server_input_data (buffer_server, "/msg nickserv identify secret"); CHECK_SENT("PRIVMSG nickserv :identify secret"); CHECK_NO_MSG; /* message to a nick (with /query ) */ server_input_data (buffer_server, "/query bob \002msg pv 3"); CHECK_SENT("PRIVMSG bob :\002msg pv 3"); CHECK_NO_MSG; /* message to a nick (with /query ), private buffer does not exist */ server_input_data (buffer_server, "/query bob_query \002msg pv 4"); CHECK_SENT("PRIVMSG bob_query :\002msg pv 4"); CHECK_NO_MSG; /* notice to channel */ server_input_data (buffer_server, "/notice #test \002notice chan"); CHECK_SENT("NOTICE #test :\002notice chan"); CHECK_NO_MSG; /* STATUSMSG notice to channel */ server_input_data (buffer_server, "/notice @#test \002notice chan ops"); CHECK_SENT("NOTICE @#test :\002notice chan ops"); CHECK_NO_MSG; /* notice to a nick */ server_input_data (buffer_server, "/notice bob \002notice pv"); CHECK_SENT("NOTICE bob :\002notice pv"); CHECK_NO_MSG; /* action on channel (with /me) */ server_input_data (buffer_chan, "/me \002action chan 1"); CHECK_SENT("PRIVMSG #test :\001ACTION \002action chan 1\001"); CHECK_NO_MSG; /* action on channel (with /me), no message */ server_input_data (buffer_chan, "/me"); CHECK_SENT("PRIVMSG #test :\001ACTION\001"); CHECK_NO_MSG; /* action on channel (with raw code: "\001ACTION") */ server_input_data (buffer_chan, "\001ACTION \002is testing\001"); CHECK_SENT("PRIVMSG #test :\001ACTION \002is testing\001"); CHECK_NO_MSG; /* action on channel (with raw code: "\001ACTION"), no message */ server_input_data (buffer_chan, "\001ACTION\001"); CHECK_SENT("PRIVMSG #test :\001ACTION\001"); CHECK_NO_MSG; /* action on channel (with /action *) */ server_input_data (buffer_chan, "/action * \002action chan 2"); CHECK_SENT("PRIVMSG #test :\001ACTION \002action chan 2\001"); CHECK_NO_MSG; /* action on channel (with /action ) */ server_input_data (buffer_server, "/action #test \002action chan 3"); CHECK_SENT("PRIVMSG #test :\001ACTION \002action chan 3\001"); CHECK_NO_MSG; /* action on channel (with /action ), no message */ server_input_data (buffer_chan, "/action #test"); CHECK_SENT("PRIVMSG #test :\001ACTION\001"); CHECK_NO_MSG; /* STATUSMSG action on channel (with /action @) */ server_input_data (buffer_server, "/action @#test \002action chan 4"); CHECK_SENT("PRIVMSG @#test :\001ACTION \002action chan 4\001"); CHECK_NO_MSG; /* STATUSMSG action on channel (with /action @), no message */ server_input_data (buffer_server, "/action @#test"); CHECK_SENT("PRIVMSG @#test :\001ACTION\001"); CHECK_NO_MSG; /* action on channel (with /ctcp action) */ server_input_data (buffer_server, "/ctcp #test action \002action chan 5"); CHECK_SENT("PRIVMSG #test :\001ACTION \002action chan 5\001"); CHECK_NO_MSG; /* STATUSMSG action on channel (with /ctcp @ action) */ server_input_data (buffer_server, "/ctcp @#test action \002action chan ops"); CHECK_SENT("PRIVMSG @#test :\001ACTION \002action chan ops\001"); CHECK_NO_MSG; /* action in private (with /me) */ server_input_data (buffer_pv, "/me \002action pv 1"); CHECK_SENT("PRIVMSG bob :\001ACTION \002action pv 1\001"); CHECK_NO_MSG; /* action in private (with /ctcp) */ server_input_data (buffer_server, "/ctcp bob action \002action pv 2"); CHECK_SENT("PRIVMSG bob :\001ACTION \002action pv 2\001"); CHECK_NO_MSG; /* action in private (with /ctcp), without private buffer */ server_input_data (buffer_server, "/ctcp bob2 action \002action pv 3"); CHECK_SENT("PRIVMSG bob2 :\001ACTION \002action pv 3\001"); CHECK_NO_MSG; /* CTCP version to channel */ server_input_data (buffer_server, "/ctcp #test version"); CHECK_SENT("PRIVMSG #test :\001VERSION\001"); CHECK_NO_MSG; /* unknown CTCP to channel */ server_input_data (buffer_server, "/ctcp #test unknown1 \002some args"); CHECK_SENT("PRIVMSG #test :\001UNKNOWN1 \002some args\001"); CHECK_NO_MSG; /* CTCP version to nick */ server_input_data (buffer_server, "/ctcp bob version"); CHECK_SENT("PRIVMSG bob :\001VERSION\001"); CHECK_NO_MSG; /* CTCP version to other nick (no private buffer) */ server_input_data (buffer_server, "/ctcp other_nick version"); CHECK_SENT("PRIVMSG other_nick :\001VERSION\001"); CHECK_NO_MSG; /* unknown CTCP to nick */ server_input_data (buffer_server, "/ctcp bob unknown2 \002some args"); CHECK_SENT("PRIVMSG bob :\001UNKNOWN2 \002some args\001"); CHECK_NO_MSG; hashtable_remove (ptr_server->cap_list, "echo-message"); } /* * Test functions: * irc_protocol_nick_address */ TEST(IrcProtocolWithServer, NickAddress) { struct t_irc_nick *ptr_nick; char result[1024]; SRV_INIT_JOIN; ptr_nick = ptr_server->channels->nicks; STRCMP_EQUAL("", irc_protocol_nick_address (NULL, 0, NULL, NULL, NULL)); STRCMP_EQUAL("", irc_protocol_nick_address (ptr_server, 0, NULL, NULL, NULL)); STRCMP_EQUAL("", irc_protocol_nick_address (ptr_server, 0, ptr_nick, NULL, NULL)); STRCMP_EQUAL("", irc_protocol_nick_address (ptr_server, 0, ptr_nick, NULL, NULL)); snprintf (result, sizeof (result), "%s%s%s", ptr_nick->color, "alice", gui_color_get_custom ("reset")); STRCMP_EQUAL(result, irc_protocol_nick_address (ptr_server, 0, ptr_nick, "alice", NULL)); snprintf (result, sizeof (result), "%s%s %s(%s%s%s)%s", ptr_nick->color, "alice", gui_color_search_config ("chat_delimiters"), gui_color_search_config ("chat_host"), "example.com", gui_color_search_config ("chat_delimiters"), gui_color_get_custom ("reset")); STRCMP_EQUAL(result, irc_protocol_nick_address (ptr_server, 0, ptr_nick, "alice", "example.com")); config_file_option_set (irc_config_look_color_nicks_in_server_messages, "off", 1); snprintf (result, sizeof (result), "%s%s %s(%s%s%s)%s", ptr_nick->color, "alice", gui_color_search_config ("chat_delimiters"), gui_color_search_config ("chat_host"), "example.com", gui_color_search_config ("chat_delimiters"), gui_color_get_custom ("reset")); STRCMP_EQUAL(result, irc_protocol_nick_address (ptr_server, 0, ptr_nick, "alice", "example.com")); snprintf (result, sizeof (result), "%s%s %s(%s%s%s)%s", gui_color_search_config ("chat_nick"), "alice", gui_color_search_config ("chat_delimiters"), gui_color_search_config ("chat_host"), "example.com", gui_color_search_config ("chat_delimiters"), gui_color_get_custom ("reset")); STRCMP_EQUAL(result, irc_protocol_nick_address (ptr_server, 1, ptr_nick, "alice", "example.com")); config_file_option_reset (irc_config_look_color_nicks_in_server_messages, 1); } /* * Test functions: * irc_protocol_recv_command (command not found) */ TEST(IrcProtocolWithServer, recv_command_not_found) { SRV_INIT; RECV(":alice!user@host XYZ"); CHECK_SRV("=!=", "irc: command \"XYZ\" not found: \":alice!user@host XYZ\"", ""); RECV(":alice!user@host XYZ abc :\002def"); CHECK_SRV("=!=", "irc: command \"XYZ\" not found: \":alice!user@host XYZ abc :\002def\"", ""); RECV(":alice!user@host 099"); CHECK_ERROR_PARAMS("099", 0, 1); RECV(":alice!user@host 099 abc :\002def"); CHECK_SRV("--", "abc def", "irc_099,irc_numeric,nick_alice,host_user@host,log3"); } /* * Test functions: * irc_protocol_recv_command (invalid message) */ TEST(IrcProtocolWithServer, recv_command_invalid_message) { SRV_INIT; RECV(":"); CHECK_NO_MSG; RECV("abc"); CHECK_SRV("=!=", "irc: command \"abc\" not found: \"abc\"", ""); RECV(":alice!user@host"); CHECK_NO_MSG; RECV("@"); CHECK_SRV("=!=", "irc: command \"@\" not found: \"@\"", ""); RECV("@test"); CHECK_SRV("=!=", "irc: command \"@test\" not found: \"@test\"", ""); RECV("@test :"); CHECK_NO_MSG; RECV("@test :abc"); CHECK_NO_MSG; } /* * Test functions: * irc_protocol_cb_account (without account-notify capability) */ TEST(IrcProtocolWithServer, account_without_account_notify_cap) { struct t_irc_nick *ptr_nick; SRV_INIT_JOIN2; RECV(":bob!user@host PRIVMSG alice :hi Alice!"); ptr_nick = ptr_server->channels->last_nick; STRCMP_EQUAL(NULL, ptr_nick->account); /* not enough parameters */ RECV(":bob!user@host ACCOUNT"); CHECK_ERROR_PARAMS("account", 0, 1); STRCMP_EQUAL(NULL, ptr_nick->account); RECV(":bob!user@host ACCOUNT *"); CHECK_CHAN("--", "bob has unidentified", "irc_account,irc_smart_filter,nick_bob,host_user@host,log3"); CHECK_PV("bob", "--", "bob has unidentified", "irc_account,nick_bob,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_nick->account); RECV(":bob!user@host ACCOUNT :*"); CHECK_CHAN("--", "bob has unidentified", "irc_account,irc_smart_filter,nick_bob,host_user@host,log3"); CHECK_PV("bob", "--", "bob has unidentified", "irc_account,nick_bob,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_nick->account); RECV(":bob!user@host ACCOUNT new_account"); CHECK_CHAN("--", "bob has identified as new_account", "irc_account,irc_smart_filter,nick_bob,host_user@host,log3"); CHECK_PV("bob", "--", "bob has identified as new_account", "irc_account,nick_bob,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_nick->account); RECV(":bob!user@host ACCOUNT :\002new_account"); CHECK_CHAN("--", "bob has identified as new_account", "irc_account,irc_smart_filter,nick_bob,host_user@host,log3"); CHECK_PV("bob", "--", "bob has identified as new_account", "irc_account,nick_bob,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_nick->account); } /* * Test functions: * irc_protocol_cb_account (with account-notify capability) */ TEST(IrcProtocolWithServer, account_with_account_notify_cap) { struct t_irc_nick *ptr_nick; /* assume "account-notify" capability is enabled in server */ hashtable_set (ptr_server->cap_list, "account-notify", NULL); SRV_INIT_JOIN; ptr_nick = ptr_server->channels->nicks; STRCMP_EQUAL(NULL, ptr_nick->account); RECV(":alice!user@host ACCOUNT new_account"); CHECK_CHAN("--", "alice has identified as new_account", "irc_account,nick_alice,host_user@host,log3"); STRCMP_EQUAL("new_account", ptr_nick->account); RECV(":alice!user@host ACCOUNT : \002new account with spaces "); CHECK_CHAN("--", "alice has identified as new account with spaces ", "irc_account,nick_alice,host_user@host,log3"); STRCMP_EQUAL(" \002new account with spaces ", ptr_nick->account); RECV(":alice!user@host ACCOUNT *"); CHECK_CHAN("--", "alice has unidentified", "irc_account,nick_alice,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_nick->account); RECV(":alice!user@host ACCOUNT :new_account2"); CHECK_CHAN("--", "alice has identified as new_account2", "irc_account,nick_alice,host_user@host,log3"); STRCMP_EQUAL("new_account2", ptr_nick->account); RECV(":alice!user@host ACCOUNT :*"); CHECK_CHAN("--", "alice has unidentified", "irc_account,nick_alice,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_nick->account); hashtable_remove (ptr_server->cap_list, "account-notify"); } /* * Test functions: * irc_protocol_cb_authenticate */ TEST(IrcProtocolWithServer, authenticate) { SRV_INIT; /* not enough parameters */ RECV("AUTHENTICATE"); CHECK_ERROR_PARAMS("authenticate", 0, 1); RECV(":server.address AUTHENTICATE"); CHECK_ERROR_PARAMS("authenticate", 0, 1); RECV("AUTHENTICATE " "QQDaUzXAmVffxuzFy77XWBGwABBQAgdinelBrKZaR3wE7nsIETuTVY= "); CHECK_NO_MSG; RECV(":server.address AUTHENTICATE " "QQDaUzXAmVffxuzFy77XWBGwABBQAgdinelBrKZaR3wE7nsIETuTVY= "); CHECK_NO_MSG; } /* * Test functions: * irc_protocol_cb_away */ TEST(IrcProtocolWithServer, away) { struct t_irc_nick *ptr_nick; SRV_INIT_JOIN; /* missing nick */ RECV("AWAY"); CHECK_ERROR_NICK("away"); ptr_nick = ptr_server->channels->nicks; LONGS_EQUAL(0, ptr_nick->away); RECV(":alice!user@host AWAY Bye"); CHECK_NO_MSG; LONGS_EQUAL(1, ptr_nick->away); RECV(":alice!user@host AWAY : \002Holidays now! "); CHECK_NO_MSG; LONGS_EQUAL(1, ptr_nick->away); RECV(":alice!user@host AWAY"); CHECK_NO_MSG; LONGS_EQUAL(0, ptr_nick->away); } /* * Test functions: * irc_protocol_cb_batch (without batch cap) */ TEST(IrcProtocolWithServer, batch_without_batch_cap) { SRV_INIT_JOIN2; /* not enough parameters */ RECV(":server BATCH"); CHECK_ERROR_PARAMS("batch", 0, 1); RECV(":server BATCH +test"); CHECK_NO_MSG; /* invalid reference: does not start with '+' or '-' */ RECV(":server BATCH zzz type"); CHECK_NO_MSG; POINTERS_EQUAL(NULL, ptr_server->batches); /* start batch without parameters */ RECV(":server BATCH +ref example"); CHECK_NO_MSG; POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "ref")); /* new messages with batch reference */ RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test : \002this is a test "); CHECK_CHAN("bob", " this is a test ", "irc_privmsg,irc_tag_batch=ref,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :second test"); CHECK_CHAN("bob", "second test", "irc_privmsg,irc_tag_batch=ref,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :third test"); CHECK_CHAN("bob", "third test", "irc_privmsg,irc_tag_batch=ref,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); /* end batch */ RECV(":server BATCH -ref"); CHECK_NO_MSG; /* start batch with parameters */ RECV(":server BATCH +ref example param1 param2 param3"); CHECK_NO_MSG; POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "ref")); /* new messages with batch reference */ RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :test 1"); CHECK_CHAN("bob", "test 1", "irc_privmsg,irc_tag_batch=ref,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :test 2"); CHECK_CHAN("bob", "test 2", "irc_privmsg,irc_tag_batch=ref,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :test 3"); CHECK_CHAN("bob", "test 3", "irc_privmsg,irc_tag_batch=ref,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); /* end batch */ RECV(":server BATCH -ref"); CHECK_NO_MSG; /* start/end batch without parameters */ RECV(":server BATCH +ref example"); RECV(":server BATCH -ref"); CHECK_NO_MSG; POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "ref")); /* interleaving batches */ RECV(":server BATCH +1 example"); CHECK_NO_MSG; RECV("@batch=1 :bob!user_b@host_b PRIVMSG #test :message 1"); CHECK_CHAN("bob", "message 1", "irc_privmsg,irc_tag_batch=1,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV(":server BATCH +2 example"); CHECK_NO_MSG; RECV("@batch=1 :bob!user_b@host_b PRIVMSG #test :message 2"); CHECK_CHAN("bob", "message 2", "irc_privmsg,irc_tag_batch=1,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV("@batch=2 :bob!user_b@host_b PRIVMSG #test :message 4"); CHECK_CHAN("bob", "message 4", "irc_privmsg,irc_tag_batch=2,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV("@batch=1 :bob!user_b@host_b PRIVMSG #test :message 3"); CHECK_CHAN("bob", "message 3", "irc_privmsg,irc_tag_batch=1,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV(":server BATCH -1"); CHECK_NO_MSG; RECV("@batch=2 :bob!user_b@host_b PRIVMSG #test :message 5"); CHECK_CHAN("bob", "message 5", "irc_privmsg,irc_tag_batch=2,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV(":server BATCH -2"); CHECK_NO_MSG; /* nested batch */ RECV(":server BATCH +ref1 example1"); CHECK_NO_MSG; RECV("@batch=ref1 :server BATCH +ref2 example2"); RECV("@batch=ref1 :bob!user_b@host_b PRIVMSG #test :test ref1"); CHECK_CHAN("bob", "test ref1", "irc_privmsg,irc_tag_batch=ref1,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV("@batch=ref2 :bob!user_b@host_b PRIVMSG #test :test ref2"); CHECK_CHAN("bob", "test ref2", "irc_privmsg,irc_tag_batch=ref2,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV(":server BATCH -ref2"); CHECK_NO_MSG; RECV(":server BATCH -ref1"); CHECK_NO_MSG; /* multiline */ RECV(":server BATCH +ref draft/multiline #test"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :line 1"); CHECK_CHAN("bob", "line 1", "irc_privmsg,irc_tag_batch=ref,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :line 2"); CHECK_CHAN("bob", "line 2", "irc_privmsg,irc_tag_batch=ref,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV(":server BATCH -ref"); CHECK_NO_MSG; /* multiline with CTCP */ RECV(":server BATCH +ref draft/multiline #test"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :\001ACTION is testing"); CHECK_CHAN(" *", "bob is testing", "irc_privmsg,irc_tag_batch=ref,irc_action,notify_message," "nick_bob,host_user_b@host_b,log1"); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :again\001"); CHECK_CHAN("bob", "again\001", "irc_privmsg,irc_tag_batch=ref,notify_message," "prefix_nick_248,nick_bob,host_user_b@host_b,log1"); RECV(":server BATCH -ref"); CHECK_NO_MSG; } /* * Test functions: * irc_protocol_cb_batch (with batch cap) */ TEST(IrcProtocolWithServer, batch_with_batch_cap) { struct t_irc_batch *ptr_batch; /* assume "batch" capability is enabled in server */ hashtable_set (ptr_server->cap_list, "batch", NULL); SRV_INIT_JOIN2; /* not enough parameters */ RECV(":server BATCH"); CHECK_ERROR_PARAMS("batch", 0, 1); RECV(":server BATCH +test"); CHECK_ERROR_PARSE("batch", ":server BATCH +test"); /* invalid reference: does not start with '+' or '-' */ RECV(":server BATCH zzz type"); CHECK_NO_MSG; POINTERS_EQUAL(NULL, ptr_server->batches); /* start batch without parameters */ RECV(":server BATCH +ref example "); CHECK_NO_MSG; ptr_batch = irc_batch_search (ptr_server, "ref"); CHECK(ptr_batch); STRCMP_EQUAL(NULL, ptr_batch->parent_ref); STRCMP_EQUAL("example", ptr_batch->type); STRCMP_EQUAL(NULL, ptr_batch->parameters); POINTERS_EQUAL(NULL, ptr_batch->messages); LONGS_EQUAL(0, ptr_batch->end_received); LONGS_EQUAL(0, ptr_batch->messages_processed); /* new messages with batch reference */ RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test : \002this is a test "); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :second test"); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :third test"); CHECK_NO_MSG; /* end batch */ RECV(":server BATCH -ref"); CHECK_CHAN("bob", " this is a test ", "irc_privmsg,irc_tag_batch=ref,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); CHECK_CHAN("bob", "second test", "irc_privmsg,irc_tag_batch=ref,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); CHECK_CHAN("bob", "third test", "irc_privmsg,irc_tag_batch=ref,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "ref")); /* start batch with parameters */ RECV(":server BATCH +ref example param1 param2 param3 "); CHECK_NO_MSG; ptr_batch = irc_batch_search (ptr_server, "ref"); CHECK(ptr_batch); STRCMP_EQUAL(NULL, ptr_batch->parent_ref); STRCMP_EQUAL("example", ptr_batch->type); STRCMP_EQUAL("param1 param2 param3", ptr_batch->parameters); POINTERS_EQUAL(NULL, ptr_batch->messages); LONGS_EQUAL(0, ptr_batch->end_received); LONGS_EQUAL(0, ptr_batch->messages_processed); /* new messages with batch reference */ RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :test 1"); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :test 2"); RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :test 3"); CHECK_NO_MSG; /* end batch */ RECV(":server BATCH -ref"); CHECK_CHAN("bob", "test 1", "irc_privmsg,irc_tag_batch=ref,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); CHECK_CHAN("bob", "test 2", "irc_privmsg,irc_tag_batch=ref,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); CHECK_CHAN("bob", "test 3", "irc_privmsg,irc_tag_batch=ref,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "ref")); /* start/end batch without parameters */ RECV(":server BATCH +ref example"); RECV(":server BATCH -ref"); CHECK_NO_MSG; POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "ref")); /* interleaving batches */ RECV(":server BATCH +1 example"); CHECK_NO_MSG; CHECK(irc_batch_search (ptr_server, "1")); RECV("@batch=1 :bob!user_b@host_b PRIVMSG #test :message 1"); CHECK_NO_MSG; RECV(":server BATCH +2 example"); CHECK_NO_MSG; CHECK(irc_batch_search (ptr_server, "2")); RECV("@batch=1 :bob!user_b@host_b PRIVMSG #test :message 2"); CHECK_NO_MSG; RECV("@batch=2 :bob!user_b@host_b PRIVMSG #test :message 4"); CHECK_NO_MSG; RECV("@batch=1 :bob!user_b@host_b PRIVMSG #test :message 3"); CHECK_NO_MSG; RECV(":server BATCH -1"); CHECK_CHAN("bob", "message 1", "irc_privmsg,irc_tag_batch=1,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); CHECK_CHAN("bob", "message 2", "irc_privmsg,irc_tag_batch=1,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); CHECK_CHAN("bob", "message 3", "irc_privmsg,irc_tag_batch=1,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "1")); RECV("@batch=2 :bob!user_b@host_b PRIVMSG #test :message 5"); CHECK_NO_MSG; RECV(":server BATCH -2"); CHECK_CHAN("bob", "message 4", "irc_privmsg,irc_tag_batch=2,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); CHECK_CHAN("bob", "message 5", "irc_privmsg,irc_tag_batch=2,irc_batch_type_example," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "2")); /* nested batch */ RECV(":server BATCH +ref1 example1"); CHECK_NO_MSG; CHECK(irc_batch_search (ptr_server, "ref1")); RECV("@batch=ref1 :server BATCH +ref2 example2"); CHECK_NO_MSG; CHECK(irc_batch_search (ptr_server, "ref2")); RECV("@batch=ref1 :bob!user_b@host_b PRIVMSG #test :test ref1"); CHECK_NO_MSG; RECV("@batch=ref2 :bob!user_b@host_b PRIVMSG #test :test ref2"); CHECK_NO_MSG; RECV(":server BATCH -ref2"); CHECK_NO_MSG; CHECK(irc_batch_search (ptr_server, "ref2")); RECV(":server BATCH -ref1"); CHECK_CHAN("bob", "test ref1", "irc_privmsg,irc_tag_batch=ref1,irc_batch_type_example1," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); CHECK_CHAN("bob", "test ref2", "irc_privmsg,irc_tag_batch=ref2,irc_batch_type_example2," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "ref1")); POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "ref2")); /* multiline */ RECV("@time=2023-08-09T07:43:01.830Z;msgid=icqfzy7zdbpix4gy8pvzuv49kw " ":server BATCH +ref draft/multiline #test"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :line 1"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :line 2"); CHECK_NO_MSG; RECV(":server BATCH -ref"); CHECK_CHAN("bob", "line 1", "irc_privmsg,irc_tag_batch=ref,irc_tag_time=2023-08-09T07:43:01.830Z," "irc_tag_msgid=icqfzy7zdbpix4gy8pvzuv49kw," "irc_batch_type_draft/multiline,notify_message,prefix_nick_248," "nick_bob,host_user_b@host_b,log1"); CHECK_CHAN("bob", "line 2", "irc_privmsg,irc_tag_batch=ref,irc_tag_time=2023-08-09T07:43:01.830Z," "irc_tag_msgid=icqfzy7zdbpix4gy8pvzuv49kw,irc_batch_type_draft/multiline," "notify_message,prefix_nick_248,nick_bob,host_user_b@host_b,log1"); /* multiline with CTCP */ RECV(":server BATCH +ref draft/multiline #test"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :\001ACTION is testing"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :again\001"); CHECK_NO_MSG; RECV(":server BATCH -ref"); CHECK_CHAN(" *", "bob is testing", "irc_privmsg,irc_tag_batch=ref,irc_batch_type_draft/multiline," "irc_action,notify_message,nick_bob,host_user_b@host_b,log1"); CHECK_CHAN("bob", "again\001", "irc_privmsg,irc_tag_batch=ref,irc_batch_type_draft/multiline," "notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); RECV(":bob!user_b@host_b PRIVMSG #test :prout\001"); CHECK_CHAN("bob", "prout\001", "irc_privmsg,notify_message,prefix_nick_248,nick_bob," "host_user_b@host_b,log1"); /* assume "draft/multiline" capability is enabled in server */ hashtable_set (ptr_server->cap_list, "draft/multiline", NULL); irc_server_set_buffer_input_multiline (ptr_server, 1); /* multiline */ RECV("@time=2023-08-09T07:43:01.830Z;msgid=icqfzy7zdbpix4gy8pvzuv49kw " ":server BATCH +ref draft/multiline #test"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :line 1"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :line 2"); CHECK_NO_MSG; RECV(":server BATCH -ref"); CHECK_CHAN("bob", "line 1\n" "line 2", "irc_privmsg,irc_tag_batch=ref,irc_tag_time=2023-08-09T07:43:01.830Z," "irc_tag_msgid=icqfzy7zdbpix4gy8pvzuv49kw," "irc_batch_type_draft/multiline,notify_message,prefix_nick_248," "nick_bob,host_user_b@host_b,log1"); /* multiline with CTCP */ RECV(":server BATCH +ref draft/multiline #test"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :\001ACTION is testing"); CHECK_NO_MSG; RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :again\001"); CHECK_NO_MSG; RECV(":server BATCH -ref"); CHECK_CHAN(" *", "bob is testing\n" "again", "irc_privmsg,irc_tag_batch=ref,irc_batch_type_draft/multiline," "irc_action,notify_message,nick_bob,host_user_b@host_b,log1"); hashtable_remove (ptr_server->cap_list, "draft/multiline"); irc_server_set_buffer_input_multiline (ptr_server, 0); hashtable_remove (ptr_server->cap_list, "batch"); } /* * Test functions: * irc_protocol_cap_to_enable */ TEST(IrcProtocol, cap_to_enable) { char *str; WEE_CHECK_CAP_TO_ENABLE("", NULL, 0); WEE_CHECK_CAP_TO_ENABLE("", "", 0); WEE_CHECK_CAP_TO_ENABLE("extended-join", "extended-join", 0); WEE_CHECK_CAP_TO_ENABLE("extended-join,sasl", "extended-join", 1); WEE_CHECK_CAP_TO_ENABLE(IRC_ALL_CAPS, "*", 0); WEE_CHECK_CAP_TO_ENABLE(IRC_ALL_CAPS ",sasl", "*", 1); WEE_CHECK_CAP_TO_ENABLE(IRC_ALL_CAPS ",!away-notify,!extended-join,sasl", "*,!away-notify,!extended-join", 1); } /* * Test functions: * irc_protocol_cb_cap */ TEST(IrcProtocolWithServer, cap) { SRV_INIT; /* not enough parameters */ RECV("CAP"); CHECK_ERROR_PARAMS("cap", 0, 2); RECV("CAP *"); CHECK_ERROR_PARAMS("cap", 1, 2); RECV(":server CAP"); CHECK_ERROR_PARAMS("cap", 0, 2); RECV(":server CAP *"); CHECK_ERROR_PARAMS("cap", 1, 2); /* CAP LS */ RECV("CAP * LS :multi-prefix sasl "); CHECK_SRV("--", "irc: client capability, server supports: multi-prefix sasl", "irc_cap,log3"); RECV("CAP * LS * :multi-prefix sasl"); CHECK_NO_MSG; RECV(":server CAP * LS :multi-prefix sasl"); CHECK_SRV("--", "irc: client capability, server supports: multi-prefix sasl", "irc_cap,log3"); RECV(":server CAP * LS * :multi-prefix sasl"); CHECK_NO_MSG; /* CAP LIST */ RECV("CAP * LIST : multi-prefix sasl "); CHECK_SRV("--", "irc: client capability, currently enabled: multi-prefix sasl", "irc_cap,log3"); RECV("CAP * LIST * :multi-prefix sasl"); CHECK_NO_MSG; RECV(":server CAP * LIST :multi-prefix sasl"); CHECK_SRV("--", "irc: client capability, currently enabled: multi-prefix sasl", "irc_cap,log3"); RECV(":server CAP * LIST * :multi-prefix sasl"); CHECK_NO_MSG; /* CAP NEW */ RECV("CAP * NEW : multi-prefix sasl "); CHECK_SRV("--", "irc: client capability, now available: multi-prefix sasl ", "irc_cap,log3"); RECV(":server CAP * NEW :multi-prefix sasl"); CHECK_SRV("--", "irc: client capability, now available: multi-prefix sasl", "irc_cap,log3"); /* CAP DEL */ RECV("CAP * DEL : multi-prefix sasl "); CHECK_SRV("--", "irc: client capability, removed: multi-prefix sasl ", "irc_cap,log3"); RECV(":server CAP * DEL :multi-prefix sasl"); CHECK_SRV("--", "irc: client capability, removed: multi-prefix sasl", "irc_cap,log3"); /* CAP ACK */ RECV("CAP * ACK : sasl "); CHECK_SRV("--", "irc: client capability, enabled: sasl", "irc_cap,log3"); RECV(":server CAP * ACK :sasl"); CHECK_SRV("--", "irc: client capability, enabled: sasl", "irc_cap,log3"); /* CAP NAK */ RECV("CAP * NAK : sasl "); CHECK_SRV("=!=", "irc: client capability, refused: sasl ", "irc_cap,log3"); RECV(":server CAP * NAK :sasl"); CHECK_SRV("=!=", "irc: client capability, refused: sasl", "irc_cap,log3"); } /* * Test functions: * irc_protocol_cb_chghost */ TEST(IrcProtocolWithServer, chghost) { struct t_irc_nick *ptr_nick, *ptr_nick2; SRV_INIT_JOIN2; RECV(":bob!user_\00304red@host_\00304red PRIVMSG alice :hi Alice!"); ptr_nick = ptr_server->channels->nicks; ptr_nick2 = ptr_server->channels->last_nick; STRCMP_EQUAL("user_a@host_a", ptr_nick->host); /* not enough parameters */ RECV(":alice!user@host CHGHOST"); CHECK_ERROR_PARAMS("chghost", 0, 2); RECV(":alice!user@host CHGHOST user2"); CHECK_ERROR_PARAMS("chghost", 1, 2); /* missing nick */ RECV("CHGHOST user2 host2"); CHECK_ERROR_NICK("chghost"); STRCMP_EQUAL("user_a@host_a", ptr_nick->host); /* self nick */ RECV(":alice!user@host CHGHOST user2 host2 "); CHECK_CHAN("--", "alice (user@host) has changed host to user2@host2", "irc_chghost,new_host_user2@host2,nick_alice,host_user@host,log3"); STRCMP_EQUAL("user2@host2", ptr_nick->host); RECV(":alice!user@host CHGHOST user2 host2"); CHECK_CHAN("--", "alice (user@host) has changed host to user2@host2", "irc_chghost,new_host_user2@host2,nick_alice,host_user@host,log3"); STRCMP_EQUAL("user2@host2", ptr_nick->host); RECV(":alice!user2@host2 CHGHOST user3 :host3"); CHECK_CHAN("--", "alice (user2@host2) has changed host to user3@host3", "irc_chghost,new_host_user3@host3,nick_alice,host_user2@host2,log3"); STRCMP_EQUAL("user3@host3", ptr_nick->host); /* another nick */ RECV(":bob!user_\00304red@host_\00304red CHGHOST user_\00302blue host_\00302blue"); CHECK_CHAN("--", "bob (user_red@host_red) has changed host to user_blue@host_blue", "irc_chghost,new_host_user_\00302blue@host_\00302blue,irc_smart_filter," "nick_bob,host_user_\00304red@host_\00304red,log3"); STRCMP_EQUAL("user_\00302blue@host_\00302blue", ptr_nick2->host); CHECK_PV("bob", "--", "bob (user_red@host_red) has changed host to user_blue@host_blue", "irc_chghost,new_host_user_\00302blue@host_\00302blue,nick_bob," "host_user_\00304red@host_\00304red,log3"); } /* * Test functions: * irc_protocol_cb_error */ TEST(IrcProtocolWithServer, error) { SRV_INIT; /* not enough parameters */ RECV("ERROR"); CHECK_ERROR_PARAMS("error", 0, 1); RECV("ERROR test"); CHECK_SRV("=!=", "test", "irc_error,log3"); RECV("ERROR : Closing Link: irc.server.org (\002Bad Password\002) "); CHECK_SRV("=!=", " Closing Link: irc.server.org (Bad Password) ", "irc_error,log3"); } /* * Test functions: * irc_protocol_cb_fail */ TEST(IrcProtocolWithServer, fail) { SRV_INIT; /* not enough parameters */ RECV(":server FAIL"); CHECK_ERROR_PARAMS("fail", 0, 2); RECV(":server FAIL *"); CHECK_ERROR_PARAMS("fail", 1, 2); RECV(":server FAIL COMMAND"); CHECK_ERROR_PARAMS("fail", 1, 2); RECV(":server FAIL * TEST"); CHECK_SRV("=!=", "Failure: [] TEST", "irc_fail,nick_server,log3"); RECV(":server FAIL * TEST : \002the message "); CHECK_SRV("=!=", "Failure: [TEST] the message ", "irc_fail,nick_server,log3"); RECV(":server FAIL * TEST TEST2"); CHECK_SRV("=!=", "Failure: [TEST] TEST2", "irc_fail,nick_server,log3"); RECV(":server FAIL * TEST TEST2 :the message"); CHECK_SRV("=!=", "Failure: [TEST TEST2] the message", "irc_fail,nick_server,log3"); RECV(":server FAIL COMMAND TEST"); CHECK_SRV("=!=", "Failure: COMMAND [] TEST", "irc_fail,nick_server,log3"); RECV(":server FAIL COMMAND TEST :the message"); CHECK_SRV("=!=", "Failure: COMMAND [TEST] the message", "irc_fail,nick_server,log3"); RECV(":server FAIL COMMAND TEST TEST2"); CHECK_SRV("=!=", "Failure: COMMAND [TEST] TEST2", "irc_fail,nick_server,log3"); RECV(":server FAIL COMMAND TEST TEST2 :the message"); CHECK_SRV("=!=", "Failure: COMMAND [TEST TEST2] the message", "irc_fail,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_invite */ TEST(IrcProtocolWithServer, invite) { SRV_INIT; /* not enough parameters */ RECV(":bob!user@host INVITE"); CHECK_ERROR_PARAMS("invite", 0, 2); RECV(":bob!user@host INVITE alice"); CHECK_ERROR_PARAMS("invite", 1, 2); /* missing nick */ RECV("INVITE alice #channel"); CHECK_ERROR_NICK("invite"); RECV(":bob!user@host INVITE alice #channel "); CHECK_SRV("--", "You have been invited to #channel by bob", "irc_invite,notify_highlight,nick_bob,host_user@host,log3"); RECV(":bob!user@host INVITE xxx #channel"); CHECK_SRV("--", "bob has invited xxx to #channel", "irc_invite,nick_bob,host_user@host,log3"); } /* * Test functions: * irc_protocol_cb_join */ TEST(IrcProtocolWithServer, join) { struct t_irc_channel *ptr_channel; struct t_irc_nick *ptr_nick; SRV_INIT; POINTERS_EQUAL(NULL, ptr_server->channels); /* not enough parameters */ RECV(":alice!user@host JOIN"); CHECK_ERROR_PARAMS("join", 0, 1); /* missing nick */ RECV("JOIN #test"); CHECK_ERROR_NICK("join"); POINTERS_EQUAL(NULL, ptr_server->channels); /* join of a user while the channel does not yet exist in local */ RECV(":bob!user@host JOIN #test"); CHECK_NO_MSG; RECV(":alice!user@host JOIN #test "); CHECK_CHAN("-->", "alice (user@host) has joined #test", "irc_join,nick_alice,host_user@host,log4"); ptr_channel = ptr_server->channels; CHECK(ptr_channel); CHECK(ptr_channel == ptr_server->last_channel); LONGS_EQUAL(IRC_CHANNEL_TYPE_CHANNEL, ptr_channel->type); STRCMP_EQUAL("#test", ptr_channel->name); STRCMP_EQUAL(NULL, ptr_channel->topic); STRCMP_EQUAL(NULL, ptr_channel->modes); LONGS_EQUAL(0, ptr_channel->limit); STRCMP_EQUAL(NULL, ptr_channel->key); LONGS_EQUAL(0, ptr_channel->checking_whox); STRCMP_EQUAL(NULL, ptr_channel->away_message); LONGS_EQUAL(0, ptr_channel->has_quit_server); LONGS_EQUAL(0, ptr_channel->cycle); LONGS_EQUAL(0, ptr_channel->part); STRCMP_EQUAL(NULL, ptr_channel->pv_remote_nick_color); POINTERS_EQUAL(NULL, ptr_channel->hook_autorejoin); ptr_nick = ptr_channel->nicks; LONGS_EQUAL(1, ptr_channel->nicks_count); CHECK(ptr_nick); CHECK(ptr_nick == ptr_channel->last_nick); STRCMP_EQUAL("alice", 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(NULL, ptr_nick->account); STRCMP_EQUAL(NULL, ptr_nick->realname); CHECK(ptr_nick->color); CHECK(ptr_channel->buffer); /* second self JOIN should be ignored if already joined */ RECV(":alice!user@host JOIN #test "); CHECK_NO_MSG; RECV(":bob!user@host JOIN #test * : "); CHECK_CHAN("-->", "bob ( ) (user@host) has joined #test", "irc_join,irc_smart_filter,nick_bob,host_user@host,log4"); 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); STRCMP_EQUAL(NULL, ptr_nick->account); STRCMP_EQUAL(" ", ptr_nick->realname); CHECK(ptr_nick->color); RECV(":carol!user@host JOIN #test carol_account : \002Carol Name "); CHECK_CHAN("-->", "carol [carol_account] ( Carol Name ) (user@host) " "has joined #test", "irc_join,irc_smart_filter,nick_carol,host_user@host,log4"); 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(" \002Carol Name ", ptr_nick->realname); CHECK(ptr_nick->color); /* join with option irc.look.display_host_join set to off */ config_file_option_set (irc_config_look_display_host_join, "off", 1); RECV(":dan!user@host JOIN #test"); CHECK_CHAN("-->", "dan has joined #test", "irc_join,irc_smart_filter,nick_dan,host_user@host,log4"); config_file_option_reset (irc_config_look_display_host_join, 1); /* join with option irc.look.display_host_join_local set to off */ config_file_option_set (irc_config_look_display_host_join_local, "off", 1); RECV(":alice!user@host PART #test"); RECV(":alice!user@host JOIN #test"); CHECK_CHAN("-->", "alice has joined #test", "irc_join,nick_alice,host_user@host,log4"); config_file_option_reset (irc_config_look_display_host_join_local, 1); } /* * Test functions: * irc_protocol_cb_kick */ TEST(IrcProtocolWithServer, kick) { struct t_irc_channel *ptr_channel; SRV_INIT; POINTERS_EQUAL(NULL, ptr_server->channels); RECV(":alice!user@host JOIN #test"); CHECK_CHAN("-->", "alice (user@host) has joined #test", "irc_join,nick_alice,host_user@host,log4"); RECV(":bob!user@host JOIN #test"); CHECK_CHAN("-->", "bob (user@host) has joined #test", "irc_join,irc_smart_filter,nick_bob,host_user@host,log4"); ptr_channel = ptr_server->channels; CHECK(ptr_channel); CHECK(ptr_channel->nicks); STRCMP_EQUAL("alice", ptr_channel->nicks->name); CHECK(ptr_channel->nicks->next_nick); STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name); /* not enough parameters */ RECV(":alice!user@host KICK"); CHECK_ERROR_PARAMS("kick", 0, 2); RECV(":alice!user@host KICK #test"); CHECK_ERROR_PARAMS("kick", 1, 2); /* missing nick */ RECV("KICK #test bob"); CHECK_ERROR_NICK("kick"); STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name); /* channel not found */ RECV(":alice!user@host KICK #xyz bob :\002the reason"); CHECK_NO_MSG; /* kick without a reason */ RECV(":alice!user@host KICK #test bob"); CHECK_CHAN("<--", "alice has kicked bob", "irc_kick,nick_alice,host_user@host,log3"); STRCMP_EQUAL("alice", ptr_channel->nicks->name); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick); RECV(":bob!user@host JOIN #test"); CHECK_CHAN("-->", "bob (user@host) has joined #test", "irc_join,irc_smart_filter,nick_bob,host_user@host,log4"); /* with kick a reason */ RECV(":alice!user@host KICK #test bob :\002no spam here! "); CHECK_CHAN("<--", "alice has kicked bob (no spam here! )", "irc_kick,nick_alice,host_user@host,log3"); STRCMP_EQUAL("alice", ptr_channel->nicks->name); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick); RECV(":bob!user@host JOIN #test"); CHECK_CHAN("-->", "bob (user@host) has joined #test", "irc_join,irc_smart_filter,nick_bob,host_user@host,log4"); /* kick of self nick */ RECV(":bob!user@host KICK #test alice :\002no spam here! "); CHECK_CHAN("<--", "bob has kicked alice (no spam here! )", "irc_kick,nick_bob,host_user@host,log3"); POINTERS_EQUAL(NULL, ptr_channel->nicks); } /* * Test functions: * irc_protocol_cb_kill */ TEST(IrcProtocolWithServer, kill) { struct t_irc_channel *ptr_channel; SRV_INIT_JOIN2; ptr_channel = ptr_server->channels; CHECK(ptr_channel); CHECK(ptr_channel->nicks); STRCMP_EQUAL("alice", ptr_channel->nicks->name); CHECK(ptr_channel->nicks->next_nick); STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name); /* not enough parameters */ RECV(":alice!user@host KILL"); CHECK_ERROR_PARAMS("kill", 0, 1); /* missing nick */ RECV("KILL alice"); CHECK_ERROR_NICK("kill"); STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name); /* kill without a reason */ RECV(":bob!user@host KILL alice"); CHECK_CHAN("<--", "You were killed by bob", "irc_kill,nick_bob,host_user@host,log3"); POINTERS_EQUAL(NULL, ptr_channel->nicks); RECV(":alice!user@host JOIN #test"); CHECK_CHAN("-->", "alice (user@host) has joined #test", "irc_join,nick_alice,host_user@host,log4"); RECV(":bob!user@host JOIN #test"); CHECK_CHAN("-->", "bob (user@host) has joined #test", "irc_join,irc_smart_filter,nick_bob,host_user@host,log4"); /* kill with a reason */ RECV(":bob!user@host KILL alice :\002killed by admin "); CHECK_CHAN("<--", "You were killed by bob (killed by admin )", "irc_kill,nick_bob,host_user@host,log3"); POINTERS_EQUAL(NULL, ptr_channel->nicks); } /* * Test functions: * irc_protocol_cb_mode */ TEST(IrcProtocolWithServer, mode) { struct t_irc_channel *ptr_channel; struct t_irc_nick *ptr_nick; SRV_INIT_JOIN; ptr_channel = ptr_server->channels; CHECK(ptr_channel); STRCMP_EQUAL(NULL, ptr_channel->modes); ptr_nick = ptr_channel->nicks; CHECK(ptr_nick); STRCMP_EQUAL("alice", ptr_nick->name); STRCMP_EQUAL(" ", ptr_nick->prefixes); STRCMP_EQUAL(" ", ptr_nick->prefix); /* not enough parameters */ RECV(":admin MODE"); CHECK_ERROR_PARAMS("mode", 0, 2); RECV(":admin MODE #test"); CHECK_ERROR_PARAMS("mode", 1, 2); /* missing nick */ RECV("MODE #test +nt"); CHECK_ERROR_NICK("mode"); STRCMP_EQUAL(NULL, ptr_channel->modes); /* channel mode */ RECV(":admin!user@host MODE #test +nt "); CHECK_CHAN("--", "Mode #test [+nt] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL("+tn", ptr_channel->modes); /* channel mode removed */ RECV(":admin!user@host MODE #test -n"); CHECK_CHAN("--", "Mode #test [-n] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL("+t", ptr_channel->modes); /* channel mode removed */ RECV(":admin!user@host MODE #test -t"); CHECK_CHAN("--", "Mode #test [-t] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_channel->modes); /* bans added on channel */ RECV(":admin!user@host MODE #test +bb " "bob!user_\00304red@host_\00304red " "carol!user_\00304red@host_\00304red"); CHECK_CHAN("--", "Mode #test [+bb bob!user_red@host_red " "carol!user_red@host_red] by admin", "irc_mode,nick_admin,host_user@host,log3"); /* bans removed from channel */ RECV(":admin!user@host MODE #test -bb " "bob!user_\00304red@host_\00304red " "carol!user_\00304red@host_\00304red"); CHECK_CHAN("--", "Mode #test [-bb bob!user_red@host_red " "carol!user_red@host_red] by admin", "irc_mode,nick_admin,host_user@host,log3"); /* nick mode '@' on channel #test */ RECV(":admin!user@host MODE #test +o alice "); CHECK_CHAN("--", "Mode #test [+o alice] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL("@ ", ptr_nick->prefixes); STRCMP_EQUAL("@", ptr_nick->prefix); /* another nick mode '+' on channel #test */ RECV(":admin!user@host MODE #test +v alice"); CHECK_CHAN("--", "Mode #test [+v alice] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL("@+", ptr_nick->prefixes); STRCMP_EQUAL("@", ptr_nick->prefix); /* nick mode '@' removed on channel #test */ RECV(":admin!user@host MODE #test -o alice"); CHECK_CHAN("--", "Mode #test [-o alice] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL(" +", ptr_nick->prefixes); STRCMP_EQUAL("+", ptr_nick->prefix); /* nick mode '+' removed on channel #test */ RECV(":admin!user@host MODE #test -v alice"); CHECK_CHAN("--", "Mode #test [-v alice] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL(" ", ptr_nick->prefixes); STRCMP_EQUAL(" ", ptr_nick->prefix); /* nick mode 'i' */ STRCMP_EQUAL(NULL, ptr_server->nick_modes); RECV(":admin!user@host MODE alice +i"); CHECK_SRV("--", "User mode [+i] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL("i", ptr_server->nick_modes); /* nick mode 'R' */ RECV(":admin!user@host MODE alice +R"); CHECK_SRV("--", "User mode [+R] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL("iR", ptr_server->nick_modes); /* remove nick mode 'i' */ RECV(":admin!user@host MODE alice -i"); CHECK_SRV("--", "User mode [-i] by admin", "irc_mode,nick_admin,host_user@host,log3"); STRCMP_EQUAL("R", ptr_server->nick_modes); } /* * Test functions: * irc_protocol_cb_nick */ TEST(IrcProtocolWithServer, nick) { struct t_irc_channel *ptr_channel; struct t_irc_nick *ptr_nick1, *ptr_nick2; SRV_INIT_JOIN2; RECV(":bob!user@host PRIVMSG alice :hi Alice!"); CHECK_PV("bob", "bob", "hi Alice!", "irc_privmsg,notify_private,prefix_nick_248,nick_bob," "host_user@host,log1"); ptr_channel = ptr_server->channels; CHECK(ptr_channel); ptr_nick1 = ptr_channel->nicks; CHECK(ptr_nick1); ptr_nick2 = ptr_nick1->next_nick; CHECK(ptr_nick2); STRCMP_EQUAL("alice", ptr_nick1->name); STRCMP_EQUAL("bob", ptr_nick2->name); /* not enough parameters */ RECV(":alice!user@host NICK"); CHECK_ERROR_PARAMS("nick", 0, 1); STRCMP_EQUAL("alice", ptr_nick1->name); STRCMP_EQUAL("bob", ptr_nick2->name); /* missing nick */ RECV("NICK alice_away"); CHECK_ERROR_NICK("nick"); /* new nick for alice */ RECV(":alice!user@host NICK alice_away "); CHECK_SRV("--", "You are now known as alice_away", "irc_nick,irc_nick1_alice,irc_nick2_alice_away," "nick_alice,host_user@host,log2"); CHECK_CHAN("--", "You are now known as alice_away", "irc_nick,irc_nick1_alice,irc_nick2_alice_away," "nick_alice,host_user@host,log2"); STRCMP_EQUAL("alice_away", ptr_nick1->name); /* new nick for alice_away (with ":") */ RECV(":alice_away!user@host NICK :alice2"); CHECK_SRV("--", "You are now known as alice2", "irc_nick,irc_nick1_alice_away,irc_nick2_alice2," "nick_alice_away,host_user@host,log2"); CHECK_CHAN("--", "You are now known as alice2", "irc_nick,irc_nick1_alice_away,irc_nick2_alice2," "nick_alice_away,host_user@host,log2"); STRCMP_EQUAL("alice2", ptr_nick1->name); /* new nick for bob */ RECV(":bob!user@host NICK bob_away"); CHECK_CHAN("--", "bob is now known as bob_away", "irc_nick,irc_smart_filter,irc_nick1_bob,irc_nick2_bob_away," "nick_bob,host_user@host,log2"); CHECK_PV("bob_away", "--", "bob is now known as bob_away", "irc_nick,irc_nick1_bob,irc_nick2_bob_away,nick_bob,host_user@host," "log2"); STRCMP_EQUAL("bob_away", ptr_nick2->name); /* new nick for bob_away (with ":") */ RECV(":bob_away!user@host NICK :bob2"); CHECK_CHAN("--", "bob_away is now known as bob2", "irc_nick,irc_smart_filter,irc_nick1_bob_away," "irc_nick2_bob2,nick_bob_away,host_user@host,log2"); CHECK_PV("bob2", "--", "bob_away is now known as bob2", "irc_nick,irc_nick1_bob_away,irc_nick2_bob2," "nick_bob_away,host_user@host,log2"); STRCMP_EQUAL("bob2", ptr_nick2->name); STRCMP_EQUAL("bob2", ptr_server->last_channel->name); } /* * Test functions: * irc_protocol_cb_note */ TEST(IrcProtocolWithServer, note) { SRV_INIT; /* not enough parameters */ RECV(":server NOTE"); CHECK_ERROR_PARAMS("note", 0, 2); RECV(":server NOTE *"); CHECK_ERROR_PARAMS("note", 1, 2); RECV(":server NOTE COMMAND"); CHECK_ERROR_PARAMS("note", 1, 2); RECV(":server NOTE * TEST"); CHECK_SRV("--", "Note: [] TEST", "irc_note,nick_server,log3"); RECV(":server NOTE * TEST : \002the message "); CHECK_SRV("--", "Note: [TEST] the message ", "irc_note,nick_server,log3"); RECV(":server NOTE * TEST TEST2"); CHECK_SRV("--", "Note: [TEST] TEST2", "irc_note,nick_server,log3"); RECV(":server NOTE * TEST TEST2 :the message"); CHECK_SRV("--", "Note: [TEST TEST2] the message", "irc_note,nick_server,log3"); RECV(":server NOTE COMMAND TEST"); CHECK_SRV("--", "Note: COMMAND [] TEST", "irc_note,nick_server,log3"); RECV(":server NOTE COMMAND TEST :the message"); CHECK_SRV("--", "Note: COMMAND [TEST] the message", "irc_note,nick_server,log3"); RECV(":server NOTE COMMAND TEST TEST2"); CHECK_SRV("--", "Note: COMMAND [TEST] TEST2", "irc_note,nick_server,log3"); RECV(":server NOTE COMMAND TEST TEST2 :the message"); CHECK_SRV("--", "Note: COMMAND [TEST TEST2] the message", "irc_note,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_notice */ TEST(IrcProtocolWithServer, notice) { int echo_message; SRV_INIT_JOIN; /* test without and with capability "echo-message" */ for (echo_message = 0; echo_message < 2; echo_message++) { if (echo_message == 1) { /* assume "echo-message" capability is enabled in server */ hashtable_set (ptr_server->cap_list, "echo-message", NULL); } /* not enough parameters */ RECV("NOTICE"); CHECK_ERROR_PARAMS("notice", 0, 2); RECV("NOTICE AUTH"); CHECK_ERROR_PARAMS("notice", 1, 2); RECV(":bob!user@host NOTICE"); CHECK_ERROR_PARAMS("notice", 0, 2); RECV(":bob!user@host NOTICE #test"); CHECK_ERROR_PARSE("notice", ":bob!user@host NOTICE #test"); RECV(":bob!user@host NOTICE alice"); CHECK_ERROR_PARSE("notice", ":bob!user@host NOTICE alice"); /* notice from server */ RECV("NOTICE AUTH :\002*** Looking up your hostname... "); CHECK_SRV("--", "*** Looking up your hostname... ", "irc_notice,log1"); RECV(":server.address NOTICE AUTH :*** Looking up your hostname... "); CHECK_SRV("--", "server.address: *** Looking up your hostname... ", "irc_notice,notify_private,nick_server.address,log1"); RECV(":server.address NOTICE * :*** Looking up your hostname... "); CHECK_SRV("--", "server.address: *** Looking up your hostname... ", "irc_notice,notify_private,nick_server.address,log1"); /* notice to channel/user */ RECV(":server.address NOTICE #test :\002a notice "); CHECK_CHAN("--", "Notice(server.address) -> #test: a notice ", "irc_notice,notify_message,nick_server.address,log1"); RECV(":server.address NOTICE alice :a notice "); CHECK_SRV("--", "server.address: a notice ", "irc_notice,notify_private,nick_server.address,log1"); RECV(":bob!user@host NOTICE #test :a notice "); CHECK_CHAN("--", "Notice(bob) -> #test: a notice ", "irc_notice,notify_message,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :a notice "); CHECK_SRV("--", "bob (user@host): a notice ", "irc_notice,notify_private,nick_bob,host_user@host,log1"); /* notice to channel/user with color in address */ RECV(":bob!user_\00304red@host_\00304red NOTICE #test :a notice "); CHECK_CHAN("--", "Notice(bob) -> #test: a notice ", "irc_notice,notify_message,nick_bob,host_user_\00304red@host_\00304red,log1"); RECV(":bob!user_\00304red@host_\00304red NOTICE alice :a notice "); CHECK_SRV("--", "bob (user_red@host_red): a notice ", "irc_notice,notify_private,nick_bob,host_user_\00304red@host_\00304red,log1"); /* notice to channel/user with option irc.look.display_host_notice set to off */ config_file_option_set (irc_config_look_display_host_notice, "off", 1); RECV(":server.address NOTICE #test :\002a notice "); CHECK_CHAN("--", "Notice(server.address) -> #test: a notice ", "irc_notice,notify_message,nick_server.address,log1"); RECV(":server.address NOTICE alice :a notice "); CHECK_SRV("--", "server.address: a notice ", "irc_notice,notify_private,nick_server.address,log1"); RECV(":bob!user@host NOTICE #test :a notice "); CHECK_CHAN("--", "Notice(bob) -> #test: a notice ", "irc_notice,notify_message,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :a notice "); CHECK_SRV("--", "bob: a notice ", "irc_notice,notify_private,nick_bob,host_user@host,log1"); config_file_option_reset (irc_config_look_display_host_notice, 1); /* * notice to channel/user from self nick * (case of bouncer or if echo-message capability is enabled) */ RECV(":alice!user@host NOTICE #test :\002a notice "); CHECK_CHAN("--", "Notice(alice) -> #test: a notice ", "irc_notice,self_msg,notify_none,no_highlight,nick_alice," "host_user@host,log1"); /* notice to ops of channel */ RECV(":server.address NOTICE @#test :\002a notice "); CHECK_CHAN("--", "Notice(server.address) -> @#test: a notice ", "irc_notice,notify_message,nick_server.address,log1"); RECV(":bob!user@host NOTICE @#test :a notice "); CHECK_CHAN("--", "Notice(bob) -> @#test: a notice ", "irc_notice,notify_message,nick_bob,host_user@host,log1"); /* * notice to ops of channel from self nick * (case of bouncer or if echo-message capability is enabled) */ RECV(":alice!user@host NOTICE @#test :\002a notice "); CHECK_CHAN("--", "Notice(alice) -> @#test: a notice ", "irc_notice,self_msg,notify_none,no_highlight,nick_alice," "host_user@host,log1"); /* * notice from self nick * (case of bouncer or if echo-message capability is enabled) */ RECV(":alice!user@host NOTICE alice :\002a notice "); CHECK_SRV("--", "Notice -> alice: a notice ", "irc_notice,notify_private,nick_alice,host_user@host,log1"); /* notice with channel name at beginning */ RECV(":server.address NOTICE alice :[#test] \002a notice "); CHECK_CHAN("--", "PvNotice(server.address): a notice ", "irc_notice,nick_server.address,log1"); RECV(":server.address NOTICE alice :(#test) a notice "); CHECK_CHAN("--", "PvNotice(server.address): a notice ", "irc_notice,nick_server.address,log1"); RECV(":server.address NOTICE alice :{#test} a notice "); CHECK_CHAN("--", "PvNotice(server.address): a notice ", "irc_notice,nick_server.address,log1"); RECV(":server.address NOTICE alice :<#test> a notice "); CHECK_CHAN("--", "PvNotice(server.address): a notice ", "irc_notice,nick_server.address,log1"); RECV(":bob!user@host NOTICE alice :[#test] a notice "); CHECK_CHAN("--", "PvNotice(bob): a notice ", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :(#test) a notice "); CHECK_CHAN("--", "PvNotice(bob): a notice ", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :{#test} a notice "); CHECK_CHAN("--", "PvNotice(bob): a notice ", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :<#test> a notice "); CHECK_CHAN("--", "PvNotice(bob): a notice ", "irc_notice,nick_bob,host_user@host,log1"); /* * notice to another nick with channel name at beginning * (case of a notice sent if echo-message capability is enabled) */ RECV(":alice!user@host NOTICE bob :[#test] \002a notice "); CHECK_SRV("--", "Notice -> bob: [#test] a notice ", "irc_notice,notify_private,nick_alice,host_user@host,log1"); /* broken CTCP to channel */ RECV(":bob!user@host NOTICE #test :\001"); CHECK_SRV("--", "CTCP reply from bob: ", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001TEST"); CHECK_SRV("--", "CTCP reply from bob: TEST", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001ACTION"); CHECK_SRV("--", "CTCP reply from bob: ACTION", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001ACTION is testing"); CHECK_SRV("--", "CTCP reply from bob: ACTION is testing", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001VERSION"); CHECK_SRV("--", "CTCP reply from bob: VERSION", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001DCC"); CHECK_SRV("--", "CTCP reply from bob: DCC", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001DCC SEND"); CHECK_SRV("--", "CTCP reply from bob: DCC SEND", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001DCC SEND file.txt"); CHECK_SRV("--", "CTCP reply from bob: DCC SEND file.txt", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001DCC SEND file.txt 1 2 3"); CHECK_SRV("--", "CTCP reply from bob: DCC SEND file.txt 1 2 3", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); /* broken CTCP to user */ RECV(":bob!user@host NOTICE alice :\001"); CHECK_SRV("--", "CTCP reply from bob: ", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001TEST"); CHECK_SRV("--", "CTCP reply from bob: TEST", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001ACTION"); CHECK_SRV("--", "CTCP reply from bob: ACTION", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001ACTION is testing"); CHECK_SRV("--", "CTCP reply from bob: ACTION is testing", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001VERSION"); CHECK_SRV("--", "CTCP reply from bob: VERSION", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001DCC"); CHECK_SRV("--", "CTCP reply from bob: DCC", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001DCC SEND"); CHECK_SRV("--", "CTCP reply from bob: DCC SEND", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001DCC SEND file.txt"); CHECK_SRV("--", "CTCP reply from bob: DCC SEND file.txt", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001DCC SEND file.txt 1 2 3"); CHECK_SRV("--", "CTCP reply from bob: DCC SEND file.txt 1 2 3", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); /* valid CTCP to channel */ RECV(":bob!user@host NOTICE #test :\001TEST\001"); CHECK_SRV("--", "CTCP reply from bob: TEST", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001ACTION\001"); CHECK_SRV("--", "CTCP reply from bob: ACTION", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001ACTION is testing\001"); CHECK_SRV("--", "CTCP reply from bob: ACTION is testing", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001VERSION\001"); CHECK_SRV("--", "CTCP reply from bob: VERSION", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE #test :\001DCC SEND file.txt 1 2 3\001"); CHECK_SRV("--", "CTCP reply from bob: DCC SEND file.txt 1 2 3", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); /* valid CTCP to user */ RECV(":bob!user@host NOTICE alice :\001TEST\001"); CHECK_SRV("--", "CTCP reply from bob: TEST", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001ACTION\001"); CHECK_SRV("--", "CTCP reply from bob: ACTION", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001ACTION is testing\001"); CHECK_SRV("--", "CTCP reply from bob: ACTION is testing", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001VERSION\001"); CHECK_SRV("--", "CTCP reply from bob: VERSION", "irc_notice,nick_bob,host_user@host,log1"); RECV(":bob!user@host NOTICE alice :\001DCC SEND file.txt 1 2 3\001"); CHECK_SRV("--", "CTCP reply from bob: DCC SEND file.txt 1 2 3", "irc_notice,irc_ctcp,nick_bob,host_user@host,log1"); if (echo_message == 1) hashtable_remove (ptr_server->cap_list, "echo-message"); } } /* * Test functions: * irc_protocol_cb_part */ TEST(IrcProtocolWithServer, part) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":alice!user@host PART"); CHECK_ERROR_PARAMS("part", 0, 1); /* missing nick */ RECV("PART #test"); CHECK_ERROR_NICK("part"); STRCMP_EQUAL("#test", ptr_server->channels->name); CHECK(ptr_server->channels->nicks); LONGS_EQUAL(0, ptr_server->channels->part); /* channel not found */ RECV(":alice!user@host PART #xyz"); CHECK_NO_MSG; STRCMP_EQUAL("#test", ptr_server->channels->name); CHECK(ptr_server->channels->nicks); LONGS_EQUAL(0, ptr_server->channels->part); /* without part message */ RECV(":alice!user@host PART #test"); CHECK_CHAN("<--", "alice (user@host) has left #test", "irc_part,nick_alice,host_user@host,log4"); STRCMP_EQUAL("#test", ptr_server->channels->name); POINTERS_EQUAL(NULL, ptr_server->channels->nicks); LONGS_EQUAL(1, ptr_server->channels->part); /* without part message (but empty trailing parameter) */ RECV(":alice!user@host JOIN #test"); RECV(":alice!user@host PART #test :"); CHECK_CHAN("<--", "alice (user@host) has left #test", "irc_part,nick_alice,host_user@host,log4"); STRCMP_EQUAL("#test", ptr_server->channels->name); POINTERS_EQUAL(NULL, ptr_server->channels->nicks); LONGS_EQUAL(1, ptr_server->channels->part); /* with part message */ RECV(":alice!user@host JOIN #test"); RECV(":alice!user@host PART #test :\002part message "); CHECK_CHAN("<--", "alice (user@host) has left #test (part message )", "irc_part,nick_alice,host_user@host,log4"); STRCMP_EQUAL("#test", ptr_server->channels->name); POINTERS_EQUAL(NULL, ptr_server->channels->nicks); LONGS_EQUAL(1, ptr_server->channels->part); RECV(":alice!user@host JOIN #test"); CHECK_CHAN("-->", "alice (user@host) has joined #test", "irc_join,nick_alice,host_user@host,log4"); RECV(":bob!user@host JOIN #test"); CHECK_CHAN("-->", "bob (user@host) has joined #test", "irc_join,irc_smart_filter,nick_bob,host_user@host,log4"); /* part from another user */ RECV(":bob!user@host PART #test :part message "); CHECK_CHAN("<--", "bob (user@host) has left #test (part message )", "irc_part,irc_smart_filter,nick_bob,host_user@host,log4"); STRCMP_EQUAL("#test", ptr_server->channels->name); CHECK(ptr_server->channels->nicks == ptr_server->channels->last_nick); LONGS_EQUAL(0, ptr_server->channels->part); } /* * Test functions: * irc_protocol_cb_ping */ TEST(IrcProtocolWithServer, ping) { SRV_INIT; /* not enough parameters, no response */ RECV("PING"); CHECK_ERROR_PARAMS("ping", 0, 1); CHECK_SENT(NULL); RECV("PING :\002123456789 "); CHECK_NO_MSG; CHECK_SENT("PONG :\002123456789 "); } /* * Test functions: * irc_protocol_cb_pong */ TEST(IrcProtocolWithServer, pong) { SRV_INIT; RECV(":server PONG"); CHECK_SRV("", "PONG", "irc_pong,nick_server,log3"); RECV(":server PONG server"); CHECK_SRV("", "PONG", "irc_pong,nick_server,log3"); RECV(":server PONG server : \002info "); CHECK_SRV("", "PONG: info ", "irc_pong,nick_server,log3"); RECV(":server PONG server :extra info"); CHECK_SRV("", "PONG: extra info", "irc_pong,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_privmsg */ TEST(IrcProtocolWithServer, privmsg) { char *info, message[1024]; int echo_message; SRV_INIT_JOIN2; /* test without and with capability "echo-message" */ for (echo_message = 0; echo_message < 2; echo_message++) { if (echo_message == 1) { /* assume "echo-message" capability is enabled in server */ hashtable_set (ptr_server->cap_list, "echo-message", NULL); } /* not enough parameters */ RECV(":bob!user@host PRIVMSG"); CHECK_ERROR_PARAMS("privmsg", 0, 2); RECV(":bob!user@host PRIVMSG #test"); CHECK_ERROR_PARAMS("privmsg", 1, 2); RECV(":bob!user@host PRIVMSG alice"); CHECK_ERROR_PARAMS("privmsg", 1, 2); /* missing nick */ RECV("PRIVMSG #test :this is the message"); CHECK_ERROR_NICK("privmsg"); /* message to channel/user */ RECV(":bob!user@host PRIVMSG #test :\002this is the message "); CHECK_CHAN_DATE_NOW("bob", "this is the message ", "irc_privmsg,notify_message,prefix_nick_248,nick_bob," "host_user@host,log1"); RECV(":bob!user@host PRIVMSG alice :this is the message "); CHECK_PV_CLOSE("bob", "bob", "this is the message ", "irc_privmsg,notify_private,prefix_nick_248,nick_bob," "host_user@host,log1"); /* message with tags to channel/user */ RECV("@tag1=value1;tag2=value2 :bob!user@host PRIVMSG #test " ":\002this is the message "); CHECK_CHAN_DATE_NOW("bob", "this is the message ", "irc_privmsg,irc_tag_tag1=value1,irc_tag_tag2=value2," "notify_message,prefix_nick_248,nick_bob,host_user@host,log1"); RECV("@tag1=value1;tag2=value2 :bob!user@host PRIVMSG alice " ":this is the message "); CHECK_PV_CLOSE("bob", "bob", "this is the message ", "irc_privmsg,irc_tag_tag1=value1,irc_tag_tag2=value2," "notify_private,prefix_nick_248,nick_bob,host_user@host,log1"); /* message with tags + time as timestamp to channel/user */ RECV("@tag1=value1;tag2=value2;time=1703500149 :bob!user@host PRIVMSG #test " ":\002this is the message "); CHECK_CHAN_DATE_VALUE( "bob", "this is the message ", "irc_privmsg,irc_tag_tag1=value1,irc_tag_tag2=value2," "irc_tag_time=1703500149,notify_message,prefix_nick_248,nick_bob," "host_user@host,log1", 1703500149, 0); /* message with tags + time as timestamp with milliseconds to channel/user */ RECV("@tag1=value1;tag2=value2;time=1703500149.456 :bob!user@host PRIVMSG #test " ":\002this is the message "); CHECK_CHAN_DATE_VALUE( "bob", "this is the message ", "irc_privmsg,irc_tag_tag1=value1,irc_tag_tag2=value2," "irc_tag_time=1703500149.456,notify_message,prefix_nick_248,nick_bob," "host_user@host,log1", 1703500149, 456000); /* message with tags + time as timestamp with microseconds to channel/user */ RECV("@tag1=value1;tag2=value2;time=1703500149.456789 :bob!user@host PRIVMSG #test " ":\002this is the message "); CHECK_CHAN_DATE_VALUE( "bob", "this is the message ", "irc_privmsg,irc_tag_tag1=value1,irc_tag_tag2=value2," "irc_tag_time=1703500149.456789,notify_message,prefix_nick_248,nick_bob," "host_user@host,log1", 1703500149, 456789); /* message with tags + time as ISO 8601 with microseconds to channel/user */ RECV("@tag1=value1;tag2=value2;time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG #test :\002this is the message "); CHECK_CHAN_DATE_VALUE( "bob", "this is the message ", "irc_privmsg,irc_tag_tag1=value1,irc_tag_tag2=value2," "irc_tag_time=2023-12-25T10:29:09.456789Z,notify_message," "prefix_nick_248,nick_bob," "host_user@host,log1", 1703500149, 456789); /* * message to channel/user from self nick * (case of bouncer or if echo-message capability is enabled) */ RECV(":alice!user@host PRIVMSG #test :\002this is the message "); CHECK_CHAN("alice", "this is the message ", "irc_privmsg,self_msg,notify_none,no_highlight," "prefix_nick_white,nick_alice,host_user@host,log1"); /* message to ops of channel */ RECV(":bob!user@host PRIVMSG @#test :\002this is the message "); CHECK_CHAN("--", "Msg(bob) -> @#test: this is the message ", "irc_privmsg,notify_message,nick_bob,host_user@host,log1"); /* * message to ops of channel from self nick * (case of bouncer or if echo-message capability is enabled) */ RECV(":alice!user@host PRIVMSG @#test :\002this is the message "); CHECK_CHAN("--", "Msg(alice) -> @#test: this is the message ", "irc_privmsg,self_msg,notify_none,no_highlight,nick_alice," "host_user@host,log1"); /* * message from self nick in private * (case of bouncer or if echo-message capability is enabled) */ if (echo_message == 0) { /* without echo-message */ RECV(":alice!user@host PRIVMSG bob :\002this is the message "); CHECK_PV_CLOSE("bob", "alice", "this is the message ", "irc_privmsg,self_msg,notify_none,no_highlight," "prefix_nick_white,nick_alice,host_user@host,log1"); } else { /* with echo-message */ RECV(":alice!user@host PRIVMSG bob :\002this is the message "); CHECK_PV_CLOSE("bob", "alice", "this is the message ", "irc_privmsg,self_msg,notify_none,no_highlight," "prefix_nick_white,nick_alice,host_user@host,log1"); /* with echo-message, option irc.look.open_pv_buffer_echo_msg off */ config_file_option_set (irc_config_look_open_pv_buffer_echo_msg, "off", 1); RECV(":alice!user@host PRIVMSG bob :\002this is the message "); CHECK_SRV("--", "Msg(alice) -> bob: this is the message ", "irc_privmsg,self_msg,notify_none,no_highlight," "nick_alice,host_user@host,log1"); config_file_option_reset (irc_config_look_open_pv_buffer_echo_msg, 1); } /* * message from self nick in private, with password hidden (nickserv) * (case of bouncer or if echo-message capability is enabled) */ if (echo_message == 0) { /* without echo-message */ RECV(":alice!user@host PRIVMSG nickserv :identify secret"); CHECK_PV_CLOSE("nickserv", "alice", "identify ******", "irc_privmsg,self_msg,notify_none,no_highlight," "prefix_nick_white,nick_alice,host_user@host,log1"); } else { /* with echo-message */ RECV(":alice!user@host PRIVMSG nickserv :identify secret"); CHECK_PV_CLOSE("nickserv", "alice", "identify ******", "irc_privmsg,self_msg,notify_none,no_highlight," "prefix_nick_white,nick_alice,host_user@host,log1"); /* with echo-message, option irc.look.open_pv_buffer_echo_msg off */ config_file_option_set (irc_config_look_open_pv_buffer_echo_msg, "off", 1); RECV(":alice!user@host PRIVMSG nickserv :identify secret"); CHECK_SRV("--", "Msg(alice) -> nickserv: identify ******", "irc_privmsg,self_msg,notify_none,no_highlight," "nick_alice,host_user@host,log1"); config_file_option_reset (irc_config_look_open_pv_buffer_echo_msg, 1); } /* broken CTCP to channel */ RECV(":bob!user@host PRIVMSG #test :\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "Unknown CTCP requested by bob: ", "irc_privmsg,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host PRIVMSG #test :\001TEST"); CHECK_SENT(NULL); CHECK_CHAN("--", "Unknown CTCP requested by bob: TEST", "irc_privmsg,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host PRIVMSG #test :\001ACTION"); CHECK_SENT(NULL); CHECK_CHAN(" *", "bob", "irc_privmsg,irc_action,notify_message,nick_bob," "host_user@host,log1"); RECV(":bob!user@host PRIVMSG #test :\001ACTION \002is testing"); CHECK_SENT(NULL); CHECK_CHAN(" *", "bob is testing", "irc_privmsg,irc_action,notify_message,nick_bob," "host_user@host,log1"); info = irc_ctcp_eval_reply (ptr_server, irc_ctcp_get_reply (ptr_server, "VERSION")); RECV(":bob!user@host PRIVMSG #test :\001VERSION"); snprintf (message, sizeof (message), "NOTICE bob :\001VERSION %s\001", info); CHECK_SENT(message); CHECK_CHAN("--", "CTCP requested by bob: VERSION", "irc_privmsg,irc_ctcp,nick_bob,host_user@host,log1"); snprintf (message, sizeof (message), "CTCP reply to bob: VERSION %s", info); if (echo_message == 0) { /* reply is displayed only if echo-message is NOT enabled */ CHECK_SRV("--", message, "irc_privmsg,irc_ctcp,irc_ctcp_reply,self_msg,notify_none," "no_highlight,nick_alice,log1"); } snprintf (message, sizeof (message), "NOTICE bob :\001VERSION %s\001", info); CHECK_SENT(message); free (info); RECV(":bob!user@host PRIVMSG #test :\001DCC"); CHECK_SENT(NULL); CHECK_NO_MSG; RECV(":bob!user@host PRIVMSG #test :\001DCC SEND"); CHECK_SENT(NULL); CHECK_NO_MSG; RECV(":bob!user@host PRIVMSG #test :\001DCC SEND file.txt"); CHECK_SENT(NULL); CHECK_SRV("=!=", "irc: cannot parse \"privmsg\" command", ""); RECV(":bob!user@host PRIVMSG #test :\001DCC SEND file.txt 1 2 3"); CHECK_SENT(NULL); CHECK_CORE("", "xfer: incoming file from bob (0.0.0.1, irc." IRC_FAKE_SERVER "), name: file.txt, 3 bytes (protocol: dcc)"); /* broken CTCP to user */ RECV(":bob!user@host PRIVMSG alice :\001"); CHECK_SENT(NULL); CHECK_SRV("--", "Unknown CTCP requested by bob: ", "irc_privmsg,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host PRIVMSG alice :\001TEST"); CHECK_SENT(NULL); CHECK_SRV("--", "Unknown CTCP requested by bob: TEST", "irc_privmsg,irc_ctcp,nick_bob,host_user@host,log1"); RECV(":bob!user@host PRIVMSG alice :\001ACTION"); CHECK_SENT(NULL); CHECK_PV_CLOSE("bob", " *", "bob", "irc_privmsg,irc_action,notify_private,nick_bob," "host_user@host,log1"); RECV(":bob!user@host PRIVMSG alice :\001ACTION \002is testing"); CHECK_SENT(NULL); CHECK_PV_CLOSE("bob", " *", "bob is testing", "irc_privmsg,irc_action,notify_private,nick_bob," "host_user@host,log1"); info = irc_ctcp_eval_reply (ptr_server, irc_ctcp_get_reply (ptr_server, "VERSION")); RECV(":bob!user@host PRIVMSG alice :\001VERSION"); snprintf (message, sizeof (message), "NOTICE bob :\001VERSION %s\001", info); CHECK_SENT(message); snprintf (message, sizeof (message), "CTCP reply to bob: VERSION %s", info); if (echo_message == 0) { /* reply is displayed only if echo-message is NOT enabled */ CHECK_SRV("--", message, "irc_privmsg,irc_ctcp,irc_ctcp_reply,self_msg,notify_none," "no_highlight,nick_alice,log1"); } free (info); RECV(":bob!user@host PRIVMSG alice :\001DCC"); CHECK_SENT(NULL); CHECK_NO_MSG; RECV(":bob!user@host PRIVMSG alice :\001DCC SEND"); CHECK_SENT(NULL); CHECK_NO_MSG; RECV(":bob!user@host PRIVMSG alice :\001DCC SEND file.txt"); CHECK_SENT(NULL); CHECK_SRV("=!=", "irc: cannot parse \"privmsg\" command", ""); RECV(":bob!user@host PRIVMSG alice :\001DCC SEND file.txt 1 2 3"); CHECK_SENT(NULL); CHECK_CORE("", "xfer: incoming file from bob (0.0.0.1, irc." IRC_FAKE_SERVER "), name: file.txt, 3 bytes (protocol: dcc)"); /* valid CTCP to channel */ RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG #test :\001TEST\001"); CHECK_SENT(NULL); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG #test :\001ACTION\001"); CHECK_SENT(NULL); CHECK_CHAN(" *", "bob", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_action,notify_message,nick_bob,host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG #test :\001ACTION is testing with \002bold\002\001"); CHECK_SENT(NULL); CHECK_CHAN(" *", "bob is testing with bold", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_action,notify_message,nick_bob,host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG #test :\001PING 1703496549 905284\001"); CHECK_SENT("NOTICE bob :\001PING 1703496549 905284\001"); CHECK_CHAN("--", "CTCP requested by bob: PING 1703496549 905284", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_bob,host_user@host,log1"); if (echo_message == 0) { /* reply is displayed only if echo-message is NOT enabled */ CHECK_SRV("--", "CTCP reply to bob: PING 1703496549 905284", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,irc_ctcp_reply,self_msg,notify_none," "no_highlight,nick_alice,log1"); } RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG #test :\001UNKNOWN\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "Unknown CTCP requested by bob: UNKNOWN", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_bob,host_user@host,log1"); /* valid CTCP to ops of channel */ RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG @#test :\001ACTION\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "Action -> @#test: bob", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_action,notify_message,nick_bob,host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG @#test :\001ACTION \002is testing\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "Action -> @#test: bob is testing", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_action,notify_message,nick_bob,host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG @#test :\001PING 1703496549 905284\001"); CHECK_SENT("NOTICE bob :\001PING 1703496549 905284\001"); CHECK_CHAN("--", "CTCP requested by bob: PING 1703496549 905284", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_bob,host_user@host,log1"); if (echo_message == 0) { /* reply is displayed only if echo-message is NOT enabled */ CHECK_SRV("--", "CTCP reply to bob: PING 1703496549 905284", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,irc_ctcp_reply,self_msg,notify_none," "no_highlight,nick_alice,log1"); } RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG @#test :\001UNKNOWN\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "Unknown CTCP requested by bob: UNKNOWN", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_bob,host_user@host,log1"); /* * valid CTCP to channel from self nick * (case of bouncer or if echo-message capability is enabled) */ RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG #test :\001VERSION\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "CTCP query to #test: VERSION", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,self_msg,notify_none,no_highlight,nick_alice," "host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG #test :\001ACTION\001"); CHECK_SENT(NULL); CHECK_CHAN(" *", "alice", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_action,self_msg,notify_none,no_highlight,nick_alice," "host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG #test :\001ACTION is testing with \002bold\002\001"); CHECK_SENT(NULL); CHECK_CHAN(" *", "alice is testing with bold", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_action,self_msg,notify_none,no_highlight,nick_alice," "host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG #test :\001PING 1703496549 905284\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "CTCP query to #test: PING 1703496549 905284", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,self_msg,notify_none,no_highlight," "nick_alice,host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG #test :\001UNKNOWN\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "CTCP query to #test: UNKNOWN", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,self_msg,notify_none,no_highlight," "nick_alice,host_user@host,log1"); /* * valid CTCP to ops of channel from self nick * (case of bouncer or if echo-message capability is enabled) */ RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG @#test :\001ACTION\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "Action -> @#test: alice", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_action,self_msg,notify_none,no_highlight,nick_alice," "host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG @#test :\001ACTION \002is testing\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "Action -> @#test: alice is testing", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_action,self_msg,notify_none,no_highlight,nick_alice," "host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG @#test :\001PING 1703496549 905284\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "CTCP query to @#test: PING 1703496549 905284", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,self_msg,notify_none,no_highlight," "nick_alice,host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG @#test :\001UNKNOWN\001"); CHECK_SENT(NULL); CHECK_CHAN("--", "CTCP query to @#test: UNKNOWN", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,self_msg,notify_none,no_highlight," "nick_alice,host_user@host,log1"); /* valid CTCP to user */ RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG alice :\001TEST\001"); CHECK_SENT(NULL); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG alice :\001ACTION\001"); CHECK_SENT(NULL); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG alice :\001ACTION \002is testing\001"); CHECK_SENT(NULL); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG alice :\001PING 1703496549 905284\001"); CHECK_SENT("NOTICE bob :\001PING 1703496549 905284\001"); CHECK_SRV("--", "CTCP requested by bob: PING 1703496549 905284", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_bob,host_user@host,log1"); if (echo_message == 0) { /* reply is displayed only if echo-message is NOT enabled */ CHECK_SRV("--", "CTCP reply to bob: PING 1703496549 905284", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,irc_ctcp_reply,self_msg,notify_none," "no_highlight,nick_alice,log1"); } RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG alice :\001UNKNOWN\001"); CHECK_SENT(NULL); CHECK_SRV("--", "Unknown CTCP requested by bob: UNKNOWN", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_bob,host_user@host,log1"); info = irc_ctcp_eval_reply (ptr_server, irc_ctcp_get_reply (ptr_server, "VERSION")); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG alice :\001VERSION\001"); snprintf (message, sizeof (message), "NOTICE bob :\001VERSION %s\001", info); CHECK_SENT(message); CHECK_SRV("--", "CTCP requested by bob: VERSION", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_bob,host_user@host,log1"); snprintf (message, sizeof (message), "CTCP reply to bob: VERSION %s", info); if (echo_message == 0) { /* reply is displayed only if echo-message is NOT enabled */ CHECK_SRV("--", message, "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,irc_ctcp_reply,self_msg,notify_none,no_highlight," "nick_alice,log1"); } snprintf (message, sizeof (message), "NOTICE bob :\001VERSION %s\001", info); CHECK_SENT(message); free (info); info = hook_info_get (NULL, "weechat_site_download", ""); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG alice :\001SOURCE\001"); snprintf (message, sizeof (message), "NOTICE bob :\001SOURCE %s\001", info); CHECK_SENT(message); free (info); RECV("@time=2023-12-25T10:29:09.456789Z " ":bob!user@host PRIVMSG alice :\001DCC SEND file.txt 1 2 3\001"); CHECK_SENT(NULL); CHECK_CORE("", "xfer: incoming file from bob (0.0.0.1, irc." IRC_FAKE_SERVER "), name: file.txt, 3 bytes (protocol: dcc)"); CHECK_SENT(NULL); /* * valid CTCP to user from self nick * (case of bouncer or if echo-message capability is enabled) */ RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG alice :\001CLIENTINFO\001"); if (echo_message == 0) { CHECK_SENT("NOTICE alice :\001CLIENTINFO ACTION CLIENTINFO DCC " "PING SOURCE TIME VERSION\001"); CHECK_SRV("--", "CTCP requested by alice: CLIENTINFO", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_alice,host_user@host,log1"); CHECK_SRV("--", "CTCP reply to alice: CLIENTINFO ACTION CLIENTINFO " "DCC PING SOURCE TIME VERSION", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,irc_ctcp_reply,self_msg,notify_none," "no_highlight,nick_alice,host_user@host,log1"); } else { CHECK_SENT(NULL); CHECK_SRV("--", "CTCP query to alice: CLIENTINFO", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,self_msg,notify_none,no_highlight,nick_alice," "host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host PRIVMSG alice :\001CLIENTINFO\001"); CHECK_SENT("NOTICE alice :\001CLIENTINFO ACTION CLIENTINFO DCC " "PING SOURCE TIME VERSION\001"); CHECK_SRV("--", "CTCP requested by alice: CLIENTINFO", "irc_privmsg,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_alice,host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host NOTICE alice :\001CLIENTINFO DCC PING " "SOURCE TIME VERSION\001"); CHECK_SENT(NULL); CHECK_SRV("--", "CTCP reply to alice: CLIENTINFO DCC PING " "SOURCE TIME VERSION", "irc_notice,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,irc_ctcp_reply,self_msg,notify_none," "no_highlight,nick_alice,host_user@host,log1"); RECV("@time=2023-12-25T10:29:09.456789Z " ":alice!user@host NOTICE alice :\001CLIENTINFO DCC PING " "SOURCE TIME VERSION\001"); CHECK_SENT(NULL); CHECK_SRV("--", "CTCP reply from alice: CLIENTINFO DCC PING " "SOURCE TIME VERSION", "irc_notice,irc_tag_time=2023-12-25T10:29:09.456789Z," "irc_ctcp,nick_alice,host_user@host,log1"); } /* close xfer buffer */ if (xfer_buffer) gui_buffer_close (xfer_buffer); if (echo_message == 1) hashtable_remove (ptr_server->cap_list, "echo-message"); } } /* * Test functions: * irc_protocol_cb_quit */ TEST(IrcProtocolWithServer, quit) { struct t_irc_channel *ptr_channel; SRV_INIT_JOIN; /* missing nick */ RECV("QUIT"); CHECK_ERROR_NICK("quit"); RECV(":bob!user@host PRIVMSG alice :hi Alice!"); CHECK_PV("bob", "bob", "hi Alice!", "irc_privmsg,notify_private,prefix_nick_248,nick_bob," "host_user@host,log1"); ptr_channel = ptr_server->channels; /* without quit message */ RECV(":bob!user@host JOIN #test"); RECV(":bob!user@host QUIT"); CHECK_CHAN("<--", "bob (user@host) has quit", "irc_quit,irc_smart_filter,nick_bob,host_user@host,log4"); LONGS_EQUAL(1, ptr_channel->nicks_count); STRCMP_EQUAL("alice", ptr_channel->nicks->name); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick); /* without quit message (but empty trailing parameter) */ RECV(":bob!user@host JOIN #test"); RECV(":bob!user@host QUIT :"); CHECK_CHAN("<--", "bob (user@host) has quit", "irc_quit,irc_smart_filter,nick_bob,host_user@host,log4"); LONGS_EQUAL(1, ptr_channel->nicks_count); STRCMP_EQUAL("alice", ptr_channel->nicks->name); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick); /* with quit message */ RECV(":bob!user@host JOIN #test"); RECV(":bob!user@host QUIT :\002quit message "); CHECK_CHAN("<--", "bob (user@host) has quit (quit message )", "irc_quit,irc_smart_filter,nick_bob,host_user@host,log4"); LONGS_EQUAL(1, ptr_channel->nicks_count); STRCMP_EQUAL("alice", ptr_channel->nicks->name); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick); /* with quit message */ RECV(":bob!user_\00304red@host_\00304red JOIN #test"); RECV(":bob!user_\00304red@host_\00304red QUIT :\002quit message "); CHECK_CHAN("<--", "bob (user_red@host_red) has quit (quit message )", "irc_quit,irc_smart_filter,nick_bob,host_user_\00304red@host_\00304red,log4"); LONGS_EQUAL(1, ptr_channel->nicks_count); STRCMP_EQUAL("alice", ptr_channel->nicks->name); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick); RECV(":bob!user_\00304red@host_\00304red JOIN #test"); CHECK_PV("bob", "-->", "bob (user_red@host_red) is back on server", "irc_nick_back,nick_bob,host_user_\00304red@host_\00304red,log4"); RECV(":bob!user_\00304red@host_\00304red QUIT :\002quit message "); /* quit with option irc.look.display_host_quit set to off */ config_file_option_set (irc_config_look_display_host_quit, "off", 1); RECV(":bob!user@host JOIN #test"); RECV(":bob!user@host QUIT :\002quit message "); CHECK_CHAN("<--", "bob has quit (quit message )", "irc_quit,irc_smart_filter,nick_bob,host_user@host,log4"); config_file_option_reset (irc_config_look_display_host_quit, 1); } /* * Test functions: * irc_protocol_cb_setname (without setname capability) */ TEST(IrcProtocolWithServer, setname_without_setname_cap) { struct t_irc_nick *ptr_nick; SRV_INIT_JOIN2; ptr_nick = ptr_server->channels->nicks; STRCMP_EQUAL(NULL, ptr_nick->realname); /* not enough parameters */ RECV(":alice!user@host SETNAME"); CHECK_ERROR_PARAMS("setname", 0, 1); /* missing nick */ RECV("SETNAME :new bob realname"); CHECK_ERROR_NICK("setname"); STRCMP_EQUAL(NULL, ptr_nick->realname); /* real name of "bob" has changed */ RECV(":bob!user@host SETNAME :\002new bob realname "); CHECK_CHAN("--", "bob has changed real name to \"new bob realname \"", "irc_setname,irc_smart_filter,nick_bob,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_nick->realname); /* self real name has changed */ RECV(":alice!user@host SETNAME :\002new alice realname "); CHECK_SRV("--", "Your real name has been set to \"new alice realname \"", "irc_setname,nick_alice,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_nick->realname); } /* * Test functions: * irc_protocol_cb_setname (with setname capability) */ TEST(IrcProtocolWithServer, setname_with_setname_cap) { struct t_irc_nick *ptr_nick, *ptr_nick2; /* assume "setname" capability is enabled in server */ hashtable_set (ptr_server->cap_list, "setname", NULL); SRV_INIT_JOIN2; ptr_nick = ptr_server->channels->nicks; ptr_nick2 = ptr_server->channels->last_nick; STRCMP_EQUAL(NULL, ptr_nick->realname); /* real name of "bob" has changed */ RECV(":bob!user@host SETNAME :\002new bob realname "); CHECK_CHAN("--", "bob has changed real name to \"new bob realname \"", "irc_setname,irc_smart_filter,nick_bob,host_user@host,log3"); STRCMP_EQUAL("\002new bob realname ", ptr_nick2->realname); /* self real name has changed */ RECV(":alice!user@host SETNAME :new realname"); CHECK_SRV("--", "Your real name has been set to \"new realname\"", "irc_setname,nick_alice,host_user@host,log3"); STRCMP_EQUAL("new realname", ptr_nick->realname); /* self real name has changed */ RECV(":alice!user@host SETNAME :new realname2"); CHECK_SRV("--", "Your real name has been set to \"new realname2\"", "irc_setname,nick_alice,host_user@host,log3"); STRCMP_EQUAL("new realname2", ptr_nick->realname); hashtable_remove (ptr_server->cap_list, "setname"); } /* * Test functions: * irc_protocol_cb_tagmsg */ TEST(IrcProtocolWithServer, tagmsg) { struct t_gui_buffer *ptr_buffer; struct t_typing_status *ptr_typing_status; SRV_INIT_JOIN2; /* not enough parameters */ RECV(":bob!user@host TAGMSG"); CHECK_ERROR_PARAMS("tagmsg", 0, 1); /* no tags */ RECV(":bob!user@host TAGMSG #test"); CHECK_NO_MSG; RECV(":bob!user@host TAGMSG :#test"); CHECK_NO_MSG; /* with tags */ RECV("@tag1=123;tag2=456 :bob!user@host TAGMSG #test "); CHECK_NO_MSG; RECV("@tag1=123;tag2=456 :bob!user@host TAGMSG :#test "); CHECK_NO_MSG; /* check typing status */ ptr_buffer = ptr_server->channels->buffer; config_file_option_set (irc_config_look_typing_status_nicks, "on", 1); config_file_option_set (typing_config_look_enabled_nicks, "on", 1); POINTERS_EQUAL(NULL, typing_status_nick_search (ptr_buffer, "bob")); RECV("@+typing=active :bob!user@host TAGMSG #test "); ptr_typing_status = typing_status_nick_search (ptr_buffer, "bob"); CHECK(ptr_typing_status); LONGS_EQUAL(TYPING_STATUS_STATE_TYPING, ptr_typing_status->state); RECV("@+typing=paused :bob!user@host TAGMSG : #test "); ptr_typing_status = typing_status_nick_search (ptr_buffer, "bob"); CHECK(ptr_typing_status); LONGS_EQUAL(TYPING_STATUS_STATE_PAUSED, ptr_typing_status->state); RECV("@+typing=done :bob!user@host TAGMSG #test "); POINTERS_EQUAL(NULL, typing_status_nick_search (ptr_buffer, "bob")); config_file_option_reset (typing_config_look_enabled_nicks, 1); config_file_option_reset (irc_config_look_typing_status_nicks, 1); } /* * Test functions: * irc_protocol_cb_topic */ TEST(IrcProtocolWithServer, topic) { struct t_irc_channel *ptr_channel; SRV_INIT_JOIN; ptr_channel = ptr_server->channels; STRCMP_EQUAL(NULL, ptr_channel->topic); /* not enough parameters */ RECV(":alice!user@host TOPIC"); CHECK_ERROR_PARAMS("topic", 0, 1); /* missing nick */ RECV("TOPIC #test :new topic"); CHECK_ERROR_NICK("topic"); STRCMP_EQUAL(NULL, ptr_channel->topic); /* not a channel */ RECV(":alice!user@host TOPIC bob"); CHECK_SRV("=!=", "irc: \"topic\" command received without channel", ""); /* empty topic */ RECV(":alice!user@host TOPIC #test"); CHECK_CHAN("--", "alice has unset topic for #test", "irc_topic,nick_alice,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_channel->topic); /* empty topic (with empty trailing parameter) */ RECV(":alice!user@host TOPIC #test :"); CHECK_CHAN("--", "alice has unset topic for #test", "irc_topic,nick_alice,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_channel->topic); /* new topic */ RECV(":alice!user@host TOPIC #test :\002new topic "); CHECK_CHAN("--", "alice has changed topic for #test to \"new topic \"", "irc_topic,nick_alice,host_user@host,log3"); STRCMP_EQUAL("\002new topic ", ptr_channel->topic); /* another new topic */ RECV(":alice!user_\00304red@host_\00304red TOPIC #test :\00304another new topic "); CHECK_CHAN("--", "alice has changed topic for #test from " "\"new topic \" to \"another new topic \"", "irc_topic,nick_alice,host_user_\00304red@host_\00304red,log3"); STRCMP_EQUAL("\00304another new topic ", ptr_channel->topic); /* empty topic */ RECV(":alice!user@host TOPIC #test"); CHECK_CHAN("--", "alice has unset topic for #test (old topic: " "\"another new topic \")", "irc_topic,nick_alice,host_user@host,log3"); STRCMP_EQUAL(NULL, ptr_channel->topic); } /* * Test functions: * irc_protocol_cb_wallops */ TEST(IrcProtocolWithServer, wallops) { SRV_INIT; /* not enough parameters */ RECV(":alice!user@host WALLOPS"); CHECK_ERROR_PARAMS("wallops", 0, 1); RECV(":alice!user@host WALLOPS message "); CHECK_SRV("--", "Wallops from alice (user@host): message", "irc_wallops,notify_private,nick_alice,host_user@host,log3"); RECV(":alice!user@host WALLOPS :\002message from admin "); CHECK_SRV("--", "Wallops from alice (user@host): message from admin ", "irc_wallops,notify_private,nick_alice,host_user@host,log3"); /* wallops with option irc.look.display_host_wallops set to off */ config_file_option_set (irc_config_look_display_host_wallops, "off", 1); RECV(":alice!user@host WALLOPS :message from admin "); CHECK_SRV("--", "Wallops from alice: message from admin ", "irc_wallops,notify_private,nick_alice,host_user@host,log3"); config_file_option_reset (irc_config_look_display_host_wallops, 1); } /* * Test functions: * irc_protocol_cb_warn */ TEST(IrcProtocolWithServer, warn) { SRV_INIT; /* not enough parameters */ RECV(":server WARN"); CHECK_ERROR_PARAMS("warn", 0, 2); RECV(":server WARN *"); CHECK_ERROR_PARAMS("warn", 1, 2); RECV(":server WARN COMMAND"); CHECK_ERROR_PARAMS("warn", 1, 2); RECV(":server WARN * TEST"); CHECK_SRV("=!=", "Warning: [] TEST", "irc_warn,nick_server,log3"); RECV(":server WARN * TEST : \002the message "); CHECK_SRV("=!=", "Warning: [TEST] the message ", "irc_warn,nick_server,log3"); RECV(":server WARN * TEST TEST2"); CHECK_SRV("=!=", "Warning: [TEST] TEST2", "irc_warn,nick_server,log3"); RECV(":server WARN * TEST TEST2 :the message"); CHECK_SRV("=!=", "Warning: [TEST TEST2] the message", "irc_warn,nick_server,log3"); RECV(":server WARN COMMAND TEST"); CHECK_SRV("=!=", "Warning: COMMAND [] TEST", "irc_warn,nick_server,log3"); RECV(":server WARN COMMAND TEST :the message"); CHECK_SRV("=!=", "Warning: COMMAND [TEST] the message", "irc_warn,nick_server,log3"); RECV(":server WARN COMMAND TEST TEST2"); CHECK_SRV("=!=", "Warning: COMMAND [TEST] TEST2", "irc_warn,nick_server,log3"); RECV(":server WARN COMMAND TEST TEST2 :the message"); CHECK_SRV("=!=", "Warning: COMMAND [TEST TEST2] the message", "irc_warn,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_001 (connected to IRC server, empty) */ TEST(IrcProtocolWithServer, 001_empty) { LONGS_EQUAL(0, ptr_server->is_connected); STRCMP_EQUAL("nick1", ptr_server->nick); /* not enough parameters */ RECV(":server 001"); CHECK_ERROR_PARAMS("001", 0, 1); RECV(":server 001 alice"); CHECK_SRV("--", "", "irc_001,irc_numeric,nick_server,log3"); LONGS_EQUAL(1, ptr_server->is_connected); STRCMP_EQUAL("alice", ptr_server->nick); } /* * Test functions: * irc_protocol_cb_001 (connected to IRC server, welcome message) */ TEST(IrcProtocolWithServer, 001_welcome) { run_cmd_quiet ("/mute /set irc.server." IRC_FAKE_SERVER ".autojoin \"#autojoin1\""); run_cmd_quiet ("/mute /set irc.server." IRC_FAKE_SERVER ".command " "\"/join #test1;/join #test2;/query remote_nick\""); LONGS_EQUAL(0, ptr_server->is_connected); STRCMP_EQUAL("nick1", ptr_server->nick); RECV(":server 001 alice : Welcome on this server, alice! "); CHECK_SRV("--", " Welcome on this server, alice! ", "irc_001,irc_numeric,nick_server,log3"); LONGS_EQUAL(1, ptr_server->is_connected); STRCMP_EQUAL("alice", ptr_server->nick); CHECK(ptr_server->channels); STRCMP_EQUAL("remote_nick", ptr_server->channels->name); } /* * Test functions: * irc_protocol_cb_005 (infos from server, empty) */ TEST(IrcProtocolWithServer, 005_empty) { SRV_INIT; STRCMP_EQUAL(NULL, ptr_server->prefix_modes); STRCMP_EQUAL(NULL, ptr_server->prefix_chars); RECV(":server 005 alice TEST=A"); CHECK_SRV("--", "TEST=A", "irc_005,irc_numeric,nick_server,log3"); STRCMP_EQUAL(NULL, ptr_server->prefix_modes); STRCMP_EQUAL(NULL, ptr_server->prefix_chars); } /* * Test functions: * irc_protocol_cb_005 (infos from server, full) */ TEST(IrcProtocolWithServer, 005_full) { SRV_INIT; STRCMP_EQUAL(NULL, ptr_server->prefix_modes); STRCMP_EQUAL(NULL, ptr_server->prefix_chars); LONGS_EQUAL(0, ptr_server->msg_max_length); LONGS_EQUAL(0, ptr_server->nick_max_length); LONGS_EQUAL(0, ptr_server->user_max_length); LONGS_EQUAL(0, ptr_server->host_max_length); LONGS_EQUAL(0, ptr_server->casemapping); STRCMP_EQUAL(NULL, ptr_server->chantypes); STRCMP_EQUAL(NULL, ptr_server->chanmodes); LONGS_EQUAL(0, ptr_server->monitor); LONGS_EQUAL(IRC_SERVER_UTF8MAPPING_NONE, ptr_server->utf8mapping); LONGS_EQUAL(0, ptr_server->utf8only); STRCMP_EQUAL(NULL, ptr_server->isupport); RECV(":server 005 alice " IRC_MSG_005 " : are supported "); CHECK_SRV("--", IRC_MSG_005 " are supported ", "irc_005,irc_numeric,nick_server,log3"); STRCMP_EQUAL("ohv", ptr_server->prefix_modes); STRCMP_EQUAL("@%+", ptr_server->prefix_chars); LONGS_EQUAL(4096, ptr_server->msg_max_length); LONGS_EQUAL(30, ptr_server->nick_max_length); LONGS_EQUAL(16, ptr_server->user_max_length); LONGS_EQUAL(32, ptr_server->host_max_length); LONGS_EQUAL(1, ptr_server->casemapping); STRCMP_EQUAL("#", ptr_server->chantypes); STRCMP_EQUAL("eIbq,k,flj,CFLMPQScgimnprstuz", ptr_server->chanmodes); LONGS_EQUAL(100, ptr_server->monitor); LONGS_EQUAL(IRC_SERVER_UTF8MAPPING_RFC8265, ptr_server->utf8mapping); LONGS_EQUAL(1, ptr_server->utf8only); STRCMP_EQUAL(IRC_MSG_005, ptr_server->isupport); /* check that realloc of info is OK if we receive the message again */ RECV(":server 005 alice " IRC_MSG_005 " :are supported"); CHECK_SRV("--", IRC_MSG_005 " are supported", "irc_005,irc_numeric,nick_server,log3"); STRCMP_EQUAL("ohv", ptr_server->prefix_modes); STRCMP_EQUAL("@%+", ptr_server->prefix_chars); LONGS_EQUAL(4096, ptr_server->msg_max_length); LONGS_EQUAL(30, ptr_server->nick_max_length); LONGS_EQUAL(16, ptr_server->user_max_length); LONGS_EQUAL(32, ptr_server->host_max_length); LONGS_EQUAL(1, ptr_server->casemapping); STRCMP_EQUAL("#", ptr_server->chantypes); STRCMP_EQUAL("eIbq,k,flj,CFLMPQScgimnprstuz", ptr_server->chanmodes); LONGS_EQUAL(100, ptr_server->monitor); LONGS_EQUAL(IRC_SERVER_UTF8MAPPING_RFC8265, ptr_server->utf8mapping); LONGS_EQUAL(1, ptr_server->utf8only); STRCMP_EQUAL(IRC_MSG_005 " " IRC_MSG_005, ptr_server->isupport); } /* * Test functions: * irc_protocol_cb_005 (accumulated ISUPPORT is bounded) */ TEST(IrcProtocolWithServer, 005_limit) { char str_msg[4096], str_value[3500]; size_t length1, length2; int i; SRV_INIT; memset (str_value, 'X', sizeof (str_value) - 1); str_value[sizeof (str_value) - 1] = '\0'; snprintf (str_msg, sizeof (str_msg), ":server 005 alice TEST=%s :are supported", str_value); /* flood the server with "005" messages */ for (i = 0; i < 100; i++) { server_recv (str_msg); } CHECK(ptr_server->isupport); length1 = strlen (ptr_server->isupport); /* the accumulated ISUPPORT data must be bounded */ CHECK(length1 <= IRC_SERVER_ISUPPORT_MAX_LENGTH + sizeof (str_value)); /* receiving more "005" messages must not grow it any further */ for (i = 0; i < 100; i++) { server_recv (str_msg); } length2 = strlen (ptr_server->isupport); LONGS_EQUAL(length1, length2); } /* * Test functions: * irc_protocol_cb_005 (infos from server, multiple messages) */ TEST(IrcProtocolWithServer, 005_multiple_messages) { SRV_INIT; STRCMP_EQUAL(NULL, ptr_server->prefix_modes); STRCMP_EQUAL(NULL, ptr_server->prefix_chars); LONGS_EQUAL(0, ptr_server->host_max_length); STRCMP_EQUAL(NULL, ptr_server->isupport); RECV(":server 005 alice PREFIX=(ohv)@%+ :are supported"); CHECK_SRV("--", "PREFIX=(ohv)@%+ are supported", "irc_005,irc_numeric,nick_server,log3"); STRCMP_EQUAL("ohv", ptr_server->prefix_modes); STRCMP_EQUAL("@%+", ptr_server->prefix_chars); STRCMP_EQUAL("PREFIX=(ohv)@%+", ptr_server->isupport); RECV(":server 005 alice HOSTLEN=24 :are supported"); CHECK_SRV("--", "HOSTLEN=24 are supported", "irc_005,irc_numeric,nick_server,log3"); LONGS_EQUAL(24, ptr_server->host_max_length); STRCMP_EQUAL("PREFIX=(ohv)@%+ HOSTLEN=24", ptr_server->isupport); } /* * Test functions: * irc_protocol_cb_008 (server notice mask) */ TEST(IrcProtocolWithServer, 008) { SRV_INIT; /* not enough parameters */ RECV(":server 008"); CHECK_ERROR_PARAMS("008", 0, 2); RECV(":server 008 alice"); CHECK_ERROR_PARAMS("008", 1, 2); RECV(":server 008 alice +Zbfkrsuy : \002Server notice mask "); CHECK_SRV("--", "Server notice mask for alice: +Zbfkrsuy Server notice mask ", "irc_008,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_221 (user mode string) */ TEST(IrcProtocolWithServer, 221) { SRV_INIT; /* not enough parameters */ RECV(":server 221"); CHECK_ERROR_PARAMS("221", 0, 2); RECV(":server 221 alice"); CHECK_ERROR_PARAMS("221", 1, 2); STRCMP_EQUAL(NULL, ptr_server->nick_modes); RECV(":server 221 alice : +abc "); CHECK_SRV("--", "User mode for alice is [ +abc ]", "irc_221,irc_numeric,nick_server,log3"); STRCMP_EQUAL("abc", ptr_server->nick_modes); RECV(":server 221 alice :-abc"); CHECK_SRV("--", "User mode for alice is [-abc]", "irc_221,irc_numeric,nick_server,log3"); STRCMP_EQUAL(NULL, ptr_server->nick_modes); } /* * Test 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: whois (is a bot on) * 337: whois ((is hiding idle time) * 378: whois (connecting from) * 379: whois (using modes) * 671: whois (secure connection) */ TEST(IrcProtocolWithServer, whois_nick_msg) { SRV_INIT; /* not enough parameters */ RECV(":server 223"); CHECK_ERROR_PARAMS("223", 0, 2); RECV(":server 223 alice"); CHECK_ERROR_PARAMS("223", 1, 2); RECV(":server 264"); CHECK_ERROR_PARAMS("264", 0, 2); RECV(":server 264 alice"); CHECK_ERROR_PARAMS("264", 1, 2); RECV(":server 275"); CHECK_ERROR_PARAMS("275", 0, 2); RECV(":server 275 alice"); CHECK_ERROR_PARAMS("275", 1, 2); RECV(":server 276"); CHECK_ERROR_PARAMS("276", 0, 2); RECV(":server 276 alice"); CHECK_ERROR_PARAMS("276", 1, 2); RECV(":server 307"); CHECK_ERROR_PARAMS("307", 0, 2); RECV(":server 307 alice"); CHECK_ERROR_PARAMS("307", 1, 2); RECV(":server 310"); CHECK_ERROR_PARAMS("310", 0, 2); RECV(":server 310 alice"); CHECK_ERROR_PARAMS("310", 1, 2); RECV(":server 313"); CHECK_ERROR_PARAMS("313", 0, 2); RECV(":server 313 alice"); CHECK_ERROR_PARAMS("313", 1, 2); RECV(":server 318"); CHECK_ERROR_PARAMS("318", 0, 2); RECV(":server 318 alice"); CHECK_ERROR_PARAMS("318", 1, 2); RECV(":server 319"); CHECK_ERROR_PARAMS("319", 0, 2); RECV(":server 319 alice"); CHECK_ERROR_PARAMS("319", 1, 2); RECV(":server 320"); CHECK_ERROR_PARAMS("320", 0, 2); RECV(":server 320 alice"); CHECK_ERROR_PARAMS("320", 1, 2); RECV(":server 326"); CHECK_ERROR_PARAMS("326", 0, 2); RECV(":server 326 alice"); CHECK_ERROR_PARAMS("326", 1, 2); RECV(":server 335"); CHECK_ERROR_PARAMS("335", 0, 2); RECV(":server 335 alice"); CHECK_ERROR_PARAMS("335", 1, 2); RECV(":server 337"); CHECK_ERROR_PARAMS("337", 0, 2); RECV(":server 337 alice"); CHECK_ERROR_PARAMS("337", 1, 2); RECV(":server 378"); CHECK_ERROR_PARAMS("378", 0, 2); RECV(":server 378 alice"); CHECK_ERROR_PARAMS("378", 1, 2); RECV(":server 379"); CHECK_ERROR_PARAMS("379", 0, 2); RECV(":server 379 alice"); CHECK_ERROR_PARAMS("379", 1, 2); RECV(":server 671"); CHECK_ERROR_PARAMS("671", 0, 2); RECV(":server 671 alice"); CHECK_ERROR_PARAMS("671", 1, 2); RECV(":server 223 alice bob UTF-8"); CHECK_SRV("--", "[bob] UTF-8", "irc_223,irc_numeric,nick_server,log3"); RECV(":server 223 alice bob :UTF-8"); CHECK_SRV("--", "[bob] UTF-8", "irc_223,irc_numeric,nick_server,log3"); RECV(":server 223 alice bob : UTF-8 "); CHECK_SRV("--", "[bob] UTF-8 ", "irc_223,irc_numeric,nick_server,log3"); RECV(":server 223 alice bob"); CHECK_SRV("--", "bob", "irc_223,irc_numeric,nick_server,log3"); RECV(":server 264 alice bob : \002is using encrypted connection "); CHECK_SRV("--", "[bob] is using encrypted connection ", "irc_264,irc_numeric,nick_server,log3"); RECV(":server 264 alice bob"); CHECK_SRV("--", "bob", "irc_264,irc_numeric,nick_server,log3"); RECV(":server 275 alice bob : is using secure connection "); CHECK_SRV("--", "[bob] is using secure connection ", "irc_275,irc_numeric,nick_server,log3"); RECV(":server 275 alice bob"); CHECK_SRV("--", "bob", "irc_275,irc_numeric,nick_server,log3"); RECV(":server 276 alice bob : has client certificate fingerprint "); CHECK_SRV("--", "[bob] has client certificate fingerprint ", "irc_276,irc_numeric,nick_server,log3"); RECV(":server 276 alice bob"); CHECK_SRV("--", "bob", "irc_276,irc_numeric,nick_server,log3"); RECV(":server 307 alice bob : registered nick "); CHECK_SRV("--", "[bob] registered nick ", "irc_307,irc_numeric,nick_server,log3"); RECV(":server 307 alice bob"); CHECK_SRV("--", "bob", "irc_307,irc_numeric,nick_server,log3"); RECV(":server 310 alice bob : help mode "); CHECK_SRV("--", "[bob] help mode ", "irc_310,irc_numeric,nick_server,log3"); RECV(":server 310 alice bob"); CHECK_SRV("--", "bob", "irc_310,irc_numeric,nick_server,log3"); RECV(":server 313 alice bob : operator "); CHECK_SRV("--", "[bob] operator ", "irc_313,irc_numeric,nick_server,log3"); RECV(":server 313 alice bob"); CHECK_SRV("--", "bob", "irc_313,irc_numeric,nick_server,log3"); RECV(":server 318 alice bob : end "); CHECK_SRV("--", "[bob] end ", "irc_318,irc_numeric,nick_server,log3"); RECV(":server 318 alice bob"); CHECK_SRV("--", "bob", "irc_318,irc_numeric,nick_server,log3"); RECV(":server 319 alice bob : channels "); CHECK_SRV("--", "[bob] channels ", "irc_319,irc_numeric,nick_server,log3"); RECV(":server 319 alice bob"); CHECK_SRV("--", "bob", "irc_319,irc_numeric,nick_server,log3"); RECV(":server 320 alice bob : identified user "); CHECK_SRV("--", "[bob] identified user ", "irc_320,irc_numeric,nick_server,log3"); RECV(":server 320 alice bob"); CHECK_SRV("--", "bob", "irc_320,irc_numeric,nick_server,log3"); RECV(":server 326 alice bob : has oper privs "); CHECK_SRV("--", "[bob] has oper privs ", "irc_326,irc_numeric,nick_server,log3"); RECV(":server 326 alice bob"); CHECK_SRV("--", "bob", "irc_326,irc_numeric,nick_server,log3"); RECV(":server 335 alice bob : is a bot "); CHECK_SRV("--", "[bob] is a bot ", "irc_335,irc_numeric,nick_server,log3"); RECV(":server 335 alice bob"); CHECK_SRV("--", "bob", "irc_335,irc_numeric,nick_server,log3"); RECV(":server 337 alice bob : is hiding their idle time "); CHECK_SRV("--", "[bob] is hiding their idle time ", "irc_337,irc_numeric,nick_server,log3"); RECV(":server 337 alice bob"); CHECK_SRV("--", "bob", "irc_337,irc_numeric,nick_server,log3"); RECV(":server 378 alice bob"); CHECK_SRV("--", "bob", "irc_378,irc_numeric,nick_server,log3"); RECV(":server 378 alice bob : connecting from "); CHECK_SRV("--", "[bob] connecting from ", "irc_378,irc_numeric,nick_server,log3"); RECV(":server 378 alice bob"); CHECK_SRV("--", "bob", "irc_378,irc_numeric,nick_server,log3"); RECV(":server 379 alice bob : using modes "); CHECK_SRV("--", "[bob] using modes ", "irc_379,irc_numeric,nick_server,log3"); RECV(":server 379 alice bob"); CHECK_SRV("--", "bob", "irc_379,irc_numeric,nick_server,log3"); RECV(":server 671 alice bob : secure connection "); CHECK_SRV("--", "[bob] secure connection ", "irc_671,irc_numeric,nick_server,log3"); RECV(":server 671 alice bob"); CHECK_SRV("--", "bob", "irc_671,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_whowas_nick_msg * * Messages: * 369: whowas (end) */ TEST(IrcProtocolWithServer, whowas_nick_msg) { SRV_INIT; /* not enough parameters */ RECV(":server 369"); CHECK_ERROR_PARAMS("369", 0, 2); RECV(":server 369 alice"); CHECK_ERROR_PARAMS("369", 1, 2); RECV(":server 369 alice bob end"); CHECK_SRV("--", "[bob] end", "irc_369,irc_numeric,nick_server,log3"); RECV(":server 369 alice bob : \002end "); CHECK_SRV("--", "[bob] end ", "irc_369,irc_numeric,nick_server,log3"); RECV(":server 369 alice bob"); CHECK_SRV("--", "bob", "irc_369,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_301 (away message) */ TEST(IrcProtocolWithServer, 301) { SRV_INIT; RECV(":bob!user@host PRIVMSG alice :hi Alice!"); CHECK_PV("bob", "bob", "hi Alice!", "irc_privmsg,notify_private,prefix_nick_248,nick_bob," "host_user@host,log1"); /* not enough parameters */ RECV(":server 301"); CHECK_ERROR_PARAMS("301", 0, 1); STRCMP_EQUAL(NULL, ptr_server->channels->away_message); RECV(":server 301 alice bob"); CHECK_NO_MSG; STRCMP_EQUAL(NULL, ptr_server->channels->away_message); RECV(":server 301 alice bob : \002I am away "); CHECK_PV("bob", "--", "[bob] is away: I am away ", "irc_301,irc_numeric,nick_server,log3"); STRCMP_EQUAL(" \002I am away ", ptr_server->channels->away_message); } /* * Test functions: * irc_protocol_cb_303 (ison) */ TEST(IrcProtocolWithServer, 303) { SRV_INIT; /* not enough parameters */ RECV(":server 303"); CHECK_ERROR_PARAMS("303", 0, 2); RECV(":server 303 alice"); CHECK_ERROR_PARAMS("303", 1, 2); RECV(":server 303 alice : nick1 nick2 "); CHECK_SRV("--", "Users online: nick1 nick2 ", "irc_303,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_305 (unaway) * irc_protocol_cb_306 (away) */ TEST(IrcProtocolWithServer, 305_306) { SRV_INIT; RECV(":bob!user@host PRIVMSG alice :hi Alice!"); CHECK_PV("bob", "bob", "hi Alice!", "irc_privmsg,notify_private,prefix_nick_248,nick_bob," "host_user@host,log1"); /* not enough parameters */ RECV(":server 305"); CHECK_ERROR_PARAMS("305", 0, 1); RECV(":server 306"); CHECK_ERROR_PARAMS("306", 0, 1); STRCMP_EQUAL(NULL, ptr_server->channels->away_message); RECV(":server 306 alice"); /* now away */ CHECK_NO_MSG; LONGS_EQUAL(1, ptr_server->is_away); RECV(":server 305 alice"); CHECK_NO_MSG; LONGS_EQUAL(0, ptr_server->is_away); RECV(":server 306 alice : \002We'll miss you "); /* now away */ CHECK_SRV("--", " We'll miss you ", "irc_306,irc_numeric,nick_server,log3"); LONGS_EQUAL(1, ptr_server->is_away); RECV(":server 305 alice : \002Does this mean you're really back? "); CHECK_SRV("--", " Does this mean you're really back? ", "irc_305,irc_numeric,nick_server,log3"); LONGS_EQUAL(0, ptr_server->is_away); } /* * Test functions: * irc_protocol_cb_311 (whois, user) */ TEST(IrcProtocolWithServer, 311) { SRV_INIT; /* not enough parameters */ RECV(":server 311"); CHECK_ERROR_PARAMS("311", 0, 3); RECV(":server 311 alice"); CHECK_ERROR_PARAMS("311", 1, 3); RECV(":server 311 alice bob"); CHECK_ERROR_PARAMS("311", 2, 3); RECV(":server 311 alice bob user"); /* non-standard parameters (using default whois callback) */ RECV(":server 311 alice bob user"); CHECK_SRV("--", "[bob] user", "irc_311,irc_numeric,nick_server,log3"); /* standard parameters */ RECV(":server 311 alice bob user_\00304red host_\00302blue * : \002real name "); CHECK_SRV("--", "[bob] (user_red@host_blue): real name ", "irc_311,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_312 (whois, server) */ TEST(IrcProtocolWithServer, 312) { SRV_INIT; /* not enough parameters */ RECV(":server 312"); CHECK_ERROR_PARAMS("312", 0, 3); RECV(":server 312 alice"); CHECK_ERROR_PARAMS("312", 1, 3); RECV(":server 312 alice bob"); CHECK_ERROR_PARAMS("312", 2, 3); /* non-standard parameters (using default whois callback) */ RECV(":server 312 alice bob server"); CHECK_SRV("--", "[bob] server", "irc_312,irc_numeric,nick_server,log3"); /* standard parameters */ RECV(":server 312 alice bob server : \002https://example.com/ "); CHECK_SRV("--", "[bob] server ( https://example.com/ )", "irc_312,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_314 (whowas) */ TEST(IrcProtocolWithServer, 314) { SRV_INIT; /* not enough parameters */ RECV(":server 314"); CHECK_ERROR_PARAMS("314", 0, 3); RECV(":server 314 alice"); CHECK_ERROR_PARAMS("314", 1, 3); RECV(":server 314 alice bob"); CHECK_ERROR_PARAMS("314", 2, 3); /* non-standard parameters (using default whowas callback) */ RECV(":server 314 alice bob user"); CHECK_SRV("--", "[bob] user", "irc_314,irc_numeric,nick_server,log3"); /* standard parameters */ RECV(":server 314 alice bob user host * : \002real name "); CHECK_SRV("--", "[bob] (user@host) was real name ", "irc_314,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_315 (end of /who) */ TEST(IrcProtocolWithServer, 315) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 315"); CHECK_ERROR_PARAMS("315", 0, 3); RECV(":server 315 alice"); CHECK_ERROR_PARAMS("315", 1, 3); RECV(":server 315 alice #test"); CHECK_ERROR_PARAMS("315", 2, 3); RECV(":server 315 alice #test end"); CHECK_SRV("--", "[#test] end", "irc_315,irc_numeric,nick_server,log3"); RECV(":server 315 alice #test : \002End of /WHO list. "); CHECK_SRV("--", "[#test] End of /WHO list. ", "irc_315,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_317 (whois, idle) */ TEST(IrcProtocolWithServer, 317) { time_t time; char message[1024]; SRV_INIT; /* not enough parameters */ RECV(":server 317"); CHECK_ERROR_PARAMS("317", 0, 4); RECV(":server 317 alice"); CHECK_ERROR_PARAMS("317", 1, 4); RECV(":server 317 alice bob"); CHECK_ERROR_PARAMS("317", 2, 4); RECV(":server 317 alice bob 122877"); CHECK_ERROR_PARAMS("317", 3, 4); /* signon at 03/12/2008 @ 1:18pm (UTC) */ RECV(":server 317 alice bob 122877 1205327880"); CHECK_SRV("--", "[bob] idle: 1 day, 10 hours 07 minutes 57 seconds, " "signon at: Wed, 12 Mar 2008 13:18:00", "irc_317,irc_numeric,nick_server,log3"); RECV(":server 317 alice bob 122877 1205327880 :\002seconds idle, signon time "); CHECK_SRV("--", "[bob] idle: 1 day, 10 hours 07 minutes 57 seconds, " "signon at: Wed, 12 Mar 2008 13:18:00", "irc_317,irc_numeric,nick_server,log3"); /* 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); RECV(message); } /* * Test functions: * irc_protocol_cb_321 (/list start) */ TEST(IrcProtocolWithServer, 321) { SRV_INIT; /* not enough parameters */ RECV(":server 321"); CHECK_ERROR_PARAMS("321", 0, 2); RECV(":server 321 alice"); CHECK_ERROR_PARAMS("321", 1, 2); RECV(":server 321 alice #test"); CHECK_SRV("--", "#test", "irc_321,irc_numeric,nick_server,log3"); RECV(":server 321 alice #test Users"); CHECK_SRV("--", "#test Users", "irc_321,irc_numeric,nick_server,log3"); RECV(":server 321 alice #test : \002Users Name "); CHECK_SRV("--", "#test Users Name ", "irc_321,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_322 (channel for /list) */ TEST(IrcProtocolWithServer, 322) { SRV_INIT; /* not enough parameters */ RECV(":server 322"); CHECK_ERROR_PARAMS("322", 0, 3); RECV(":server 322 alice"); CHECK_ERROR_PARAMS("322", 1, 3); RECV(":server 322 alice #test"); CHECK_ERROR_PARAMS("322", 2, 3); RECV(":server 322 alice #test 3"); CHECK_SRV("--", "#test(3)", "irc_322,irc_numeric,nick_server,log3"); RECV(":server 322 alice #test 3 :\002topic of channel "); CHECK_SRV("--", "#test(3): topic of channel ", "irc_322,irc_numeric,nick_server,log3"); run_cmd_quiet ("/list -server " IRC_FAKE_SERVER " -raw #test.*"); CHECK_SRV("--", "#test(3): topic of channel ", "irc_322,irc_numeric,nick_server,log3"); RECV(":server 322 alice #test 3"); CHECK_SRV("--", "#test(3)", "irc_322,irc_numeric,nick_server,log3"); RECV(":server 322 alice #test 3 :topic of channel "); CHECK_SRV("--", "#test(3): topic of channel ", "irc_322,irc_numeric,nick_server,log3"); RECV(":server 322 alice #xyz 3"); CHECK_NO_MSG; RECV(":server 322 alice #xyz 3 :topic of channel "); CHECK_NO_MSG; } /* * Test functions: * irc_protocol_cb_323 (end of /list) */ TEST(IrcProtocolWithServer, 323) { SRV_INIT; /* not enough parameters */ RECV(":server 323"); CHECK_ERROR_PARAMS("323", 0, 1); RECV(":server 323 alice"); CHECK_SRV("--", "", "irc_323,irc_numeric,nick_server,log3"); RECV(":server 323 alice end"); CHECK_SRV("--", "end", "irc_323,irc_numeric,nick_server,log3"); RECV(":server 323 alice : \002End of /LIST "); CHECK_SRV("--", " End of /LIST ", "irc_323,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_324 (channel mode) */ TEST(IrcProtocolWithServer, 324) { SRV_INIT_JOIN; STRCMP_EQUAL(NULL, ptr_server->channels->modes); /* not enough parameters */ RECV(":server 324"); CHECK_ERROR_PARAMS("324", 0, 2); RECV(":server 324 alice"); CHECK_ERROR_PARAMS("324", 1, 2); RECV(":server 324 alice #test +nt"); CHECK_NO_MSG; STRCMP_EQUAL("+nt", ptr_server->channels->modes); RECV(":server 324 alice #test +nst "); CHECK_CHAN("--", "Mode #test [+nst]", "irc_324,irc_numeric,nick_server,log3"); STRCMP_EQUAL("+nst", ptr_server->channels->modes); RECV(":server 324 alice #test"); CHECK_CHAN("--", "Mode #test []", "irc_324,irc_numeric,nick_server,log3"); STRCMP_EQUAL(NULL, ptr_server->channels->modes); } /* * Test functions: * irc_protocol_cb_327 (whois, host) */ TEST(IrcProtocolWithServer, 327) { SRV_INIT; /* not enough parameters */ RECV(":server 327"); CHECK_ERROR_PARAMS("327", 0, 3); RECV(":server 327 alice"); CHECK_ERROR_PARAMS("327", 1, 3); RECV(":server 327 alice bob"); CHECK_ERROR_PARAMS("327", 2, 3); /* non-standard parameters (using default whois callback) */ RECV(":server 327 alice bob host"); CHECK_SRV("--", "[bob] host", "irc_327,irc_numeric,nick_server,log3"); /* standard parameters */ RECV(":server 327 alice bob host 1.2.3.4"); CHECK_SRV("--", "[bob] host 1.2.3.4", "irc_327,irc_numeric,nick_server,log3"); RECV(":server 327 alice bob host_\00304red 1.2.3.4 : \002real name "); CHECK_SRV("--", "[bob] host_red 1.2.3.4 ( real name )", "irc_327,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_328 (channel URL) */ TEST(IrcProtocolWithServer, 328) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 328"); CHECK_ERROR_PARAMS("328", 0, 3); RECV(":server 328 alice"); CHECK_ERROR_PARAMS("328", 1, 3); RECV(":server 328 alice #test"); CHECK_ERROR_PARAMS("328", 2, 3); RECV(":server 328 alice #test :https://example.com/"); CHECK_CHAN("--", "URL for #test: https://example.com/", "irc_328,irc_numeric,nick_server,log3"); RECV(":server 328 alice #test : \002URL is https://example.com/ "); CHECK_CHAN("--", "URL for #test: URL is https://example.com/ ", "irc_328,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_329 (channel creation date) */ TEST(IrcProtocolWithServer, 329) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 329"); CHECK_ERROR_PARAMS("329", 0, 3); RECV(":server 329 alice"); CHECK_ERROR_PARAMS("329", 1, 3); RECV(":server 329 alice #test"); CHECK_ERROR_PARAMS("329", 2, 3); RECV(":server 329 alice #test 1205327894"); CHECK_CHAN("--", "Channel created on Wed, 12 Mar 2008 13:18:14", "irc_329,irc_numeric,nick_server,log3"); RECV(":server 329 alice #test :1205327894"); CHECK_CHAN("--", "Channel created on Wed, 12 Mar 2008 13:18:14", "irc_329,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 329 alice #xyz 1205327894"); CHECK_SRV("--", "Channel #xyz created on Wed, 12 Mar 2008 13:18:14", "irc_329,irc_numeric,nick_server,log3"); RECV(":server 329 alice #xyz :1205327894 "); CHECK_SRV("--", "Channel #xyz created on Wed, 12 Mar 2008 13:18:14", "irc_329,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_330 (whois, is logged in as) * irc_protocol_cb_343 (whois, is opered as) */ TEST(IrcProtocolWithServer, 330_343) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 330"); CHECK_ERROR_PARAMS("330", 0, 3); RECV(":server 330 alice"); CHECK_ERROR_PARAMS("330", 1, 3); RECV(":server 330 alice bob"); CHECK_ERROR_PARAMS("330", 2, 3); /* not enough parameters */ RECV(":server 343"); CHECK_ERROR_PARAMS("343", 0, 3); RECV(":server 343 alice"); CHECK_ERROR_PARAMS("343", 1, 3); RECV(":server 343 alice bob"); CHECK_ERROR_PARAMS("343", 2, 3); RECV(":server 330 alice bob bob2"); CHECK_SRV("--", "[bob] bob2", "irc_330,irc_numeric,nick_server,log3"); RECV(":server 330 alice bob bob2 : \002is logged in as "); CHECK_SRV("--", "[bob] is logged in as bob2", "irc_330,irc_numeric,nick_server,log3"); RECV(":server 343 alice bob bob2"); CHECK_SRV("--", "[bob] bob2", "irc_343,irc_numeric,nick_server,log3"); RECV(":server 343 alice bob bob2 :\002is opered as "); CHECK_SRV("--", "[bob] is opered as bob2", "irc_343,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_331 (no topic for channel) */ TEST(IrcProtocolWithServer, 331) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 331"); CHECK_ERROR_PARAMS("331", 0, 2); RECV(":server 331 alice"); CHECK_ERROR_PARAMS("331", 1, 2); RECV(":server 331 alice #test"); CHECK_CHAN("--", "No topic set for channel #test", "irc_331,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 331 alice #xyz "); CHECK_SRV("--", "No topic set for channel #xyz", "irc_331,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_332 (topic of channel) */ TEST(IrcProtocolWithServer, 332) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 332"); CHECK_ERROR_PARAMS("332", 0, 2); RECV(":server 332 alice"); CHECK_ERROR_PARAMS("332", 1, 2); STRCMP_EQUAL(NULL, ptr_server->channels->topic); RECV(":server 332 alice #test"); CHECK_CHAN("--", "Topic for #test is \"\"", "irc_332,irc_numeric,nick_server,log3"); RECV(":server 332 alice #test :\002the new topic "); CHECK_CHAN("--", "Topic for #test is \"the new topic \"", "irc_332,irc_numeric,nick_server,log3"); STRCMP_EQUAL("\002the new topic ", ptr_server->channels->topic); } /* * Test functions: * irc_protocol_cb_333 (infos about topic (nick / date)) */ TEST(IrcProtocolWithServer, 333) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 333"); CHECK_ERROR_PARAMS("333", 0, 3); RECV(":server 333 alice"); CHECK_ERROR_PARAMS("333", 1, 3); RECV(":server 333 alice #test"); CHECK_ERROR_PARAMS("333", 2, 3); RECV(":server 333 alice #test nick!user_\00304red@host_\00304red"); CHECK_NO_MSG; RECV(":server 333 alice #test nick!user_\00304red@host_\00304red 1205428096"); CHECK_CHAN("--", "Topic set by nick (user_red@host_red) on Thu, 13 Mar 2008 17:08:16", "irc_333,irc_numeric,nick_server,log3"); RECV(":server 333 alice #test 1205428096 "); CHECK_CHAN("--", "Topic set on Thu, 13 Mar 2008 17:08:16", "irc_333,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 333 alice #xyz nick!user_\00304red@host_\00304red"); CHECK_NO_MSG; RECV(":server 333 alice #xyz nick!user_\00304red@host_\00304red 1205428096"); CHECK_SRV("--", "Topic for #xyz set by nick (user_red@host_red) on " "Thu, 13 Mar 2008 17:08:16", "irc_333,irc_numeric,nick_server,log3"); RECV(":server 333 alice #xyz 1205428096"); CHECK_SRV("--", "Topic for #xyz set on Thu, 13 Mar 2008 17:08:16", "irc_333,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_338 (whois, host) */ TEST(IrcProtocolWithServer, 338) { SRV_INIT; /* not enough parameters */ RECV(":server 338"); CHECK_ERROR_PARAMS("338", 0, 3); RECV(":server 338 alice"); CHECK_ERROR_PARAMS("338", 1, 3); RECV(":server 338 alice bob"); CHECK_ERROR_PARAMS("338", 2, 3); RECV(":server 338 alice bob host_\00304red : \002actually using host "); CHECK_SRV("--", "[bob] actually using host host_red", "irc_338,irc_numeric,nick_server,log3"); /* on Rizon server */ RECV(":server 338 alice bob :\002is actually bob_\00304red@example_\00304red.com [1.2.3.4]"); CHECK_SRV("--", "[bob] is actually bob_red@example_red.com [1.2.3.4]", "irc_338,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_341 (inviting) */ TEST(IrcProtocolWithServer, 341) { SRV_INIT; /* not enough parameters */ RECV(":server 341"); CHECK_ERROR_PARAMS("341", 0, 3); RECV(":server 341 alice"); CHECK_ERROR_PARAMS("341", 1, 3); RECV(":server 341 alice bob"); CHECK_ERROR_PARAMS("341", 2, 3); RECV(":server 341 alice bob #test"); CHECK_SRV("--", "alice has invited bob to #test", "irc_341,irc_numeric,nick_alice,log3"); RECV(":server 341 alice bob : #test "); CHECK_SRV("--", "alice has invited bob to #test ", "irc_341,irc_numeric,nick_alice,log3"); } /* * Test functions: * irc_protocol_cb_344 (channel reop / whois (geo info)) */ TEST(IrcProtocolWithServer, 344) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 344"); CHECK_ERROR_PARAMS("344", 0, 3); RECV(":server 344 alice"); CHECK_ERROR_PARAMS("344", 1, 3); RECV(":server 344 alice #test"); CHECK_ERROR_PARAMS("344", 2, 3); /* channel reop (IRCnet) */ RECV(":server 344 alice #test nick!user@host"); CHECK_SRV("--", "Channel reop #test: nick!user@host", "irc_344,irc_numeric,nick_server,log3"); RECV(":server 344 alice #test : nick!user@host "); CHECK_SRV("--", "Channel reop #test: nick!user@host ", "irc_344,irc_numeric,nick_server,log3"); /* channel reop (IRCnet), channel not found */ RECV(":server 344 alice #xyz nick!user@host"); CHECK_SRV("--", "Channel reop #xyz: nick!user@host", "irc_344,irc_numeric,nick_server,log3"); RECV(":server 344 alice #xyz : nick!user@host "); CHECK_SRV("--", "Channel reop #xyz: nick!user@host ", "irc_344,irc_numeric,nick_server,log3"); /* whois, geo info (UnrealIRCd) */ RECV(":server 344 alice bob FR : \002is connecting from France "); CHECK_SRV("--", "[bob] is connecting from France (FR)", "irc_344,irc_numeric,nick_server,log3"); /* whois, geo info (UnrealIRCd), no country code */ RECV(":server 344 alice bob : \002is connecting from France "); CHECK_SRV("--", "[bob] is connecting from France ", "irc_344,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_345 (end of channel reop) */ TEST(IrcProtocolWithServer, 345) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 345"); CHECK_ERROR_PARAMS("345", 0, 3); RECV(":server 345 alice"); CHECK_ERROR_PARAMS("345", 1, 3); RECV(":server 345 alice #test"); CHECK_ERROR_PARAMS("345", 2, 3); RECV(":server 345 alice #test end"); CHECK_SRV("--", "#test: end", "irc_345,irc_numeric,nick_server,log3"); RECV(":server 345 alice #test : \002End of Channel Reop List "); CHECK_SRV("--", "#test: End of Channel Reop List ", "irc_345,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 345 alice #xyz end"); CHECK_SRV("--", "#xyz: end", "irc_345,irc_numeric,nick_server,log3"); RECV(":server 345 alice #xyz :\002End of Channel Reop List"); CHECK_SRV("--", "#xyz: End of Channel Reop List", "irc_345,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_346 (channel invite list) */ TEST(IrcProtocolWithServer, 346) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 346"); CHECK_ERROR_PARAMS("346", 0, 3); RECV(":server 346 alice"); CHECK_ERROR_PARAMS("346", 1, 3); RECV(":server 346 alice #test"); CHECK_ERROR_PARAMS("346", 2, 3); RECV(":server 346 alice #test invitemask"); CHECK_CHAN("--", "[#test] [1] invitemask invited", "irc_346,irc_numeric,nick_server,log3"); RECV(":server 346 alice #test invitemask nick!user_\00304red@host_\00304red"); CHECK_CHAN("--", "[#test] [2] invitemask invited by nick (user_red@host_red)", "irc_346,irc_numeric,nick_server,log3"); RECV(":server 346 alice #test invitemask nick!user_\00304red@host_\00304red 1205590879 "); CHECK_CHAN("--", "[#test] [3] invitemask invited by nick (user_red@host_red) " "on Sat, 15 Mar 2008 14:21:19", "irc_346,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 346 alice #xyz invitemask"); CHECK_SRV("--", "[#xyz] invitemask invited", "irc_346,irc_numeric,nick_server,log3"); RECV(":server 346 alice #xyz invitemask nick!user_\00304red@host_\00304red"); CHECK_SRV("--", "[#xyz] invitemask invited by nick (user_red@host_red)", "irc_346,irc_numeric,nick_server,log3"); RECV(":server 346 alice #xyz invitemask nick!user_\00304red@host_\00304red 1205590879"); CHECK_SRV("--", "[#xyz] invitemask invited by nick (user_red@host_red) " "on Sat, 15 Mar 2008 14:21:19", "irc_346,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_347 (end of channel invite list) */ TEST(IrcProtocolWithServer, 347) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 347"); CHECK_ERROR_PARAMS("347", 0, 2); RECV(":server 347 alice"); CHECK_ERROR_PARAMS("347", 1, 2); RECV(":server 347 alice #test"); CHECK_CHAN("--", "[#test]", "irc_347,irc_numeric,nick_server,log3"); RECV(":server 347 alice #test end"); CHECK_CHAN("--", "[#test] end", "irc_347,irc_numeric,nick_server,log3"); RECV(":server 347 alice #test : \002End of Channel Invite List "); CHECK_CHAN("--", "[#test] End of Channel Invite List ", "irc_347,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 347 alice #xyz"); CHECK_SRV("--", "[#xyz]", "irc_347,irc_numeric,nick_server,log3"); RECV(":server 347 alice #xyz end"); CHECK_SRV("--", "[#xyz] end", "irc_347,irc_numeric,nick_server,log3"); RECV(":server 347 alice #xyz :\002End of Channel Invite List"); CHECK_SRV("--", "[#xyz] End of Channel Invite List", "irc_347,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_348 (channel exception list) */ TEST(IrcProtocolWithServer, 348) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 348"); CHECK_ERROR_PARAMS("348", 0, 3); RECV(":server 348 alice"); CHECK_ERROR_PARAMS("348", 1, 3); RECV(":server 348 alice #test"); CHECK_ERROR_PARAMS("348", 2, 3); RECV(":server 348 alice #test nick1!user1@host1"); CHECK_CHAN("--", "[#test] [1] exception nick1!user1@host1", "irc_348,irc_numeric,nick_server,log3"); RECV(":server 348 alice #test nick1!user_\00304red@host_\00304red " "nick2!user_\00302blue@host_\00302blue"); CHECK_CHAN("--", "[#test] [2] exception nick1!user_red@host_red " "by nick2 (user_blue@host_blue)", "irc_348,irc_numeric,nick_server,log3"); RECV(":server 348 alice #test nick1!user_\00304red@host_\00304red " "nick2!user_\00302blue@host_\00302blue 1205585109 "); CHECK_CHAN("--", "[#test] [3] exception nick1!user_red@host_red " "by nick2 (user_blue@host_blue) on Sat, 15 Mar 2008 12:45:09", "irc_348,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 348 alice #xyz nick1!user_\00304red@host_\00304red"); CHECK_SRV("--", "[#xyz] exception nick1!user_red@host_red", "irc_348,irc_numeric,nick_server,log3"); RECV(":server 348 alice #xyz nick1!user_\00304red@host_\00304red " "nick2!user_\00302blue@host_\00302blue"); CHECK_SRV("--", "[#xyz] exception nick1!user_red@host_red " "by nick2 (user_blue@host_blue)", "irc_348,irc_numeric,nick_server,log3"); RECV(":server 348 alice #xyz nick1!user_\00304red@host_\00304red " "nick2!user_\00302blue@host_\00302blue 1205585109"); CHECK_SRV("--", "[#xyz] exception nick1!user_red@host_red " "by nick2 (user_blue@host_blue) on Sat, 15 Mar 2008 12:45:09", "irc_348,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_349 (end of channel exception list) */ TEST(IrcProtocolWithServer, 349) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 349"); CHECK_ERROR_PARAMS("349", 0, 2); RECV(":server 349 alice"); CHECK_ERROR_PARAMS("349", 1, 2); RECV(":server 349 alice #test"); CHECK_CHAN("--", "[#test]", "irc_349,irc_numeric,nick_server,log3"); RECV(":server 349 alice #test end"); CHECK_CHAN("--", "[#test] end", "irc_349,irc_numeric,nick_server,log3"); RECV(":server 349 alice #test :\002End of Channel Exception List "); CHECK_CHAN("--", "[#test] End of Channel Exception List ", "irc_349,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 349 alice #xyz"); CHECK_SRV("--", "[#xyz]", "irc_349,irc_numeric,nick_server,log3"); RECV(":server 349 alice #xyz end"); CHECK_SRV("--", "[#xyz] end", "irc_349,irc_numeric,nick_server,log3"); RECV(":server 349 alice #xyz :\002End of Channel Exception List"); CHECK_SRV("--", "[#xyz] End of Channel Exception List", "irc_349,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_350 (whois, gateway) */ TEST(IrcProtocolWithServer, 350) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 350"); CHECK_ERROR_PARAMS("350", 0, 2); RECV(":server 350 alice"); CHECK_ERROR_PARAMS("350", 1, 2); /* non-standard parameters (using whois_nick_msg callback) */ RECV(":server 350 alice bob : \002something here "); CHECK_SRV("--", "[bob] something here ", "irc_350,irc_numeric,nick_server,log3"); RECV(":server 350 alice bob * : something here "); CHECK_SRV("--", "[bob] something here ", "irc_350,irc_numeric,nick_server,log3"); /* non-standard parameters (using default whois callback) */ RECV(":server 350 alice bob"); CHECK_SRV("--", "bob", "irc_350,irc_numeric,nick_server,log3"); /* standard parameters */ RECV(":server 350 alice bob * * : \002is connected via the WebIRC gateway "); CHECK_SRV("--", "[bob] is connected via the WebIRC gateway ", "irc_350,irc_numeric,nick_server,log3"); RECV(":server 350 alice bob example.com * :is connected via the WebIRC gateway"); CHECK_SRV("--", "[bob] (example.com) is connected via the WebIRC gateway", "irc_350,irc_numeric,nick_server,log3"); RECV(":server 350 alice bob * 1.2.3.4 :is connected via the WebIRC gateway"); CHECK_SRV("--", "[bob] (1.2.3.4) is connected via the WebIRC gateway", "irc_350,irc_numeric,nick_server,log3"); RECV(":server 350 alice bob example.com 1.2.3.4 :is connected via the WebIRC gateway"); CHECK_SRV("--", "[bob] (example.com, 1.2.3.4) is connected via the WebIRC gateway", "irc_350,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_351 (server version) */ TEST(IrcProtocolWithServer, 351) { SRV_INIT; /* not enough parameters */ RECV(":server 351"); CHECK_ERROR_PARAMS("351", 0, 3); RECV(":server 351 alice"); CHECK_ERROR_PARAMS("351", 1, 3); RECV(":server 351 alice dancer-ircd-1.0"); CHECK_ERROR_PARAMS("351", 2, 3); RECV(":server 351 alice dancer-ircd-1.0 server"); CHECK_SRV("--", "dancer-ircd-1.0 server", "irc_351,irc_numeric,nick_server,log3"); RECV(":server 351 alice dancer-ircd-1.0 server : iMZ \002dncrTS/v4 "); CHECK_SRV("--", "dancer-ircd-1.0 server ( iMZ dncrTS/v4 )", "irc_351,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_352 (who) */ TEST(IrcProtocolWithServer, 352) { struct t_irc_nick *ptr_nick, *ptr_nick2; SRV_INIT_JOIN2; /* not enough parameters */ RECV(":server 352"); CHECK_ERROR_PARAMS("352", 0, 3); RECV(":server 352 alice"); CHECK_ERROR_PARAMS("352", 1, 3); RECV(":server 352 alice #test"); CHECK_ERROR_PARAMS("352", 2, 3); /* not enough parameters, but silently ignored */ RECV(":server 352 alice #test user"); CHECK_NO_MSG; RECV(":server 352 alice #test user host"); CHECK_NO_MSG; RECV(":server 352 alice #test user host server"); CHECK_NO_MSG; ptr_nick = ptr_server->channels->nicks; ptr_nick2 = ptr_server->channels->last_nick; STRCMP_EQUAL("user_a@host_a", ptr_nick->host); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick->away); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick->realname); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 352 alice #test user_\00304red host_\00304red server bob"); CHECK_SRV("--", "[#test] bob (user_red@host_red) ()", "irc_352,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_\00304red@host_\00304red", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 352 alice #test user3 host3 server bob *"); CHECK_SRV("--", "[#test] bob (user3@host3) * ()", "irc_352,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user3@host3", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 352 alice #test user4 host4 server bob * :0 \002real name 1 "); CHECK_SRV("--", "[#test] bob (user4@host4) * 0 (real name 1 )", "irc_352,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user4@host4", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL("\002real name 1 ", ptr_nick2->realname); RECV(":server 352 alice #test user5 host5 server bob H@ :0 real name 2"); CHECK_SRV("--", "[#test] bob (user5@host5) H@ 0 (real name 2)", "irc_352,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user5@host5", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL("real name 2", ptr_nick2->realname); RECV(":server 352 alice #test user6 host6 server bob G@ :0 real name 3"); CHECK_SRV("--", "[#test] bob (user6@host6) G@ 0 (real name 3)", "irc_352,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user6@host6", ptr_nick2->host); LONGS_EQUAL(1, ptr_nick2->away); STRCMP_EQUAL("real name 3", ptr_nick2->realname); RECV(":server 352 alice #test user7 host7 server bob * :0 real name 4"); CHECK_SRV("--", "[#test] bob (user7@host7) * 0 (real name 4)", "irc_352,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user7@host7", ptr_nick2->host); LONGS_EQUAL(1, ptr_nick2->away); STRCMP_EQUAL("real name 4", ptr_nick2->realname); RECV(":server 352 alice #test user_\00304red host_\00304red server bob H@ :0 real name \00302blue"); CHECK_SRV("--", "[#test] bob (user_red@host_red) H@ 0 (real name blue)", "irc_352,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_\00304red@host_\00304red", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL("real name \00302blue", ptr_nick2->realname); RECV(":server 352 alice #test user8 host8 server bob H@ :0"); CHECK_SRV("--", "[#test] bob (user8@host8) H@ 0 ()", "irc_352,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user8@host8", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL("real name \00302blue", ptr_nick2->realname); /* nothing should have changed in the first nick */ STRCMP_EQUAL("user_a@host_a", ptr_nick->host); LONGS_EQUAL(0, ptr_nick->away); STRCMP_EQUAL(NULL, ptr_nick->realname); /* channel not found */ RECV(":server 352 alice #xyz user"); CHECK_NO_MSG; RECV(":server 352 alice #xyz user host"); CHECK_NO_MSG; RECV(":server 352 alice #xyz user host server"); CHECK_NO_MSG; RECV(":server 352 alice #xyz user host server bob"); CHECK_SRV("--", "[#xyz] bob (user@host) ()", "irc_352,irc_numeric,nick_server,log3"); RECV(":server 352 alice #xyz user host server bob *"); CHECK_SRV("--", "[#xyz] bob (user@host) * ()", "irc_352,irc_numeric,nick_server,log3"); RECV(":server 352 alice #xyz user host server bob * :0 nick"); CHECK_SRV("--", "[#xyz] bob (user@host) * 0 (nick)", "irc_352,irc_numeric,nick_server,log3"); RECV(":server 352 alice #xyz user host server bob H@ :0 nick"); CHECK_SRV("--", "[#xyz] bob (user@host) H@ 0 (nick)", "irc_352,irc_numeric,nick_server,log3"); RECV(":server 352 alice #xyz user host server bob G@ :0 nick"); CHECK_SRV("--", "[#xyz] bob (user@host) G@ 0 (nick)", "irc_352,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_353 (list of users on a channel) */ TEST(IrcProtocolWithServer, 353) { struct t_irc_channel *ptr_channel; SRV_INIT_JOIN2; ptr_channel = ptr_server->channels; STRCMP_EQUAL("alice", ptr_channel->nicks->name); STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick->next_nick); /* not enough parameters */ RECV(":server 353"); CHECK_ERROR_PARAMS("353", 0, 3); RECV(":server 353 alice"); CHECK_ERROR_PARAMS("353", 1, 3); RECV(":server 353 alice #test"); CHECK_ERROR_PARAMS("353", 2, 3); RECV(":server 353 alice ="); CHECK_ERROR_PARAMS("353", 2, 3); RECV(":server 353 alice = #test"); CHECK_ERROR_PARSE("353", ":server 353 alice = #test"); RECV(":server 353 alice #test :alice"); CHECK_NO_MSG; STRCMP_EQUAL("alice", ptr_channel->nicks->name); STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick->next_nick); RECV(":server 353 alice #test :alice bob @carol +dan!user_\00304red@host_\00304red "); CHECK_NO_MSG; STRCMP_EQUAL("alice", ptr_channel->nicks->name); STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name); STRCMP_EQUAL("carol", ptr_channel->nicks->next_nick->next_nick->name); STRCMP_EQUAL("@", ptr_channel->nicks->next_nick->next_nick->prefix); STRCMP_EQUAL("dan", ptr_channel->nicks->next_nick->next_nick->next_nick->name); STRCMP_EQUAL("+", ptr_channel->nicks->next_nick->next_nick->next_nick->prefix); STRCMP_EQUAL("user_\00304red@host_\00304red", ptr_channel->nicks->next_nick->next_nick->next_nick->host); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick->next_nick->next_nick->next_nick); RECV(":server 353 alice = #test :alice"); CHECK_NO_MSG; STRCMP_EQUAL("alice", ptr_channel->nicks->name); STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name); STRCMP_EQUAL("carol", ptr_channel->nicks->next_nick->next_nick->name); STRCMP_EQUAL("@", ptr_channel->nicks->next_nick->next_nick->prefix); STRCMP_EQUAL("dan", ptr_channel->nicks->next_nick->next_nick->next_nick->name); STRCMP_EQUAL("+", ptr_channel->nicks->next_nick->next_nick->next_nick->prefix); STRCMP_EQUAL("user_\00304red@host_\00304red", ptr_channel->nicks->next_nick->next_nick->next_nick->host); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick->next_nick->next_nick->next_nick); RECV(":server 353 alice = #test :alice bob @carol +dan!user_\00304red@host_\00304red"); CHECK_NO_MSG; STRCMP_EQUAL("alice", ptr_channel->nicks->name); STRCMP_EQUAL("bob", ptr_channel->nicks->next_nick->name); STRCMP_EQUAL("carol", ptr_channel->nicks->next_nick->next_nick->name); STRCMP_EQUAL("@", ptr_channel->nicks->next_nick->next_nick->prefix); STRCMP_EQUAL("dan", ptr_channel->nicks->next_nick->next_nick->next_nick->name); STRCMP_EQUAL("+", ptr_channel->nicks->next_nick->next_nick->next_nick->prefix); STRCMP_EQUAL("user_\00304red@host_\00304red", ptr_channel->nicks->next_nick->next_nick->next_nick->host); POINTERS_EQUAL(NULL, ptr_channel->nicks->next_nick->next_nick->next_nick->next_nick); /* with option irc.look.color_nicks_in_names enabled */ config_file_option_set (irc_config_look_color_nicks_in_names, "on", 1); RECV(":server 353 alice = #test :alice bob @carol +dan!user@host"); config_file_option_unset (irc_config_look_color_nicks_in_names); /* channel not found */ RECV(":server 353 alice #xyz :alice"); CHECK_SRV("--", "Nicks #xyz: [alice]", "irc_353,irc_numeric,nick_server,log3"); RECV(":server 353 alice #xyz :alice bob @carol +dan!user@host"); CHECK_SRV("--", "Nicks #xyz: [alice bob @carol +dan]", "irc_353,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 353 alice = #xyz :alice"); CHECK_SRV("--", "Nicks #xyz: [alice]", "irc_353,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #xyz :alice bob @carol +dan!user@host"); CHECK_SRV("--", "Nicks #xyz: [alice bob @carol +dan]", "irc_353,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_354 (WHOX output) */ TEST(IrcProtocolWithServer, 354) { struct t_irc_nick *ptr_nick, *ptr_nick2; /* assume "account-notify" capability is enabled in server */ hashtable_set (ptr_server->cap_list, "account-notify", NULL); SRV_INIT_JOIN2; /* not enough parameters */ RECV(":server 354"); CHECK_ERROR_PARAMS("354", 0, 2); RECV(":server 354 alice"); CHECK_ERROR_PARAMS("354", 1, 2); ptr_nick = ptr_server->channels->nicks; ptr_nick2 = ptr_server->channels->last_nick; STRCMP_EQUAL("user_a@host_a", ptr_nick->host); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick->away); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick->account); STRCMP_EQUAL(NULL, ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick->realname); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test"); CHECK_SRV("--", "[#test]", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test user2"); CHECK_SRV("--", "[#test] user2", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test user2 :trailing parameter"); CHECK_SRV("--", "[#test] user2 trailing parameter", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test user2 host2"); CHECK_SRV("--", "[#test] user2 host2", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test user2 host2 server"); CHECK_SRV("--", "[#test] user2 host2 server", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test user2 host2 server bob"); CHECK_SRV("--", "[#test] user2 host2 server bob", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test user2 host2 server bob *"); CHECK_SRV("--", "[#test] user2 host2 server bob *", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test user2 host2 server bob H@ 0"); CHECK_SRV("--", "[#test] user2 host2 server bob H@ 0", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_b@host_b", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL(NULL, ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test user2 host2 server bob * 0 \002account2"); CHECK_SRV("--", "[#test] bob [account2] (user2@host2) * 0 ()", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user2@host2", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL("\002account2", ptr_nick2->account); STRCMP_EQUAL(NULL, ptr_nick2->realname); RECV(":server 354 alice #test user3 host3 server bob * 0 \002account3 " ": \002real name 2 "); CHECK_SRV("--", "[#test] bob [account3] (user3@host3) * 0 ( real name 2 )", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user3@host3", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL("\002account3", ptr_nick2->account); STRCMP_EQUAL(" \002real name 2 ", ptr_nick2->realname); RECV(":server 354 alice #test user4 host4 server bob H@ 0 account4 " ":real name 3"); CHECK_SRV("--", "[#test] bob [account4] (user4@host4) H@ 0 (real name 3)", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user4@host4", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL("account4", ptr_nick2->account); STRCMP_EQUAL("real name 3", ptr_nick2->realname); RECV(":server 354 alice #test user5 host5 server bob G@ 0 account5 " ":real name 4"); CHECK_SRV("--", "[#test] bob [account5] (user5@host5) G@ 0 (real name 4)", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user5@host5", ptr_nick2->host); LONGS_EQUAL(1, ptr_nick2->away); STRCMP_EQUAL("account5", ptr_nick2->account); STRCMP_EQUAL("real name 4", ptr_nick2->realname); RECV(":server 354 alice #test user6 host6 server bob * 0 account6 " ":real name 5"); CHECK_SRV("--", "[#test] bob [account6] (user6@host6) * 0 (real name 5)", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user6@host6", ptr_nick2->host); LONGS_EQUAL(1, ptr_nick2->away); STRCMP_EQUAL("account6", ptr_nick2->account); STRCMP_EQUAL("real name 5", ptr_nick2->realname); RECV(":server 354 alice #test user_\00304red host_\00304red server bob " "H@ 0 account_\00304red :real name \00302blue"); CHECK_SRV("--", "[#test] bob [account_red] (user_red@host_red) H@ 0 " "(real name blue)", "irc_354,irc_numeric,nick_server,log3"); STRCMP_EQUAL("user_\00304red@host_\00304red", ptr_nick2->host); LONGS_EQUAL(0, ptr_nick2->away); STRCMP_EQUAL("account_\00304red", ptr_nick2->account); STRCMP_EQUAL("real name \00302blue", ptr_nick2->realname); /* nothing should have changed in the first nick */ STRCMP_EQUAL("user_a@host_a", ptr_nick->host); LONGS_EQUAL(0, ptr_nick->away); STRCMP_EQUAL(NULL, ptr_nick->account); STRCMP_EQUAL(NULL, ptr_nick->realname); /* channel not found */ RECV(":server 354 alice #xyz"); CHECK_SRV("--", "[#xyz]", "irc_354,irc_numeric,nick_server,log3"); RECV(":server 354 alice #xyz user2"); CHECK_SRV("--", "[#xyz] user2", "irc_354,irc_numeric,nick_server,log3"); RECV(":server 354 alice #xyz user2 host2"); CHECK_SRV("--", "[#xyz] user2 host2", "irc_354,irc_numeric,nick_server,log3"); RECV(":server 354 alice #xyz user2 host2 server"); CHECK_SRV("--", "[#xyz] user2 host2 server", "irc_354,irc_numeric,nick_server,log3"); RECV(":server 354 alice #xyz user2 host2 server bob"); CHECK_SRV("--", "[#xyz] user2 host2 server bob", "irc_354,irc_numeric,nick_server,log3"); RECV(":server 354 alice #xyz user2 host2 server bob *"); CHECK_SRV("--", "[#xyz] user2 host2 server bob *", "irc_354,irc_numeric,nick_server,log3"); RECV(":server 354 alice #xyz user2 host2 server bob G@ 0"); CHECK_SRV("--", "[#xyz] user2 host2 server bob G@ 0", "irc_354,irc_numeric,nick_server,log3"); RECV(":server 354 alice #xyz user2 host2 server bob H@ 0 account"); CHECK_SRV("--", "[#xyz] bob [account] (user2@host2) H@ 0 ()", "irc_354,irc_numeric,nick_server,log3"); RECV(":server 354 alice #xyz user2 host2 server bob G@ 0 account " ":real name"); CHECK_SRV("--", "[#xyz] bob [account] (user2@host2) G@ 0 (real name)", "irc_354,irc_numeric,nick_server,log3"); hashtable_remove (ptr_server->cap_list, "account-notify"); } /* * Test functions: * irc_protocol_get_string_channel_nicks * irc_protocol_get_string_channel_nicks_count * irc_protocol_cb_366 (end of /names list) */ TEST(IrcProtocolWithServer, 366) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 366"); CHECK_ERROR_PARAMS("366", 0, 3); RECV(":server 366 alice"); CHECK_ERROR_PARAMS("366", 1, 3); RECV(":server 366 alice #test"); CHECK_ERROR_PARAMS("366", 2, 3); RECV(":server 366 alice #test end"); CHECK_CHAN("--", "Channel #test: 1 nick (0 ops, 0 voiced, 1 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 366 alice #test : \002End of /NAMES list "); CHECK_CHAN("--", "Channel #test: 1 nick (0 ops, 0 voiced, 1 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :bob"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN("--", "Channel #test: 2 nicks (0 ops, 0 voiced, 2 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :@carol"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN("--", "Channel #test: 3 nicks (1 op, 0 voiced, 2 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :+dan!user@host"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN("--", "Channel #test: 4 nicks (1 op, 1 voiced, 2 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :@evans"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN("--", "Channel #test: 5 nicks (2 ops, 1 voiced, 2 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :+fred"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN("--", "Channel #test: 6 nicks (2 ops, 2 voiced, 2 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :greg"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN("--", "Channel #test: 7 nicks (2 ops, 2 voiced, 3 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 005 alice " IRC_MSG_005 " :are supported"); RECV(":server 353 alice = #test :%harry"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN("--", "Channel #test: 8 nicks (2 ops, 1 halfop, 2 voiced, 3 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :%ian"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN("--", "Channel #test: 9 nicks (2 ops, 2 halfops, 2 voiced, 3 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 005 alice PREFIX=(qaohv)~&@%+ :are supported"); RECV(":server 353 alice = #test :~jessica"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN( "--", "Channel #test: 10 nicks (1 owner, 0 admins, 2 ops, 2 halfops, 2 voiced, 3 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :&karl"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN( "--", "Channel #test: 11 nicks (1 owner, 1 admin, 2 ops, 2 halfops, 2 voiced, 3 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :&mike"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN( "--", "Channel #test: 12 nicks (1 owner, 2 admins, 2 ops, 2 halfops, 2 voiced, 3 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :~olivia"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN( "--", "Channel #test: 13 nicks (2 owners, 2 admins, 2 ops, 2 halfops, 2 voiced, 3 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 005 alice PREFIX=(zqaohv)?~&@%+ :are supported"); RECV(":server 353 alice = #test :?peggy"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN( "--", "Channel #test: 14 nicks (1 +z, 2 owners, 2 admins, 2 ops, 2 halfops, 2 voiced, 3 regular)", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 353 alice = #test :?robert"); RECV(":server 366 alice #test :End of /NAMES list"); CHECK_CHAN( "--", "Channel #test: 15 nicks (2 +z, 2 owners, 2 admins, 2 ops, 2 halfops, 2 voiced, 3 regular)", "irc_366,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 366 alice #xyz end"); CHECK_SRV("--", "#xyz: end", "irc_366,irc_numeric,nick_server,log3"); RECV(":server 366 alice #xyz : End of /NAMES list "); CHECK_SRV("--", "#xyz: End of /NAMES list ", "irc_366,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_367 (banlist) */ TEST(IrcProtocolWithServer, 367) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 367"); CHECK_ERROR_PARAMS("367", 0, 3); RECV(":server 367 alice"); CHECK_ERROR_PARAMS("367", 1, 3); RECV(":server 367 alice #test"); CHECK_ERROR_PARAMS("367", 2, 3); RECV(":server 367 alice #test nick1!user1@host1_\00304red"); CHECK_CHAN("--", "[#test] [1] nick1!user1@host1_red banned", "irc_367,irc_numeric,nick_server,log3"); RECV(":server 367 alice #test nick1!user1_\00304red@host1_\00304red " "nick2!user2_\00304red@host2_\00304red "); CHECK_CHAN("--", "[#test] [2] nick1!user1_red@host1_red banned by nick2 (user2_red@host2_red)", "irc_367,irc_numeric,nick_server,log3"); RECV(":server 367 alice #test nick1!user1_\00304red@host1_\00304red " "nick2!user2_\00304red@host2_\00304red 1205585109 "); CHECK_CHAN("--", "[#test] [3] nick1!user1_red@host1_red banned " "by nick2 (user2_red@host2_red) on Sat, 15 Mar 2008 12:45:09", "irc_367,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 367 alice #xyz nick1!user1_\00304red@host1_\00304red"); CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red banned", "irc_367,irc_numeric,nick_server,log3"); RECV(":server 367 alice #xyz nick1!user1_\00304red@host1_\00304red " "nick2!user2_\00304red@host2_\00304red"); CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red banned by nick2 (user2_red@host2_red)", "irc_367,irc_numeric,nick_server,log3"); RECV(":server 367 alice #xyz nick1!user1_\00304red@host1_\00304red " "nick2!user2_\00304red@host2_\00304red 1205585109"); CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red banned by nick2 (user2_red@host2_red) " "on Sat, 15 Mar 2008 12:45:09", "irc_367,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_368 (end of banlist) */ TEST(IrcProtocolWithServer, 368) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 368"); CHECK_ERROR_PARAMS("368", 0, 2); RECV(":server 368 alice"); CHECK_ERROR_PARAMS("368", 1, 2); RECV(":server 368 alice #test"); CHECK_CHAN("--", "[#test]", "irc_368,irc_numeric,nick_server,log3"); RECV(":server 368 alice #test end"); CHECK_CHAN("--", "[#test] end", "irc_368,irc_numeric,nick_server,log3"); RECV(":server 368 alice #test : \002End of Channel Ban List "); CHECK_CHAN("--", "[#test] End of Channel Ban List ", "irc_368,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 368 alice #xyz"); CHECK_SRV("--", "[#xyz]", "irc_368,irc_numeric,nick_server,log3"); RECV(":server 368 alice #xyz end"); CHECK_SRV("--", "[#xyz] end", "irc_368,irc_numeric,nick_server,log3"); RECV(":server 368 alice #xyz :\002End of Channel Ban List"); CHECK_SRV("--", "[#xyz] End of Channel Ban List", "irc_368,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_401 (no such nick/channel) */ TEST(IrcProtocolWithServer, 401) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 401"); CHECK_ERROR_PARAMS("401", 0, 2); RECV(":server 401 alice"); CHECK_ERROR_PARAMS("401", 1, 2); RECV(":server 401 alice bob"); CHECK_SRV("--", "bob", "irc_401,irc_numeric,nick_server,log3"); RECV(":server 401 alice bob : \002No such nick/channel "); CHECK_SRV("--", "bob: No such nick/channel ", "irc_401,irc_numeric,nick_server,log3"); RECV(":server 401 alice #unknown :\002No such nick/channel"); CHECK_SRV("--", "#unknown: No such nick/channel", "irc_401,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_402 (no such server) */ TEST(IrcProtocolWithServer, 402) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 402"); CHECK_ERROR_PARAMS("402", 0, 2); RECV(":server 402 alice"); CHECK_ERROR_PARAMS("402", 1, 2); RECV(":server 402 alice server"); CHECK_SRV("--", "server", "irc_402,irc_numeric,nick_server,log3"); RECV(":server 402 alice server : \002No such server "); CHECK_SRV("--", "server: No such server ", "irc_402,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_403 (no such channel) */ TEST(IrcProtocolWithServer, 403) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 403"); CHECK_ERROR_PARAMS("403", 0, 2); RECV(":server 403 alice"); CHECK_ERROR_PARAMS("403", 1, 2); RECV(":server 403 alice #test2"); CHECK_SRV("--", "#test2", "irc_403,irc_numeric,nick_server,log3"); RECV(":server 403 alice #test2 : \002No such channel "); CHECK_SRV("--", "#test2: No such channel ", "irc_403,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_404 (cannot send to channel) */ TEST(IrcProtocolWithServer, 404) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 404"); CHECK_ERROR_PARAMS("404", 0, 2); RECV(":server 404 alice"); CHECK_ERROR_PARAMS("404", 1, 2); RECV(":server 404 alice #test"); CHECK_SRV("--", "#test", "irc_404,irc_numeric,nick_server,log3"); RECV(":server 404 alice #test : \002Cannot send to channel "); CHECK_CHAN("--", "#test: Cannot send to channel ", "irc_404,irc_numeric,nick_server,log3"); RECV(":server 404 alice #test2 :\002Cannot send to channel"); CHECK_SRV("--", "#test2: Cannot send to channel", "irc_404,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_405 (too many channels) */ TEST(IrcProtocolWithServer, 405) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 405"); CHECK_ERROR_PARAMS("405", 0, 2); RECV(":server 405 alice"); CHECK_ERROR_PARAMS("405", 1, 2); RECV(":server 405 alice #test2"); CHECK_SRV("--", "#test2", "irc_405,irc_numeric,nick_server,log3"); RECV(":server 405 alice #test2 : \002You have joined too many channels "); CHECK_SRV("--", "#test2: You have joined too many channels ", "irc_405,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_406 (was no such nick) */ TEST(IrcProtocolWithServer, 406) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 406"); CHECK_ERROR_PARAMS("406", 0, 2); RECV(":server 406 alice"); CHECK_ERROR_PARAMS("406", 1, 2); RECV(":server 406 alice bob"); CHECK_SRV("--", "bob", "irc_406,irc_numeric,nick_server,log3"); RECV(":server 406 alice bob : \002There was no such nick "); CHECK_SRV("--", "bob: There was no such nick ", "irc_406,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_407 (too many targets) */ TEST(IrcProtocolWithServer, 407) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 407"); CHECK_ERROR_PARAMS("407", 0, 2); RECV(":server 407 alice"); CHECK_ERROR_PARAMS("407", 1, 2); RECV(":server 407 alice bob@host"); CHECK_SRV("--", "bob@host", "irc_407,irc_numeric,nick_server,log3"); RECV(":server 407 alice bob@host : \002Duplicate recipients. No message delivered "); CHECK_SRV("--", "bob@host: Duplicate recipients. No message delivered ", "irc_407,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_409 (no origin) */ TEST(IrcProtocolWithServer, 409) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 409"); CHECK_ERROR_PARAMS("409", 0, 2); RECV(":server 409 alice"); CHECK_ERROR_PARAMS("409", 1, 2); RECV(":server 409 alice : \002No origin specified "); CHECK_SRV("--", " No origin specified ", "irc_409,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_411 (no recipient) */ TEST(IrcProtocolWithServer, 411) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 411"); CHECK_ERROR_PARAMS("411", 0, 2); RECV(":server 411 alice"); CHECK_ERROR_PARAMS("411", 1, 2); RECV(":server 411 alice : \002No recipient given (PRIVMSG) "); CHECK_SRV("--", " No recipient given (PRIVMSG) ", "irc_411,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_412 (no text to send) */ TEST(IrcProtocolWithServer, 412) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 412"); CHECK_ERROR_PARAMS("412", 0, 2); RECV(":server 412 alice"); CHECK_ERROR_PARAMS("412", 1, 2); RECV(":server 412 alice : \002No text to send "); CHECK_SRV("--", " No text to send ", "irc_412,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_413 (no toplevel) */ TEST(IrcProtocolWithServer, 413) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 413"); CHECK_ERROR_PARAMS("413", 0, 2); RECV(":server 413 alice"); CHECK_ERROR_PARAMS("413", 1, 2); RECV(":server 413 alice mask"); CHECK_SRV("--", "mask", "irc_413,irc_numeric,nick_server,log3"); RECV(":server 413 alice mask : \002No toplevel domain specified "); CHECK_SRV("--", "mask: No toplevel domain specified ", "irc_413,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_414 (wildcard in toplevel domain) */ TEST(IrcProtocolWithServer, 414) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 414"); CHECK_ERROR_PARAMS("414", 0, 2); RECV(":server 414 alice"); CHECK_ERROR_PARAMS("414", 1, 2); RECV(":server 414 alice mask"); CHECK_SRV("--", "mask", "irc_414,irc_numeric,nick_server,log3"); RECV(":server 414 alice mask : \002Wildcard in toplevel domain "); CHECK_SRV("--", "mask: Wildcard in toplevel domain ", "irc_414,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_415 (cannot send to channel) */ TEST(IrcProtocolWithServer, 415) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 415"); CHECK_ERROR_PARAMS("415", 0, 2); RECV(":server 415 alice"); CHECK_ERROR_PARAMS("415", 1, 2); RECV(":server 415 alice #test"); CHECK_SRV("--", "#test", "irc_415,irc_numeric,nick_server,log3"); RECV(":server 415 alice #test : \002Cannot send message to channel (+R) "); CHECK_CHAN("--", "#test: Cannot send message to channel (+R) ", "irc_415,irc_numeric,nick_server,log3"); RECV(":server 415 alice #test2 :\002Cannot send message to channel (+R)"); CHECK_SRV("--", "#test2: Cannot send message to channel (+R)", "irc_415,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_421 (unknown command) */ TEST(IrcProtocolWithServer, 421) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 421"); CHECK_ERROR_PARAMS("421", 0, 2); RECV(":server 421 alice"); CHECK_ERROR_PARAMS("421", 1, 2); RECV(":server 421 alice UNKNOWN"); CHECK_SRV("--", "UNKNOWN", "irc_421,irc_numeric,nick_server,log3"); RECV(":server 421 alice UNKNOWN : \002Unknown command "); CHECK_SRV("--", "UNKNOWN: Unknown command ", "irc_421,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_422 (MOTD is missing) */ TEST(IrcProtocolWithServer, 422) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 422"); CHECK_ERROR_PARAMS("422", 0, 2); RECV(":server 422 alice"); CHECK_ERROR_PARAMS("422", 1, 2); RECV(":server 422 alice : \002MOTD file is missing "); CHECK_SRV("--", " MOTD file is missing ", "irc_422,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_423 (no administrative info) */ TEST(IrcProtocolWithServer, 423) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 423"); CHECK_ERROR_PARAMS("423", 0, 2); RECV(":server 423 alice"); CHECK_ERROR_PARAMS("423", 1, 2); RECV(":server 423 alice server"); CHECK_SRV("--", "server", "irc_423,irc_numeric,nick_server,log3"); RECV(":server 423 alice server : \002No administrative info available "); CHECK_SRV("--", "server: No administrative info available ", "irc_423,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_424 (file error) */ TEST(IrcProtocolWithServer, 424) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 424"); CHECK_ERROR_PARAMS("424", 0, 2); RECV(":server 424 alice"); CHECK_ERROR_PARAMS("424", 1, 2); RECV(":server 424 alice : \002File error doing read on /path/to/file "); CHECK_SRV("--", " File error doing read on /path/to/file ", "irc_424,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_431 (no nickname given) */ TEST(IrcProtocolWithServer, 431) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 431"); CHECK_ERROR_PARAMS("431", 0, 2); RECV(":server 431 alice"); CHECK_ERROR_PARAMS("431", 1, 2); RECV(":server 431 alice : \002No nickname given "); CHECK_SRV("--", " No nickname given ", "irc_431,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_432 (erroneous nickname, not connected) */ TEST(IrcProtocolWithServer, 432_not_connected) { RECV(":server 432 * alice error"); CHECK_SRV("--", "* alice error", ""); CHECK_SRV("=!=", "irc: nickname \"nick1\" is invalid, trying nickname \"nick2\"", ""); RECV(":server 432 * :alice error"); CHECK_SRV("--", "* alice error", ""); CHECK_SRV("=!=", "irc: nickname \"nick2\" is invalid, trying nickname \"nick3\"", ""); RECV(":server 432 * alice : \002Erroneous Nickname "); CHECK_SRV("--", "* alice Erroneous Nickname ", ""); CHECK_SRV("=!=", "irc: nickname \"nick3\" is invalid, trying nickname \"nick1_\"", ""); RECV(":server 432 * alice1 :\002Erroneous Nickname"); CHECK_SRV("--", "* alice1 Erroneous Nickname", ""); CHECK_SRV("=!=", "irc: nickname \"nick1_\" is invalid, " "trying nickname \"nick1__\"", ""); } /* * Test functions: * irc_protocol_cb_432 (erroneous nickname, connected) */ TEST(IrcProtocolWithServer, 432_connected) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 432"); CHECK_ERROR_PARAMS("432", 0, 2); RECV(":server 432 alice"); CHECK_ERROR_PARAMS("432", 1, 2); RECV(":server 432 alice test%+"); CHECK_SRV("--", "test%+", "irc_432,irc_numeric,nick_server,log3"); RECV(":server 432 alice test%+ error"); CHECK_SRV("--", "test%+: error", "irc_432,irc_numeric,nick_server,log3"); RECV(":server 432 alice test%+ : \002Erroneous Nickname "); CHECK_SRV("--", "test%+: Erroneous Nickname ", "irc_432,irc_numeric,nick_server,log3"); /* * special case: erroneous nick is a channel: check that the message is * still displayed on the server buffer */ RECV(":server 432 alice #test : \002Erroneous Nickname "); CHECK_SRV("--", "#test: Erroneous Nickname ", "irc_432,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_433 (nickname already in use, not connected) */ TEST(IrcProtocolWithServer, 433_not_connected) { RECV(":server 433 * alice error"); CHECK_SRV("--", "irc: nickname \"nick1\" is already in use, " "trying nickname \"nick2\"", ""); RECV(":server 433 * alice : Nickname is already in use. "); CHECK_SRV("--", "irc: nickname \"nick2\" is already in use, " "trying nickname \"nick3\"", ""); RECV(":server 433 * alice1 :Nickname is already in use."); CHECK_SRV("--", "irc: nickname \"nick3\" is already in use, " "trying nickname \"nick1_\"", ""); } /* * Test functions: * irc_protocol_cb_433 (nickname already in use, connected) */ TEST(IrcProtocolWithServer, 433_connected) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 433"); CHECK_ERROR_PARAMS("433", 0, 2); RECV(":server 433 alice"); CHECK_ERROR_PARAMS("433", 1, 2); RECV(":server 433 alice test"); CHECK_SRV("--", "test", "irc_433,irc_numeric,nick_server,log3"); RECV(":server 433 alice test error"); CHECK_SRV("--", "test: error", "irc_433,irc_numeric,nick_server,log3"); RECV(":server 433 alice test : \002Nickname is already in use. "); CHECK_SRV("--", "test: Nickname is already in use. ", "irc_433,irc_numeric,nick_server,log3"); /* * special case: nickname already used looks like a channel (it should * never happen in practice): check that the message is still displayed * on the server buffer */ RECV(":server 433 alice #test : \002Nickname is already in use. "); CHECK_SRV("--", "#test: Nickname is already in use. ", "irc_433,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_436 (nickname collision) */ TEST(IrcProtocolWithServer, 436) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 436"); CHECK_ERROR_PARAMS("436", 0, 2); RECV(":server 436 alice"); CHECK_ERROR_PARAMS("436", 1, 2); RECV(":server 436 alice bob"); CHECK_SRV("--", "bob", "irc_436,irc_numeric,nick_server,log3"); RECV(":server 436 alice bob error"); CHECK_SRV("--", "bob: error", "irc_436,irc_numeric,nick_server,log3"); RECV(":server 436 alice bob : \002Nickname collision KILL "); CHECK_SRV("--", "bob: Nickname collision KILL ", "irc_436,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_437 (nick/channel temporarily unavailable, not connected) */ TEST(IrcProtocolWithServer, 437_not_connected) { RECV(":server 437 * alice error"); CHECK_SRV("--", "* alice error", "irc_437,irc_numeric,nick_server,log3"); RECV(":server 437 * alice : \002Nick/channel is temporarily unavailable "); CHECK_SRV("--", "* alice Nick/channel is temporarily unavailable ", "irc_437,irc_numeric,nick_server,log3"); RECV(":server 437 * alice1 :\002Nick/channel is temporarily unavailable"); CHECK_SRV("--", "* alice1 Nick/channel is temporarily unavailable", "irc_437,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_437 (nick/channel temporarily unavailable, connected) */ TEST(IrcProtocolWithServer, 437_connected) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 437"); CHECK_ERROR_PARAMS("437", 0, 2); RECV(":server 437 alice"); CHECK_ERROR_PARAMS("437", 1, 2); RECV(":server 437 * alice"); CHECK_SRV("--", "* alice", "irc_437,irc_numeric,nick_server,log3"); RECV(":server 437 * alice error"); CHECK_SRV("--", "* alice error", "irc_437,irc_numeric,nick_server,log3"); RECV(":server 437 * alice : \002Nick/channel is temporarily unavailable "); CHECK_SRV("--", "* alice Nick/channel is temporarily unavailable ", "irc_437,irc_numeric,nick_server,log3"); RECV(":server 437 alice #test :\002Cannot change nickname while banned on channel"); CHECK_SRV("--", "#test: Cannot change nickname while banned on channel", "irc_437,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_438 (not authorized to change nickname) */ TEST(IrcProtocolWithServer, 438) { SRV_INIT; /* not enough parameters */ RECV(":server 438"); CHECK_ERROR_PARAMS("438", 0, 2); RECV(":server 438 alice"); CHECK_ERROR_PARAMS("438", 1, 2); RECV(":server 438 alice alice2"); CHECK_SRV("--", "alice alice2", "irc_438,irc_numeric,nick_server,log3"); RECV(":server 438 alice alice2 error"); CHECK_SRV("--", "error (alice => alice2)", "irc_438,irc_numeric,nick_server,log3"); RECV(":server 438 alice alice2 : \002Nick change too fast. " "Please wait 30 seconds. "); CHECK_SRV("--", " Nick change too fast. Please wait 30 seconds. (alice => alice2)", "irc_438,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_441 (user not in channel) */ TEST(IrcProtocolWithServer, 441) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 441"); CHECK_ERROR_PARAMS("441", 0, 2); RECV(":server 441 alice"); CHECK_ERROR_PARAMS("441", 1, 2); RECV(":server 441 alice bob"); CHECK_SRV("--", "bob", "irc_441,irc_numeric,nick_server,log3"); RECV(":server 441 alice bob #test2"); CHECK_SRV("--", "bob: #test2", "irc_441,irc_numeric,nick_server,log3"); RECV(":server 441 alice bob #test2 : \002They aren't on that channel "); CHECK_SRV("--", "bob: #test2 They aren't on that channel ", "irc_441,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_442 (not on channel) */ TEST(IrcProtocolWithServer, 442) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 442"); CHECK_ERROR_PARAMS("442", 0, 2); RECV(":server 442 alice"); CHECK_ERROR_PARAMS("442", 1, 2); RECV(":server 442 alice #test2"); CHECK_SRV("--", "#test2", "irc_442,irc_numeric,nick_server,log3"); RECV(":server 442 alice #test2 : \002You're not on that channel "); CHECK_SRV("--", "#test2: You're not on that channel ", "irc_442,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_443 (user already on channel) */ TEST(IrcProtocolWithServer, 443) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 443"); CHECK_ERROR_PARAMS("443", 0, 2); RECV(":server 443 alice"); CHECK_ERROR_PARAMS("443", 1, 2); RECV(":server 443 alice bob"); CHECK_SRV("--", "bob", "irc_443,irc_numeric,nick_server,log3"); RECV(":server 443 alice bob #test2"); CHECK_SRV("--", "bob: #test2", "irc_443,irc_numeric,nick_server,log3"); RECV(":server 443 alice bob #test2 : \002is already on channel "); CHECK_SRV("--", "bob: #test2 is already on channel ", "irc_443,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_444 (user not logged in) */ TEST(IrcProtocolWithServer, 444) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 444"); CHECK_ERROR_PARAMS("444", 0, 2); RECV(":server 444 alice"); CHECK_ERROR_PARAMS("444", 1, 2); RECV(":server 444 alice bob"); CHECK_SRV("--", "bob", "irc_444,irc_numeric,nick_server,log3"); RECV(":server 444 alice bob error"); CHECK_SRV("--", "bob: error", "irc_444,irc_numeric,nick_server,log3"); RECV(":server 444 alice bob : \002User not logged in "); CHECK_SRV("--", "bob: User not logged in ", "irc_444,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_445 (SUMMON has been disabled) */ TEST(IrcProtocolWithServer, 445) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 445"); CHECK_ERROR_PARAMS("445", 0, 2); RECV(":server 445 alice"); CHECK_ERROR_PARAMS("445", 1, 2); RECV(":server 445 alice : \002SUMMON has been disabled "); CHECK_SRV("--", " SUMMON has been disabled ", "irc_445,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_446 (USERS has been disabled) */ TEST(IrcProtocolWithServer, 446) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 446"); CHECK_ERROR_PARAMS("446", 0, 2); RECV(":server 446 alice"); CHECK_ERROR_PARAMS("446", 1, 2); RECV(":server 446 alice : \002USERS has been disabled "); CHECK_SRV("--", " USERS has been disabled ", "irc_446,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_451 (you are not registered) */ TEST(IrcProtocolWithServer, 451) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 451"); CHECK_ERROR_PARAMS("451", 0, 2); RECV(":server 451 alice"); CHECK_ERROR_PARAMS("451", 1, 2); RECV(":server 451 alice : \002You have not registered "); CHECK_SRV("--", " You have not registered ", "irc_451,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_461 (not enough parameters) */ TEST(IrcProtocolWithServer, 461) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 461"); CHECK_ERROR_PARAMS("461", 0, 2); RECV(":server 461 alice"); CHECK_ERROR_PARAMS("461", 1, 2); RECV(":server 461 alice PRIVMSG"); CHECK_SRV("--", "PRIVMSG", "irc_461,irc_numeric,nick_server,log3"); RECV(":server 461 alice PRIVMSG : \002Not enough parameters "); CHECK_SRV("--", "PRIVMSG: Not enough parameters ", "irc_461,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_462 (you may not register) */ TEST(IrcProtocolWithServer, 462) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 462"); CHECK_ERROR_PARAMS("462", 0, 2); RECV(":server 462 alice"); CHECK_ERROR_PARAMS("462", 1, 2); RECV(":server 462 alice : \002You may not reregister "); CHECK_SRV("--", " You may not reregister ", "irc_462,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_463 (host not privileged) */ TEST(IrcProtocolWithServer, 463) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 463"); CHECK_ERROR_PARAMS("463", 0, 2); RECV(":server 463 alice"); CHECK_ERROR_PARAMS("463", 1, 2); RECV(":server 463 alice : \002Your host isn't among the privileged "); CHECK_SRV("--", " Your host isn't among the privileged ", "irc_463,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_464 (password incorrect) */ TEST(IrcProtocolWithServer, 464) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 464"); CHECK_ERROR_PARAMS("464", 0, 2); RECV(":server 464 alice"); CHECK_ERROR_PARAMS("464", 1, 2); RECV(":server 464 alice : \002Password incorrect "); CHECK_SRV("--", " Password incorrect ", "irc_464,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_465 (banned from this server) */ TEST(IrcProtocolWithServer, 465) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 465"); CHECK_ERROR_PARAMS("465", 0, 2); RECV(":server 465 alice"); CHECK_ERROR_PARAMS("465", 1, 2); RECV(":server 465 alice : \002You are banned from this server "); CHECK_SRV("--", " You are banned from this server ", "irc_465,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_467 (channel key already set) */ TEST(IrcProtocolWithServer, 467) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 467"); CHECK_ERROR_PARAMS("467", 0, 2); RECV(":server 467 alice"); CHECK_ERROR_PARAMS("467", 1, 2); RECV(":server 467 alice #test2"); CHECK_SRV("--", "#test2", "irc_467,irc_numeric,nick_server,log3"); RECV(":server 467 alice #test2 : \002Channel key already set "); CHECK_SRV("--", "#test2: Channel key already set ", "irc_467,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_470 (forwarding to another channel) */ TEST(IrcProtocolWithServer, 470) { SRV_INIT; /* not enough parameters */ RECV(":server 470"); CHECK_ERROR_PARAMS("470", 0, 2); RECV(":server 470 alice"); CHECK_ERROR_PARAMS("470", 1, 2); RECV(":server 470 alice #test"); CHECK_SRV("--", "#test", "irc_470,irc_numeric,nick_server,log3"); RECV(":server 470 alice #test #test2"); CHECK_SRV("--", "#test: #test2", "irc_470,irc_numeric,nick_server,log3"); RECV(":server 470 alice #test #test2 forwarding"); CHECK_SRV("--", "#test: #test2 forwarding", "irc_470,irc_numeric,nick_server,log3"); RECV(":server 470 alice #test #test2 : \002Forwarding to another channel "); CHECK_SRV("--", "#test: #test2 Forwarding to another channel ", "irc_470,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_471 (channel is already full) */ TEST(IrcProtocolWithServer, 471) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 471"); CHECK_ERROR_PARAMS("471", 0, 2); RECV(":server 471 alice"); CHECK_ERROR_PARAMS("471", 1, 2); RECV(":server 471 alice #test2"); CHECK_SRV("--", "#test2", "irc_471,irc_numeric,nick_server,log3"); RECV(":server 471 alice #test2 : \002Cannot join channel (+l) "); CHECK_SRV("--", "#test2: Cannot join channel (+l) ", "irc_471,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_472 (unknown mode char to me) */ TEST(IrcProtocolWithServer, 472) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 472"); CHECK_ERROR_PARAMS("472", 0, 2); RECV(":server 472 alice"); CHECK_ERROR_PARAMS("472", 1, 2); RECV(":server 472 alice x"); CHECK_SRV("--", "x", "irc_472,irc_numeric,nick_server,log3"); RECV(":server 472 alice x : \002is unknown mode char to me "); CHECK_SRV("--", "x: is unknown mode char to me ", "irc_472,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_473 (cannot join (invite only)) */ TEST(IrcProtocolWithServer, 473) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 473"); CHECK_ERROR_PARAMS("473", 0, 2); RECV(":server 473 alice"); CHECK_ERROR_PARAMS("473", 1, 2); RECV(":server 473 alice #test2"); CHECK_SRV("--", "#test2", "irc_473,irc_numeric,nick_server,log3"); RECV(":server 473 alice #test2 : \002Cannot join channel (+i) "); CHECK_SRV("--", "#test2: Cannot join channel (+i) ", "irc_473,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_474 (cannot join (banned)) */ TEST(IrcProtocolWithServer, 474) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 474"); CHECK_ERROR_PARAMS("474", 0, 2); RECV(":server 474 alice"); CHECK_ERROR_PARAMS("474", 1, 2); RECV(":server 474 alice #test2"); CHECK_SRV("--", "#test2", "irc_474,irc_numeric,nick_server,log3"); RECV(":server 474 alice #test2 : \002Cannot join channel (+b) "); CHECK_SRV("--", "#test2: Cannot join channel (+b) ", "irc_474,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_475 (cannot join (bad key)) */ TEST(IrcProtocolWithServer, 475) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 475"); CHECK_ERROR_PARAMS("475", 0, 2); RECV(":server 475 alice"); CHECK_ERROR_PARAMS("475", 1, 2); RECV(":server 475 alice #test2"); CHECK_SRV("--", "#test2", "irc_475,irc_numeric,nick_server,log3"); RECV(":server 475 alice #test2 : \002Cannot join channel (+k) "); CHECK_SRV("--", "#test2: Cannot join channel (+k) ", "irc_475,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_476 (bad channel mask) */ TEST(IrcProtocolWithServer, 476) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 476"); CHECK_ERROR_PARAMS("476", 0, 2); RECV(":server 476 alice"); CHECK_ERROR_PARAMS("476", 1, 2); RECV(":server 476 alice #test2"); CHECK_SRV("--", "#test2", "irc_476,irc_numeric,nick_server,log3"); RECV(":server 476 alice #test2 : \002Bad Channel Mask "); CHECK_SRV("--", "#test2: Bad Channel Mask ", "irc_476,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_477 (channel doesn't support modes) */ TEST(IrcProtocolWithServer, 477) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 477"); CHECK_ERROR_PARAMS("477", 0, 2); RECV(":server 477 alice"); CHECK_ERROR_PARAMS("477", 1, 2); RECV(":server 477 alice #test2"); CHECK_SRV("--", "#test2", "irc_477,irc_numeric,nick_server,log3"); RECV(":server 477 alice #test2 : \002Channel doesn't support modes "); CHECK_SRV("--", "#test2: Channel doesn't support modes ", "irc_477,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_481 (you're not an IRC operator) */ TEST(IrcProtocolWithServer, 481) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 481"); CHECK_ERROR_PARAMS("481", 0, 2); RECV(":server 481 alice"); CHECK_ERROR_PARAMS("481", 1, 2); RECV(":server 481 alice : \002Permission Denied- You're not an IRC operator "); CHECK_SRV("--", " Permission Denied- You're not an IRC operator ", "irc_481,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_482 (you're not channel operator) */ TEST(IrcProtocolWithServer, 482) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 482"); CHECK_ERROR_PARAMS("482", 0, 2); RECV(":server 482 alice"); CHECK_ERROR_PARAMS("482", 1, 2); RECV(":server 482 alice #test2"); CHECK_SRV("--", "#test2", "irc_482,irc_numeric,nick_server,log3"); RECV(":server 482 alice #test2 : \002You're not channel operator "); CHECK_SRV("--", "#test2: You're not channel operator ", "irc_482,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_483 (you can't kill a server!) */ TEST(IrcProtocolWithServer, 483) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 483"); CHECK_ERROR_PARAMS("483", 0, 2); RECV(":server 483 alice"); CHECK_ERROR_PARAMS("483", 1, 2); RECV(":server 483 alice : \002You cant kill a server! "); CHECK_SRV("--", " You cant kill a server! ", "irc_483,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_484 (your connection is restricted!) */ TEST(IrcProtocolWithServer, 484) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 484"); CHECK_ERROR_PARAMS("484", 0, 2); RECV(":server 484 alice"); CHECK_ERROR_PARAMS("484", 1, 2); RECV(":server 484 alice : \002Your connection is restricted! "); CHECK_SRV("--", " Your connection is restricted! ", "irc_484,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_485 (not the original channel operator) */ TEST(IrcProtocolWithServer, 485) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 485"); CHECK_ERROR_PARAMS("485", 0, 2); RECV(":server 485 alice"); CHECK_ERROR_PARAMS("485", 1, 2); RECV(":server 485 alice : \002You're not the original channel operator "); CHECK_SRV("--", " You're not the original channel operator ", "irc_485,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_491 (no O-lines for your host) */ TEST(IrcProtocolWithServer, 491) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 491"); CHECK_ERROR_PARAMS("491", 0, 2); RECV(":server 491 alice"); CHECK_ERROR_PARAMS("491", 1, 2); RECV(":server 491 alice : \002No O-lines for your host "); CHECK_SRV("--", " No O-lines for your host ", "irc_491,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_501 (unknown mode flag) */ TEST(IrcProtocolWithServer, 501) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 501"); CHECK_ERROR_PARAMS("501", 0, 2); RECV(":server 501 alice"); CHECK_ERROR_PARAMS("501", 1, 2); RECV(":server 501 alice : \002Unknown MODE flag "); CHECK_SRV("--", " Unknown MODE flag ", "irc_501,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_502 (can't change mode for other users) */ TEST(IrcProtocolWithServer, 502) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 502"); CHECK_ERROR_PARAMS("502", 0, 2); RECV(":server 502 alice"); CHECK_ERROR_PARAMS("502", 1, 2); RECV(":server 502 alice : \002Cant change mode for other users "); CHECK_SRV("--", " Cant change mode for other users ", "irc_502,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_524 (help not found) */ TEST(IrcProtocolWithServer, 524) { SRV_INIT; /* not enough parameters */ RECV(":server 524"); CHECK_ERROR_PARAMS("524", 0, 2); RECV(":server 524 alice"); CHECK_ERROR_PARAMS("524", 1, 2); RECV(":server 524 alice UNKNOWN"); CHECK_SRV("--", "UNKNOWN", "irc_524,irc_numeric,nick_server,log3"); RECV(":server 524 alice UNKNOWN : \002Help not found "); CHECK_SRV("--", "UNKNOWN: Help not found ", "irc_524,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_569 (whois, connecting from) */ TEST(IrcProtocolWithServer, 569) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 569"); CHECK_ERROR_PARAMS("569", 0, 2); RECV(":server 569 alice"); CHECK_ERROR_PARAMS("569", 1, 2); /* whois, connecting from (UnrealIRCd) */ RECV(":server 569 alice bob 12345 : \002is connecting from AS12345 [Hoster] "); CHECK_SRV("--", "[bob] is connecting from AS12345 [Hoster] (12345)", "irc_569,irc_numeric,nick_server,log3"); /* whois, connecting from (UnrealIRCd), no ASN */ RECV(":server 569 alice bob :\002is connecting from AS12345 [Hoster]"); CHECK_SRV("--", "[bob] is connecting from AS12345 [Hoster]", "irc_569,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_704 (start of HELP/HELPOP) */ TEST(IrcProtocolWithServer, 704) { SRV_INIT; /* not enough parameters */ RECV(":server 704"); CHECK_ERROR_PARAMS("704", 0, 2); RECV(":server 704 alice"); CHECK_ERROR_PARAMS("704", 1, 2); RECV(":server 704 alice MODE"); CHECK_SRV("--", "MODE", "irc_704,irc_numeric,nick_server,log3"); RECV(":server 704 alice MODE " ": MODE [ [...]] "); CHECK_SRV("--", "MODE: MODE [ [...]] ", "irc_704,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_705 (body of HELP/HELPOP) */ TEST(IrcProtocolWithServer, 705) { SRV_INIT; /* not enough parameters */ RECV(":server 705"); CHECK_ERROR_PARAMS("705", 0, 2); RECV(":server 705 alice"); CHECK_ERROR_PARAMS("705", 1, 2); RECV(":server 705 alice MODE"); CHECK_SRV("--", "MODE", "irc_705,irc_numeric,nick_server,log3"); RECV(":server 705 alice MODE : \002Sets and removes modes from the given target. "); CHECK_SRV("--", "MODE: Sets and removes modes from the given target. ", "irc_705,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_706 (end of HELP/HELPOP) */ TEST(IrcProtocolWithServer, 706) { SRV_INIT; /* not enough parameters */ RECV(":server 706"); CHECK_ERROR_PARAMS("706", 0, 2); RECV(":server 706 alice"); CHECK_ERROR_PARAMS("706", 1, 2); RECV(":server 706 alice MODE"); CHECK_SRV("--", "MODE", "irc_706,irc_numeric,nick_server,log3"); RECV(":server 706 alice MODE : \002End of /HELPOP "); CHECK_SRV("--", "MODE: End of /HELPOP ", "irc_706,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_710 (knock: has asked for an invite) */ TEST(IrcProtocolWithServer, 710) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 710"); CHECK_ERROR_PARAMS("710", 0, 3); RECV(":server 710 #test"); CHECK_ERROR_PARAMS("710", 1, 3); RECV(":server 710 #test #test"); CHECK_ERROR_PARAMS("710", 2, 3); RECV(":server 710 #test #test nick1!user1@host1"); CHECK_CHAN("--", "nick1 (user1@host1) has asked for an invite", "irc_710,irc_numeric,notify_message,nick_nick1,host_user1@host1,log3"); RECV(":server 710 #test #test nick1!user1@host1 : \002has asked for an invite. "); CHECK_CHAN("--", "nick1 (user1@host1) has asked for an invite. ", "irc_710,irc_numeric,notify_message,nick_nick1,host_user1@host1,log3"); /* channel not found */ RECV(":server 710 #xyz #xyz nick1!user1@host1"); CHECK_ERROR_PARSE("710", ":server 710 #xyz #xyz nick1!user1@host1"); RECV(":server 710 #xyz #xyz nick1!user1@host1 : \002has asked for an invite. "); CHECK_ERROR_PARSE("710", ":server 710 #xyz #xyz nick1!user1@host1 : \002has asked for an invite. "); } /* * Test functions: * irc_protocol_cb_711 (knock: has been delivered) */ TEST(IrcProtocolWithServer, 711) { SRV_INIT; /* not enough parameters */ RECV(":server 711"); CHECK_ERROR_PARAMS("711", 0, 3); RECV(":server 711 alice"); CHECK_ERROR_PARAMS("711", 1, 3); RECV(":server 711 alice #test"); CHECK_ERROR_PARAMS("711", 2, 3); RECV(":server 711 alice #test : \002Your KNOCK has been delivered. "); CHECK_SRV("--", "#test: Your KNOCK has been delivered. ", "irc_711,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_712 (knock: too many knocks) */ TEST(IrcProtocolWithServer, 712) { SRV_INIT; /* not enough parameters */ RECV(":server 712"); CHECK_ERROR_PARAMS("712", 0, 3); RECV(":server 712 alice"); CHECK_ERROR_PARAMS("712", 1, 3); RECV(":server 712 alice #test"); CHECK_ERROR_PARAMS("712", 2, 3); RECV(":server 712 alice #test : \002Too many KNOCKs (channel). "); CHECK_SRV("--", "#test: Too many KNOCKs (channel). ", "irc_712,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_713 (knock: channel is open) */ TEST(IrcProtocolWithServer, 713) { SRV_INIT; /* not enough parameters */ RECV(":server 713"); CHECK_ERROR_PARAMS("713", 0, 3); RECV(":server 713 alice"); CHECK_ERROR_PARAMS("713", 1, 3); RECV(":server 713 alice #test"); CHECK_ERROR_PARAMS("713", 2, 3); RECV(":server 713 alice #test : \002Channel is open. "); CHECK_SRV("--", "#test: Channel is open. ", "irc_713,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_714 (knock: already on that channel) */ TEST(IrcProtocolWithServer, 714) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 714"); CHECK_ERROR_PARAMS("714", 0, 3); RECV(":server 714 alice"); CHECK_ERROR_PARAMS("714", 1, 3); RECV(":server 714 alice #test"); CHECK_ERROR_PARAMS("714", 2, 3); RECV(":server 714 alice #test : \002You are already on that channel. "); CHECK_SRV("--", "#test: You are already on that channel. ", "irc_714,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_716 (nick is in +g mode) */ TEST(IrcProtocolWithServer, 716) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 716"); CHECK_ERROR_PARAMS("716", 0, 2); RECV(":server 716 alice"); CHECK_ERROR_PARAMS("716", 1, 2); RECV(":server 716 alice bob : \002is in +g mode and must manually allow you to " "message them. Your message was discarded. "); CHECK_SRV("--", "bob: is in +g mode and must manually allow you to message them. " "Your message was discarded. ", "irc_716,irc_numeric,nick_server,log3"); /* open private buffer */ RECV(":bob!user@host PRIVMSG alice :hi Alice!"); RECV(":server 716 alice bob : \002is in +g mode and must manually allow you to " "message them. Your message was discarded. "); CHECK_PV("bob", "--", "bob: is in +g mode and must manually allow you to message them. " "Your message was discarded. ", "irc_716,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_717 (nick has been informed that you messaged them) */ TEST(IrcProtocolWithServer, 717) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 717"); CHECK_ERROR_PARAMS("717", 0, 2); RECV(":server 717 alice"); CHECK_ERROR_PARAMS("717", 1, 2); RECV(":server 717 alice bob : \002has been informed that you messaged them. "); CHECK_SRV("--", "bob: has been informed that you messaged them. ", "irc_717,irc_numeric,nick_server,log3"); /* open private buffer */ RECV(":bob!user@host PRIVMSG alice :hi Alice!"); RECV(":server 717 alice bob : \002has been informed that you messaged them. "); CHECK_PV("bob", "--", "bob: has been informed that you messaged them. ", "irc_717,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_728 (quietlist) */ TEST(IrcProtocolWithServer, 728) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 728"); CHECK_ERROR_PARAMS("728", 0, 4); RECV(":server 728 alice"); CHECK_ERROR_PARAMS("728", 1, 4); RECV(":server 728 alice #test"); CHECK_ERROR_PARAMS("728", 2, 4); RECV(":server 728 alice #test q"); CHECK_ERROR_PARAMS("728", 3, 4); RECV(":server 728 alice #test q nick1!user1_\00304red@host1_\00304red"); CHECK_CHAN("--", "[#test] nick1!user1_red@host1_red quieted", "irc_728,irc_numeric,nick_server,log3"); RECV(":server 728 alice #test q nick1!user1_\00304red@host1_\00304red " "alice!user_\00304red@host_\00304red"); CHECK_CHAN("--", "[#test] nick1!user1_red@host1_red quieted by alice (user_red@host_red)", "irc_728,irc_numeric,nick_server,log3"); RECV(":server 728 alice #test q nick1!user1_\00304red@host1_\00304red " "alice!user_\00304red@host_\00304red 1351350090 "); CHECK_CHAN("--", "[#test] nick1!user1_red@host1_red quieted by alice (user_red@host_red) " "on Sat, 27 Oct 2012 15:01:30", "irc_728,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 728 alice #xyz q nick1!user1_\00304red@host1_\00304red"); CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red quieted", "irc_728,irc_numeric,nick_server,log3"); RECV(":server 728 alice #xyz q nick1!user1_\00304red@host1_\00304red alice!user_\00304red@host_\00304red"); CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red quieted by alice (user_red@host_red)", "irc_728,irc_numeric,nick_server,log3"); RECV(":server 728 alice #xyz q nick1!user1_\00304red@host1_\00304red alice!user_\00304red@host_\00304red " "1351350090 "); CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red quieted by alice (user_red@host_red) " "on Sat, 27 Oct 2012 15:01:30", "irc_728,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_729 (end of quietlist) */ TEST(IrcProtocolWithServer, 729) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 729"); CHECK_ERROR_PARAMS("729", 0, 3); RECV(":server 729 alice"); CHECK_ERROR_PARAMS("729", 1, 3); RECV(":server 729 alice #test"); CHECK_ERROR_PARAMS("729", 2, 3); RECV(":server 729 alice #test q"); CHECK_CHAN("--", "[#test]", "irc_729,irc_numeric,nick_server,log3"); RECV(":server 729 alice #test q end"); CHECK_CHAN("--", "[#test] end", "irc_729,irc_numeric,nick_server,log3"); RECV(":server 729 alice #test q : \002End of Channel Quiet List "); CHECK_CHAN("--", "[#test] End of Channel Quiet List ", "irc_729,irc_numeric,nick_server,log3"); /* channel not found */ RECV(":server 729 alice #xyz q"); CHECK_SRV("--", "[#xyz]", "irc_729,irc_numeric,nick_server,log3"); RECV(":server 729 alice #xyz q end"); CHECK_SRV("--", "[#xyz] end", "irc_729,irc_numeric,nick_server,log3"); RECV(":server 729 alice #xyz q : \002End of Channel Quiet List "); CHECK_SRV("--", "[#xyz] End of Channel Quiet List ", "irc_729,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_730 (monitored nicks are online (RPL_MONONLINE)) * irc_protocol_cb_731 (monitored nicks are offline (RPL_MONOFFLINE)) */ TEST(IrcProtocolWithServer, 730) { SRV_INIT; /* not enough parameters */ RECV(":server 730"); CHECK_ERROR_PARAMS("730", 0, 2); RECV(":server 730 alice"); CHECK_ERROR_PARAMS("730", 1, 2); RECV(":server 731"); CHECK_ERROR_PARAMS("731", 0, 2); RECV(":server 731 alice"); CHECK_ERROR_PARAMS("731", 1, 2); /* without notify */ RECV(":server 730 alice : nick1!user1@host1,nick2!user2@host2 "); CHECK_SRV("--", "notify: nick1 (user1@host1) is connected", "irc_notify,irc_notify_join,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) is connected", "irc_notify,irc_notify_join,nick_nick2,notify_message,log3"); RECV(":server 730 alice :nick1!user1@host1,nick2!user2@host2"); CHECK_SRV("--", "notify: nick1 (user1@host1) is connected", "irc_notify,irc_notify_join,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) is connected", "irc_notify,irc_notify_join,nick_nick2,notify_message,log3"); RECV(":server 731 alice : nick1!user1@host1,nick2!user2@host2 "); CHECK_SRV("--", "notify: nick1 (user1@host1) is offline", "irc_notify,irc_notify_quit,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) is offline", "irc_notify,irc_notify_quit,nick_nick2,notify_message,log3"); RECV(":server 731 alice :nick1!user1@host1,nick2!user2@host2"); CHECK_SRV("--", "notify: nick1 (user1@host1) is offline", "irc_notify,irc_notify_quit,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) is offline", "irc_notify,irc_notify_quit,nick_nick2,notify_message,log3"); /* with notify on nick1 */ run_cmd_quiet ("/notify add nick1 " IRC_FAKE_SERVER); RECV(":server 730 alice : nick1!user1@host1,nick2!user2@host2 "); CHECK_SRV("--", "notify: nick1 (user1@host1) is connected", "irc_notify,irc_notify_join,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) is connected", "irc_notify,irc_notify_join,nick_nick2,notify_message,log3"); RECV(":server 730 alice :nick1!user1@host1,nick2!user2@host2"); CHECK_SRV("--", "notify: nick2 (user2@host2) is connected", "irc_notify,irc_notify_join,nick_nick2,notify_message,log3"); RECV(":server 731 alice : nick1!user1@host1,nick2!user2@host2 "); CHECK_SRV("--", "notify: nick1 (user1@host1) has quit", "irc_notify,irc_notify_quit,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) is offline", "irc_notify,irc_notify_quit,nick_nick2,notify_message,log3"); RECV(":server 731 alice :nick1!user1@host1,nick2!user2@host2"); CHECK_SRV("--", "notify: nick2 (user2@host2) is offline", "irc_notify,irc_notify_quit,nick_nick2,notify_message,log3"); RECV(":server 730 alice :nick1!user1@host1,nick2!user2@host2"); CHECK_SRV("--", "notify: nick1 (user1@host1) has connected", "irc_notify,irc_notify_join,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) is connected", "irc_notify,irc_notify_join,nick_nick2,notify_message,log3"); run_cmd_quiet ("/mute /notify del nick1 " IRC_FAKE_SERVER); /* with notify on nick1 and nick2 */ run_cmd_quiet ("/notify add nick1 " IRC_FAKE_SERVER); run_cmd_quiet ("/notify add nick2 " IRC_FAKE_SERVER); RECV(":server 730 alice :nick1!user1@host1,nick2!user2@host2"); CHECK_SRV("--", "notify: nick1 (user1@host1) is connected", "irc_notify,irc_notify_join,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) is connected", "irc_notify,irc_notify_join,nick_nick2,notify_message,log3"); RECV(":server 731 alice :nick1!user1@host1,nick2!user2@host2"); CHECK_SRV("--", "notify: nick1 (user1@host1) has quit", "irc_notify,irc_notify_quit,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) has quit", "irc_notify,irc_notify_quit,nick_nick2,notify_message,log3"); RECV(":server 730 alice :nick1!user1@host1,nick2!user2@host2"); CHECK_SRV("--", "notify: nick1 (user1@host1) has connected", "irc_notify,irc_notify_join,nick_nick1,notify_message,log3"); CHECK_SRV("--", "notify: nick2 (user2@host2) has connected", "irc_notify,irc_notify_join,nick_nick2,notify_message,log3"); run_cmd_quiet ("/mute /notify del nick1 " IRC_FAKE_SERVER); run_cmd_quiet ("/mute /notify del nick2 " IRC_FAKE_SERVER); } /* * Test functions: * irc_protocol_cb_732 (list of monitored nicks (RPL_MONLIST)) */ TEST(IrcProtocolWithServer, 732) { SRV_INIT; /* not enough parameters */ RECV(":server 732"); CHECK_ERROR_PARAMS("732", 0, 1); RECV(":server 732 alice"); CHECK_SRV("--", "", "irc_732,irc_numeric,nick_server,log3"); RECV(":server 732 alice : nick1!user1@host1,nick2!user2@host2 "); CHECK_SRV("--", "nick1!user1@host1,nick2!user2@host2", "irc_732,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_733 (end of a monitor list (RPL_ENDOFMONLIST)) */ TEST(IrcProtocolWithServer, 733) { SRV_INIT; /* not enough parameters */ RECV(":server 733"); CHECK_ERROR_PARAMS("733", 0, 1); RECV(":server 733 alice"); CHECK_SRV("--", "", "irc_733,irc_numeric,nick_server,log3"); RECV(":server 733 alice end"); CHECK_SRV("--", "end", "irc_733,irc_numeric,nick_server,log3"); RECV(":server 733 alice : End of MONITOR list "); CHECK_SRV("--", " End of MONITOR list ", "irc_733,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_734 (monitor list is full (ERR_MONLISTFULL)) */ TEST(IrcProtocolWithServer, 734) { SRV_INIT; /* not enough parameters */ RECV(":server 734"); CHECK_ERROR_PARAMS("734", 0, 3); RECV(":server 734 alice"); CHECK_ERROR_PARAMS("734", 1, 3); RECV(":server 734 alice 10"); CHECK_ERROR_PARAMS("734", 2, 3); RECV(":server 734 alice 10 nick1,nick2"); CHECK_SRV("=!=", " (10)", "irc_734,irc_numeric,nick_server,log3"); RECV(":server 734 alice 10 nick1,nick2 full"); CHECK_SRV("=!=", "full (10)", "irc_734,irc_numeric,nick_server,log3"); RECV(":server 734 alice 10 nick1,nick2 : \002Monitor list is full "); CHECK_SRV("=!=", " Monitor list is full (10)", "irc_734,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_742 (mode cannot be set) */ TEST(IrcProtocolWithServer, 742) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 742"); CHECK_ERROR_PARAMS("742", 0, 2); RECV(":server 742 alice"); CHECK_ERROR_PARAMS("742", 1, 2); RECV(":server 742 alice #test"); CHECK_SRV("--", "#test", "irc_742,irc_numeric,nick_server,log3"); RECV(":server 742 alice #test n nstlk : \002MODE cannot be set due to channel " "having an active MLOCK restriction policy "); CHECK_CHAN("--", "#test: n nstlk MODE cannot be set due to channel having " "an active MLOCK restriction policy ", "irc_742,irc_numeric,nick_server,log3"); RECV(":server 742 alice #test2 n nstlk :\002MODE cannot be set due to channel " "having an active MLOCK restriction policy"); CHECK_SRV("--", "#test2: n nstlk MODE cannot be set due to channel having " "an active MLOCK restriction policy", "irc_742,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_900 (logged in as (SASL)) */ TEST(IrcProtocolWithServer, 900) { SRV_INIT; /* not enough parameters */ RECV(":server 900"); CHECK_ERROR_PARAMS("900", 0, 4); RECV(":server 900 alice"); CHECK_ERROR_PARAMS("900", 1, 4); RECV(":server 900 alice alice!user@host"); CHECK_ERROR_PARAMS("900", 2, 4); RECV(":server 900 alice alice!user@host alice"); CHECK_ERROR_PARAMS("900", 3, 4); RECV(":server 900 alice alice!user@host alice logged"); CHECK_SRV("--", "logged (alice!user@host)", "irc_900,irc_numeric,nick_server,log3"); RECV(":server 900 alice alice!user@host alice : " "\002You are now logged in as mynick "); CHECK_SRV("--", " You are now logged in as mynick (alice!user@host)", "irc_900,irc_numeric,nick_server,log3"); RECV(":server 900 * * alice : \002You are now logged in as mynick "); CHECK_SRV("--", " You are now logged in as mynick ", "irc_900,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_901 (you are now logged out) */ TEST(IrcProtocolWithServer, 901) { SRV_INIT; /* not enough parameters */ RECV(":server 901"); CHECK_ERROR_PARAMS("901", 0, 3); RECV(":server 901 alice"); CHECK_ERROR_PARAMS("901", 1, 3); RECV(":server 901 alice nick!user@host"); CHECK_ERROR_PARAMS("901", 2, 3); RECV(":server 901 alice nick!user@host logged"); CHECK_SRV("--", "logged", "irc_901,irc_numeric,nick_server,log3"); RECV(":server 901 alice nick!user@host : \002You are now logged out "); CHECK_SRV("--", " You are now logged out ", "irc_901,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_903 (SASL OK) * irc_protocol_cb_907 (SASL OK) */ TEST(IrcProtocolWithServer, 903_907) { SRV_INIT; /* not enough parameters */ RECV(":server 903"); CHECK_ERROR_PARAMS("903", 0, 1); /* not enough parameters */ RECV(":server 907"); CHECK_ERROR_PARAMS("907", 0, 1); RECV(":server 903 alice ok"); CHECK_SRV("--", "ok", "irc_903,irc_numeric,nick_server,log3"); RECV(":server 903 alice : \002SASL authentication successful "); CHECK_SRV("--", " SASL authentication successful ", "irc_903,irc_numeric,nick_server,log3"); RECV(":server 903 * : SASL authentication successful "); CHECK_SRV("--", " SASL authentication successful ", "irc_903,irc_numeric,nick_server,log3"); RECV(":server 907 alice ok"); CHECK_SRV("--", "ok", "irc_907,irc_numeric,nick_server,log3"); RECV(":server 907 alice : \002SASL authentication successful "); CHECK_SRV("--", " SASL authentication successful ", "irc_907,irc_numeric,nick_server,log3"); } /* * Test 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) { SRV_INIT; /* not enough parameters */ RECV(":server 902"); CHECK_ERROR_PARAMS("902", 0, 1); /* not enough parameters */ RECV(":server 904"); CHECK_ERROR_PARAMS("904", 0, 1); /* not enough parameters */ RECV(":server 905"); CHECK_ERROR_PARAMS("905", 0, 1); /* not enough parameters */ RECV(":server 906"); CHECK_ERROR_PARAMS("906", 0, 1); RECV(":server 902 alice error"); CHECK_SRV("--", "error", "irc_902,irc_numeric,nick_server,log3"); RECV(":server 902 alice : \002SASL authentication failed "); CHECK_SRV("--", " SASL authentication failed ", "irc_902,irc_numeric,nick_server,log3"); RECV(":server 904 alice error"); CHECK_SRV("--", "error", "irc_904,irc_numeric,nick_server,log3"); RECV(":server 904 alice : \002SASL authentication failed "); CHECK_SRV("--", " SASL authentication failed ", "irc_904,irc_numeric,nick_server,log3"); RECV(":server 905 alice error"); CHECK_SRV("--", "error", "irc_905,irc_numeric,nick_server,log3"); RECV(":server 905 alice : \002SASL authentication failed "); CHECK_SRV("--", " SASL authentication failed ", "irc_905,irc_numeric,nick_server,log3"); RECV(":server 906 alice error"); CHECK_SRV("--", "error", "irc_906,irc_numeric,nick_server,log3"); RECV(":server 906 alice : \002SASL authentication failed "); CHECK_SRV("--", " SASL authentication failed ", "irc_906,irc_numeric,nick_server,log3"); } /* * Test functions: * irc_protocol_cb_936 (censored word) */ TEST(IrcProtocolWithServer, 936) { SRV_INIT_JOIN; /* not enough parameters */ RECV(":server 936"); CHECK_ERROR_PARAMS("936", 0, 2); RECV(":server 936 alice"); CHECK_ERROR_PARAMS("936", 1, 2); RECV(":server 936 alice #test"); CHECK_SRV("--", "#test", "irc_936,irc_numeric,nick_server,log3"); RECV(":server 936 alice #test CENSORED_WORD " ": \002Your message contained a censored word, and was blocked "); CHECK_CHAN("--", "#test: CENSORED_WORD Your message contained a censored word, " "and was blocked ", "irc_936,irc_numeric,nick_server,log3"); } /* * Test 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) { SRV_INIT; /* not enough parameters */ RECV(":server 973"); CHECK_ERROR_PARAMS("973", 0, 1); RECV(":server 973 alice"); CHECK_NO_MSG; RECV(":server 973 alice mode"); CHECK_SRV("--", "mode", "irc_973,irc_numeric,nick_server,log3"); RECV(":server 973 alice mode test"); CHECK_SRV("--", "mode: test", "irc_973,irc_numeric,nick_server,log3"); RECV(":server 973 alice mode : test "); CHECK_SRV("--", "mode: test ", "irc_973,irc_numeric,nick_server,log3"); RECV(":server 974 alice"); CHECK_NO_MSG; RECV(":server 974 alice mode"); CHECK_SRV("--", "mode", "irc_974,irc_numeric,nick_server,log3"); RECV(":server 974 alice mode test"); CHECK_SRV("--", "mode: test", "irc_974,irc_numeric,nick_server,log3"); RECV(":server 974 alice mode : test "); CHECK_SRV("--", "mode: test ", "irc_974,irc_numeric,nick_server,log3"); RECV(":server 975 alice"); CHECK_NO_MSG; RECV(":server 975 alice mode"); CHECK_SRV("--", "mode", "irc_975,irc_numeric,nick_server,log3"); RECV(":server 975 alice mode test"); CHECK_SRV("--", "mode: test", "irc_975,irc_numeric,nick_server,log3"); RECV(":server 975 alice mode : test "); CHECK_SRV("--", "mode: test ", "irc_975,irc_numeric,nick_server,log3"); RECV(":server 973 bob"); CHECK_SRV("--", "bob", "irc_973,irc_numeric,nick_server,log3"); RECV(":server 973 bob mode"); CHECK_SRV("--", "bob: mode", "irc_973,irc_numeric,nick_server,log3"); RECV(":server 973 bob mode test"); CHECK_SRV("--", "bob: mode test", "irc_973,irc_numeric,nick_server,log3"); RECV(":server 973 bob mode : test "); CHECK_SRV("--", "bob: mode test ", "irc_973,irc_numeric,nick_server,log3"); RECV(":server 974 bob"); CHECK_SRV("--", "bob", "irc_974,irc_numeric,nick_server,log3"); RECV(":server 974 bob mode"); CHECK_SRV("--", "bob: mode", "irc_974,irc_numeric,nick_server,log3"); RECV(":server 974 bob mode test"); CHECK_SRV("--", "bob: mode test", "irc_974,irc_numeric,nick_server,log3"); RECV(":server 974 bob mode : test "); CHECK_SRV("--", "bob: mode test ", "irc_974,irc_numeric,nick_server,log3"); RECV(":server 975 bob"); CHECK_SRV("--", "bob", "irc_975,irc_numeric,nick_server,log3"); RECV(":server 975 bob mode"); CHECK_SRV("--", "bob: mode", "irc_975,irc_numeric,nick_server,log3"); RECV(":server 975 bob mode test"); CHECK_SRV("--", "bob: mode test", "irc_975,irc_numeric,nick_server,log3"); RECV(":server 975 bob mode : test "); CHECK_SRV("--", "bob: mode test ", "irc_975,irc_numeric,nick_server,log3"); }