unrealircd

irctest.self_tests.cases.IrcTestCaseTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
test_message_matching_negative[{'command': '004', 'params': ['nick', '...', OptStrRe(r'[a-zA-Z]+')]}-004 nick ... 123]..dd
test_message_matching_negative[{'command': '004', 'params': ['nick', '...', OptStrRe(r'[a-zA-Z]+')]}-004 nick ... :]..dd
test_message_matching_negative[{'command': '005', 'params': ['nick', 'FOO=1', *ANYLIST]}-005 nick BAR=2]..dd
test_message_matching_negative[{'command': '005', 'params': ['nick', 'FOO=1', *ANYLIST]}-005 nick]..dd
test_message_matching_negative[{'command': '005', 'params': ['nick', ListRemainder(ANYSTR, min_length=1)]}-005 nick]..dd
test_message_matching_negative[{'command': '005', 'params': ['nick', ListRemainder(StrRe(r'[A-Z]+=.*'), min_length=1)]}-005 nick foo=1]..dd
test_message_matching_negative[{'command': '005', 'params': ['nick', ListRemainder(StrRe(r'[A-Z]+=.*'), min_length=1)]}-005 nick]..dd
test_message_matching_negative[{'command': 'PING', 'params': ['abc']}-PONG def]..dd
test_message_matching_negative[{'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMSG #chan hello2]..dd
test_message_matching_negative[{'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMSG #chan2 hello]..dd
test_message_matching_negative[{'command': 'PRIVMSG', 'params': ['#chan', StrRe(r'hello.*')]}-PRIVMSG #chan :hi]..dd
test_message_matching_negative[{'command': 'PRIVMSG', 'params': ['#chan', StrRe(r'hello.*')]}-PRIVMSG #chan2 hello]..dd
test_message_matching_negative[{'nick': 'foo', 'command': 'PRIVMSG'}-:foo2!baz@qux PRIVMSG #chan hello]..dd
test_message_matching_negative[{'nick': 'foo', 'command': 'PRIVMSG'}-@tag1=bar :foo2!baz@qux PRIVMSG #chan :hello]..dd
test_message_matching_negative[{'nick': 'foo', 'command': 'PRIVMSG'}-PRIVMSG #chan :hi]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-:foo!baz@qux PRIVMSG #chan hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=value1 PRIVMSG #chan :hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMG #chan :hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMSG #chan hello2]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMSG #chan2 hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar;tag2= PRIVMSG #chan :hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar;tag2=baz PRIVMSG #chan :hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=value1 PRIVMSG #chan :hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMG #chan :hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar'}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-:foo!baz@qux PRIVMSG #chan hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar'}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar;tag2= PRIVMSG #chan :hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar'}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=value1 PRIVMSG #chan :hello]..dd
test_message_matching_negative[{'tags': {'tag1': 'bar'}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMSG #chan hello]..dd
test_message_matching_negative[{'tags': {'tag1': ANYSTR}, 'command': 'PRIVMSG', 'params': ['#chan', ANYSTR]}-:foo!baz@qux PRIVMSG #chan hello]..dd
test_message_matching_negative[{'tags': {'tag1': ANYSTR}, 'command': 'PRIVMSG', 'params': ['#chan', ANYSTR]}-@tag1=bar;tag2= PRIVMSG #chan :hello]..dd
test_message_matching_negative[{'tags': {'tag1': ANYSTR}, 'command': 'PRIVMSG', 'params': ['#chan', ANYSTR]}-PRIVMSG #chan hello]..dd
test_message_matching_negative[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-:foo!baz@qux PRIVMSG #chan hello]..dd
test_message_matching_negative[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=value1 PRIVMSG #chan :hello]..dd
test_message_matching_negative[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMG #chan :hello]..dd
test_message_matching_negative[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMSG #chan hello2]..dd
test_message_matching_negative[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMSG #chan2 hello]..dd
test_message_matching_negative_message[expected command to match PING, got PONG]..dd
test_message_matching_negative_message[expected command to match PRIVMSG, got PRIVMG0]..dd
test_message_matching_negative_message[expected command to match PRIVMSG, got PRIVMG1]..dd
test_message_matching_negative_message[expected command to match PRIVMSG, got PRIVMG2]..dd
test_message_matching_negative_message[expected nick to be foo, got None instead]..dd
test_message_matching_negative_message[expected nick to be foo, got foo2 instead0]..dd
test_message_matching_negative_message[expected nick to be foo, got foo2 instead1]..dd
test_message_matching_negative_message[expected params to match ['#chan', 'hello'], got ['#chan', 'hello2']0]..dd
test_message_matching_negative_message[expected params to match ['#chan', 'hello'], got ['#chan', 'hello2']1]..dd
test_message_matching_negative_message[expected params to match ['#chan', 'hello'], got ['#chan', 'hello2']2]..dd
test_message_matching_negative_message[expected params to match ['#chan', 'hello'], got ['#chan2', 'hello']0]..dd
test_message_matching_negative_message[expected params to match ['#chan', 'hello'], got ['#chan2', 'hello']1]..dd
test_message_matching_negative_message[expected params to match ['#chan', 'hello'], got ['#chan2', 'hello']2]..dd
test_message_matching_negative_message[expected params to match ['#chan', StrRe(r'hello.*')], got ['#chan', 'hi']]..dd
test_message_matching_negative_message[expected params to match ['#chan', StrRe(r'hello.*')], got ['#chan2', 'hello']]..dd
test_message_matching_negative_message[expected params to match ['nick', '...', OptStrRe(r'[a-zA-Z]+')], got ['nick', '...', '']]..dd
test_message_matching_negative_message[expected params to match ['nick', '...', OptStrRe(r'[a-zA-Z]+')], got ['nick', '...', '123']]..dd
test_message_matching_negative_message[expected params to match ['nick', 'FOO=1', *ANYLIST], got ['nick', 'BAR=2']]..dd
test_message_matching_negative_message[expected params to match ['nick', 'FOO=1', *ANYLIST], got ['nick']]..dd
test_message_matching_negative_message[expected params to match ['nick', ListRemainder(ANYSTR, min_length=1)], got ['nick']]..dd
test_message_matching_negative_message[expected params to match ['nick', ListRemainder(StrRe(r'[A-Z]+=.*'), min_length=1)], got ['nick', 'foo=1']]..dd
test_message_matching_negative_message[expected params to match ['nick', ListRemainder(StrRe(r'[A-Z]+=.*'), min_length=1)], got ['nick']]..dd
test_message_matching_negative_message[expected tags to match {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, got {'tag1': 'value1'}]..dd
test_message_matching_negative_message[expected tags to match {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, got {}]..dd
test_message_matching_negative_message[expected tags to match {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, got {'tag1': 'bar', 'tag2': ''}]..dd
test_message_matching_negative_message[expected tags to match {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, got {'tag1': 'bar', 'tag2': 'baz'}]..dd
test_message_matching_negative_message[expected tags to match {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, got {'tag1': 'value1'}]..dd
test_message_matching_negative_message[expected tags to match {'tag1': 'bar'}, got {'tag1': 'bar', 'tag2': ''}]..dd
test_message_matching_negative_message[expected tags to match {'tag1': 'bar'}, got {'tag1': 'value1'}]..dd
test_message_matching_negative_message[expected tags to match {'tag1': 'bar'}, got {}0]..dd
test_message_matching_negative_message[expected tags to match {'tag1': 'bar'}, got {}1]..dd
test_message_matching_negative_message[expected tags to match {'tag1': ANYSTR}, got {'tag1': 'bar', 'tag2': ''}]..dd
test_message_matching_negative_message[expected tags to match {'tag1': ANYSTR}, got {}0]..dd
test_message_matching_negative_message[expected tags to match {'tag1': ANYSTR}, got {}1]..dd
test_message_matching_negative_message[expected tags to match {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, got {'tag1': 'value1'}]..dd
test_message_matching_negative_message[expected tags to match {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, got {}]..dd
test_message_matching_positive[{'command': '004', 'params': ['nick', '...', OptStrRe(r'[a-zA-Z]+')]}-004 nick ... abc]..dd
test_message_matching_positive[{'command': '004', 'params': ['nick', '...', OptStrRe(r'[a-zA-Z]+')]}-004 nick ...]..dd
test_message_matching_positive[{'command': '005', 'params': ['nick', 'FOO=1', *ANYLIST]}-005 nick FOO=1 BAR=2]..dd
test_message_matching_positive[{'command': '005', 'params': ['nick', 'FOO=1', *ANYLIST]}-005 nick FOO=1]..dd
test_message_matching_positive[{'command': '005', 'params': ['nick', ListRemainder(ANYSTR, min_length=1)]}-005 nick BAR=2]..dd
test_message_matching_positive[{'command': '005', 'params': ['nick', ListRemainder(ANYSTR, min_length=1)]}-005 nick FOO=1 BAR=2]..dd
test_message_matching_positive[{'command': '005', 'params': ['nick', ListRemainder(ANYSTR, min_length=1)]}-005 nick FOO=1]..dd
test_message_matching_positive[{'command': '005', 'params': ['nick', ListRemainder(StrRe(r'[A-Z]+=.*'), min_length=1)]}-005 nick BAR=2]..dd
test_message_matching_positive[{'command': '005', 'params': ['nick', ListRemainder(StrRe(r'[A-Z]+=.*'), min_length=1)]}-005 nick FOO=1 BAR=2]..dd
test_message_matching_positive[{'command': '005', 'params': ['nick', ListRemainder(StrRe(r'[A-Z]+=.*'), min_length=1)]}-005 nick FOO=1]..dd
test_message_matching_positive[{'command': 'PING', 'params': ['abc']}-PING abc]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-:foo!baz@qux PRIVMSG #chan hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar :foo!baz@qux PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar;tag2= PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-PRIVMSG #chan hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', StrRe(r'hello.*')]}-:foo!baz@qux PRIVMSG #chan hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', StrRe(r'hello.*')]}-@tag1=bar :foo!baz@qux PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', StrRe(r'hello.*')]}-@tag1=bar PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', StrRe(r'hello.*')]}-@tag1=bar;tag2= PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', StrRe(r'hello.*')]}-PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', StrRe(r'hello.*')]}-PRIVMSG #chan hello2]..dd
test_message_matching_positive[{'command': 'PRIVMSG', 'params': ['#chan', StrRe(r'hello.*')]}-PRIVMSG #chan hello]..dd
test_message_matching_positive[{'nick': 'foo', 'command': 'PRIVMSG'}-:foo!baz@qux PRIVMSG #chan hello]..dd
test_message_matching_positive[{'nick': 'foo', 'command': 'PRIVMSG'}-@tag1=bar :foo!baz@qux PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar :foo!baz@qux PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar;tag2= PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar :foo!baz@qux PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': 'bar', RemainingKeys(NotStrRe(r'tag2')): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar;tag3= PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': 'bar'}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar :foo!baz@qux PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': 'bar'}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': ANYSTR}, 'command': 'PRIVMSG', 'params': ['#chan', ANYSTR]}-@tag1=bar :foo!baz@qux PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': ANYSTR}, 'command': 'PRIVMSG', 'params': ['#chan', ANYSTR]}-@tag1=bar PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {'tag1': ANYSTR}, 'command': 'PRIVMSG', 'params': ['#chan', ANYSTR]}-@tag1=value1 PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=;tag2=bar PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar :foo!baz@qux PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar PRIVMSG #chan :hello]..dd
test_message_matching_positive[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar;tag2= PRIVMSG #chan :hello0]..dd
test_message_matching_positive[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag1=bar;tag2= PRIVMSG #chan :hello1]..dd
test_message_matching_positive[{'tags': {StrRe(r'tag[12]'): 'bar', RemainingKeys(ANYSTR): ANYOPTSTR}, 'command': 'PRIVMSG', 'params': ['#chan', 'hello']}-@tag2=bar PRIVMSG #chan :hello]..dd

irctest.server_tests.account_registration.RegisterBeforeConnectDisallowedTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testBeforeConnectddss

irctest.server_tests.account_registration.RegisterBeforeConnectTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testBeforeConnectddss

irctest.server_tests.account_registration.RegisterEmailVerifiedAfterConnectTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testAfterConnectddss

irctest.server_tests.account_registration.RegisterEmailVerifiedBeforeConnectTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testBeforeConnectddss

irctest.server_tests.account_registration.RegisterTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testRegisterDefaultName

"If <account> is *, then this value is the user’s current nickname."

ddss
testRegisterDifferentName

Requested account name differs from the nick

ddss
testRegisterSameName

Requested account name is the same as the nick

ddss

irctest.server_tests.account_tag.AccountTagTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testInvitedd..
testPrivmsgdd..

irctest.server_tests.away.AwayTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testAway..dd
testAwayAck

"The server acknowledges the change in away status by returning the RPL_NOWAWAY and RPL_UNAWAY numerics." -- https://modern.ircdocs.horse/#away-message

..dd
testAwayEmptyMessage

"If [AWAY] is sent with a nonempty parameter (the 'away message') then the user is set to be away. If this command is sent with no parameters, or with the empty string as the parameter, the user is no longer away." -- https://modern.ircdocs.horse/#away-message

..dd
testAwayPrivmsg

"Servers SHOULD notify clients when a user they're interacting with is away when relevant" -- https://modern.ircdocs.horse/#away-message

"<client> <nick> :<message>" -- https://modern.ircdocs.horse/#rplaway-301

..dd
testAwayUserhost

"Servers SHOULD notify clients when a user they're interacting with is away when relevant" -- https://modern.ircdocs.horse/#away-message

"<client> <nick> :<message>" -- https://modern.ircdocs.horse/#rplaway-301

..dd
testAwayWhois

"Servers SHOULD notify clients when a user they're interacting with is away when relevant" -- https://modern.ircdocs.horse/#away-message

"<client> <nick> :<message>" -- https://modern.ircdocs.horse/#rplaway-301

..dd

irctest.server_tests.away_notify.AwayNotifyTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testAwayNotify

Basic away-notify test.

..dd
testAwayNotifyOnJoin
The away-notify specification states:

"Clients will be sent an AWAY message [...] when a user joins and has an away message set."

..dd

irctest.server_tests.bot_mode.BotModeTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testBotChannelMessage..dd
testBotMode..dd
testBotPrivateMessage..dd
testBotWhois..dd
testBotWhox..dd

irctest.server_tests.buffering.BufferingTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testNoTags[byteperbyte-colon]..dd
testNoTags[byteperbyte-no colon]..dd
testNoTags[charperchar-colon]..dd
testNoTags[charperchar-no colon]..dd
testNoTags[whole-colon]..dd
testNoTags[whole-no colon]..dd

irctest.server_tests.cap.CapTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testCapRemovalByClient

Test CAP LIST and removal of caps via CAP REQ :-tagname.

..dd
testEmptyCapList
“If no capabilities are active, an empty parameter must be sent.”

-- <http://ircv3.net/specs/core/capability-negotiation-3.1.html#the-cap-list-subcommand>

..dd
testInvalidCapSubcommand
“If no capabilities are active, an empty parameter must be sent.”

-- <http://ircv3.net/specs/core/capability-negotiation-3.1.html#the-cap-list-subcommand>

..dd
testIrc301CapLs

Current version:

"The LS subcommand is used to list the capabilities supported by the server. The client should send an LS subcommand with no other arguments to solicit a list of all capabilities."

"If a client has not indicated support for CAP LS 302 features, the server MUST NOT send these new features to the client." -- <https://ircv3.net/specs/core/capability-negotiation.html>

Before the v3.1 / v3.2 merge:

IRCv3.1: “The LS subcommand is used to list the capabilities supported by the server. The client should send an LS subcommand with no other arguments to solicit a list of all capabilities.” -- <http://ircv3.net/specs/core/capability-negotiation-3.1.html#the-cap-ls-subcommand>

IRCv3.2: “Servers MUST NOT send messages described by this document if the client only supports version 3.1.” -- <http://ircv3.net/specs/core/capability-negotiation-3.2.html#version-in-cap-ls>

..dd
testNakExactString
“The argument of the NAK subcommand MUST consist of at least the

first 100 characters of the capability list in the REQ subcommand which triggered the NAK.” -- <http://ircv3.net/specs/core/capability-negotiation-3.1.html#the-cap-nak-subcommand>

..dd
testNakWhole
“The capability identifier set must be accepted as a whole, or

rejected entirely.” -- <http://ircv3.net/specs/core/capability-negotiation-3.1.html#the-cap-req-subcommand>

..dd
testNoMultiline301Response

Current version: "If the client supports CAP version 302, the server MAY send multiple lines in response to CAP LS and CAP LIST." This should be read as disallowing multiline responses to pre-302 clients. -- <https://ircv3.net/specs/extensions/capability-negotiation#multiline-replies-to-cap-ls-and-cap-list>

..dd
testNoReq
Test the server handles gracefully clients which do not send

REQs.

“Clients that support capabilities but do not wish to enter negotiation SHOULD send CAP END upon connection to the server.” -- <http://ircv3.net/specs/core/capability-negotiation-3.1.html#the-cap-end-subcommand>

..dd
testReqOne

Tests requesting a single capability

..dd
testReqOneThenOne

Tests requesting two capabilities in different messages

..dd
testReqPostRegistration

Tests requesting more capabilities after CAP END

..dd
testReqTwo

Tests requesting two capabilities at once

..dd
testReqUnavailable
Test the server handles gracefully clients which request

capabilities that are not available. <http://ircv3.net/specs/core/capability-negotiation-3.1.html>

..dd

irctest.server_tests.channel_rename.ChannelRenameTestCase

Basic tests for channel-rename.

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testChannelRenamessdd

irctest.server_tests.chathistory.ChathistoryTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testChathistoryEventPlayback[AFTER]ddss
testChathistoryEventPlayback[AROUND]ddss
testChathistoryEventPlayback[BEFORE]ddss
testChathistoryEventPlayback[BETWEEN]ddss
testChathistoryEventPlayback[LATEST]ddss
testChathistoryNoEventPlayback
Tests that non-messages don't appear in the chat history when event-playback

is not enabled.

dd..
testChathistory[AFTER]dd..
testChathistory[AROUND]ddXX
testChathistory[BEFORE]dd..
testChathistory[BETWEEN]ddXX
testChathistory[LATEST]dd..
testInvalidTargetsdd..

irctest.server_tests.chmodes.ban.BanModeTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testBan

Basic ban operation

..dd
testBanException
`Exception mode <https://modern.ircdocs.horse/#exception-channel-mode`_,

detected using ISUPPORT EXCEPTS and checked against ISUPPORT CHANMODES

Docutils System Messages

..dd
testBanList

RPL_BANLIST

..dd

irctest.server_tests.chmodes.key.KeyTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testKeyNormal..dd
testKeyValidation[empty]
key = 1*23( %x01-05 / %x07-08 / %x0C / %x0E-1F / %x21-7F )

; any 7-bit US_ASCII character, ; except NUL, CR, LF, FF, h/v TABs, and " "

-- https://tools.ietf.org/html/rfc2812#page-8

"Servers may validate the value (eg. to forbid spaces, as they make it harder to use the key in JOIN messages). If the value is invalid, they SHOULD return [ERR_INVALIDMODEPARAM](#errinvalidmodeparam-696). However, clients MUST be able to handle any of the following:

  • [ERR_INVALIDMODEPARAM](#errinvalidmodeparam-696)

  • [ERR_INVALIDKEY](#errinvalidkey-525)

  • MODE echoed with a different key (eg. truncated or stripped of invalid characters)

  • the key changed ignored, and no MODE echoed if no other mode change was valid.

" -- https://modern.ircdocs.horse/#key-channel-mode -- https://github.com/ircdocs/modern-irc/pull/111

..dd
testKeyValidation[long]
key = 1*23( %x01-05 / %x07-08 / %x0C / %x0E-1F / %x21-7F )

; any 7-bit US_ASCII character, ; except NUL, CR, LF, FF, h/v TABs, and " "

-- https://tools.ietf.org/html/rfc2812#page-8

"Servers may validate the value (eg. to forbid spaces, as they make it harder to use the key in JOIN messages). If the value is invalid, they SHOULD return [ERR_INVALIDMODEPARAM](#errinvalidmodeparam-696). However, clients MUST be able to handle any of the following:

  • [ERR_INVALIDMODEPARAM](#errinvalidmodeparam-696)

  • [ERR_INVALIDKEY](#errinvalidkey-525)

  • MODE echoed with a different key (eg. truncated or stripped of invalid characters)

  • the key changed ignored, and no MODE echoed if no other mode change was valid.

" -- https://modern.ircdocs.horse/#key-channel-mode -- https://github.com/ircdocs/modern-irc/pull/111

..dd
testKeyValidation[only-space]
key = 1*23( %x01-05 / %x07-08 / %x0C / %x0E-1F / %x21-7F )

; any 7-bit US_ASCII character, ; except NUL, CR, LF, FF, h/v TABs, and " "

-- https://tools.ietf.org/html/rfc2812#page-8

"Servers may validate the value (eg. to forbid spaces, as they make it harder to use the key in JOIN messages). If the value is invalid, they SHOULD return [ERR_INVALIDMODEPARAM](#errinvalidmodeparam-696). However, clients MUST be able to handle any of the following:

  • [ERR_INVALIDMODEPARAM](#errinvalidmodeparam-696)

  • [ERR_INVALIDKEY](#errinvalidkey-525)

  • MODE echoed with a different key (eg. truncated or stripped of invalid characters)

  • the key changed ignored, and no MODE echoed if no other mode change was valid.

" -- https://modern.ircdocs.horse/#key-channel-mode -- https://github.com/ircdocs/modern-irc/pull/111

..dd
testKeyValidation[spaces]
key = 1*23( %x01-05 / %x07-08 / %x0C / %x0E-1F / %x21-7F )

; any 7-bit US_ASCII character, ; except NUL, CR, LF, FF, h/v TABs, and " "

-- https://tools.ietf.org/html/rfc2812#page-8

"Servers may validate the value (eg. to forbid spaces, as they make it harder to use the key in JOIN messages). If the value is invalid, they SHOULD return [ERR_INVALIDMODEPARAM](#errinvalidmodeparam-696). However, clients MUST be able to handle any of the following:

  • [ERR_INVALIDMODEPARAM](#errinvalidmodeparam-696)

  • [ERR_INVALIDKEY](#errinvalidkey-525)

  • MODE echoed with a different key (eg. truncated or stripped of invalid characters)

  • the key changed ignored, and no MODE echoed if no other mode change was valid.

" -- https://modern.ircdocs.horse/#key-channel-mode -- https://github.com/ircdocs/modern-irc/pull/111

..dd

irctest.server_tests.chmodes.modeis.RplChannelModeIsTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testChannelModeIs
Test RPL_CHANNELMODEIS and RPL_CHANNELCREATED as responses to

MODE #channel: <https://modern.ircdocs.horse/#rplcreationtime-329> <https://modern.ircdocs.horse/#rplchannelmodeis-324>

..dd

irctest.server_tests.chmodes.moderated.ModeratedModeTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testModeratedMode..dd

irctest.server_tests.chmodes.mute_extban.MuteExtbanTestCase

https://defs.ircdocs.horse/defs/isupport.html#extban

It magically guesses what char the IRCd uses for mutes.

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testMuteExtban

Basic usage of mute

s.dd
testMuteExtbanExempt

Checks +e overrides the mute

<https://defs.ircdocs.horse/defs/chanmodes.html#e-ban-exception>

s.dd
testMuteExtbanVoiced

Checks +v overrides the mute

s.dd

irctest.server_tests.chmodes.no_external.NoExternalMessagesTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testNoExternalMessagesMode..dd

irctest.server_tests.chmodes.operator.ChannelOperatorModeTestCase

Test various error and success cases around the channel operator mode:

<https://modern.ircdocs.horse/#channel-operators> <https://modern.ircdocs.horse/#mode-message>

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testChannelOperatorModeChannelAndTargetDoNotExist
Test that +o targeting a nonexistent channel and nickname

fails as expected.

.Xdd
testChannelOperatorModeChannelDoesNotExist

Test that +o targeting a nonexistent channel fails as expected.

"If <target> is a channel that does not exist on the network, # the ERR_NOSUCHCHANNEL (403) numeric is returned."

.Xdd
testChannelOperatorModeSenderAndTargetNonMembers
Test that +o where neither the sender nor the target is a channel

member fails as expected.

..dd
testChannelOperatorModeSenderNonMember
Test that +o where the sender is not a channel member

fails as expected.

..dd
testChannelOperatorModeSenderPrivsNeeded
Test that +o from a channel member without the necessary privileges

fails as expected.

..dd
testChannelOperatorModeSuccess

Tests a successful grant of +o in a channel.

..dd
testChannelOperatorModeTargetDoesNotExist

Test that +o targeting a nonexistent nick fails as expected.

..dd
testChannelOperatorModeTargetNotInChannel
Test that +o targeting a user not present in the channel fails

as expected.

..dd

irctest.server_tests.chmodes.secret.SecretChannelTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testSecretChannelListCommand

<https://datatracker.ietf.org/doc/html/rfc1459#section-4.2.6>

"Likewise, secret channels are not listed at all unless the client is a member of the channel in question."

<https://modern.ircdocs.horse/#secret-channel-mode> "A channel that is set to secret will not show up in responses to the LIST or NAMES command unless the client sending the command is joined to the channel."

..dd

irctest.server_tests.connection_registration.ConnectionRegistrationTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testConnectionRegistration..dd
testEarlyNickCollision

Two users register simultaneously with the same nick.

..dd
testEmptyRealname

Syntax: "<client> <command> :Not enough parameters" -- https://defs.ircdocs.horse/defs/numerics.html#err-needmoreparams-461 -- https://modern.ircdocs.horse/#errneedmoreparams-461

Use of this numeric: "The minimum length of <username> is 1, ie. it MUST not be empty. If it is empty, the server SHOULD reject the command with ERR_NEEDMOREPARAMS (even an empty parameter is provided)" https://github.com/ircdocs/modern-irc/issues/85

..dd
testNickCollision
A user connects and requests the same nickname as an already

registered user.

..dd
testNonutf8Realname..dd
testNonutf8Username..dd
testQuitDisconnects
“The server must close the connection to a client which sends a

QUIT message.” -- <https://tools.ietf.org/html/rfc1459#section-4.1.3>

..dd
testQuitErrors
“A client session is terminated with a quit message. The server

acknowledges this by sending an ERROR message to the client.” -- <https://tools.ietf.org/html/rfc2812#section-3.1.7>

..dd

irctest.server_tests.connection_registration.PasswordedConnectionRegistrationTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testNoPassword..dd
testPassBeforeNickuser..dd
testWrongPassword

"If the password supplied does not match the password expected by the server, then the server SHOULD send ERR_PASSWDMISMATCH and MUST close the connection with ERROR." -- https://github.com/ircdocs/modern-irc/pull/172

..dd

irctest.server_tests.echo_message.EchoMessageTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testEchoMessage[NOTICE-False-True]

<http://ircv3.net/specs/extensions/echo-message-3.2.html>

..dd
testEchoMessage[PRIVMSG-False-False]

<http://ircv3.net/specs/extensions/echo-message-3.2.html>

..dd
testEchoMessage[PRIVMSG-False-True]

<http://ircv3.net/specs/extensions/echo-message-3.2.html>

..dd
testEchoMessage[PRIVMSG-True-True]

<http://ircv3.net/specs/extensions/echo-message-3.2.html>

..dd

irctest.server_tests.extended_join.MetadataTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testLoggedIndd..
testNotLoggedIndd..

irctest.server_tests.help.HelpTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testHelpNoArg[HELPOP]ssdd
testHelpNoArg[HELP]ssdd
testHelpPrivmsg[HELPOP]ssdd
testHelpPrivmsg[HELP]ssdd
testHelpUnknownSubject[HELPOP]ssdd
testHelpUnknownSubject[HELP]ssdd

irctest.server_tests.info.InfoTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testInfo

<https://datatracker.ietf.org/doc/html/rfc1459#section-4.3.8> <https://datatracker.ietf.org/doc/html/rfc2812#section-3.4.10>

"Upon receiving an INFO command, the given server will respond with zero or more RPL_INFO replies, followed by one RPL_ENDOFINFO numeric" -- <https://modern.ircdocs.horse/#info-message>

..dd

irctest.server_tests.invite.InviteTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testInvexList..dd
testInviteAlreadyInChannel

"If the user is already on the target channel, the server MUST reject the command with the ERR_USERONCHANNEL numeric." -- https://modern.ircdocs.horse/#invite-message

..dd
testInviteInviteOnly

"To invite a user to a channel which is invite only (MODE +i), the client sending the invite must be recognised as being a channel operator on the given channel." -- https://datatracker.ietf.org/doc/html/rfc1459#section-4.2.7

"When the channel has invite-only flag set, only channel operators may issue INVITE command." -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.7

"When the channel has [invite-only](#invite-only-channel-mode) mode set, only channel operators may issue INVITE command. Otherwise, the server MUST reject the command with the ERR_CHANOPRIVSNEEDED numeric." -- https://modern.ircdocs.horse/#invite-message

..dd
testInviteList..dd
testInviteNoNotificationForOtherMembers

"Other channel members are not notified." -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.7

"Other channel members SHOULD NOT be notified." -- https://modern.ircdocs.horse/#invite-message

..dd
testInviteOnlyFromUsersInChannel

"if the channel exists, only members of the channel are allowed to invite other users" -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.7

" 442 ERR_NOTONCHANNEL

"<channel> :You're not on that channel"

  • Returned by the server whenever a client tries to perform a channel affecting command for which the client isn't a member.

" -- https://datatracker.ietf.org/doc/html/rfc2812

" Only members of the channel are allowed to invite other users. Otherwise, the server MUST reject the command with the ERR_NOTONCHANNEL numeric." -- https://modern.ircdocs.horse/#invite-message

..dd
testInvite[False]..dd
testInvite[True]..dd
testInvites

Test some basic functionality related to INVITE and the +i mode.

https://modern.ircdocs.horse/#invite-only-channel-mode https://modern.ircdocs.horse/#rplinviting-341

..dd

irctest.server_tests.isupport.IsupportTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testParameters

https://modern.ircdocs.horse/#rplisupport-005

..dd
testPrefix

https://modern.ircdocs.horse/#prefix-parameter

..dd
testTargmax

"Format: TARGMAX=[<command>:[limit]{,<command>:[limit]}]" -- https://modern.ircdocs.horse/#targmax-parameter

"TARGMAX=[cmd:[number][,cmd:[number][,...]]]" -- https://defs.ircdocs.horse/defs/isupport.html#targmax

..dd

irctest.server_tests.join.JoinTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testJoinKey

Joins a single channel with a key

..dd
testJoinKeys

Joins two channels, both with keys

..dd
testJoinManySingleKey

Joins two channels, the first one has a key.

..dd
testJoinNamreply
“353 RPL_NAMREPLY
"( "=" / "*" / "@" ) <channel>

:[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> )”

-- <https://tools.ietf.org/html/rfc2812#section-5.2>

This test makes a user join and check what is sent to them.

..dd
testJoinPartiallyInvalid

TODO: specify this in Modern

..dd
testJoinPartiallyInvalidLabeledResponse

TODO: specify this in Modern

..dd
testJoinTwice..dd

irctest.server_tests.kick.KickTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testDoubleKickMessages[False]
“The server MUST NOT send KICK messages with multiple channels or

users to clients. This is necessarily to maintain backward compatibility with old client software.” -- https://tools.ietf.org/html/rfc2812#section-3.2.8

"The server MUST NOT send KICK messages with multiple channels or users to clients. This is necessary to maintain backward compatibility with existing client software." -- https://modern.ircdocs.horse/#kick-message

"Servers MAY limit the number of target users per KICK command via the [TARGMAX parameter of RPL_ISUPPORT](#targmax-parameter), and silently drop targets if the number of targets exceeds the limit." -- https://modern.ircdocs.horse/#kick-message

"If the "TARGMAX" parameter is not advertised or a value is not sent then a client SHOULD assume that no commands except the "JOIN" and "PART" commands accept multiple parameters." -- https://defs.ircdocs.horse/defs/isupport.html#targmax

"If this parameter is not advertised or a value is not sent then a client SHOULD assume that no commands except the JOIN and PART commands accept multiple parameters." -- https://github.com/ircdocs/modern-irc/pull/113

"If <limit> is not specified, then there is no maximum number of targets for that command." -- https://modern.ircdocs.horse/#targmax-parameter

..dd
testDoubleKickMessages[True]
“The server MUST NOT send KICK messages with multiple channels or

users to clients. This is necessarily to maintain backward compatibility with old client software.” -- https://tools.ietf.org/html/rfc2812#section-3.2.8

"The server MUST NOT send KICK messages with multiple channels or users to clients. This is necessary to maintain backward compatibility with existing client software." -- https://modern.ircdocs.horse/#kick-message

"Servers MAY limit the number of target users per KICK command via the [TARGMAX parameter of RPL_ISUPPORT](#targmax-parameter), and silently drop targets if the number of targets exceeds the limit." -- https://modern.ircdocs.horse/#kick-message

"If the "TARGMAX" parameter is not advertised or a value is not sent then a client SHOULD assume that no commands except the "JOIN" and "PART" commands accept multiple parameters." -- https://defs.ircdocs.horse/defs/isupport.html#targmax

"If this parameter is not advertised or a value is not sent then a client SHOULD assume that no commands except the JOIN and PART commands accept multiple parameters." -- https://github.com/ircdocs/modern-irc/pull/113

"If <limit> is not specified, then there is no maximum number of targets for that command." -- https://modern.ircdocs.horse/#targmax-parameter

..dd
testKickDefaultComment

"If a "comment" is given, this will be sent instead of the default message, the nickname of the user issuing the KICK." -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.8

..dd
testKickNoComment

"If no comment is given, the server SHOULD use a default message instead." -- https://modern.ircdocs.horse/#kick-message

..dd
testKickNonexistentChannel

“Kick command [...] Numeric replies: [...] ERR_NOSUCHCHANNEL.

..dd
testKickPrivileges
Test who has the ability to kick / what error codes are sent

for invalid kicks.

..dd
testKickSendsMessages
“Once a user has joined a channel, he receives information about

all commands his server receives affecting the channel. This includes […] KICK” -- <https://tools.ietf.org/html/rfc1459#section-4.2.1> and <https://tools.ietf.org/html/rfc2812#section-3.2.1>

"If a comment is given, this will be sent instead of the default message, the nickname of the user targeted by the KICK." -- https://modern.ircdocs.horse/#kick-message

..dd

irctest.server_tests.labeled_responses.LabeledResponsesTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testBatchedJoinMessages..dd
testEmptyBatchForNoResponse..dd
testLabeledNoticeResponsesToClient..dd
testLabeledNoticeResponsesToSelf..dd
testLabeledPrivmsgResponsesToClient..dd
testLabeledPrivmsgResponsesToMultipleClients..dd
testLabeledPrivmsgResponsesToSelf..dd
testNoBatchForSingleMessage..dd
testUnknownCommand..dd

irctest.server_tests.links.LinksTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testLinksSingleServer

Only testing the parameter-less case.

https://datatracker.ietf.org/doc/html/rfc1459#section-4.3.3 https://datatracker.ietf.org/doc/html/rfc2812#section-3.4.5 https://github.com/ircdocs/modern-irc/pull/175

" 364 RPL_LINKS

"<mask> <server> :<hopcount> <server info>"

365 RPL_ENDOFLINKS

"<mask> :End of /LINKS list"

  • In replying to the LINKS message, a server must send replies back using the RPL_LINKS numeric and mark the end of the list using an RPL_ENDOFLINKS reply.

" -- https://datatracker.ietf.org/doc/html/rfc1459#page-51 -- https://datatracker.ietf.org/doc/html/rfc2812#page-48

RPL_LINKS: "<client> * <server> :<hopcount> <server info>" RPL_ENDOFLINKS: "<client> * :End of /LINKS list" -- https://github.com/ircdocs/modern-irc/pull/175/files

..dd

irctest.server_tests.links.ServicesLinksTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testLinksWithServices

Only testing the parameter-less case.

https://datatracker.ietf.org/doc/html/rfc1459#section-4.3.3 https://datatracker.ietf.org/doc/html/rfc2812#section-3.4.5

" 364 RPL_LINKS

"<mask> <server> :<hopcount> <server info>"

365 RPL_ENDOFLINKS

"<mask> :End of /LINKS list"

  • In replying to the LINKS message, a server must send replies back using the RPL_LINKS numeric and mark the end of the list using an RPL_ENDOFLINKS reply.

" -- https://datatracker.ietf.org/doc/html/rfc1459#page-51 -- https://datatracker.ietf.org/doc/html/rfc2812#page-48

RPL_LINKS: "<client> * <server> :<hopcount> <server info>" RPL_ENDOFLINKS: "<client> * :End of /LINKS list" -- https://github.com/ircdocs/modern-irc/pull/175/files

dd..

irctest.server_tests.list.FaketimeListTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testListCreationTime

" C: Searching based on channel creation time, via the "C<val" and "C>val" modifiers to search for a channel creation time that is higher or lower than val." -- <https://modern.ircdocs.horse/#elist-parameter> -- https://datatracker.ietf.org/doc/html/draft-hardy-irc-isupport-00#section-4.8

Unfortunately, this is ambiguous, because "val" is a time delta (in minutes), not a timestamp.

On InspIRCd and Charybdis/Solanum, "C<val" is interpreted as "the channel was created less than <val> minutes ago

On UnrealIRCd, Plexus, and Hybrid, it is interpreted as "the channel's creation time is a timestamp lower than <val> minutes ago" (ie. the exact opposite)

"C: Searching based on channel creation time, via the "C<val" and "C>val" modifiers to search for a channel that was created either less than val minutes ago, or more than val minutes ago, respectively" -- https://github.com/ircdocs/modern-irc/pull/171

.Xdd
testListTopicTime

"T: Searching based on topic time, via the "T<val" and "T>val" modifiers to search for a topic time that is lower or higher than val respectively." -- <https://modern.ircdocs.horse/#elist-parameter> -- https://datatracker.ietf.org/doc/html/draft-hardy-irc-isupport-00#section-4.8

See testListCreationTime's docstring for comments on this.

"T: Searching based on topic set time, via the "T<val" and "T>val" modifiers to search for a topic time that was set less than val minutes ago, or more than val minutes ago, respectively." -- https://github.com/ircdocs/modern-irc/pull/171

.Xdd

irctest.server_tests.list.ListTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testListEmpty
<https://tools.ietf.org/html/rfc1459#section-4.2.6>

<https://tools.ietf.org/html/rfc2812#section-3.2.6> <https://modern.ircdocs.horse/#list-message>

..dd
testListMask

"M: Searching based on mask." -- <https://modern.ircdocs.horse/#elist-parameter> -- https://datatracker.ietf.org/doc/html/draft-hardy-irc-isupport-00#section-4.8

..dd
testListNonexistent
LIST on a nonexistent channel does not send an error

response. <https://tools.ietf.org/html/rfc1459#section-4.2.6> <https://tools.ietf.org/html/rfc2812#section-3.2.6>

..dd
testListNotMask

" N: Searching based on a non-matching mask. i.e., the opposite of M." -- <https://modern.ircdocs.horse/#elist-parameter> -- https://datatracker.ietf.org/doc/html/draft-hardy-irc-isupport-00#section-4.8

..dd
testListOne
When a channel exists, LIST should get it in a reply.

<https://tools.ietf.org/html/rfc1459#section-4.2.6> <https://tools.ietf.org/html/rfc2812#section-3.2.6>

<https://modern.ircdocs.horse/#list-message>

..dd
testListUsers

"U: Searching based on user count within the channel, via the "<val" and ">val" modifiers to search for a channel that has less or more than val users, respectively." -- <https://modern.ircdocs.horse/#elist-parameter> -- https://datatracker.ietf.org/doc/html/draft-hardy-irc-isupport-00#section-4.8

..dd

irctest.server_tests.lusers.BasicLusersTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testLusers..dd
testLusersFull..dd

irctest.server_tests.lusers.LusersUnregisteredDefaultInvisibleTestCase

Same as above but with +i as the default.

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testLusersFull..dd
testLusersRfc2812..dd

irctest.server_tests.lusers.LusersUnregisteredTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testLusersFull..dd
testLusersRfc2812..dd

irctest.server_tests.messages.NoticeTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testNotice

<https://tools.ietf.org/html/rfc2812#section-3.3.2>

..dd
testNoticeNonexistentChannel

"automatic replies must never be sent in response to a NOTICE message. This rule applies to servers too - they must not send any error reply back to the client on receipt of a notice" <https://tools.ietf.org/html/rfc1459#section-4.4.2>

'automatic replies MUST NEVER be sent in response to a NOTICE message. This rule applies to servers too - they MUST NOT send any error repl back to the client on receipt of a notice." <https://tools.ietf.org/html/rfc2812#section-3.3.2>

XXdd

irctest.server_tests.messages.PrivmsgTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testEmptyPrivmsg..dd
testPrivmsg

<https://tools.ietf.org/html/rfc2812#section-3.3.1>

..dd
testPrivmsgNonexistentChannel

<https://tools.ietf.org/html/rfc2812#section-3.3.1>

..dd
testPrivmsgNonexistentUser

<https://tools.ietf.org/html/rfc2812#section-3.3.1>

..dd
testPrivmsgToUser

<https://tools.ietf.org/html/rfc2812#section-3.3.1>

..dd

irctest.server_tests.messages.TagsTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testLineTooLong.Xdd

irctest.server_tests.monitor.AuthenticatedExtendedMonitorTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testExtendedMonitorAccountNotifyNoCap[-]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when account-notify is not enabled by the watcher

dd..
testExtendedMonitorAccountNotifyNoCap[-with-cap]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when account-notify is not enabled by the watcher

dd..
testExtendedMonitorAccountNotifyNoCap[monitor_before_connect-]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when account-notify is not enabled by the watcher

dd..
testExtendedMonitorAccountNotifyNoCap[monitor_before_connect-with-cap]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when account-notify is not enabled by the watcher

dd..
testExtendedMonitorAccountNotify[-]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when account-notify is not enabled by the watcher

dd..
testExtendedMonitorAccountNotify[-with-cap]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when account-notify is not enabled by the watcher

dd..
testExtendedMonitorAccountNotify[monitor_before_connect-]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when account-notify is not enabled by the watcher

dd..
testExtendedMonitorAccountNotify[monitor_before_connect-with-cap]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when account-notify is not enabled by the watcher

dd..

irctest.server_tests.monitor.ExtendedMonitorTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testExtendedMonitorAwayNoCap[-]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when away-notify is not enabled by the watcher

.sdd
testExtendedMonitorAwayNoCap[-with-cap]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when away-notify is not enabled by the watcher

.sdd
testExtendedMonitorAwayNoCap[monitor_before_connect-]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when away-notify is not enabled by the watcher

.sdd
testExtendedMonitorAwayNoCap[monitor_before_connect-with-cap]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when away-notify is not enabled by the watcher

.sdd
testExtendedMonitorAway[-]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

with https://ircv3.net/specs/extensions/away-notify

.sdd
testExtendedMonitorAway[-with-cap]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

with https://ircv3.net/specs/extensions/away-notify

.sdd
testExtendedMonitorAway[monitor_before_connect-]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

with https://ircv3.net/specs/extensions/away-notify

.sdd
testExtendedMonitorAway[monitor_before_connect-with-cap]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

with https://ircv3.net/specs/extensions/away-notify

.sdd
testExtendedMonitorSetNameNoCap[False]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when setname is not enabled by the watcher

.sdd
testExtendedMonitorSetNameNoCap[True]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

does nothing when setname is not enabled by the watcher

.sdd
testExtendedMonitorSetName[False]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

with https://ircv3.net/specs/extensions/setname

.sdd
testExtendedMonitorSetName[True]
Tests https://ircv3.net/specs/extensions/extended-monitor.html

with https://ircv3.net/specs/extensions/setname

.sdd

irctest.server_tests.monitor.MonitorTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testMonitorClear
“Clears the list of targets being monitored. No output will be returned

for use of this command.“ -- <https://ircv3.net/specs/extensions/monitor#monitor-c>

.sdd
testMonitorConnectedAndDisconnected
“If any of the targets being added are online, the server will

generate RPL_MONONLINE numerics listing those targets that are online.

If any of the targets being added are offline, the server will generate RPL_MONOFFLINE numerics listing those targets that are online.” -- <http://ircv3.net/specs/core/monitor-3.2.html#monitor--targettarget2>

.sdd
testMonitorForbidsMasks
“The MONITOR implementation also enhances user privacy by

disallowing subscription to hostmasks, allowing users to avoid nick-change stalking.” -- <http://ircv3.net/specs/core/monitor-3.2.html#watch-vs-monitor>

“For this specification, ‘target’ MUST be a valid nick as determined by the IRC daemon.” -- <http://ircv3.net/specs/core/monitor-3.2.html#monitor-command>

.sdd
testMonitorList.sdd
testMonitorOneConnected
“If any of the targets being added are offline, the server will

generate RPL_MONOFFLINE numerics listing those targets that are online.” -- <http://ircv3.net/specs/core/monitor-3.2.html#monitor--targettarget2>

.sdd
testMonitorOneConnection.sdd
testMonitorOneConnectionWithQuit.sdd
testMonitorOneDisconnected
“If any of the targets being added are online, the server will

generate RPL_MONONLINE numerics listing those targets that are online.” -- <http://ircv3.net/specs/core/monitor-3.2.html#monitor--targettarget2>

.sdd
testMonitorStatus
“Outputs for each target in the list being monitored, whether

the client is online or offline. All targets that are online will be sent using RPL_MONONLINE, all targets that are offline will be sent using RPL_MONOFFLINE.“ -- <https://ircv3.net/specs/extensions/monitor#monitor-s>

.sdd
testNickChange.sdd
testTwoMonitoringOneRemove
Tests the following scenario:
  • foo MONITORs qux

  • bar MONITORs qux

  • bar unMONITORs qux

  • qux connects.

.sdd
testUnmonitor.sdd

irctest.server_tests.multi_prefix.MultiPrefixTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testMultiPrefix
“When requested, the multi-prefix client capability will cause the

IRC server to send all possible prefixes which apply to a user in NAMES and WHO output.

These prefixes MUST be in order of ‘rank’, from highest to lowest.

..dd
testNoMultiPrefix

When not requested, only the highest prefix should be sent

..dd

irctest.server_tests.multiline.MultilineTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testBasicssdd
testBlankLinesssdd
testInvalidBatchTag
Test that an unexpected change of batch tag results in

FAIL BATCH MULTILINE_INVALID.

ssdd
testInvalidBlankConcatTag
Test that the concat tag on a blank message results in

FAIL BATCH MULTILINE_INVALID.

ssdd

irctest.server_tests.names.NamesTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testNames2812

https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.5

..dd
testNames2812Secret
The symbol sent for a secret channel is @ instead of =:

https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.5 https://modern.ircdocs.horse/#rplnamreply-353

..dd
testNamesInvalidChannel

"There is no error reply for bad channel names." -- https://datatracker.ietf.org/doc/html/rfc1459#section-4.2.5 -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.5

"If the channel name is invalid or the channel does not exist, one RPL_ENDOFNAMES numeric containing the given channel name should be returned." -- https://modern.ircdocs.horse/#names-message

..dd
testNamesModern

https://modern.ircdocs.horse/#names-message

..dd
testNamesMultipleChannels2812

https://modern.ircdocs.horse/#names-message https://datatracker.ietf.org/doc/html/rfc1459#section-4.2.5 https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.5

ssdd
testNamesNonexistingChannel

"There is no error reply for bad channel names." -- https://datatracker.ietf.org/doc/html/rfc1459#section-4.2.5 -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.5

"If the channel name is invalid or the channel does not exist, one RPL_ENDOFNAMES numeric containing the given channel name should be returned." -- https://modern.ircdocs.horse/#names-message

..dd

irctest.server_tests.part.PartTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testBasicPart..dd
testBasicPartRfc2812

“If a "Part Message" is given, this will be sent instead of the default message, the nickname.”

..dd
testPartMessage

“If a "Part Message" is given, this will be sent instead of the default message, the nickname.”

..dd
testPartNotInEmptyChannel
“442 ERR_NOTONCHANNEL

"<channel> :You're not on that channel"

According to RFCs, ERR_NOSUCHCHANNEL should only be used for invalid channel names: “403 ERR_NOSUCHCHANNEL

"<channel name> :No such channel"

  • Used to indicate the given channel name is invalid.”

-- <https://tools.ietf.org/html/rfc1459#section-6.1> and <https://tools.ietf.org/html/rfc2812#section-5.2>

However, many implementations use 479 instead, so let's allow it. <http://danieloaks.net/irc-defs/defs/ircnumerics.html#403> <http://danieloaks.net/irc-defs/defs/ircnumerics.html#479>

..dd
testPartNotInNonEmptyChannel
“442 ERR_NOTONCHANNEL

"<channel> :You're not on that channel"

According to RFCs, ERR_NOSUCHCHANNEL should only be used for invalid channel names: “403 ERR_NOSUCHCHANNEL

"<channel name> :No such channel"

  • Used to indicate the given channel name is invalid.”

-- <https://tools.ietf.org/html/rfc1459#section-6.1> and <https://tools.ietf.org/html/rfc2812#section-5.2>

However, many implementations use 479 instead, so let's allow it. <http://danieloaks.net/irc-defs/defs/ircnumerics.html#403> <http://danieloaks.net/irc-defs/defs/ircnumerics.html#479>

..dd

irctest.server_tests.pingpong.PingPongTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testPing

https://github.com/ircdocs/modern-irc/pull/99

..dd
testPingEmptyToken

https://github.com/ircdocs/modern-irc/pull/99

..dd
testPingNoToken

https://github.com/ircdocs/modern-irc/pull/99

..dd

irctest.server_tests.quit.ChannelQuitTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testQuit
“Once a user has joined a channel, he receives information about

all commands his server receives affecting the channel. This includes [...] QUIT” <https://tools.ietf.org/html/rfc2812#section-3.2.1>

..dd

irctest.server_tests.regressions.RegressionsTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testCaseChanges..dd
testEmptyNick..dd
testFailedNickChange..dd
testLabeledNick

InspIRCd up to 3.16.1 used the new nick as source of NICK changes

https://github.com/inspircd/inspircd/issues/2067

https://github.com/inspircd/inspircd/commit/83f01b36a11734fd91a4e7aad99c15463858fe4a

..dd
testNickRelease..dd
testNickReleaseQuit..dd
testStarNick..dd
testTagCapssdd

irctest.server_tests.sasl.RegistrationTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testRegistrationdd..

irctest.server_tests.sasl.SaslTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testMechanismNotAvailable
“If authentication fails, a 904 or 905 numeric will be sent”

-- <http://ircv3.net/specs/extensions/sasl-3.1.html#the-authenticate-command>

dd..
testPlain

PLAIN authentication with correct username/password.

dd..
testPlainFailure

PLAIN authentication with incorrect username/password.

dd..
testPlainLarge
Test the client splits large AUTHENTICATE messages whose payload

is not a multiple of 400. <http://ircv3.net/specs/extensions/sasl-3.1.html#the-authenticate-command>

dd.s
testPlainLargeEquals400
Test the client splits large AUTHENTICATE messages whose payload

is not a multiple of 400. <http://ircv3.net/specs/extensions/sasl-3.1.html#the-authenticate-command>

dd.s
testPlainNoAuthzid

“message = [authzid] UTF8NUL authcid UTF8NUL passwd

[…]

Upon receipt of the message, the server will verify the presented (in the message) authentication identity (authcid) and password (passwd) with the system authentication database, and it will verify that the authentication credentials permit the client to act as the (presented or derived) authorization identity (authzid). If both steps succeed, the user is authenticated.

[…]

When no authorization identity is provided, the server derives an authorization identity from the prepared representation of the provided authentication identity string. This ensures that the derivation of different representations of the authentication identity produces the same authorization identity.” -- <https://tools.ietf.org/html/rfc4616#section-2>

dd..
testPlainNonAsciidd..
testScramSha256Failureddss
testScramSha256Successddss

irctest.server_tests.setname.SetnameMessageTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testSetnameChannel
“[Servers] MUST send the server-to-client version of the

SETNAME message to all clients in common channels, as well as to the client from which it originated, to confirm the change has occurred.

The SETNAME message MUST NOT be sent to clients which do not have the setname capability negotiated.“

.sdd
testSetnameMessage.sdd

irctest.server_tests.statusmsg.StatusmsgTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testStatusmsgFromOp
Test that STATUSMSG are sent to the intended recipients,

with the intended prefixes.

..dd
testStatusmsgFromRegular
Test that STATUSMSG are sent to the intended recipients,

with the intended prefixes.

ssdd

irctest.server_tests.time.TimeTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testTime..dd

irctest.server_tests.topic.TopicPrivilegesTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testTopicPrivileges..dd

irctest.server_tests.topic.TopicTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testTopicMode
“Once a user has joined a channel, he receives information about

all commands his server receives affecting the channel. This includes […] TOPIC” -- <https://tools.ietf.org/html/rfc1459#section-4.2.1> and <https://tools.ietf.org/html/rfc2812#section-3.2.1>

..dd
testTopicModern
"If the topic of a channel is changed or cleared, every client in that

channel (including the author of the topic change) will receive a TOPIC command with the new topic as argument (or an empty argument if the topic was cleared) alerting them to how the topic has changed.

Clients joining the channel in the future will receive a RPL_TOPIC numeric (or lack thereof) accordingly." -- https://modern.ircdocs.horse/#topic-message

..dd
testTopicNonexistentChannel
RFC2812 specifies ERR_NOTONCHANNEL as the correct response to TOPIC

on a nonexistent channel. The modern spec prefers ERR_NOSUCHCHANNEL.

<https://tools.ietf.org/html/rfc2812#section-3.2.4> <http://modern.ircdocs.horse/#topic-message>

..dd
testTopicRfc
“Once a user has joined a channel, he receives information about

all commands his server receives affecting the channel. This includes […] TOPIC” -- <https://tools.ietf.org/html/rfc1459#section-4.2.1> and <https://tools.ietf.org/html/rfc2812#section-3.2.1>

..dd
testUnsetTopicResponses

Test various cases related to RPL_NOTOPIC with set and unset topics.

..dd

irctest.server_tests.utf8.Utf8TestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testNonutf8Realnamessdd
testNonutf8Usernamessdd
testUtf8Validationssdd

irctest.server_tests.wallops.WallopsTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testWallops

"The WALLOPS command is used to send a message to all currently connected users who have set the 'w' user mode for themselves." -- https://datatracker.ietf.org/doc/html/rfc2812#section-4.7 -- https://github.com/ircdocs/modern-irc/pull/118

"Servers MAY echo WALLOPS messages to their sender even if they don't have the 'w' user mode. Servers MAY send WALLOPS only to operators." -- https://github.com/ircdocs/modern-irc/pull/118

..dd
testWallopsPrivileges

https://github.com/ircdocs/modern-irc/pull/118

..dd

irctest.server_tests.who.WhoInvisibleTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testWhoInvisible..dd

irctest.server_tests.who.WhoServicesTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testWhoxAccountdd..
testWhoxNoAccountdd..

irctest.server_tests.who.WhoTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testWhoChan[casefolded]..dd
testWhoChan[exact]..dd
testWhoMultiChan

When WHO <#chan> is sent, the second parameter of RPL_WHOREPLY must be #chan. See discussion on Modern: <https://github.com/ircdocs/modern-irc/issues/209>

..dd
testWhoNickAwayAndOper[casefolded]..dd
testWhoNickAwayAndOper[exact]..dd
testWhoNickAwayAndOper[mask]..dd
testWhoNickAway[casefolded]..dd
testWhoNickAway[exact]..dd
testWhoNickAway[mask]..dd
testWhoNickNotExists

When WHO is sent with a non-existing nickname, the server must reply with a single RPL_ENDOFWHO. See: <https://github.com/ircdocs/modern-irc/pull/216>

..dd
testWhoNickOper[casefolded]..dd
testWhoNickOper[exact]..dd
testWhoNickOper[mask]..dd
testWhoNick[casefolded]..dd
testWhoNick[exact]..dd
testWhoNick[mask]..dd
testWhoRealNameSpacesssdd
testWhoStar..dd
testWhoUsernameRealName[hostname]ssdd
testWhoUsernameRealName[realname-mask]ssdd
testWhoUsernameRealName[username]ssdd
testWhoxFull

https://github.com/ircv3/ircv3-specifications/pull/482

..dd
testWhoxFullReversed

https://github.com/ircv3/ircv3-specifications/pull/482

..dd
testWhoxOneChar[a]..dd
testWhoxOneChar[c]..dd
testWhoxOneChar[d]..dd
testWhoxOneChar[f]..dd
testWhoxOneChar[h]..dd
testWhoxOneChar[i]..dd
testWhoxOneChar[l]..dd
testWhoxOneChar[n]..dd
testWhoxOneChar[o]..dd
testWhoxOneChar[r]..dd
testWhoxOneChar[s]..dd
testWhoxOneChar[u]..dd
testWhoxToken

https://github.com/ircv3/ircv3-specifications/pull/482

..dd

irctest.server_tests.whois.ServicesWhoisTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testWhoisAccount

Test numeric 330, RPL_WHOISACCOUNT.

<https://defs.ircdocs.horse/defs/numerics.html#rpl-whoisaccount-330>

dd..
testWhoisNumerics[normal]
Tests all numerics are in the exhaustive list defined in the Modern spec,

on an authenticated user.

<https://modern.ircdocs.horse/#whois-message>

dd..
testWhoisNumerics[oper]
Tests all numerics are in the exhaustive list defined in the Modern spec,

on an authenticated user.

<https://modern.ircdocs.horse/#whois-message>

dd..

irctest.server_tests.whois.WhoisTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testWhoisMissingUser

Test WHOIS on a nonexistent nickname.

..dd
testWhoisNumerics[away]

Tests all numerics are in the exhaustive list defined in the Modern spec.

<https://modern.ircdocs.horse/#whois-message>

..dd
testWhoisNumerics[normal]

Tests all numerics are in the exhaustive list defined in the Modern spec.

<https://modern.ircdocs.horse/#whois-message>

..dd
testWhoisNumerics[oper]

Tests all numerics are in the exhaustive list defined in the Modern spec.

<https://modern.ircdocs.horse/#whois-message>

..dd
testWhoisUser[no-target]

Test basic WHOIS behavior

..dd
testWhoisUser[target-nick]

Test basic WHOIS behavior

..dd
testWhoisUser[target_server]

Test basic WHOIS behavior

..dd

irctest.server_tests.whowas.WhowasTestCase

unrealircd
unrealircd-5
unrealircd-anope
unrealircd-atheme
testWhowasCount1

"If there are multiple entries, up to <count> replies will be returned" -- https://datatracker.ietf.org/doc/html/rfc1459#section-4.5.3 -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.6.3 -- https://modern.ircdocs.horse/#whowas-message

..dd
testWhowasCount2

"If there are multiple entries, up to <count> replies will be returned" -- https://datatracker.ietf.org/doc/html/rfc1459#section-4.5.3 -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.6.3 -- https://modern.ircdocs.horse/#whowas-message

..dd
testWhowasCountNegative

"If a non-positive number is passed as being <count>, then a full search is done." -- https://datatracker.ietf.org/doc/html/rfc1459#section-4.5.3 -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.6.3

"If given, <count> SHOULD be a positive number. Otherwise, a full search "is done. -- https://modern.ircdocs.horse/#whowas-message

..dd
testWhowasCountZero

"If a non-positive number is passed as being <count>, then a full search is done." -- https://datatracker.ietf.org/doc/html/rfc1459#section-4.5.3 -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.6.3

"If given, <count> SHOULD be a positive number. Otherwise, a full search "is done. -- https://modern.ircdocs.horse/#whowas-message

..dd
testWhowasEnd

"At the end of all reply batches, there must be RPL_ENDOFWHOWAS" -- https://datatracker.ietf.org/doc/html/rfc1459#page-50 -- https://datatracker.ietf.org/doc/html/rfc2812#page-45

"Servers MUST reply with either ERR_WASNOSUCHNICK or [...], both followed with RPL_ENDOFWHOWAS" -- https://modern.ircdocs.horse/#whowas-message

..dd
testWhowasMultiTarget[nick2,nick3]

https://datatracker.ietf.org/doc/html/rfc2812#section-3.6.3

ssdd
testWhowasMultiTarget[nick3,nick2]

https://datatracker.ietf.org/doc/html/rfc2812#section-3.6.3

ssdd
testWhowasMultiple

"The history is searched backward, returning the most recent entry first." -- https://datatracker.ietf.org/doc/html/rfc1459#section-4.5.3 -- https://datatracker.ietf.org/doc/html/rfc2812#section-3.6.3 -- https://modern.ircdocs.horse/#whowas-message

..dd
testWhowasNoParamModern

"If the <nick> argument is missing, they SHOULD send a single reply, using either ERR_NONICKNAMEGIVEN or ERR_NEEDMOREPARAMS" -- https://modern.ircdocs.horse/#whowas-message

..dd
testWhowasNoSuchNick

https://datatracker.ietf.org/doc/html/rfc1459#section-4.5.3 https://datatracker.ietf.org/doc/html/rfc2812#section-3.6.3 -- https://modern.ircdocs.horse/#whowas-message

and:

"At the end of all reply batches, there must be RPL_ENDOFWHOWAS (even if there was only one reply and it was an error)." -- https://datatracker.ietf.org/doc/html/rfc1459#page-50 -- https://datatracker.ietf.org/doc/html/rfc2812#page-45

and:

"Servers MUST reply with either ERR_WASNOSUCHNICK or [...], both followed with RPL_ENDOFWHOWAS" -- https://modern.ircdocs.horse/#whowas-message

..dd
testWhowasNumerics

https://datatracker.ietf.org/doc/html/rfc1459#section-4.5.3 https://datatracker.ietf.org/doc/html/rfc2812#section-3.6.3

..dd