import concurrent.futures
import signal
import subprocess
import urllib.request
import urllib.error

p = subprocess.Popen(["./api"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
try:
    first = p.stdout.readline().strip()
    assert first.startswith("listening="), first
    base = "http://" + first.split("=", 1)[1]
    def work():
        with urllib.request.urlopen(base + "/work", timeout=5) as r:
            return r.status, r.read().decode().strip()
    with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
        future = pool.submit(work)
        assert p.stdout.readline().strip() == "work-started"
        p.send_signal(signal.SIGTERM)
        assert p.stdout.readline().strip() == "draining"
        try:
            urllib.request.urlopen(base + "/readyz", timeout=2)
            raise AssertionError("readiness stayed ready")
        except urllib.error.HTTPError as e:
            assert e.code == 503
            e.close()
            print("after SIGTERM: readiness=503")
        status, body = future.result(timeout=5)
        assert (status, body) == (200, "finished")
        print(f"in-flight request: {status} {body}")
    assert p.stdout.readline().strip() == "shutdown-complete"
    assert p.wait(timeout=5) == 0, p.stderr.read()
    print("process exit: 0; shutdown completed")
finally:
    if p.poll() is None:
        p.kill()
        p.wait()
