82 lines
2.1 KiB
Python
82 lines
2.1 KiB
Python
import json
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
import urllib.request
|
|
|
|
|
|
PORT = os.environ.get("TELEGRAM_SCRAPER_SMOKE_PORT", "18080")
|
|
BASE_URL = f"http://127.0.0.1:{PORT}"
|
|
ENDPOINTS = [
|
|
"/",
|
|
"/viewer",
|
|
"/swagger",
|
|
"/openapi.json",
|
|
"/health",
|
|
"/health/continuous",
|
|
"/api/dashboard",
|
|
"/api/continuous",
|
|
"/api/channels",
|
|
]
|
|
|
|
|
|
def fetch(path: str) -> tuple[int, bytes]:
|
|
with urllib.request.urlopen(BASE_URL + path, timeout=3) as response:
|
|
return response.status, response.read()
|
|
|
|
|
|
def wait_for_server(process: subprocess.Popen) -> None:
|
|
deadline = time.time() + 15
|
|
last_error = None
|
|
while time.time() < deadline:
|
|
if process.poll() is not None:
|
|
raise RuntimeError(f"server exited with code {process.returncode}")
|
|
try:
|
|
fetch("/health")
|
|
return
|
|
except Exception as exc:
|
|
last_error = exc
|
|
time.sleep(0.3)
|
|
raise RuntimeError(f"server did not become ready: {last_error}")
|
|
|
|
|
|
def main() -> int:
|
|
env = {
|
|
**os.environ,
|
|
"TELEGRAM_SCRAPER_PORT": PORT,
|
|
"TELEGRAM_SCRAPER_START_CONTINUOUS": "0",
|
|
}
|
|
process = subprocess.Popen(
|
|
[sys.executable, "main.py"],
|
|
env=env,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.STDOUT,
|
|
text=True,
|
|
)
|
|
try:
|
|
wait_for_server(process)
|
|
for endpoint in ENDPOINTS:
|
|
status, body = fetch(endpoint)
|
|
if status != 200:
|
|
raise RuntimeError(f"{endpoint} returned HTTP {status}")
|
|
if endpoint.endswith(".json") or endpoint.startswith("/api") or endpoint.startswith("/health"):
|
|
json.loads(body.decode("utf-8"))
|
|
print(f"ok {endpoint}")
|
|
return 0
|
|
except Exception as exc:
|
|
print(f"smoke test failed: {exc}", file=sys.stderr)
|
|
if process.stdout:
|
|
print(process.stdout.read(), file=sys.stderr)
|
|
return 1
|
|
finally:
|
|
process.terminate()
|
|
try:
|
|
process.wait(timeout=5)
|
|
except subprocess.TimeoutExpired:
|
|
process.kill()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|