holy fuking shit
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
"""真实 HTTP 承载测试:接口仅回环、仅窗口期开放、协议边界与官方一致。"""
|
||||
|
||||
# pylint: disable=redefined-outer-name # pytest 夹具名必须与测试函数形参同名,非遮蔽缺陷
|
||||
|
||||
import http.client
|
||||
import json
|
||||
import time
|
||||
@@ -20,7 +22,7 @@ def wait_until(condition, timeout=5.0, interval=0.02):
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def referee(tmp_path):
|
||||
def local_referee(tmp_path):
|
||||
ref = Referee(action_port=0, data_dir=tmp_path / "data")
|
||||
ActionInterfaceServer(ref)
|
||||
return ref
|
||||
@@ -43,20 +45,20 @@ def post(port, path, obj=None, *, headers=None, method="POST", raw=None):
|
||||
return response.status, parsed
|
||||
|
||||
|
||||
def payload(id="e", **extra):
|
||||
return dict(arena_id="default", robot_id="2026001", request_id=id, **extra)
|
||||
def payload(request_id="e", **extra):
|
||||
return dict(arena_id="default", robot_id="2026001", request_id=request_id, **extra)
|
||||
|
||||
|
||||
def start_open_session(referee, **opts):
|
||||
def start_open_session(local_referee, **opts):
|
||||
opts.setdefault("countdown_s", 0.05)
|
||||
session = referee.start("q3_practice", "2026001", **opts)
|
||||
session = local_referee.start("q3_practice", "2026001", **opts)
|
||||
assert wait_until(lambda: session.phase == "open")
|
||||
return session
|
||||
|
||||
|
||||
def test_binding_is_loopback_only(referee):
|
||||
session = start_open_session(referee)
|
||||
server = referee._open_interface.__self__ # ActionInterfaceServer
|
||||
def test_binding_is_loopback_only(local_referee):
|
||||
_session = start_open_session(local_referee)
|
||||
server = local_referee._open_interface.__self__ # ActionInterfaceServer
|
||||
port = open_port(server)
|
||||
assert server._httpd.server_address[0] == "127.0.0.1"
|
||||
status, body = post(port, "/enter", payload("enter"))
|
||||
@@ -64,17 +66,17 @@ def test_binding_is_loopback_only(referee):
|
||||
assert body["remaining_real_duration_s"] == 1200
|
||||
|
||||
|
||||
def test_interface_refuses_connections_outside_window(referee):
|
||||
session = referee.start("q3_practice", "2026001", countdown_s=5)
|
||||
server = referee._open_interface.__self__
|
||||
def test_interface_refuses_connections_outside_window(local_referee):
|
||||
session = local_referee.start("q3_practice", "2026001", countdown_s=5)
|
||||
server = local_referee._open_interface.__self__
|
||||
assert server.is_open is False # 倒计时期间未监听
|
||||
assert wait_until(lambda: session.phase == "open", timeout=6)
|
||||
assert server.is_open is True # 窗口开启后才绑定端口
|
||||
|
||||
|
||||
def test_full_protocol_round_trip_over_http(referee):
|
||||
session = start_open_session(referee)
|
||||
server = referee._open_interface.__self__
|
||||
def test_full_protocol_round_trip_over_http(local_referee):
|
||||
session = start_open_session(local_referee)
|
||||
server = local_referee._open_interface.__self__
|
||||
port = open_port(server)
|
||||
status, body = post(port, "/enter", payload("enter-1"))
|
||||
assert status == 200 and body["accepted"] is True
|
||||
@@ -94,9 +96,9 @@ def test_full_protocol_round_trip_over_http(referee):
|
||||
assert session.end_reason == "user_exit"
|
||||
|
||||
|
||||
def test_protocol_error_statuses_over_http(referee):
|
||||
start_open_session(referee)
|
||||
server = referee._open_interface.__self__
|
||||
def test_protocol_error_statuses_over_http(local_referee):
|
||||
start_open_session(local_referee)
|
||||
server = local_referee._open_interface.__self__
|
||||
port = open_port(server)
|
||||
assert post(port, "/unknown", payload())[0] == 404
|
||||
assert post(port, "/enter/", payload())[0] == 404
|
||||
@@ -109,9 +111,9 @@ def test_protocol_error_statuses_over_http(referee):
|
||||
assert status == 200 and body["accepted"] is True
|
||||
|
||||
|
||||
def test_interface_closes_after_window_timeout(referee):
|
||||
session = start_open_session(referee, window_s=0.4)
|
||||
server = referee._open_interface.__self__
|
||||
def test_interface_closes_after_window_timeout(local_referee):
|
||||
session = start_open_session(local_referee, window_s=0.4)
|
||||
server = local_referee._open_interface.__self__
|
||||
port = open_port(server)
|
||||
assert wait_until(lambda: session.phase == "finished", timeout=5)
|
||||
assert session.end_reason == "window_timeout"
|
||||
@@ -120,9 +122,9 @@ def test_interface_closes_after_window_timeout(referee):
|
||||
post(port, "/enter", payload("late"))
|
||||
|
||||
|
||||
def test_recorded_feed_contains_every_request(referee):
|
||||
session = start_open_session(referee)
|
||||
server = referee._open_interface.__self__
|
||||
def test_recorded_feed_contains_every_request(local_referee):
|
||||
session = start_open_session(local_referee)
|
||||
server = local_referee._open_interface.__self__
|
||||
port = open_port(server)
|
||||
post(port, "/enter", payload("enter-1"))
|
||||
post(port, "/unknown", payload("bad"))
|
||||
|
||||
Reference in New Issue
Block a user