import argparse
import json
import signal
import subprocess
import sys
import uuid
from pathlib import Path
from urllib.request import ProxyHandler, build_opener


parser = argparse.ArgumentParser()
parser.add_argument("--ip", required=True)
args = parser.parse_args()
script = str(Path(__file__).with_name("discovery.py"))
name = f"Check-{uuid.uuid4().hex[:8]}"
command = [sys.executable, script]
server = subprocess.Popen(
    command + ["serve", "--ip", args.ip, "--port", "0", "--name", name],
    stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,
)
try:
    result = subprocess.run(
        command + ["discover", "--ip", args.ip, "--timeout", "10"],
        capture_output=True, text=True, timeout=20, check=True,
    )
    info = json.loads(result.stdout)
    assert info["name"] == f"{name}._mdnsdemo._tcp.local.", info
    assert info["addresses"] == [args.ip], info
    assert info["properties"] == {"path": "/hello", "version": "1"}, info
    # 绕过环境中的 HTTP 代理，确认请求直达刚启动的本地服务。
    url = f"http://{args.ip}:{info['port']}/hello"
    with build_opener(ProxyHandler({})).open(url, timeout=5) as response:
        assert response.status == 200
        assert response.read() == b"Hello from DNS-SD demo!\n"
    print(result.stdout.strip())
    print("PASS: discovered service and fetched /hello")
finally:
    server.send_signal(signal.SIGINT)
    try:
        stdout, stderr = server.communicate(timeout=10)
    except subprocess.TimeoutExpired:
        server.kill()
        stdout, stderr = server.communicate()
        raise
    if server.returncode != 0:
        raise RuntimeError(f"server exited {server.returncode}: {stdout}\n{stderr}")
