This is an automated email from the ASF dual-hosted git repository. jdanek pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
The following commit(s) were added to refs/heads/main by this push: new 13e7c6c DISPATCH-2246 Use port 0 in systemtests when starting TCP_echo_server, then query for actual port (#1365) 13e7c6c is described below commit 13e7c6ce049d5ebcad2f138e794df066b56080aa Author: Jiri Daněk <jda...@redhat.com> AuthorDate: Tue Sep 14 18:04:02 2021 +0200 DISPATCH-2246 Use port 0 in systemtests when starting TCP_echo_server, then query for actual port (#1365) --- tests/TCP_echo_server.py | 30 ++++++++++++++++++++++++++---- tests/system_tests_tcp_adaptor.py | 21 +++++++++------------ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/tests/TCP_echo_server.py b/tests/TCP_echo_server.py index 696af12..9866183 100755 --- a/tests/TCP_echo_server.py +++ b/tests/TCP_echo_server.py @@ -26,7 +26,8 @@ import socket import sys import time import traceback -from threading import Thread +from threading import Condition, Thread +from typing import Union from system_test import Logger from system_test import TIMEOUT @@ -81,7 +82,7 @@ def split_chunk_for_display(raw_bytes): class TcpEchoServer: - def __init__(self, prefix="ECHO_SERVER", port="0", echo_count=0, timeout=0.0, logger=None, + def __init__(self, prefix="ECHO_SERVER", port: Union[str, int] = "0", echo_count=0, timeout=0.0, logger=None, conn_stall=0.0, close_on_conn=False, close_on_data=False): """ Start echo server in separate thread @@ -104,13 +105,30 @@ class TcpEchoServer: self.close_on_data = close_on_data self.keep_running = True self.HOST = '127.0.0.1' - self.is_running = False + self._cv = Condition() + self._is_running = None self.exit_status = None self.error = None self._thread = Thread(target=self.run) self._thread.daemon = True self._thread.start() + @property + def is_running(self): + with self._cv: + self._cv.wait_for(lambda: self._is_running is not None, timeout=10) + return self._is_running + + @is_running.setter + def is_running(self, value): + with self._cv: + self._is_running = value + self._cv.notify_all() + + def get_listening_port(self) -> int: + address, port, *_ = self.sock.getsockname() + return port + def run(self): """ Run server in daemon thread. @@ -122,7 +140,6 @@ class TcpEchoServer: """ try: # set up spontaneous exit settings - self.is_running = True start_time = time.time() total_echoed = 0 @@ -131,6 +148,8 @@ class TcpEchoServer: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.bind((self.HOST, self.port)) self.sock.listen() + if self.port == 0: + self.port = self.get_listening_port() self.sock.setblocking(False) self.logger.log('%s Listening on host:%s, port:%s' % (self.prefix, self.HOST, self.port)) except Exception: @@ -139,6 +158,9 @@ class TcpEchoServer: self.logger.log(self.error) return 1 + # notify whoever is waiting on the condition variable for this + self.is_running = True + # set up selector sel = selectors.DefaultSelector() sel.register(self.sock, selectors.EVENT_READ, data=None) diff --git a/tests/system_tests_tcp_adaptor.py b/tests/system_tests_tcp_adaptor.py index fe26dd4..fb2e186 100644 --- a/tests/system_tests_tcp_adaptor.py +++ b/tests/system_tests_tcp_adaptor.py @@ -331,12 +331,7 @@ class TcpAdaptor(TestCase): # Write a dummy log line for scraper. cls.logger.log("SERVER (info) Container Name: TCP_TEST") - # Allocate echo server ports first - for rtr in cls.router_order: - cls.tcp_server_listener_ports[rtr] = cls.tester.get_port() - - # start echo servers immediately after the echo server - # ports are assigned. + # Start echo servers first, store their listening port numbers parent_path = os.path.dirname(os.getcwd()) for rtr in cls.router_order: test_name = "TcpAdaptor" @@ -347,12 +342,12 @@ class TcpAdaptor(TestCase): ofilename=os.path.join(parent_path, "setUpClass/TcpAdaptor_echo_server_%s.log" % rtr)) cls.logger.log("TCP_TEST Launching echo server '%s'" % server_prefix) server = TcpEchoServer(prefix=server_prefix, - port=cls.tcp_server_listener_ports[rtr], + port=0, logger=server_logger) assert server.is_running + cls.tcp_server_listener_ports[rtr] = server.port cls.echo_servers[rtr] = server - cls.EC2_conn_stall_connector_port = cls.tester.get_port() # start special naughty servers that misbehave on purpose server_prefix = "ECHO_SERVER TcpAdaptor NS_EC2_CONN_STALL" server_logger = Logger(title="TcpAdaptor", @@ -361,10 +356,11 @@ class TcpAdaptor(TestCase): ofilename=os.path.join(parent_path, "setUpClass/TcpAdaptor_echo_server_NS_CONN_STALL.log")) cls.logger.log("TCP_TEST Launching echo server '%s'" % server_prefix) server = TcpEchoServer(prefix=server_prefix, - port=cls.EC2_conn_stall_connector_port, + port=0, logger=server_logger, conn_stall=Q2_DELAY_SECONDS) assert server.is_running + cls.EC2_conn_stall_connector_port = server.port cls.echo_server_NS_CONN_STALL = server # Allocate a sea of router ports @@ -992,8 +988,6 @@ class TcpAdaptorManagementTest(TestCase): if DISABLE_SELECTOR_TESTS: return - cls.tcp_server_port = cls.tester.get_port() - cls.tcp_listener_port = cls.tester.get_port() cls.test_name = 'TCPMgmtTest' # Here we have a simple barebones standalone router config. @@ -1015,11 +1009,14 @@ class TcpAdaptorManagementTest(TestCase): save_for_dump=False, ofilename=os.path.join(parent_path, "setUpClass/TcpAdaptor_echo_server.log")) cls.echo_server = TcpEchoServer(prefix=server_prefix, - port=cls.tcp_server_port, + port=0, logger=cls.logger) # The router and the echo server are running at this point. assert cls.echo_server.is_running + cls.tcp_server_port = cls.echo_server.port + cls.tcp_listener_port = cls.tester.get_port() + @unittest.skipIf(DISABLE_SELECTOR_TESTS, DISABLE_SELECTOR_REASON) def test_01_mgmt(self): """ --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org