diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2023-05-05 20:38:38 +0200 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2023-05-14 15:32:39 +0200 |
commit | 176a10677137e887ed5e8299669bacbc4148d65a (patch) | |
tree | fd27d7d932c80eb3bec59a17ccbc9bd3a15a0eed /tests/unit/plugins/irc/test-irc-message.cpp | |
parent | e8b5d73421f63e6e792c039e7a86754db8cfa78c (diff) | |
download | weechat-176a10677137e887ed5e8299669bacbc4148d65a.zip |
irc: add support of capability "draft/multiline" (closes #1923)
Diffstat (limited to 'tests/unit/plugins/irc/test-irc-message.cpp')
-rw-r--r-- | tests/unit/plugins/irc/test-irc-message.cpp | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/tests/unit/plugins/irc/test-irc-message.cpp b/tests/unit/plugins/irc/test-irc-message.cpp index bd9cea529..e5a840248 100644 --- a/tests/unit/plugins/irc/test-irc-message.cpp +++ b/tests/unit/plugins/irc/test-irc-message.cpp @@ -841,6 +841,78 @@ TEST(IrcMessage, ParseToHashtable) hashtable_free (hashtable); } +/* + * Tests functions: + * irc_message_parse_cap_value + */ + +TEST(IrcMessage, ParseCapValue) +{ + struct t_hashtable *hashtable; + + POINTERS_EQUAL(NULL, irc_message_parse_cap_value (NULL)); + + hashtable = irc_message_parse_cap_value (""); + CHECK(hashtable); + LONGS_EQUAL(0, hashtable->items_count); + hashtable_free (hashtable); + + hashtable = irc_message_parse_cap_value ("key1=value1,key2,key3=123"); + CHECK(hashtable); + LONGS_EQUAL(3, hashtable->items_count); + STRCMP_EQUAL("value1", (const char *)hashtable_get (hashtable, "key1")); + POINTERS_EQUAL(NULL, (const char *)hashtable_get (hashtable, "key2")); + STRCMP_EQUAL("123", (const char *)hashtable_get (hashtable, "key3")); + hashtable_free (hashtable); +} + +/* + * Tests functions: + * irc_message_parse_multiline_value + */ + +TEST(IrcMessage, ParseCapMultilineValue) +{ + struct t_irc_server *server; + + server = irc_server_alloc ("test_multiline"); + CHECK(server); + + irc_message_parse_cap_multiline_value (NULL, NULL); + + server->multiline_max_bytes = 0; + server->multiline_max_lines = 0; + irc_message_parse_cap_multiline_value (server, NULL); + LONGS_EQUAL(IRC_SERVER_MULTILINE_DEFAULT_MAX_BYTES, server->multiline_max_bytes); + LONGS_EQUAL(IRC_SERVER_MULTILINE_DEFAULT_MAX_LINES, server->multiline_max_lines); + + server->multiline_max_bytes = 0; + server->multiline_max_lines = 0; + irc_message_parse_cap_multiline_value (server, ""); + LONGS_EQUAL(IRC_SERVER_MULTILINE_DEFAULT_MAX_BYTES, server->multiline_max_bytes); + LONGS_EQUAL(IRC_SERVER_MULTILINE_DEFAULT_MAX_LINES, server->multiline_max_lines); + + server->multiline_max_bytes = 0; + server->multiline_max_lines = 0; + irc_message_parse_cap_multiline_value (server, "max-bytes=2048"); + LONGS_EQUAL(2048, server->multiline_max_bytes); + LONGS_EQUAL(IRC_SERVER_MULTILINE_DEFAULT_MAX_LINES, server->multiline_max_lines); + + server->multiline_max_bytes = 0; + server->multiline_max_lines = 0; + irc_message_parse_cap_multiline_value (server, "max-lines=8"); + LONGS_EQUAL(IRC_SERVER_MULTILINE_DEFAULT_MAX_BYTES, server->multiline_max_bytes); + LONGS_EQUAL(8, server->multiline_max_lines); + + server->multiline_max_bytes = 0; + server->multiline_max_lines = 0; + irc_message_parse_cap_multiline_value (server, "max-bytes=2048,max-lines=8"); + LONGS_EQUAL(2048, server->multiline_max_bytes); + LONGS_EQUAL(8, server->multiline_max_lines); + + irc_server_free (server); +} + char * convert_irc_charset_cb (const void *pointer, void *data, const char *modifier, const char *modifier_data, @@ -1039,6 +1111,8 @@ TEST(IrcMessage, Split) { struct t_irc_server *server; struct t_hashtable *hashtable; + const char *ptr_msg, *pos1, *pos2; + char batch_ref[512], msg[4096]; server = irc_server_alloc ("test_split_msg"); CHECK(server); @@ -1607,6 +1681,254 @@ TEST(IrcMessage, Split) (const char *)hashtable_get (hashtable, "args3")); hashtable_free (hashtable); + /* PRIVMSG with multiline: BATCH is used */ + hashtable_set (server->cap_list, "batch", NULL); + hashtable_set (server->cap_list, "draft/multiline", NULL); + hashtable = irc_message_split (server, "PRIVMSG #channel :test\n\nline 3"); + CHECK(hashtable); + LONGS_EQUAL(12, hashtable->items_count); + STRCMP_EQUAL("5", + (const char *)hashtable_get (hashtable, "count")); + ptr_msg = (const char *)hashtable_get (hashtable, "msg1"); + CHECK(ptr_msg); + STRNCMP_EQUAL("BATCH +", ptr_msg, 7); + pos1 = ptr_msg + 7; + pos2 = strchr (pos1, ' '); + CHECK(pos2); + memcpy (batch_ref, pos1, pos2 - pos1); + batch_ref[pos2 - pos1] = '\0'; + snprintf (msg, sizeof (msg), + "BATCH +%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg1")); + snprintf (msg, sizeof (msg), + "+%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args1")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :test", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg2")); + STRCMP_EQUAL("test", (const char *)hashtable_get (hashtable, "args2")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg3")); + STRCMP_EQUAL("", (const char *)hashtable_get (hashtable, "args3")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :line 3", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg4")); + STRCMP_EQUAL("line 3", (const char *)hashtable_get (hashtable, "args4")); + snprintf (msg, sizeof (msg), + "BATCH -%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg5")); + snprintf (msg, sizeof (msg), + "-%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args5")); + STRCMP_EQUAL("test\n\nline 3", + (const char *)hashtable_get (hashtable, "multiline_args1")); + hashtable_free (hashtable); + hashtable_remove (server->cap_list, "batch"); + hashtable_remove (server->cap_list, "draft/multiline"); + + /* NOTICE with multiline: BATCH is used */ + hashtable_set (server->cap_list, "batch", NULL); + hashtable_set (server->cap_list, "draft/multiline", NULL); + hashtable = irc_message_split (server, "NOTICE #channel :\ntest\nline 2"); + CHECK(hashtable); + LONGS_EQUAL(12, hashtable->items_count); + STRCMP_EQUAL("5", + (const char *)hashtable_get (hashtable, "count")); + ptr_msg = (const char *)hashtable_get (hashtable, "msg1"); + CHECK(ptr_msg); + STRNCMP_EQUAL("BATCH +", ptr_msg, 7); + pos1 = ptr_msg + 7; + pos2 = strchr (pos1, ' '); + CHECK(pos2); + memcpy (batch_ref, pos1, pos2 - pos1); + batch_ref[pos2 - pos1] = '\0'; + snprintf (msg, sizeof (msg), + "BATCH +%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg1")); + snprintf (msg, sizeof (msg), + "+%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args1")); + snprintf (msg, sizeof (msg), + "@batch=%s NOTICE #channel :", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg2")); + STRCMP_EQUAL("", (const char *)hashtable_get (hashtable, "args2")); + snprintf (msg, sizeof (msg), + "@batch=%s NOTICE #channel :test", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg3")); + STRCMP_EQUAL("test", (const char *)hashtable_get (hashtable, "args3")); + snprintf (msg, sizeof (msg), + "@batch=%s NOTICE #channel :line 2", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg4")); + STRCMP_EQUAL("line 2", (const char *)hashtable_get (hashtable, "args4")); + snprintf (msg, sizeof (msg), + "BATCH -%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg5")); + snprintf (msg, sizeof (msg), + "-%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args5")); + STRCMP_EQUAL("\ntest\nline 2", + (const char *)hashtable_get (hashtable, "multiline_args1")); + hashtable_free (hashtable); + hashtable_remove (server->cap_list, "batch"); + hashtable_remove (server->cap_list, "draft/multiline"); + + /* PRIVMSG with multiline exceeding "max-lines" */ + server->multiline_max_bytes = IRC_SERVER_MULTILINE_DEFAULT_MAX_BYTES; + server->multiline_max_lines = 3; + hashtable_set (server->cap_list, "batch", NULL); + hashtable_set (server->cap_list, "draft/multiline", NULL); + hashtable = irc_message_split ( + server, + "PRIVMSG #channel :test\nline 2\nline 3\nline 4"); + CHECK(hashtable); + LONGS_EQUAL(19, hashtable->items_count); + STRCMP_EQUAL("8", + (const char *)hashtable_get (hashtable, "count")); + ptr_msg = (const char *)hashtable_get (hashtable, "msg1"); + CHECK(ptr_msg); + STRNCMP_EQUAL("BATCH +", ptr_msg, 7); + pos1 = ptr_msg + 7; + pos2 = strchr (pos1, ' '); + CHECK(pos2); + memcpy (batch_ref, pos1, pos2 - pos1); + batch_ref[pos2 - pos1] = '\0'; + snprintf (msg, sizeof (msg), + "BATCH +%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg1")); + snprintf (msg, sizeof (msg), + "+%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args1")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :test", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg2")); + STRCMP_EQUAL("test", (const char *)hashtable_get (hashtable, "args2")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :line 2", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg3")); + STRCMP_EQUAL("line 2", (const char *)hashtable_get (hashtable, "args3")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :line 3", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg4")); + STRCMP_EQUAL("line 3", (const char *)hashtable_get (hashtable, "args4")); + snprintf (msg, sizeof (msg), + "BATCH -%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg5")); + snprintf (msg, sizeof (msg), + "-%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args5")); + ptr_msg = (const char *)hashtable_get (hashtable, "msg6"); + CHECK(ptr_msg); + STRNCMP_EQUAL("BATCH +", ptr_msg, 7); + pos1 = ptr_msg + 7; + pos2 = strchr (pos1, ' '); + CHECK(pos2); + memcpy (batch_ref, pos1, pos2 - pos1); + batch_ref[pos2 - pos1] = '\0'; + snprintf (msg, sizeof (msg), + "BATCH +%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg6")); + snprintf (msg, sizeof (msg), + "+%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args6")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :line 4", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg7")); + STRCMP_EQUAL("line 4", (const char *)hashtable_get (hashtable, "args7")); + snprintf (msg, sizeof (msg), + "BATCH -%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg8")); + snprintf (msg, sizeof (msg), + "-%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args8")); + STRCMP_EQUAL("test\nline 2\nline 3", + (const char *)hashtable_get (hashtable, "multiline_args1")); + STRCMP_EQUAL("line 4", + (const char *)hashtable_get (hashtable, "multiline_args2")); + hashtable_free (hashtable); + hashtable_remove (server->cap_list, "batch"); + hashtable_remove (server->cap_list, "draft/multiline"); + + /* PRIVMSG with multiline exceeding "max-bytes" */ + server->multiline_max_bytes = 200; + server->multiline_max_lines = IRC_SERVER_MULTILINE_DEFAULT_MAX_LINES; + hashtable_set (server->cap_list, "batch", NULL); + hashtable_set (server->cap_list, "draft/multiline", NULL); + hashtable = irc_message_split ( + server, + "PRIVMSG #channel :test\n" + "this is a loooooooooooooooong line 2\n" + "this is a loooooooooooooooong line 3\n" + "this is a loooooooooooooooong line 4"); + CHECK(hashtable); + LONGS_EQUAL(19, hashtable->items_count); + STRCMP_EQUAL("8", (const char *)hashtable_get (hashtable, "count")); + ptr_msg = (const char *)hashtable_get (hashtable, "msg1"); + CHECK(ptr_msg); + STRNCMP_EQUAL("BATCH +", ptr_msg, 7); + pos1 = ptr_msg + 7; + pos2 = strchr (pos1, ' '); + CHECK(pos2); + memcpy (batch_ref, pos1, pos2 - pos1); + batch_ref[pos2 - pos1] = '\0'; + snprintf (msg, sizeof (msg), + "BATCH +%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg1")); + snprintf (msg, sizeof (msg), + "+%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args1")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :test", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg2")); + STRCMP_EQUAL("test", (const char *)hashtable_get (hashtable, "args2")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :this is a loooooooooooooooong line 2", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg3")); + STRCMP_EQUAL("this is a loooooooooooooooong line 2", (const char *)hashtable_get (hashtable, "args3")); + snprintf (msg, sizeof (msg), + "BATCH -%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg4")); + snprintf (msg, sizeof (msg), + "-%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args4")); + ptr_msg = (const char *)hashtable_get (hashtable, "msg5"); + CHECK(ptr_msg); + STRNCMP_EQUAL("BATCH +", ptr_msg, 7); + pos1 = ptr_msg + 7; + pos2 = strchr (pos1, ' '); + CHECK(pos2); + memcpy (batch_ref, pos1, pos2 - pos1); + batch_ref[pos2 - pos1] = '\0'; + snprintf (msg, sizeof (msg), + "BATCH +%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg5")); + snprintf (msg, sizeof (msg), + "+%s draft/multiline #channel", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args5")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :this is a loooooooooooooooong line 3", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg6")); + STRCMP_EQUAL("this is a loooooooooooooooong line 3", (const char *)hashtable_get (hashtable, "args6")); + snprintf (msg, sizeof (msg), + "@batch=%s PRIVMSG #channel :this is a loooooooooooooooong line 4", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg7")); + STRCMP_EQUAL("this is a loooooooooooooooong line 4", (const char *)hashtable_get (hashtable, "args7")); + snprintf (msg, sizeof (msg), + "BATCH -%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "msg8")); + snprintf (msg, sizeof (msg), + "-%s", batch_ref); + STRCMP_EQUAL(msg, (const char *)hashtable_get (hashtable, "args8")); + STRCMP_EQUAL("test\n" + "this is a loooooooooooooooong line 2", + (const char *)hashtable_get (hashtable, "multiline_args1")); + STRCMP_EQUAL("this is a loooooooooooooooong line 3\n" + "this is a loooooooooooooooong line 4", + (const char *)hashtable_get (hashtable, "multiline_args2")); + hashtable_free (hashtable); + hashtable_remove (server->cap_list, "batch"); + hashtable_remove (server->cap_list, "draft/multiline"); + /* 005: no split */ hashtable = irc_message_split (server, "005 nick " MSG_005); CHECK(hashtable); |