Files
agentmc/tests/test_e2e_interop.py

76 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""端到端互操作:Python 客户端 ←→ Node 服务端(跨实现)。
价值:这是**唯一能证明协议层真通**的测试 ——
两边是完全独立的实现,若我的 protodef 有偏差,握手不可能成功。
用法:
1) cd /home/newqqagent/plugin_data/mc/runtime && node testserver.js &
2) python3 tests/test_e2e_interop.py
"""
import sys, os, socket
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from mcfold.client import Client
HOST, PORT = "127.0.0.1", 25599
def reachable():
try:
socket.create_connection((HOST, PORT), timeout=2).close(); return True
except OSError:
return False
def _start_server():
"""自动起 Node 服务端(独立实现),让本测试**总能真跑**而不是跳过。"""
import subprocess, time, shutil
runtime = "/home/newqqagent/plugin_data/mc/runtime"
script = os.path.join(os.path.dirname(os.path.abspath(__file__)), "support_testserver.js")
if not shutil.which("node"):
return None
shutil.copy(script, os.path.join(runtime, "support_testserver.js"))
p = subprocess.Popen(["node", "support_testserver.js", str(PORT)], cwd=runtime,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
for _ in range(50):
if reachable(): return p
if p.poll() is not None: return None
time.sleep(0.2)
return None
def test_interop():
proc = None
if not reachable():
proc = _start_server()
if not reachable():
print(f" - 服务端 {HOST}:{PORT} 不可用,跳过"); return
try:
_do_interop()
finally:
if proc:
proc.terminate()
try: proc.wait(timeout=5)
except Exception: proc.kill()
try: os.remove("/home/newqqagent/plugin_data/mc/runtime/support_testserver.js")
except OSError: pass
def _do_interop():
c = Client(HOST, PORT, "PyProbe", "1.20.1")
try:
r = c.run_smoke()
assert r["protocol"] == 763, r
assert r["login_ok"], r
assert "success" in r["packets"], r
print(f" ✓ 跨实现互操作: 协议={r['protocol']} 包={r['packets']} 登录成功")
finally:
c.close()
def test_protocol_version_from_folder():
"""协议版本必须由「实例文件夹」决定,而不是硬编码。"""
c = Client(HOST, PORT, "x", "1.20.1")
c.load_protocol()
assert c.proto_num == 763, c.proto_num
print(f" ✓ 版本来自 version.json: 1.20.1 -> 协议 {c.proto_num}")
if __name__ == "__main__":
test_protocol_version_from_folder()
test_interop()
print("\n端到端互操作:通过")