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

Reply via email to