2026-09-14 15:05:17 +08:00
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""app 套件:App SysEx 全协议(组 01~06)。
|
|
|
|
|
|
|
|
|
|
|
|
- transport=com: 进程内复用 test_protocol_app_sim.run_tests(UART4 桥)
|
|
|
|
|
|
- transport=ble: 子进程跑 test_protocol_ble.py( bleak + BLE-MIDI framing),
|
|
|
|
|
|
解析其 [PASS]/[FAIL]/[SKIP]/[SENT] 输出行进统一报告
|
|
|
|
|
|
"""
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
|
import re
|
|
|
|
|
|
import subprocess
|
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
|
|
from ..paths import TOOLS_DIR
|
|
|
|
|
|
|
|
|
|
|
|
ROW_RE = re.compile(r"^\[(PASS|FAIL|SKIP|SENT)\s*\]\s*(.+?)(?:\s*\|\s*(.*))?$")
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-09-14 21:49:37 +08:00
|
|
|
|
def _absorb_output(report, suite: str, text: str, stderr: str = "") -> None:
|
2026-09-14 15:05:17 +08:00
|
|
|
|
n = 0
|
|
|
|
|
|
for line in text.splitlines():
|
|
|
|
|
|
m = ROW_RE.match(line.strip())
|
|
|
|
|
|
if m:
|
|
|
|
|
|
report.add(suite, m.group(2), m.group(1), m.group(3) or "")
|
|
|
|
|
|
n += 1
|
|
|
|
|
|
if n == 0:
|
2026-09-14 21:49:37 +08:00
|
|
|
|
blob = (text or "") + "\n" + (stderr or "")
|
|
|
|
|
|
if "未找到设备" in blob or "扫描 BLE" in blob:
|
|
|
|
|
|
report.add(
|
|
|
|
|
|
suite,
|
|
|
|
|
|
"BLE 扫描连接",
|
|
|
|
|
|
"FAIL",
|
|
|
|
|
|
"未发现 Smart Guitar MIDI(确认已开机且蓝牙开;勿在软关机态跑 BLE)",
|
|
|
|
|
|
)
|
|
|
|
|
|
return
|
|
|
|
|
|
tail = "\\n".join((text or "").splitlines()[-5:])
|
2026-09-14 15:05:17 +08:00
|
|
|
|
report.add(suite, "子进程输出解析", "FAIL", f"未找到结果行;tail: {tail}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run(report, ctx) -> None:
|
|
|
|
|
|
suite = "app"
|
|
|
|
|
|
if ctx.transport == "com":
|
|
|
|
|
|
if not ctx.port:
|
|
|
|
|
|
report.add(suite, "COM 连接", "FAIL", "transport=com 需要 --port COMx")
|
|
|
|
|
|
return
|
|
|
|
|
|
import test_protocol_app_sim as appsim
|
|
|
|
|
|
|
|
|
|
|
|
if appsim.serial is None:
|
|
|
|
|
|
report.add(suite, "pyserial", "FAIL", "pip install pyserial")
|
|
|
|
|
|
return
|
|
|
|
|
|
sim = appsim.AppSim(ctx.port, ctx.baud)
|
|
|
|
|
|
try:
|
|
|
|
|
|
res = appsim.run_tests(sim, allow_poweroff=ctx.allow_poweroff)
|
|
|
|
|
|
finally:
|
|
|
|
|
|
sim.close()
|
|
|
|
|
|
report.extend_rows(suite, res.rows)
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
# BLE:子进程调 test_protocol_ble.py(其内部已处理 bleak 异步/解配对/报告)
|
|
|
|
|
|
cmd = [
|
|
|
|
|
|
sys.executable, os.path.join(TOOLS_DIR, "test_protocol_ble.py"),
|
|
|
|
|
|
"--transport", "midi", "--no-unpair",
|
|
|
|
|
|
]
|
|
|
|
|
|
if ctx.allow_poweroff:
|
|
|
|
|
|
cmd.append("--allow-poweroff")
|
|
|
|
|
|
proc = subprocess.run(cmd, capture_output=True, text=True, timeout=600)
|
2026-09-14 21:49:37 +08:00
|
|
|
|
_absorb_output(report, suite, proc.stdout, proc.stderr or "")
|
2026-09-14 15:05:17 +08:00
|
|
|
|
if proc.returncode != 0 and not any(c.suite == suite and c.status == "FAIL" for c in report.cases):
|
|
|
|
|
|
report.add(suite, "BLE 协议子进程", "FAIL", f"exit={proc.returncode} {proc.stderr[-300:]}")
|