给 ActivityPub 写单元测试,难在规范散落各处
来源:shkspr.mobi — 2026-10-11
📋 概述
Terence Eden 在 NLnet 资助的 ActivityBot 项目里开始认真写测试,顺手记录下 ActivityPub 生态里四类测试各自撞到的墙。第一类是基础文本校验:一个 @user@server 形式的用户名,到底允许什么字符?服务器部分是域名,可以是非 ASCII 国际化域名甚至 emoji 域名;用户部分能否有点、撇号、大写?想找齐各部件的规范定义,结果发现非常困难。第二类是消息校验:WebFinger 响应长什么样、哪些字段必填、取值边界在哪,以及自己发出的消息别的服务器会不会认,现存的只有一些零散 JSON Schema。第三类是签名校验,HTTP Signatures 本身就难,验证要先收集一堆真实签名再回放进测试,所以作者开始把签名样本公开出来供他人复用;而生成签名几乎只有「发出去看对方认不认」这一条路。第四类是互通性:单机测试全绿也代表不了能和别人通信,接收方向的测试要能控制一台外部服务器发消息,而 Mastodon API 的入口只对公开实例开放。所有测试和签名样本都已公开。
🔑 核心要点
- 第一类就卡住:@user@server 里服务器可以是非 ASCII 国际化域名甚至 emoji 域名,而用户部分允许哪些字符没有一处写清
- 消息校验缺少权威清单,WebFinger 响应哪些字段必填、取值边界在哪,只能靠零散的 JSON Schema 拼凑
- HTTP Signatures 的验证需要真实签名样本,作者因此开始收集并公开签名,方便别人回放进自己的测试
- 生成签名几乎没有离线判据——唯一可靠的检验方式是把请求发出去,看对方服务器认不认
- 最根本的一条是互通:接收方向的消息无法自动化,需要能控制一台外部服务器主动发给你
- Mastodon API 提供的入口只对公开实例可用,这让私有部署的自测更麻烦;作者把测试与样本全部放到了网上
💡 金句
测试全过毫无意义——如果你没法和其他实现通信,别人也没法和你通信。
👍 0
👎 0
← 返回 Lobsters 首页