irctest/irctest/server_tests/test_znc_playback.py

219 lines
7.1 KiB
Python
Raw Normal View History

2020-02-28 04:00:37 +00:00
import time
from irctest import cases
from irctest.irc_utils.junkdrawer import ircv3_timestamp_to_unixtime
from irctest.irc_utils.junkdrawer import to_history_message
2020-10-21 15:08:14 +00:00
from irctest.irc_utils.junkdrawer import random_name
2020-02-28 04:00:37 +00:00
2020-07-24 03:13:17 +00:00
def extract_playback_privmsgs(messages):
# convert the output of a playback command, drop the echo message
result = []
for msg in messages:
2021-02-22 18:02:13 +00:00
if msg.command == "PRIVMSG" and msg.params[0].lower() != "*playback":
2020-07-24 03:13:17 +00:00
result.append(to_history_message(msg))
return result
2020-02-28 04:00:37 +00:00
class ZncPlaybackTestCase(cases.BaseServerTestCase):
@staticmethod
def config():
return {
"chathistory": True,
}
2021-02-22 18:02:13 +00:00
@cases.SpecificationSelector.requiredBySpecification("Oragono")
2020-02-28 04:00:37 +00:00
def testZncPlayback(self):
2020-02-28 04:52:55 +00:00
early_time = int(time.time() - 60)
2021-02-22 18:02:13 +00:00
chname = random_name("#znc_channel")
bar, pw = random_name("bar"), random_name("pass")
2020-07-06 08:07:21 +00:00
self.controller.registerUser(self, bar, pw)
2021-02-22 18:02:13 +00:00
self.connectClient(
bar,
name=bar,
capabilities=[
"batch",
"labeled-response",
"message-tags",
"server-time",
"echo-message",
],
password=pw,
)
2020-02-28 04:00:37 +00:00
self.joinChannel(bar, chname)
2021-02-22 18:02:13 +00:00
qux = random_name("qux")
self.connectClient(
qux,
name=qux,
capabilities=[
"batch",
"labeled-response",
"message-tags",
"server-time",
"echo-message",
],
)
2020-02-28 04:00:37 +00:00
self.joinChannel(qux, chname)
2021-02-22 18:02:13 +00:00
self.sendLine(qux, "PRIVMSG %s :hi there" % (bar,))
dm = to_history_message(
[msg for msg in self.getMessages(qux) if msg.command == "PRIVMSG"][0]
)
self.assertEqual(dm.text, "hi there")
2020-02-28 04:00:37 +00:00
NUM_MESSAGES = 10
echo_messages = []
for i in range(NUM_MESSAGES):
2021-02-22 18:02:13 +00:00
self.sendLine(qux, "PRIVMSG %s :this is message %d" % (chname, i))
echo_messages.extend(
to_history_message(msg)
for msg in self.getMessages(qux)
if msg.command == "PRIVMSG"
)
2020-02-28 04:00:37 +00:00
time.sleep(0.003)
self.assertEqual(len(echo_messages), NUM_MESSAGES)
self.getMessages(bar)
# reattach to 'bar'
2021-02-22 18:02:13 +00:00
self.connectClient(
bar,
name="viewer",
capabilities=[
"batch",
"labeled-response",
"message-tags",
"server-time",
"echo-message",
],
password=pw,
)
self.sendLine("viewer", "PRIVMSG *playback :play * %d" % (early_time,))
messages = extract_playback_privmsgs(self.getMessages("viewer"))
2020-02-28 04:00:37 +00:00
self.assertEqual(set(messages), set([dm] + echo_messages))
2021-02-22 18:02:13 +00:00
self.sendLine("viewer", "QUIT")
self.assertDisconnected("viewer")
2020-02-28 04:00:37 +00:00
# reattach to 'bar', play back selectively
2021-02-22 18:02:13 +00:00
self.connectClient(
bar,
name="viewer",
capabilities=[
"batch",
"labeled-response",
"message-tags",
"server-time",
"echo-message",
],
password=pw,
)
2020-02-28 04:00:37 +00:00
mid_timestamp = ircv3_timestamp_to_unixtime(echo_messages[5].time)
# exclude message 5 itself (oragono's CHATHISTORY implementation corrects for this, but znc.in/playback does not because whatever)
2021-02-22 18:02:13 +00:00
mid_timestamp += 0.001
self.sendLine("viewer", "PRIVMSG *playback :play * %s" % (mid_timestamp,))
messages = extract_playback_privmsgs(self.getMessages("viewer"))
2020-02-28 04:00:37 +00:00
self.assertEqual(messages, echo_messages[6:])
2021-02-22 18:02:13 +00:00
self.sendLine("viewer", "QUIT")
self.assertDisconnected("viewer")
2020-02-28 04:00:37 +00:00
# reattach to 'bar', play back selectively (pass a parameter and 2 timestamps)
2021-02-22 18:02:13 +00:00
self.connectClient(
bar,
name="viewer",
capabilities=[
"batch",
"labeled-response",
"message-tags",
"server-time",
"echo-message",
],
password=pw,
)
2020-02-28 04:00:37 +00:00
start_timestamp = ircv3_timestamp_to_unixtime(echo_messages[2].time)
2021-02-22 18:02:13 +00:00
start_timestamp += 0.001
2020-02-28 04:00:37 +00:00
end_timestamp = ircv3_timestamp_to_unixtime(echo_messages[7].time)
2021-02-22 18:02:13 +00:00
self.sendLine(
"viewer",
"PRIVMSG *playback :play %s %s %s"
% (
chname,
start_timestamp,
end_timestamp,
),
)
messages = extract_playback_privmsgs(self.getMessages("viewer"))
2020-02-28 04:00:37 +00:00
self.assertEqual(messages, echo_messages[3:7])
2020-02-28 04:52:55 +00:00
# test nicknames as targets
2021-02-22 18:02:13 +00:00
self.sendLine(
"viewer",
"PRIVMSG *playback :play %s %d"
% (
qux,
early_time,
),
)
messages = extract_playback_privmsgs(self.getMessages("viewer"))
2020-02-28 04:52:55 +00:00
self.assertEqual(messages, [dm])
2021-02-22 18:02:13 +00:00
self.sendLine(
"viewer",
"PRIVMSG *playback :play %s %d"
% (
qux.upper(),
early_time,
),
)
messages = extract_playback_privmsgs(self.getMessages("viewer"))
2020-02-28 08:52:35 +00:00
self.assertEqual(messages, [dm])
2021-02-22 18:02:13 +00:00
self.sendLine("viewer", "QUIT")
self.assertDisconnected("viewer")
2020-02-28 04:00:37 +00:00
2020-07-23 00:41:30 +00:00
# test 2-argument form
2021-02-22 18:02:13 +00:00
self.connectClient(
bar,
name="viewer",
capabilities=[
"batch",
"labeled-response",
"message-tags",
"server-time",
"echo-message",
],
password=pw,
)
self.sendLine("viewer", "PRIVMSG *playback :play %s" % (chname,))
messages = extract_playback_privmsgs(self.getMessages("viewer"))
2020-07-23 00:41:30 +00:00
self.assertEqual(messages, echo_messages)
2021-02-22 18:02:13 +00:00
self.sendLine("viewer", "PRIVMSG *playback :play *self")
messages = extract_playback_privmsgs(self.getMessages("viewer"))
2020-07-23 00:41:30 +00:00
self.assertEqual(messages, [dm])
2021-02-22 18:02:13 +00:00
self.sendLine("viewer", "PRIVMSG *playback :play *")
messages = extract_playback_privmsgs(self.getMessages("viewer"))
2020-07-23 00:41:30 +00:00
self.assertEqual(set(messages), set([dm] + echo_messages))
2021-02-22 18:02:13 +00:00
self.sendLine("viewer", "QUIT")
self.assertDisconnected("viewer")
2020-07-23 00:41:30 +00:00
2020-02-28 04:00:37 +00:00
# test limiting behavior
config = self.controller.getConfig()
2021-02-22 18:02:13 +00:00
config["history"]["znc-maxmessages"] = 5
2020-02-28 04:00:37 +00:00
self.controller.rehash(self, config)
2021-02-22 18:02:13 +00:00
self.connectClient(
bar,
name="viewer",
capabilities=[
"batch",
"labeled-response",
"message-tags",
"server-time",
"echo-message",
],
password=pw,
)
self.sendLine(
"viewer", "PRIVMSG *playback :play %s %d" % (chname, int(time.time() - 60))
)
messages = extract_playback_privmsgs(self.getMessages("viewer"))
2020-02-28 04:00:37 +00:00
# should receive the latest 5 messages
self.assertEqual(messages, echo_messages[5:])