28 lines
5.4 KiB
Markdown
28 lines
5.4 KiB
Markdown
# 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.3 `after=0` → `after=1` 并在载入任务配置前追平后复测通过。
|
||
- `scripts/check-contracts.sh`:v0.3 正例 8、反例 2、清单文件 13 均通过;旧 v0.2 清单仅作为历史,不参与运行。`docs/contracts/local-contract-manifest-v0.3.json` SHA-256 为 `f32b114b998883901baddd7c4e0225a2643bf5ab68ce54ace5dfa12c543eea93`;`docs/thirds/v0.3.md` SHA-256 为 `9a22e9ab5da7d859b5fde4b77cb50ddc148e39567704609d633b91a529af564d`。
|
||
- `go test -cover -count=1`:P1 业务包 `agent` 71.1%、`callwindow` 84.4%、`configread` 75.2%、`contract` 74.0%、`dispatcher` 70.5%、`rpc` 69.9%、`store` 67.4%、`tenant` 85.4%;RabbitMQ integration 下 `mq` 66.4%、`dispatcher` 70.6%。本轮 P1 业务包均 ≥65%。`cmd/sip-go-agent` 30.0%、历史 `internal/callruntime` 61.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 真实模式阻断。
|