From 39145373156ecc6d98c3f13b95c25c2a70ef047a Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 17 Feb 2019 14:14:46 -0500 Subject: [PATCH 01/10] add list of numerics, start using them --- irctest/numerics.py | 193 ++++++++++++++++++ .../server_tests/test_channel_operations.py | 15 +- 2 files changed, 198 insertions(+), 10 deletions(-) create mode 100644 irctest/numerics.py diff --git a/irctest/numerics.py b/irctest/numerics.py new file mode 100644 index 0000000..e204ec3 --- /dev/null +++ b/irctest/numerics.py @@ -0,0 +1,193 @@ +# Copyright (c) 2012-2014 Jeremy Latt +# Copyright (c) 2014-2015 Edmund Huber +# Copyright (c) 2016-2017 Daniel Oaks +# released under the MIT license + +# These numerics have been retrieved from: +# http://defs.ircdocs.horse/ and http://modern.ircdocs.horse/ + +# They're intended to represent a relatively-standard cross-section of the IRC +# server ecosystem out there. Custom numerics will be marked as such. + +RPL_WELCOME = "001" +RPL_YOURHOST = "002" +RPL_CREATED = "003" +RPL_MYINFO = "004" +RPL_ISUPPORT = "005" +RPL_SNOMASKIS = "008" +RPL_BOUNCE = "010" +RPL_TRACELINK = "200" +RPL_TRACECONNECTING = "201" +RPL_TRACEHANDSHAKE = "202" +RPL_TRACEUNKNOWN = "203" +RPL_TRACEOPERATOR = "204" +RPL_TRACEUSER = "205" +RPL_TRACESERVER = "206" +RPL_TRACESERVICE = "207" +RPL_TRACENEWTYPE = "208" +RPL_TRACECLASS = "209" +RPL_TRACERECONNECT = "210" +RPL_STATSLINKINFO = "211" +RPL_STATSCOMMANDS = "212" +RPL_ENDOFSTATS = "219" +RPL_UMODEIS = "221" +RPL_SERVLIST = "234" +RPL_SERVLISTEND = "235" +RPL_STATSUPTIME = "242" +RPL_STATSOLINE = "243" +RPL_LUSERCLIENT = "251" +RPL_LUSEROP = "252" +RPL_LUSERUNKNOWN = "253" +RPL_LUSERCHANNELS = "254" +RPL_LUSERME = "255" +RPL_ADMINME = "256" +RPL_ADMINLOC1 = "257" +RPL_ADMINLOC2 = "258" +RPL_ADMINEMAIL = "259" +RPL_TRACELOG = "261" +RPL_TRACEEND = "262" +RPL_TRYAGAIN = "263" +RPL_WHOISCERTFP = "276" +RPL_AWAY = "301" +RPL_USERHOST = "302" +RPL_ISON = "303" +RPL_UNAWAY = "305" +RPL_NOWAWAY = "306" +RPL_WHOISUSER = "311" +RPL_WHOISSERVER = "312" +RPL_WHOISOPERATOR = "313" +RPL_WHOWASUSER = "314" +RPL_ENDOFWHO = "315" +RPL_WHOISIDLE = "317" +RPL_ENDOFWHOIS = "318" +RPL_WHOISCHANNELS = "319" +RPL_LIST = "322" +RPL_LISTEND = "323" +RPL_CHANNELMODEIS = "324" +RPL_UNIQOPIS = "325" +RPL_CHANNELCREATED = "329" +RPL_WHOISACCOUNT = "330" +RPL_NOTOPIC = "331" +RPL_TOPIC = "332" +RPL_TOPICTIME = "333" +RPL_WHOISBOT = "335" +RPL_WHOISACTUALLY = "338" +RPL_INVITING = "341" +RPL_SUMMONING = "342" +RPL_INVITELIST = "346" +RPL_ENDOFINVITELIST = "347" +RPL_EXCEPTLIST = "348" +RPL_ENDOFEXCEPTLIST = "349" +RPL_VERSION = "351" +RPL_WHOREPLY = "352" +RPL_NAMREPLY = "353" +RPL_LINKS = "364" +RPL_ENDOFLINKS = "365" +RPL_ENDOFNAMES = "366" +RPL_BANLIST = "367" +RPL_ENDOFBANLIST = "368" +RPL_ENDOFWHOWAS = "369" +RPL_INFO = "371" +RPL_MOTD = "372" +RPL_ENDOFINFO = "374" +RPL_MOTDSTART = "375" +RPL_ENDOFMOTD = "376" +RPL_YOUREOPER = "381" +RPL_REHASHING = "382" +RPL_YOURESERVICE = "383" +RPL_TIME = "391" +RPL_USERSSTART = "392" +RPL_USERS = "393" +RPL_ENDOFUSERS = "394" +RPL_NOUSERS = "395" +ERR_UNKNOWNERROR = "400" +ERR_NOSUCHNICK = "401" +ERR_NOSUCHSERVER = "402" +ERR_NOSUCHCHANNEL = "403" +ERR_CANNOTSENDTOCHAN = "404" +ERR_TOOMANYCHANNELS = "405" +ERR_WASNOSUCHNICK = "406" +ERR_TOOMANYTARGETS = "407" +ERR_NOSUCHSERVICE = "408" +ERR_NOORIGIN = "409" +ERR_INVALIDCAPCMD = "410" +ERR_NORECIPIENT = "411" +ERR_NOTEXTTOSEND = "412" +ERR_NOTOPLEVEL = "413" +ERR_WILDTOPLEVEL = "414" +ERR_BADMASK = "415" +ERR_UNKNOWNCOMMAND = "421" +ERR_NOMOTD = "422" +ERR_NOADMININFO = "423" +ERR_FILEERROR = "424" +ERR_NONICKNAMEGIVEN = "431" +ERR_ERRONEUSNICKNAME = "432" +ERR_NICKNAMEINUSE = "433" +ERR_NICKCOLLISION = "436" +ERR_UNAVAILRESOURCE = "437" +ERR_REG_UNAVAILABLE = "440" +ERR_USERNOTINCHANNEL = "441" +ERR_NOTONCHANNEL = "442" +ERR_USERONCHANNEL = "443" +ERR_NOLOGIN = "444" +ERR_SUMMONDISABLED = "445" +ERR_USERSDISABLED = "446" +ERR_NOTREGISTERED = "451" +ERR_NEEDMOREPARAMS = "461" +ERR_ALREADYREGISTRED = "462" +ERR_NOPERMFORHOST = "463" +ERR_PASSWDMISMATCH = "464" +ERR_YOUREBANNEDCREEP = "465" +ERR_YOUWILLBEBANNED = "466" +ERR_KEYSET = "467" +ERR_INVALIDUSERNAME = "468" +ERR_CHANNELISFULL = "471" +ERR_UNKNOWNMODE = "472" +ERR_INVITEONLYCHAN = "473" +ERR_BANNEDFROMCHAN = "474" +ERR_BADCHANNELKEY = "475" +ERR_BADCHANMASK = "476" +ERR_NOCHANMODES = "477" +ERR_BANLISTFULL = "478" +ERR_NOPRIVILEGES = "481" +ERR_CHANOPRIVSNEEDED = "482" +ERR_CANTKILLSERVER = "483" +ERR_RESTRICTED = "484" +ERR_UNIQOPPRIVSNEEDED = "485" +ERR_NOOPERHOST = "491" +ERR_UMODEUNKNOWNFLAG = "501" +ERR_USERSDONTMATCH = "502" +ERR_HELPNOTFOUND = "524" +ERR_CANNOTSENDRP = "573" +RPL_WHOISSECURE = "671" +RPL_YOURLANGUAGESARE = "687" +RPL_WHOISLANGUAGE = "690" +RPL_HELPSTART = "704" +RPL_HELPTXT = "705" +RPL_ENDOFHELP = "706" +ERR_NOPRIVS = "723" +RPL_MONONLINE = "730" +RPL_MONOFFLINE = "731" +RPL_MONLIST = "732" +RPL_ENDOFMONLIST = "733" +ERR_MONLISTFULL = "734" +RPL_LOGGEDIN = "900" +RPL_LOGGEDOUT = "901" +ERR_NICKLOCKED = "902" +RPL_SASLSUCCESS = "903" +ERR_SASLFAIL = "904" +ERR_SASLTOOLONG = "905" +ERR_SASLABORTED = "906" +ERR_SASLALREADY = "907" +RPL_SASLMECHS = "908" +RPL_REGISTRATION_SUCCESS = "920" +ERR_ACCOUNT_ALREADY_EXISTS = "921" +ERR_REG_UNSPECIFIED_ERROR = "922" +RPL_VERIFYSUCCESS = "923" +ERR_ACCOUNT_ALREADY_VERIFIED = "924" +ERR_ACCOUNT_INVALID_VERIFY_CODE = "925" +RPL_REG_VERIFICATION_REQUIRED = "927" +ERR_REG_INVALID_CRED_TYPE = "928" +ERR_REG_INVALID_CALLBACK = "929" +ERR_TOOMANYLANGUAGES = "981" +ERR_NOLANGUAGE = "982" diff --git a/irctest/server_tests/test_channel_operations.py b/irctest/server_tests/test_channel_operations.py index f28b495..05b7bed 100644 --- a/irctest/server_tests/test_channel_operations.py +++ b/irctest/server_tests/test_channel_operations.py @@ -7,13 +7,7 @@ from irctest import cases from irctest import client_mock from irctest import runner from irctest.irc_utils import ambiguities - -RPL_NOTOPIC = '331' -RPL_NAMREPLY = '353' - -ERR_NOSUCHCHANNEL = '403' -ERR_NOTONCHANNEL = '442' -ERR_CHANOPRIVSNEEDED = '482' +from irctest.numerics import RPL_NOTOPIC, RPL_NAMREPLY, RPL_INVITING, ERR_NOSUCHCHANNEL, ERR_NOTONCHANNEL, ERR_CHANOPRIVSNEEDED, ERR_NOSUCHNICK, ERR_INVITEONLYCHAN class JoinTestCase(cases.BaseServerTestCase): @cases.SpecificationSelector.requiredBySpecification('RFC1459', 'RFC2812', @@ -586,16 +580,16 @@ class InviteTestCase(cases.BaseServerTestCase): self.getMessages(1) self.sendLine(1, 'INVITE bar #chan') m = self.getMessage(1) - self.assertEqual(m.command, '401') # ERR_NOSUCHNICK + self.assertEqual(m.command, ERR_NOSUCHNICK) self.connectClient('bar') self.sendLine(2, 'JOIN #chan') m = self.getMessage(2) - self.assertEqual(m.command, '473') # ERR_INVITEONLYCHAN + self.assertEqual(m.command, ERR_INVITEONLYCHAN) self.sendLine(1, 'INVITE bar #chan') m = self.getMessage(1) - self.assertEqual(m.command, '341') # RPL_INVITING + self.assertEqual(m.command, RPL_INVITING) # modern/ircv3 param order: inviter, invitee, channel self.assertEqual(m.params, ['foo', 'bar', '#chan']) m = self.getMessage(2) @@ -620,6 +614,7 @@ class ChannelQuitTestCase(cases.BaseServerTestCase): self.joinChannel(1, '#chan') self.connectClient('qux') self.sendLine(2, 'JOIN #chan') + self.getMessages(2) self.getMessages(1) self.sendLine(2, 'QUIT :qux out') From 17303fa7febb5dea86e8db8f64d015900b8eaf53 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 17 Feb 2019 14:52:34 -0500 Subject: [PATCH 02/10] test RPL_ENDOFMONLIST responses --- irctest/server_tests/test_monitor.py | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/irctest/server_tests/test_monitor.py b/irctest/server_tests/test_monitor.py index eb9315a..e42b745 100644 --- a/irctest/server_tests/test_monitor.py +++ b/irctest/server_tests/test_monitor.py @@ -5,6 +5,7 @@ from irctest import cases from irctest.client_mock import NoMessageException from irctest.basecontrollers import NotImplementedByController +from irctest.numerics import RPL_MONLIST, RPL_ENDOFMONLIST class EchoMessageTestCase(cases.BaseServerTestCase): def check_server_support(self): @@ -220,3 +221,37 @@ class EchoMessageTestCase(cases.BaseServerTestCase): self.assertEqual(l, [], fail_msg='Got response to unmonitored client: {}', extra_format=(l,)) + + @cases.SpecificationSelector.requiredBySpecification('IRCv3.2') + def testMonitorList(self): + def checkMonitorSubjects(messages, client_nick, expected_targets): + # collect all the RPL_MONLIST nicks into a set: + result = set() + for message in messages: + if message.command == RPL_MONLIST: + self.assertEqual(message.params[0], client_nick) + result.update(message.params[1].split(',')) + # finally, RPL_ENDOFMONLIST should be sent + self.assertEqual(messages[-1].command, RPL_ENDOFMONLIST) + self.assertEqual(messages[-1].params[0], client_nick) + self.assertEqual(result, expected_targets) + + self.connectClient('bar') + self.check_server_support() + self.sendLine(1, 'MONITOR L') + checkMonitorSubjects(self.getMessages(1), 'bar', set()) + + self.sendLine(1, 'MONITOR + qux') + self.getMessages(1) + self.sendLine(1, 'MONITOR L') + checkMonitorSubjects(self.getMessages(1), 'bar', {'qux',}) + + self.sendLine(1, 'MONITOR + bazbat') + self.getMessages(1) + self.sendLine(1, 'MONITOR L') + checkMonitorSubjects(self.getMessages(1), 'bar', {'qux', 'bazbat',}) + + self.sendLine(1, 'MONITOR - qux') + self.getMessages(1) + self.sendLine(1, 'MONITOR L') + checkMonitorSubjects(self.getMessages(1), 'bar', {'bazbat',}) From 85dc8a2636bebb876dac8fe42a7884a471afefb0 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 17 Feb 2019 15:18:52 -0500 Subject: [PATCH 03/10] deflake registration tests by waiting for quit --- irctest/controllers/oragono.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/irctest/controllers/oragono.py b/irctest/controllers/oragono.py index 54e435b..e31d27a 100644 --- a/irctest/controllers/oragono.py +++ b/irctest/controllers/oragono.py @@ -148,13 +148,13 @@ class OragonoController(BaseServerController, DirectoryBasedController): case.sendLine(client, 'CAP END') while case.getRegistrationMessage(client).command != '001': pass - list(case.getMessages(client)) + case.getMessages(client) case.sendLine(client, 'ACC REGISTER {} * {}'.format( username, password)) msg = case.getMessage(client) assert msg.command == '920', msg - list(case.getMessages(client)) - case.removeClient(client) + case.sendLine(client, 'QUIT') + case.assertDisconnected(client) def get_irctest_controller_class(): return OragonoController From 852cd71ff64cb07849f276ae6e678f40a77bb93a Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 17 Feb 2019 15:38:07 -0500 Subject: [PATCH 04/10] add makefile --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8737724 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +.PHONY: oragono + +oragono: + pyflakes3 ./irctest/controllers/oragono.py irctest/server_tests/*.py + ./test.py irctest.controllers.oragono From 088d02e8ecef49c9a8ac56aa0ac0c2c5ed7ac026 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 17 Feb 2019 15:39:35 -0500 Subject: [PATCH 05/10] expand pyflakes list --- Makefile | 2 +- irctest/cases.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 8737724..f37ec3d 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ .PHONY: oragono oragono: - pyflakes3 ./irctest/controllers/oragono.py irctest/server_tests/*.py + pyflakes3 ./irctest/cases.py ./irctest/client_mock.py ./irctest/controllers/oragono.py irctest/server_tests/*.py ./test.py irctest.controllers.oragono diff --git a/irctest/cases.py b/irctest/cases.py index 84c2238..f4c4ffc 100644 --- a/irctest/cases.py +++ b/irctest/cases.py @@ -4,13 +4,11 @@ import socket import tempfile import unittest import functools -import collections import supybot.utils from . import runner from . import client_mock -from . import authentication from .irc_utils import capabilities from .irc_utils import message_parser from .exceptions import ConnectionClosed @@ -56,7 +54,7 @@ class _IrcTestCase(unittest.TestCase): self.assertEqual(msg.prefix.split('!')[0], nick, msg, fail_msg) if subcommand is not None or subparams is not None: self.assertGreater(len(msg.params), 2, fail_msg) - msg_target = msg.params[0] + #msg_target = msg.params[0] msg_subcommand = msg.params[1] msg_subparams = msg.params[2:] if subcommand: From 7b2efeb2d4813d8a70906f17c5abc1dd2ac64fc1 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 17 Feb 2019 15:42:14 -0500 Subject: [PATCH 06/10] deflake another test --- irctest/server_tests/test_extended_join.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/irctest/server_tests/test_extended_join.py b/irctest/server_tests/test_extended_join.py index 8f13d0d..2f5c520 100644 --- a/irctest/server_tests/test_extended_join.py +++ b/irctest/server_tests/test_extended_join.py @@ -28,10 +28,9 @@ class MetadataTestCase(cases.BaseServerTestCase, cases.OptionalityHelper): def testNotLoggedIn(self): self.connectClient('foo', capabilities=['extended-join'], skip_if_cap_nak=True) - self.sendLine(1, 'JOIN #chan') - self.getMessages(1) + self.joinChannel(1, '#chan') self.connectClient('bar') - self.sendLine(2, 'JOIN #chan') + self.joinChannel(2, '#chan') m = self.getMessage(1) self.assertMessageEqual(m, command='JOIN', params=['#chan', '*', 'Realname'], From b184892a1c3681dcc5927e63f9bed81f6b7e96d4 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 17 Feb 2019 18:34:19 -0500 Subject: [PATCH 07/10] add an away test --- irctest/server_tests/test_user_commands.py | 28 +++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/irctest/server_tests/test_user_commands.py b/irctest/server_tests/test_user_commands.py index 063ef87..a40ed10 100644 --- a/irctest/server_tests/test_user_commands.py +++ b/irctest/server_tests/test_user_commands.py @@ -4,9 +4,7 @@ User commands as specified in Section 3.6 of RFC 2812: """ from irctest import cases - -RPL_WHOISUSER = '311' -RPL_WHOISCHANNELS = '319' +from irctest.numerics import RPL_WHOISUSER, RPL_WHOISCHANNELS, RPL_AWAY, RPL_NOWAWAY, RPL_UNAWAY class WhoisTestCase(cases.BaseServerTestCase): @@ -110,3 +108,27 @@ class InvisibleTestCase(cases.BaseServerTestCase): messages = self.getMessages(2) whoisaccount = [message for message in messages if message.command == '330'] self.assertEqual(len(whoisaccount), 0) + +class AwayTestCase(cases.BaseServerTestCase): + + @cases.SpecificationSelector.requiredBySpecification('RFC2812') + def testAway(self): + self.connectClient('bar') + self.sendLine(1, "AWAY :I'm not here right now") + replies = self.getMessages(1) + self.assertIn(RPL_NOWAWAY, [msg.command for msg in replies]) + + self.connectClient('qux') + self.sendLine(2, "PRIVMSG bar :what's up") + replies = self.getMessages(2) + self.assertEqual(len(replies), 1) + self.assertEqual(replies[0].command, RPL_AWAY) + self.assertEqual(replies[0].params, ['qux', 'bar', "I'm not here right now"]) + + self.sendLine(1, "AWAY") + replies = self.getMessages(1) + self.assertIn(RPL_UNAWAY, [msg.command for msg in replies]) + + self.sendLine(2, "PRIVMSG bar :what's up") + replies = self.getMessages(2) + self.assertEqual(len(replies), 0) From 383a65d58e205e7b4ae6e1a535c15f1b24d4e3ae Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Wed, 20 Feb 2019 22:48:48 -0500 Subject: [PATCH 08/10] test for oragono/oragono#391 --- .../server_tests/test_labeled_responses.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/irctest/server_tests/test_labeled_responses.py b/irctest/server_tests/test_labeled_responses.py index 84b5e73..687ee2d 100644 --- a/irctest/server_tests/test_labeled_responses.py +++ b/irctest/server_tests/test_labeled_responses.py @@ -277,3 +277,25 @@ class LabeledResponsesTestCase(cases.BaseServerTestCase, cases.OptionalityHelper self.assertMessageEqual(m, command='PONG', params=['adhoctestline']) # check the label self.assertEqual(m.tags.get('draft/label'), '98765') + + @cases.SpecificationSelector.requiredBySpecification('Oragono') + def testEmptyBatchForNoResponse(self): + self.connectClient('bar', capabilities=['batch', 'draft/labeled-response', 'draft/message-tags-0.2', 'server-time']) + self.getMessages(1) + + # PONG never receives a response + self.sendLine(1, '@draft/label=98765 PONG adhoctestline') + + # "If no response is required, an empty batch MUST be sent." + # https://ircv3.net/specs/extensions/labeled-response.html + ms = self.getMessages(1) + self.assertEqual(len(ms), 2) + batch_start, batch_end = ms + + self.assertEqual(batch_start.command, 'BATCH') + self.assertEqual(batch_start.tags.get('draft/label'), '98765') + self.assertTrue(batch_start.params[0].startswith('+')) + batch_id = batch_start.params[0][1:] + + self.assertEqual(batch_end.command, 'BATCH') + self.assertEqual(batch_end.params[0], '-' + batch_id) From 90f43d509d947cc5e731075625230a626a07629b Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Fri, 1 Mar 2019 01:00:53 -0500 Subject: [PATCH 09/10] upgrade to ratified message-tags --- irctest/server_tests/test_labeled_responses.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/irctest/server_tests/test_labeled_responses.py b/irctest/server_tests/test_labeled_responses.py index 687ee2d..766b755 100644 --- a/irctest/server_tests/test_labeled_responses.py +++ b/irctest/server_tests/test_labeled_responses.py @@ -164,9 +164,9 @@ class LabeledResponsesTestCase(cases.BaseServerTestCase, cases.OptionalityHelper @cases.SpecificationSelector.requiredBySpecification('IRCv3.2') def testLabeledTagMsgResponsesToClient(self): - self.connectClient('foo', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'draft/message-tags-0.2'], skip_if_cap_nak=True) + self.connectClient('foo', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'message-tags'], skip_if_cap_nak=True) self.getMessages(1) - self.connectClient('bar', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'draft/message-tags-0.2'], skip_if_cap_nak=True) + self.connectClient('bar', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'message-tags'], skip_if_cap_nak=True) self.getMessages(2) self.sendLine(1, '@draft/label=12345;+draft/reply=123;+draft/react=l😃l TAGMSG bar') @@ -191,9 +191,9 @@ class LabeledResponsesTestCase(cases.BaseServerTestCase, cases.OptionalityHelper @cases.SpecificationSelector.requiredBySpecification('IRCv3.2') def testLabeledTagMsgResponsesToChannel(self): - self.connectClient('foo', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'draft/message-tags-0.2'], skip_if_cap_nak=True) + self.connectClient('foo', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'message-tags'], skip_if_cap_nak=True) self.getMessages(1) - self.connectClient('bar', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'draft/message-tags-0.2'], skip_if_cap_nak=True) + self.connectClient('bar', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'message-tags'], skip_if_cap_nak=True) self.getMessages(2) # join channels @@ -218,7 +218,7 @@ class LabeledResponsesTestCase(cases.BaseServerTestCase, cases.OptionalityHelper @cases.SpecificationSelector.requiredBySpecification('IRCv3.2') def testLabeledTagMsgResponsesToSelf(self): - self.connectClient('foo', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'draft/message-tags-0.2'], skip_if_cap_nak=True) + self.connectClient('foo', capabilities=['batch', 'echo-message', 'draft/labeled-response', 'message-tags'], skip_if_cap_nak=True) self.getMessages(1) self.sendLine(1, '@draft/label=12345;+draft/reply=123;+draft/react=l😃l TAGMSG foo') @@ -236,7 +236,7 @@ class LabeledResponsesTestCase(cases.BaseServerTestCase, cases.OptionalityHelper @cases.SpecificationSelector.requiredBySpecification('IRCv3.2') def testBatchedJoinMessages(self): - self.connectClient('bar', capabilities=['batch', 'draft/labeled-response', 'draft/message-tags-0.2', 'server-time'], skip_if_cap_nak=True) + self.connectClient('bar', capabilities=['batch', 'draft/labeled-response', 'message-tags', 'server-time'], skip_if_cap_nak=True) self.getMessages(1) self.sendLine(1, '@draft/label=12345 JOIN #xyz') @@ -266,7 +266,7 @@ class LabeledResponsesTestCase(cases.BaseServerTestCase, cases.OptionalityHelper @cases.SpecificationSelector.requiredBySpecification('Oragono') def testNoBatchForSingleMessage(self): - self.connectClient('bar', capabilities=['batch', 'draft/labeled-response', 'draft/message-tags-0.2', 'server-time']) + self.connectClient('bar', capabilities=['batch', 'draft/labeled-response', 'message-tags', 'server-time']) self.getMessages(1) self.sendLine(1, '@draft/label=98765 PING adhoctestline') @@ -280,7 +280,7 @@ class LabeledResponsesTestCase(cases.BaseServerTestCase, cases.OptionalityHelper @cases.SpecificationSelector.requiredBySpecification('Oragono') def testEmptyBatchForNoResponse(self): - self.connectClient('bar', capabilities=['batch', 'draft/labeled-response', 'draft/message-tags-0.2', 'server-time']) + self.connectClient('bar', capabilities=['batch', 'draft/labeled-response', 'message-tags', 'server-time']) self.getMessages(1) # PONG never receives a response From f7d927cbc4aaa74a8bf2ba2b5878b6e9e9b5c389 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Thu, 7 Mar 2019 02:30:04 -0500 Subject: [PATCH 10/10] test ERR_INPUTTOOLONG --- irctest/numerics.py | 1 + irctest/server_tests/test_messages.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/irctest/numerics.py b/irctest/numerics.py index e204ec3..229cfc7 100644 --- a/irctest/numerics.py +++ b/irctest/numerics.py @@ -116,6 +116,7 @@ ERR_NOTEXTTOSEND = "412" ERR_NOTOPLEVEL = "413" ERR_WILDTOPLEVEL = "414" ERR_BADMASK = "415" +ERR_INPUTTOOLONG = "417" ERR_UNKNOWNCOMMAND = "421" ERR_NOMOTD = "422" ERR_NOADMININFO = "423" diff --git a/irctest/server_tests/test_messages.py b/irctest/server_tests/test_messages.py index 6ec232d..4756565 100644 --- a/irctest/server_tests/test_messages.py +++ b/irctest/server_tests/test_messages.py @@ -4,6 +4,7 @@ Section 3.2 of RFC 2812 """ from irctest import cases +from irctest.numerics import ERR_INPUTTOOLONG class PrivmsgTestCase(cases.BaseServerTestCase): @cases.SpecificationSelector.requiredBySpecification('RFC1459', 'RFC2812') @@ -61,3 +62,14 @@ class NoticeTestCase(cases.BaseServerTestCase): self.connectClient('foo') self.sendLine(1, 'NOTICE #nonexistent :hello there') self.assertEqual(self.getMessages(1), []) + + +class TagsTestCase(cases.BaseServerTestCase): + @cases.SpecificationSelector.requiredBySpecification('Oragono') + def testLineTooLong(self): + self.connectClient('bar') + self.joinChannel(1, '#xyz') + monsterMessage = '@+clientOnlyTagExample=' + 'a'*4096 + ' PRIVMSG #xyz hi!' + self.sendLine(1, monsterMessage) + replies = self.getMessages(1) + self.assertIn(ERR_INPUTTOOLONG, set(reply.command for reply in replies))