PM_Tiny 的测试分为常规 CTest、真实操作系统能力、覆盖率、模糊测试和发布事务五层。常规构建不依赖 Clang、AFL++、root 权限或网络;专项任务显式安装并调用对应工具。
Linux 完整回归:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DPM_TINY_BUILD_TESTS=ON
cmake --build build --parallel 4
cmake -E chdir build ctest --output-on-failureposix_runtime_integration 使用真实 PTY 验证三个标准流的 tty 属性,并按 1 KiB 边界验证 split 日志
的 .1/.2 轮转顺序和淘汰。cgroup_v2_integration 在普通 CTest 无权限时返回 77,属于明确跳过,
不能作为真实通过证据。严格门禁使用:
PM_TINY_TEST_BIN="$PWD/build" PM_TINY_REQUIRE_REAL_CGROUP=1 \
PM_TINY_ALLOW_SUDO=1 bash tests/integration/linux/cgroup_v2_integration.sh该测试创建唯一 cgroup,检查父子进程实际成员关系、完整树停止和 cgroup 目录回收。Windows 的对应 Release CTest 使用 VS 2022/MSVC x64,验证真实 Job Object、named pipe、SCM 和 split 日志轮转; MinGW 结果不能替代该门禁。
安装 Clang、llvm-profdata 和 llvm-cov 后运行:
bash scripts/test/coverage.sh脚本建立独立的 build-coverage,以 -fprofile-instr-generate -fcoverage-mapping 编译并运行完整
CTest。产物位于 build/test-artifacts/coverage/:
coverage.profdata:合并后的原始计数;summary.txt:文件和总计摘要;html/:可浏览的逐行报告;coverage.lcov:供 CI 或其他工具消费的 LCOV 数据。
首期只记录基线,不设覆盖率硬阈值。多个测试可执行文件会重复链接部分公共源码,LLVM 可能报告 同名函数的 profile hash 不同;汇总仍保留每个已插桩目标的数据,不把该提示误报为测试失败。
三个目标分别覆盖协议分块/编解码、YAML 配置与依赖图、日志请求与 bounded tail:
# PR smoke,默认每目标 30 秒
bash scripts/test/fuzz.sh smoke libfuzzer
bash scripts/test/fuzz.sh smoke afl
# nightly,默认每目标 600 秒
bash scripts/test/fuzz.sh nightly libfuzzer
bash scripts/test/fuzz.sh nightly afllibFuzzer 需要 Clang;AFL++ 需要 afl-clang-fast、afl-clang-fast++ 和 afl-fuzz。两套构建均启用
ASan/UBSan,seed corpus 保持在 tests/fuzz/corpus/,运行时演化 corpus 和 crash 输入只写入
build/test-artifacts/fuzz/。专项构建默认关闭,不给普通二进制增加 sanitizer 或 fuzz 运行依赖。
发布目录使用 releases/<release-id>,manifest 记录软件版本、平台、架构、协议/配置 schema 以及每个
文件的大小和 SHA-256。配置、程序状态和日志始终位于 release 目录之外。Linux 示例:
scripts/release/deploy-linux.sh --root /srv/pm_tiny-release \
--release-id 4.1.0-build1 --source-dir build
scripts/release/deploy-linux.sh --root /srv/pm_tiny-release \
--action rollback --target-release-id 4.1.0-build1Linux 通过同目录临时链接和 rename 原子替换 current。Windows 通过 deploy-windows.ps1 原子替换
current.release,并同步保存、更新和恢复 SCM BinaryPath。两端流程均为 staging、manifest/hash、
pm_tiny --version、隔离 daemon info --json、切换、切换后健康检查;切换前失败不改变 current,
切换后失败自动恢复,残留 journal 会在下一次操作前恢复。Windows 示例必须使用专用服务名:
.\scripts\release\deploy-windows.ps1 -Root C:\PMTiny\releases -ReleaseId 4.1.0-build1 `
-SourceDir C:\PMTiny\build\Release -ConfigPath C:\PMTiny\state\pm_tiny.yaml `
-HomePath C:\PMTiny\state -PipeName '\\.\pipe\pm_tiny-release' -ServiceName pm_tiny_releaseCTest 的 Linux/Windows release transaction 场景全部使用临时根、唯一 IPC 和唯一服务名,并注入
切换前失败、切换后失败和中断恢复,不访问 /usr/local、默认 pipe/socket 或生产 pm_tiny 服务。
正式归档从干净的公开提交构建。版本唯一来源为仓库根目录的 VERSION;三个受控平台分别运行
build-linux-release.sh、build-android-release.sh 和 build-windows-release.ps1。打包示例:
python3 scripts/release/package_release.py package \
--platform linux-x86_64 --binary-dir build/release-bin --output-dir build/release-assets \
--source-commit "$(git rev-parse HEAD)" --toolchain "Ubuntu 20.04 / GCC 9.4.0"每个归档包含 RELEASE-METADATA.json,记录公开源码 SHA、工具链、平台契约和内部文件哈希,不记录
构建主机、工作目录或设备序列号。完成三个平台打包后依次运行 checksums 和 verify;验证会拒绝
额外资产、错误架构、Android 动态 libc++、Windows pm2.exe 以及超过策略上限的 Linux ABI。
归档成员顺序、时间戳、权限和所有者字段规范化,因此相同输入应生成相同归档哈希。
build.yml 对每次 push/PR 运行 Linux、sanitizer、真实 cgroup、coverage、两套 30 秒 fuzz smoke、
Android arm64 构建和 Windows MSVC CTest,并上传 coverage、fuzz crash/corpus、Windows 测试现场。
fuzz-nightly.yml 每日运行两套每目标 600 秒任务。Android 继续使用现有三组显式 serial 的实机 smoke,
不在本阶段建设 Android 安装升级回滚,设备命令始终使用 pm2。