5.4 KiB
5.4 KiB
F09 P1 本地 Mock 验收:任务发现 v0.3
仅验收单节点、单 Dispatcher、单 Agent、单 Cell、单租户的隔离 Mock。任务发现采用项目内拟定 docs/thirds/v0.3.md,其余 SaaS 项目内业务协议仍为 v0.1;contracts/upstream/v1/ 未修改。下述结果不是 SaaS/management 或生产验收。
适用矩阵
| 场景 | 本地事实与测试 |
|---|---|
| 同一合同及分页 | 首次与后续均读取 tasks[],after 是规范十进制事件游标;首次多页、空页保持游标、同任务后续更新、removed 墓碑均通过。响应不含逐项 event_id;请求中的 page_token、旧 changes/410 路径不运行,也无 HTTP→MQ 回退。见 internal/configread/discovery_v03_test.go、internal/dispatcher/task_runtime_v03_test.go。 |
| 并发翻页、页中断与重启 | Mock 在翻页时加入同任务更新事件,D 追至最终空页并应用较新状态;第二页 HTTP 失败时仅持久保存首个成功页,关新准入;关闭并重新打开 SQLite 后从已提交的游标续读,不从零重建,也不跳过页。见 internal/dispatcher/task_runtime_v03_recovery_test.go、task_runtime_v03_test.go。 |
| 故障与事务 | 非规范/倒退游标、异常响应及 HTTP 410 均报错,不伪造空页;发现服务中断时停止旧任务消费者但保留 MQ 控制。SQLite 触发器模拟分配写失败后,任务、游标和响应证据全部回滚;未物理填满磁盘。v0.2 checkpoint 无法直接当事件 ID 使用,阻断静默切换。见 internal/configread/discovery_v03_test.go、internal/store/local_v03_discovery_test.go、local_v03_failure_test.go、internal/dispatcher/task_runtime_v3_test.go。 |
| 控制与重复投递 | 发现页先将任务从 running 改为 paused,后续更新为 running:SaaS 状态与游标已推进,但已持久的暂停不自动重开原队列;只有 MQ resume 读取单任务并确认新鲜 running 后准入与原队列才恢复。MQ pause/stop 及 removed 墓碑不因发现页运行状态而解除;pause 保留积压、stop 对未接纳命令静默 ACK,在途终结仍出最终结果。重复执行恢复原回执,持久一次性拨号决定不产生第二次呼叫。见 internal/store/local_v03_discovery_test.go 的 TestEventPageRunningAfterDiscoveryPauseWaitsForMQResume、internal/dispatcher/task_discovery_resume_test.go 的 TestTaskDiscoveryRunningAfterPauseRequiresMQResumeToRestartQueue、TestEventRuntimeHTTPPausedToRunningNeedsMQResume,以及 internal/store/local_v03_failure_test.go、execute_business_duplicate_test.go、local_origination_test.go、internal/dispatcher/task_control_v3_test.go、task_queue_v3_stop_active_test.go。 |
| SaaS 建队与 MQ/最终结果 | 受限 Dispatcher RabbitMQ 用户的 configure 权限为空,只消费 SaaS Mock 预建任务/控制队列;队列缺失或满、确认丢失与重投不冒充已接纳。HTTP→SQLite→MQ→Mock 最终结果与 outbox 恢复集成通过。见 internal/mq/amqp_v3_integration_test.go、amqp_v3_queue_full_integration_test.go、internal/dispatcher/local_v01_integration_test.go。 |
| 既有门禁 | 号码白名单、时段、配额、超时、录音结果与最后拨号判断继续使用 F04/F08 本地测试;V3 mixed/real 入口在资源连接前拒绝,Mock 不发真实呼叫。 |
执行记录与覆盖率
./scripts/acceptance-local.sh:通过。依次核对 gofmt、Proto/本地 Schema 正反例和 SHA-256 清单、go mod verify、go test -race ./... -count=1、go vet ./...、构建及受限 RabbitMQ 集成测试。首次执行发现一个旧集成夹具仍使用 v0.2 全量响应;改为 v0.3after=0→after=1并在载入任务配置前追平后复测通过。scripts/check-contracts.sh:v0.3 正例 8、反例 2、清单文件 13 均通过;旧 v0.2 清单仅作为历史,不参与运行。docs/contracts/local-contract-manifest-v0.3.jsonSHA-256 为f32b114b998883901baddd7c4e0225a2643bf5ab68ce54ace5dfa12c543eea93;docs/thirds/v0.3.mdSHA-256 为9a22e9ab5da7d859b5fde4b77cb50ddc148e39567704609d633b91a529af564d。go test -cover -count=1:P1 业务包agent71.1%、callwindow84.4%、configread75.2%、contract74.0%、dispatcher70.5%、rpc69.9%、store67.4%、tenant85.4%;RabbitMQ integration 下mq66.4%、dispatcher70.6%。本轮 P1 业务包均 ≥65%。cmd/sip-go-agent30.0%、历史internal/callruntime61.7% 单列技术债,不冒称全仓库达标;mq未带 integration tag 的结果不用于验收。- 工具链为 Go 1.27.1;RabbitMQ 本地镜像
rabbitmq:4.1-management-alpine,受限账号无configure权限。git diff --check通过;本地功能只提交到开发分支,未合并或推送main,不把 Mock 产物宣称为生产制品。
未通过的外部门禁
逐项无 event_id 是已确认的项目内响应形态:D 只能核验响应级游标进退,不能独立证明 SaaS 页内顺序和没有漏项。外部 SaaS 必须签收完整有序返回和无过期游标;长期保留撤销墓碑所需容量及灾备连续性仍未签收。v0.2 已运行状态不得按 v0.3 游标自动解释,也不删旧任务、执行/幂等/outbox;真实切换须另获受控回迁方案和授权。
真实 SaaS/management、OSS/SIP/云部署、拨号、第二节点/Cell/租户、容量与生产切换均未验证或未授权;本地通过不解除 F06 真实模式阻断。