53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
# sglang/test/srt/openai/test_server.py
|
|
import requests
|
|
|
|
from sglang.test.test_utils import DEFAULT_SMALL_MODEL_NAME_FOR_TEST as MODEL_ID
|
|
|
|
|
|
def test_health(openai_server: str):
|
|
r = requests.get(f"{openai_server}/health")
|
|
assert r.status_code == 200
|
|
# FastAPI returns an empty body → r.text == ""
|
|
assert r.text == ""
|
|
|
|
|
|
def test_models_endpoint(openai_server: str):
|
|
r = requests.get(f"{openai_server}/v1/models")
|
|
assert r.status_code == 200, r.text
|
|
payload = r.json()
|
|
|
|
# Basic contract
|
|
assert "data" in payload and isinstance(payload["data"], list) and payload["data"]
|
|
|
|
# Validate fields of the first model card
|
|
first = payload["data"][0]
|
|
for key in ("id", "root", "max_model_len"):
|
|
assert key in first, f"missing {key} in {first}"
|
|
|
|
# max_model_len must be positive
|
|
assert isinstance(first["max_model_len"], int) and first["max_model_len"] > 0
|
|
|
|
# The server should report the same model id we launched it with
|
|
ids = {m["id"] for m in payload["data"]}
|
|
assert MODEL_ID in ids
|
|
|
|
|
|
def test_get_model_info(openai_server: str):
|
|
r = requests.get(f"{openai_server}/get_model_info")
|
|
assert r.status_code == 200, r.text
|
|
info = r.json()
|
|
|
|
expected_keys = {"model_path", "tokenizer_path", "is_generation"}
|
|
assert expected_keys.issubset(info.keys())
|
|
|
|
# model_path must end with the one we passed on the CLI
|
|
assert info["model_path"].endswith(MODEL_ID)
|
|
|
|
# is_generation is documented as a boolean
|
|
assert isinstance(info["is_generation"], bool)
|
|
|
|
|
|
def test_unknown_route_returns_404(openai_server: str):
|
|
r = requests.get(f"{openai_server}/definitely-not-a-real-route")
|
|
assert r.status_code == 404
|