summaryrefslogtreecommitdiff
path: root/examples/server/tests/features/environment.py
diff options
context:
space:
mode:
authorPierrick Hymbert <pierrick.hymbert@gmail.com>2024-03-10 18:17:47 +0100
committerGitHub <noreply@github.com>2024-03-10 18:17:47 +0100
commitfa8a809a9119411bc9c3f00026550d0343f4d9b7 (patch)
tree6d6aae44c749154309b257f0bafdb3f36159f71c /examples/server/tests/features/environment.py
parentbcebd7dbf62fd7b293d5ed089023e4e733269c71 (diff)
server: ci: windows build and tests (#5968)
* server: ci: windows build and tests * server: ci: remove tmp push branch * server: ci: EOF EOL * Use builti Co-authored-by: Jared Van Bortel <cebtenzzre@gmail.com> * server: tests: server graceful shutdown, then kill, then hard kill * server: tests: remove python2 unicode string * server: tests: remove wrong comment on server starting, close_fds is always true * server: tests: server kill, if pid exists * server: tests: remove dependency to killall * server: tests: ci windows: pid exists better handling --------- Co-authored-by: Jared Van Bortel <cebtenzzre@gmail.com>
Diffstat (limited to 'examples/server/tests/features/environment.py')
-rw-r--r--examples/server/tests/features/environment.py66
1 files changed, 47 insertions, 19 deletions
diff --git a/examples/server/tests/features/environment.py b/examples/server/tests/features/environment.py
index 9fd330db..8ad987e1 100644
--- a/examples/server/tests/features/environment.py
+++ b/examples/server/tests/features/environment.py
@@ -1,9 +1,10 @@
+import errno
import os
import socket
import subprocess
import time
from contextlib import closing
-from signal import SIGKILL
+import signal
def before_scenario(context, scenario):
@@ -29,44 +30,71 @@ def after_scenario(context, scenario):
for line in f:
print(line)
if not is_server_listening(context.server_fqdn, context.server_port):
- print("\x1b[33;101mERROR: Server stopped listening\x1b[0m")
+ print("\x1b[33;101mERROR: Server stopped listening\x1b[0m\n")
if not pid_exists(context.server_process.pid):
assert False, f"Server not running pid={context.server_process.pid} ..."
- print(f"stopping server pid={context.server_process.pid} ...")
- context.server_process.kill()
+ server_graceful_shutdown(context)
+
# Wait few for socket to free up
time.sleep(0.05)
attempts = 0
- while is_server_listening(context.server_fqdn, context.server_port):
- print(f"stopping server pid={context.server_process.pid} ...")
- os.kill(context.server_process.pid, SIGKILL)
+ while pid_exists(context.server_process.pid) or is_server_listening(context.server_fqdn, context.server_port):
+ server_kill(context)
time.sleep(0.1)
attempts += 1
if attempts > 5:
- print(f"Server dangling exits, killing all {context.server_path} ...")
- process = subprocess.run(['killall', '-9', context.server_path],
- stderr=subprocess.PIPE,
- universal_newlines=True)
- print(process)
+ server_kill_hard(context)
+
+
+def server_graceful_shutdown(context):
+ print(f"shutting down server pid={context.server_process.pid} ...\n")
+ if os.name == 'nt':
+ os.kill(context.server_process.pid, signal.CTRL_C_EVENT)
+ else:
+ os.kill(context.server_process.pid, signal.SIGINT)
+
+
+def server_kill(context):
+ print(f"killing server pid={context.server_process.pid} ...\n")
+ context.server_process.kill()
+
+
+def server_kill_hard(context):
+ pid = context.server_process.pid
+ path = context.server_path
+
+ print(f"Server dangling exits, hard killing force {pid}={path}...\n")
+ if os.name == 'nt':
+ process = subprocess.check_output(['taskkill', '/F', '/pid', str(pid)]).decode()
+ print(process)
+ else:
+ os.kill(-pid, signal.SIGKILL)
def is_server_listening(server_fqdn, server_port):
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
result = sock.connect_ex((server_fqdn, server_port))
- return result == 0
+ _is_server_listening = result == 0
+ if _is_server_listening:
+ print(f"server is listening on {server_fqdn}:{server_port}...\n")
+ return _is_server_listening
def pid_exists(pid):
"""Check whether pid exists in the current process table."""
- import errno
if pid < 0:
return False
- try:
- os.kill(pid, 0)
- except OSError as e:
- return e.errno == errno.EPERM
+ if os.name == 'nt':
+ output = subprocess.check_output(['TASKLIST', '/FI', f'pid eq {pid}']).decode()
+ print(output)
+ return "No tasks are running" not in output
else:
- return True
+ try:
+ os.kill(pid, 0)
+ except OSError as e:
+ return e.errno == errno.EPERM
+ else:
+ return True