Files
Mujoco_WASM/control_bridge/tests/test_protocol.py
T
chenlin f3a8a38acd
web-platform-ci / Standalone decision service (no cloud credentials) (push) Waiting to run
web-platform-ci / TypeScript, lint, unit, build (push) Waiting to run
web-platform-ci / Playwright E2E (push) Waiting to run
lekiwi-compatibility / cpu-compatibility (push) Waiting to run
web-platform-ci / Standalone decision service (no cloud credentials) (pull_request) Waiting to run
web-platform-ci / TypeScript, lint, unit, build (pull_request) Waiting to run
web-platform-ci / Playwright E2E (pull_request) Waiting to run
lekiwi-compatibility / cpu-compatibility (pull_request) Waiting to run
feat: release v1.0.1 CADWorld 网站与 LeKiwi 智能抓放
集成同源 BYOK 会话隔离、精简模型设置、官方订阅入口和 HTTPS 发布运维;保留本地训练/调参与控制能力。同步 npm 版本及 CHANGELOG,记录公网真实 API 验收仍待用户凭据。
2026-09-24 09:57:41 +08:00

66 lines
2.7 KiB
Python

import copy
import json
import unittest
from pathlib import Path
from mujoco_control_bridge import protocol as p
from mujoco_control_bridge.client import SimRobotClient
FIXTURE = json.loads(
(Path(__file__).resolve().parents[2] / "contracts/fixtures/single-joint.json").read_text()
)
class ProtocolTests(unittest.TestCase):
def test_shared_fixture(self):
descriptor = p.descriptor(FIXTURE["descriptor"])
p.observation(FIXTURE["observation"], descriptor)
action = p.action(FIXTURE["validAction"], descriptor)
p.same_identity(action, FIXTURE["identity"])
for invalid in FIXTURE["invalidActions"]:
with self.subTest(invalid["label"]), self.assertRaises(p.RobotError) as caught:
action = p.action({**FIXTURE["validAction"], **invalid["patch"]}, descriptor)
p.same_identity(action, FIXTURE["identity"])
self.assertEqual(caught.exception.code, invalid["code"])
def test_finite_clamp_and_extra_fields(self):
for value in (float("nan"), float("inf"), True, "0", 10**1000):
with self.subTest(value=str(value)[:20]), self.assertRaises(p.RobotError):
p.values({"slider.position": value}, FIXTURE["descriptor"]["actionChannels"])
self.assertEqual(
p.values({"slider.position": 20}, FIXTURE["descriptor"]["actionChannels"], True),
{"slider.position": 1},
)
for raw in ('{"x":1,"x":2}', '{"x":NaN}', '{"x":Infinity}', "["):
with self.assertRaises(p.RobotError):
p.loads(raw)
def test_unknown_units_capabilities_versions(self):
for mutation in ("unit", "frame", "capability", "fingerprint"):
descriptor = copy.deepcopy(FIXTURE["descriptor"])
if mutation == "unit":
descriptor["actionChannels"][0]["unit"] = "deg"
elif mutation == "frame":
descriptor["frame"] = "unknown"
elif mutation == "fingerprint":
descriptor["modelFingerprint"] = "not-sha"
else:
descriptor["capabilities"]["training"] = "true"
with self.subTest(mutation), self.assertRaises(p.RobotError):
p.descriptor(descriptor)
def test_only_local_endpoints_and_token_not_in_url(self):
for endpoint in (
"https://127.0.0.1",
"http://evil.test",
"http://user:token@127.0.0.1",
"http://localhost/?token=secret",
"http://localhost/path",
):
with self.subTest(endpoint), self.assertRaises(ValueError):
SimRobotClient(endpoint, token="test-only-not-a-real-secret")
if __name__ == "__main__":
unittest.main()