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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]