forked from bluesky/tiled
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix critical regression in
tiled serve directory
(bluesky#701)
* Missed passing log_config to one conditional branch. * Fix critical regression in 'tiled serve directory' * Address pydantic change making noise in server logs. * Support running on a random port. * Test server CLI entrypoints. * Clean up processes. * Remove extra process.terminate().
- Loading branch information
1 parent
33286ae
commit 487e30f
Showing
4 changed files
with
150 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
import contextlib | ||
import re | ||
import subprocess | ||
import sys | ||
import threading | ||
from queue import Queue | ||
|
||
import httpx | ||
import pytest | ||
|
||
|
||
@contextlib.contextmanager | ||
def run_cli(command): | ||
"Run '/path/to/this/python -m ...'" | ||
process = subprocess.Popen( | ||
[sys.executable, "-m"] + command.split(), | ||
stdout=subprocess.PIPE, | ||
stderr=subprocess.PIPE, | ||
) | ||
yield process | ||
process.terminate() | ||
|
||
|
||
def scrape_server_url_from_logs(process): | ||
"Scrape from server logs 'Uvicorn running on https://...'" | ||
|
||
def target(queue): | ||
pattern = re.compile(r"Uvicorn running on (\S*)") | ||
while not process.poll(): | ||
line = process.stderr.readline() | ||
if match := pattern.search(line.decode()): | ||
break | ||
url = match.group(1) | ||
queue.put(url) | ||
|
||
queue = Queue() | ||
thread = threading.Thread(target=target, args=(queue,)) | ||
thread.start() | ||
url = queue.get(timeout=10) | ||
# If the server has an error starting up, the target() will | ||
# never find a match, and a TimeoutError will be raised above. | ||
# The thread will leak. This is the best reasonably simple, | ||
# portable approach available. | ||
thread.join() | ||
return url | ||
|
||
|
||
def check_server_readiness(process): | ||
"Given a server process, check that it responds successfully to HTTP." | ||
url = scrape_server_url_from_logs(process) | ||
httpx.get(url).raise_for_status() | ||
|
||
|
||
@pytest.mark.parametrize( | ||
"args", | ||
[ | ||
"", | ||
"--verbose", | ||
"--api-key secret", | ||
], | ||
) | ||
def test_serve_directory(args, tmpdir): | ||
"Test 'tiled serve directory ... with a variety of arguments." | ||
with run_cli(f"tiled serve directory {tmpdir!s} --port 0 " + args) as process: | ||
check_server_readiness(process) | ||
|
||
|
||
@pytest.mark.parametrize( | ||
"args", | ||
[ | ||
"", | ||
"--api-key secret", | ||
], | ||
) | ||
def test_serve_catalog_temp(args, tmpdir): | ||
"Test 'tiled serve catalog --temp ... with a variety of arguments." | ||
with run_cli(f"tiled serve directory {tmpdir!s} --port 0 " + args) as process: | ||
check_server_readiness(process) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters