From 696db1f5a010e99fe53a110f286ec22fe51bb8a4 Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Sun, 8 Dec 2024 21:15:17 +0100 Subject: [PATCH] Wait for sable_history to be up --- .github/workflows/test-stable.yml | 2 +- irctest/basecontrollers.py | 1 + irctest/controllers/sable.py | 64 ++++++++++++++++++++++++++++++- workflows.yml | 2 +- 4 files changed, 66 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-stable.yml b/.github/workflows/test-stable.yml index b4e97334..9bc70d6a 100644 --- a/.github/workflows/test-stable.yml +++ b/.github/workflows/test-stable.yml @@ -1140,7 +1140,7 @@ jobs: uses: actions/checkout@v4 with: path: sable - ref: 0576ef4e572a973d577536875526897d43dc37a3 + ref: 034c4d5dd937774099773238d8d5b8054b015607 repository: Libera-Chat/sable - name: Install rust toolchain uses: actions-rs/toolchain@v1 diff --git a/irctest/basecontrollers.py b/irctest/basecontrollers.py index 58a1afb9..a7036d0f 100644 --- a/irctest/basecontrollers.py +++ b/irctest/basecontrollers.py @@ -316,6 +316,7 @@ class BaseServerController(_BaseController): def __init__(self, *args: Any, **kwargs: Any): super().__init__(*args, **kwargs) self.faketime_enabled = False + self.services_controller = None def run( self, diff --git a/irctest/controllers/sable.py b/irctest/controllers/sable.py index eb28be29..18ec3b68 100644 --- a/irctest/controllers/sable.py +++ b/irctest/controllers/sable.py @@ -5,7 +5,8 @@ import subprocess import tempfile import time -from typing import Optional, Sequence, Type +import threading +from typing import Any, Optional, Sequence, Type from irctest.basecontrollers import ( BaseServerController, @@ -372,6 +373,12 @@ class SableController(BaseServerController, DirectoryBasedController): """Sable processes commands very quickly, but responses for commands changing the state may be sent after later commands for messages which don't.""" + history_controller: Optional[BaseServicesController] = None + + def __init__(self, *args: Any, **kwargs: Any): + super().__init__(*args, **kwargs) + self.history_controller = None + def run( self, hostname: str, @@ -548,6 +555,19 @@ def registerUser( case.sendLine(client, "QUIT") case.assertDisconnected(client) + def wait_for_services(self) -> None: + # FIXME: this isn't called when sable_history is enabled but sable_services + # isn't. This doesn't happen with the existing tests so this isn't an issue yet + if self.services_controller is not None: + t1 = threading.Thread(target=self.services_controller.wait_for_services) + t1.start() + if self.history_controller is not None: + t2 = threading.Thread(target=self.history_controller.wait_for_services) + t2.start() + t2.join() + if self.services_controller is not None: + t1.join() + class SableServicesController(BaseServicesController): server_controller: SableController @@ -660,6 +680,48 @@ def run(self, protocol: str, server_hostname: str, server_port: int) -> None: ) self.pgroup_id = os.getpgid(self.proc.pid) + def wait_for_services(self) -> None: + """Overrides the default implementation, as it relies on + ``PRIVMSG NickServ: HELP``, which always succeeds on Sable. + + Instead, this relies on SASL PLAIN availability.""" + if self.services_up: + # Don't check again if they are already available + return + self.server_controller.wait_for_port() + + c = ClientMock(name="chkHist", show_io=True) + c.connect(self.server_controller.hostname, self.server_controller.port) + c.sendLine("NICK chkHist") + c.sendLine("USER chk chk chk chk") + time.sleep(self.server_controller.sync_sleep_time) + got_end_of_motd = False + while not got_end_of_motd: + for msg in c.getMessages(synchronize=False): + if msg.command == "PING": + c.sendLine("PONG :" + msg.params[0]) + if msg.command in ("376", "422"): # RPL_ENDOFMOTD / ERR_NOMOTD + got_end_of_motd = True + + def wait(): + timeout = time.time() + 10 + while time.time() < timeout: + c.sendLine("LINKS") + time.sleep(self.server_controller.sync_sleep_time) + for msg in c.getMessages(synchronize=False): + if msg.command == "364": # RPL_LINKS + if msg.params[2] == "My.Little.History": + return + + raise Exception("History server is not available") + + wait() + + c.sendLine("QUIT") + c.getMessages() + c.disconnect() + self.services_up = True + def kill_proc(self) -> None: os.killpg(self.pgroup_id, signal.SIGKILL) super().kill_proc() diff --git a/workflows.yml b/workflows.yml index 766722b5..e3eaedb3 100644 --- a/workflows.yml +++ b/workflows.yml @@ -249,7 +249,7 @@ software: name: Sable repository: Libera-Chat/sable refs: - stable: 0576ef4e572a973d577536875526897d43dc37a3 + stable: 034c4d5dd937774099773238d8d5b8054b015607 release: null devel: master devel_release: null