diff --git a/irctest/basecontrollers.py b/irctest/basecontrollers.py index 82764d7..aa43f0c 100644 --- a/irctest/basecontrollers.py +++ b/irctest/basecontrollers.py @@ -58,16 +58,16 @@ class BaseClientController(_BaseController): class BaseServerController(_BaseController): """Base controller for IRC server.""" + port_open = False def run(self, hostname, port, password, valid_metadata_keys, invalid_metadata_keys): raise NotImplementedError() def registerUser(self, case, username, password=None): raise NotImplementedByController('registration') - def wait_for_port(self, proc, port): - port_open = False - while not port_open: + def wait_for_port(self): + while not self.port_open: time.sleep(0.1) - for conn in psutil.Process(proc.pid).connections(): - if conn.laddr[1] == port: - port_open = True + for conn in psutil.Process(self.proc.pid).connections(): + if conn.laddr[1] == self.port: + self.port_open = True diff --git a/irctest/cases.py b/irctest/cases.py index 0cab66e..273978a 100644 --- a/irctest/cases.py +++ b/irctest/cases.py @@ -235,6 +235,7 @@ class BaseServerTestCase(_IrcTestCase): def addClient(self, name=None, show_io=None): """Connects a client to the server and adds it to the dict. If 'name' is not given, uses the lowest unused non-negative integer.""" + self.controller.wait_for_port() if not name: name = max(map(int, list(self.clients)+[0]))+1 show_io = show_io if show_io is not None else self.show_io diff --git a/irctest/controllers/charybdis.py b/irctest/controllers/charybdis.py index 3338caf..668df01 100644 --- a/irctest/controllers/charybdis.py +++ b/irctest/controllers/charybdis.py @@ -47,6 +47,7 @@ class CharybdisController(BaseServerController, DirectoryBasedController): 'Defining valid and invalid METADATA keys.') assert self.proc is None self.create_config() + self.port = port password_field = 'password = "{}";'.format(password) if password else '' with self.open_file('server.conf') as fd: fd.write(TEMPLATE_CONFIG.format( @@ -60,7 +61,6 @@ class CharybdisController(BaseServerController, DirectoryBasedController): ], stderr=subprocess.DEVNULL ) - self.wait_for_port(self.proc, port) def get_irctest_controller_class(): diff --git a/irctest/controllers/inspircd.py b/irctest/controllers/inspircd.py index d2d5ee4..6283803 100644 --- a/irctest/controllers/inspircd.py +++ b/irctest/controllers/inspircd.py @@ -5,6 +5,7 @@ import tempfile import subprocess from irctest import authentication +from irctest.basecontrollers import NotImplementedByController from irctest.basecontrollers import BaseServerController, DirectoryBasedController TEMPLATE_CONFIG = """ @@ -33,6 +34,7 @@ class InspircdController(BaseServerController, DirectoryBasedController): raise NotImplementedByController( 'Defining valid and invalid METADATA keys.') assert self.proc is None + self.port = port self.create_config() password_field = 'password="{}"'.format(password) if password else '' with self.open_file('server.conf') as fd: @@ -45,7 +47,6 @@ class InspircdController(BaseServerController, DirectoryBasedController): os.path.join(self.directory, 'server.conf')], stdout=subprocess.DEVNULL ) - self.wait_for_port(self.proc, port) def get_irctest_controller_class(): return InspircdController diff --git a/irctest/controllers/mammon.py b/irctest/controllers/mammon.py index b5d61c4..7a80b8a 100644 --- a/irctest/controllers/mammon.py +++ b/irctest/controllers/mammon.py @@ -80,6 +80,7 @@ class MammonController(BaseServerController, DirectoryBasedController): if password is not None: raise NotImplementedByController('PASS command') assert self.proc is None + self.port = port self.create_config() with self.open_file('server.yml') as fd: fd.write(TEMPLATE_CONFIG.format( @@ -93,7 +94,6 @@ class MammonController(BaseServerController, DirectoryBasedController): # print(fd.read()) self.proc = subprocess.Popen(['mammond', '--nofork', #'--debug', '--config', os.path.join(self.directory, 'server.yml')]) - self.wait_for_port(self.proc, port) def registerUser(self, case, username, password=None): # XXX: Move this somewhere else when