fail faster in integration test (#1493)
This commit is contained in:
parent
95b6ff4e04
commit
f9be9d679a
@ -10,11 +10,20 @@ export PYTHONUNBUFFERED=1
|
|||||||
# Start the server in the background
|
# Start the server in the background
|
||||||
reflex run --loglevel debug --env "$2" & pid=$!
|
reflex run --loglevel debug --env "$2" & pid=$!
|
||||||
|
|
||||||
# TODO does this even work on windows? Not clear, possibly not impactful though.
|
# Within the context of this bash, $pid_in_bash is what we need to pass to "kill" on exit
|
||||||
trap "kill -INT $pid ||:" EXIT
|
# This is true on all platforms.
|
||||||
|
pid_in_bash=$pid
|
||||||
|
trap "kill -INT $pid_in_bash ||:" EXIT
|
||||||
|
|
||||||
echo "Started server with PID $pid"
|
echo "Started server with PID $pid"
|
||||||
|
|
||||||
# Assume we run from the root of the repo
|
# Assume we run from the root of the repo
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
# In Windows, our Python script below needs to work with the WINPID
|
||||||
|
if [ -f /proc/$pid/winpid ]; then
|
||||||
|
pid=$(cat /proc/$pid/winpid)
|
||||||
|
echo "Windows detected, passing winpid $pid to port waiter"
|
||||||
|
fi
|
||||||
|
|
||||||
python scripts/wait_for_listening_port.py 3000 8000 --timeout=600 --server-pid "$pid"
|
python scripts/wait_for_listening_port.py 3000 8000 --timeout=600 --server-pid "$pid"
|
@ -7,21 +7,36 @@ import argparse
|
|||||||
import socket
|
import socket
|
||||||
import time
|
import time
|
||||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||||
|
from typing import Tuple
|
||||||
|
|
||||||
|
# psutil is already a dependency of Reflex itself - so it's OK to use
|
||||||
|
import psutil
|
||||||
|
|
||||||
|
|
||||||
def _wait_for_port(port, server_pid, timeout):
|
def _pid_exists(pid):
|
||||||
|
# os.kill(pid, 0) doesn't work on Windows (actually kills the PID)
|
||||||
|
# psutil.pid_exists() doesn't work on Windows (does os.kill underneath)
|
||||||
|
# psutil.pids() seems to return the right thing. Inefficient but doesn't matter - keeps things simple.
|
||||||
|
#
|
||||||
|
# Note: For windows, the pid here is really the "winpid".
|
||||||
|
return pid in psutil.pids()
|
||||||
|
|
||||||
|
|
||||||
|
def _wait_for_port(port, server_pid, timeout) -> Tuple[bool, str]:
|
||||||
start = time.time()
|
start = time.time()
|
||||||
print(f"Waiting for up to {timeout} seconds for port {port} to start listening.")
|
print(f"Waiting for up to {timeout} seconds for port {port} to start listening.")
|
||||||
while True:
|
while True:
|
||||||
# TODO fail early if server pid not there
|
if not _pid_exists(server_pid):
|
||||||
|
return False, f"Server PID {server_pid} is not running."
|
||||||
try:
|
try:
|
||||||
socket.create_connection(("localhost", port), timeout=0.5)
|
socket.create_connection(("localhost", port), timeout=0.5)
|
||||||
print(f"OK! Port {port} is listening after {time.time() - start} seconds")
|
return True, f"Port {port} is listening after {time.time() - start} seconds"
|
||||||
return True
|
|
||||||
except Exception:
|
except Exception:
|
||||||
if time.time() - start > timeout:
|
if time.time() - start > timeout:
|
||||||
print(f"FAIL: Port {port} still not listening after {timeout} seconds.")
|
return (
|
||||||
return False
|
False,
|
||||||
|
f"Port {port} still not listening after {timeout} seconds.",
|
||||||
|
)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
|
|
||||||
|
|
||||||
@ -39,8 +54,11 @@ def main():
|
|||||||
executor.submit(_wait_for_port, p, args.server_pid, args.timeout)
|
executor.submit(_wait_for_port, p, args.server_pid, args.timeout)
|
||||||
)
|
)
|
||||||
for f in as_completed(futures):
|
for f in as_completed(futures):
|
||||||
if not f.result():
|
ok, msg = f.result()
|
||||||
print("At least one port failed... exiting with failure.")
|
if ok:
|
||||||
|
print(f"OK: {msg}")
|
||||||
|
else:
|
||||||
|
print(f"FAIL: {msg}")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user