summaryrefslogtreecommitdiff
path: root/examples/server/tests/features/environment.py
diff options
context:
space:
mode:
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