Skip to content

测试与验证边界 ​

这一页写给要改代码或判断“这个结论能不能信”的人。

不同层级的测试回答不同问题:单元测试证明函数逻辑,容器测试证明进程协作,真机测试才证明安装权限和硬件。任何一层通过,都不能代替另一层。

先跑本地回归 ​

bash
RUST_LOG=info cargo test --locked --offline
RUST_LOG=info cargo test --locked --offline --features mcp,hardware-software
cargo clippy --locked --offline --all-targets --features mcp,hardware-software -- -D warnings

离线命令要求依赖已经缓存。

各层能证明什么 ​

层级能证明不能代替
单元测试与固定向量推导、加密、签名基、请求规范化、策略、事务失败路径安装权限和真实对端
多进程、多账号socket 互认、管理拒绝、跨主体隔离、配额竞态、MCPsystemd 沙箱和整机重启
systemd 真机安装、隔离、自动恢复、真实开关机、损坏状态拒绝其他平台或实体硬件
真实服务与 SDK注册、热钥匙认证、nonce/body/过期拒绝、轮换、恢复没走过的高层 SDK API
实体硬件权限、持久化、复制、故障软件替身或模拟器

容器通过不等于你的宿主通过;模拟器通过不等于实体芯片通过。

测试文件分别管什么 ​

文件回答的问题
src/** 单元测试这个函数在它的假设下对不对
tests/cli.rs真启动二进制、在终端里敲命令,这一层还正常吗
tests/signature_end_to_end.rs整条签名链路还通吗
tests/negative.rs产品承诺的边界今天还成立吗
tests/tpm.rsTPM 封装、解封和根丢失拒绝
tests/vectors/ + tests/vectors.rs外部标准还认不认我们的实现
tests/probe.rs体检报告说的是不是真的
tests/mcp.rsMCP 工具和参数边界
tests/hardware.rs硬件绑定路径的形状
tests/no_key_material_on_disk.rs跑完一遍后,磁盘上有没有密钥材料

目录约定 ​

部署与验收脚本按运行时机分成两层:

路径运行方式修改本机状态吗
deploy/<platform>/tests/CI 每次跑;python3 -m unittest discover不修改
deploy/<platform>/acceptance/人工在目标机或一次性容器里跑,需要 root只操作显式隔离的临时实例
deploy/<platform>/ 根目录安装、更新、迁移和日常运维入口会,需按文档确认

命名规则:下划线 test_*.py 属于 CI 单元测试,连字符 test-*.py 或 acceptance_*.py 属于真机验收。看到两种名字不是笔误,是刻意区分。

向量测试失败了该怀疑谁 ​

tests/vectors/ 里每条 JSON 都带 _source,写明出处。分两类:

  • 标准文本的抄本:RFC 8032、7638、8037、9421、8785 等。失败先怀疑实现。改向量让测试变绿,等于删掉这个测试存在的理由。
  • 兄弟实现算出来的值:例如 anp_sdk_*。失败说明两个实现分家了,两边仓库都要看,对方可能才是对的。

hardware-software 是什么 ​

它把“封起来的熵”存在文件里,而不是芯片里。作用只是让没有硬件的机器也能测 v2 信封格式:版本分派、AAD、拒绝降级。

probe 不会把它当成“这台机器有硬件根”。tests/hardware.rs 验的是路径形状,不是“HS 真的出不了这台机器”。

硬件按平台单独验收 ​

  • Secure Enclave:开发签名身份下持久化、跨进程重启和主机生命周期已在本机验收;Developer ID 正式分发未完成。
  • TPM:部署范围已验收;三条硬件测试标记为 #[ignore],需要显式运行。实体芯片保护声明仍需真机验收。

平台说明和未验项见硬件根。

部署与故障验收 ​

deploy/linux/acceptance 下的 test-boundary.py、systemd-checks.py、systemd-boot-check.py、anp-service-acceptance.py 只对显式隔离环境操作;故障注入不在日常主机执行。

macOS 使用 deploy/macos/acceptance 下的 check-local-use.sh、check-agent.sh 和 se-persistence.py,同样只对临时实例操作。

所有验收都使用临时身份,并记录代码基线、feature、部署模式、实际范围和未验项。历史结果不能当作当前运行结果,也不能扩大支持声明。

Apache-2.0 许可