1
0
Files
DiAL/openspec/specs/windows-test-compat/spec.md
lanyuanxiaoyao cfca03b4d6 refactor: 规范审查与重组,合并细粒度规范,清理过时内容
- 合并 20+ 细粒度 spec 为粗粒度主题规范:dashboard、data-store、probe-engine、probe-api、probe-config 等
- 删除完全冗余规范:data-retention(被 probe-engine+data-store 覆盖)、backend-code-quality(DEVELOPMENT.md 已记录)
- 补充 http-checker 规范至完整标准(配置+执行+expect+校验+observation),匹配代码 440 行实现
- 清理 tcp/udp/llm checker 规范中已废弃 defaults 配置段的残留 Scenario
- 清理 checker-cohesion-structure 中的实现路径引用(src/server/...)
- 统一所有 spec 格式(## Purpose 开头,去除 # Capability/Title 形式)
- 更新 prompt-spec-review.md 审查提示文档
2026-05-22 18:55:18 +08:00

3.8 KiB
Raw Blame History

Purpose

确保测试在 Windows、macOS、Linux 平台上的兼容性,包括文件句柄释放后的目录清理重试机制和跨平台命令测试约定。

Requirements

Requirement: 测试临时目录清理 SHALL 支持重试

使用 SQLite 数据库的测试 SHALL 在 afterAll 中使用带重试的目录删除机制,确保在 Windows 上文件句柄未及时释放时不会导致测试失败。

Scenario: Windows 上 SQLite 文件句柄延迟释放

  • WHEN 测试在 Windows 上运行,store.close() 后立即尝试删除临时目录
  • THEN 删除操作 SHALL 自动重试(最多 3 次,间隔 200ms直到成功或耗尽重试次数

Requirement: 命令检测器测试 SHALL 使用跨平台命令

命令检测器的测试 SHALL 使用 bun -e 脚本替代所有系统命令(包括 truefalsesleepbashechoyes | head),确保测试在 Windows、macOS、Linux 三平台上行为一致。

Scenario: 进程退出码 0

  • WHEN 测试需要一个正常退出的命令
  • THEN 测试 SHALL 使用 bun -e "process.exit(0)" 替代 true

Scenario: 进程退出码非零

  • WHEN 测试需要一个失败退出的命令
  • THEN 测试 SHALL 使用 bun -e "process.exit(1)" 替代 false

Scenario: stdout 输出

  • WHEN 测试需要一个输出文本到 stdout 的命令
  • THEN 测试 SHALL 使用 bun -e "console.log('text')" 替代 echo text

Scenario: stderr 输出

  • WHEN 测试需要一个输出文本到 stderr 的命令
  • THEN 测试 SHALL 使用 bun -e "process.stderr.write('error\n')" 替代 bash -c "echo error >&2"

Scenario: 长时间运行命令

  • WHEN 测试需要一个超时场景的长时间运行命令
  • THEN 测试 SHALL 使用 bun -e "await Bun.sleep(10000)" 替代 sleep 10

Scenario: 大量输出

  • WHEN 测试需要一个产生大量输出的命令
  • THEN 测试 SHALL 使用 bun -e "process.stdout.write('y\n'.repeat(N))" 替代 bash -c "yes | head -N"

Scenario: 验证非 shell 模式下特殊字符不被展开

  • WHEN 通过 Bun.spawn 执行 bun -e "console.log('*')" 并检查 stdout 包含 *
  • THEN 测试 SHALL 在 Windows、macOS 和 Linux 上均返回 matched: true

Requirement: probes.example.yaml 使用跨平台示例

probes.example.yaml 中的 cmd 类型示例 SHALL 使用跨平台命令(如 bun -e "..."bun --version),不使用 Unix 专属命令(如 unamels /tmpdate)。

Scenario: 示例命令跨平台可执行

  • WHEN 用户在 Windows、macOS 或 Linux 上直接使用 probes.example.yaml 中的 cmd 示例
  • THEN 所有 cmd 示例 SHALL 能正常执行,不依赖平台特定命令

Scenario: ICMP checker 测试使用 platform 注入

  • WHEN 在 Windows 上运行 ICMP checker 测试mock 的 stdout 为 Unix 格式
  • THEN 测试 SHALL 通过 new IcmpChecker("linux") 构造 checker 实例,使 parsePingOutput 使用 Unix 解析器,确保测试在所有平台上通过

Requirement: 路径语义测试 SHALL 显式模拟目标平台

路径相关跨平台测试 SHALL 使用显式平台路径工具、依赖注入或等价测试 seam 表达目标平台语义MUST NOT 依赖当前运行平台的 path.sep 伪装其他平台行为。

Scenario: 在非 Windows 平台验证 Windows 路径分隔符

  • WHEN 测试需要验证 Windows 文件系统路径中的反斜杠会被转换为平台无关输出
  • THEN 测试 SHALL 使用 node:path.win32 或等价注入方式生成 Windows relative path并断言输出不包含 \\

Scenario: 验证 import specifier 输出

  • WHEN 测试验证构建脚本生成的 ESM import specifier
  • THEN 测试 SHALL 断言输出使用 / 分隔MUST NOT 使用 path.sep 禁止当前平台的合法 / 字符