Files
kira1928andClaude Fable 5 d5d8b797e4 fix: 处理第三轮 code review 意见(并发安全、路径语义一致性、后处理等待)
Gemini 高危:
- FFmpegAsyncInit 增加 ffmpegInitRunning CAS 守卫,并发调用(如 e2e
  多次 reinit)时只有第一个生效,避免并发 tool.Install()
- setFFmpegStatus 用 ffmpegStatusMu 串行化存储、变化通知与回调执行,
  保证订阅者看到的状态顺序与实际更新顺序一致
- ./ffmpeg 兜底改为 LookPath 任何失败都尝试:Unix 下当前目录不在 PATH,
  返回 ErrNotFound 而非 ErrDot,原来只处理 ErrDot 在 Unix 上不生效;
  该逻辑收敛到 utils.LookupSystemFFmpeg 供状态检测与实际查找共用

Gemini 中危:
- tool.Install() 前检查 ctx.Err(),程序退出中不再发起耗时下载

Codex P2:
- 配置了无效 ffmpeg_path 时不再走 remotetools 下载(下载了实际录制也
  不会用),直接置 not_found 并提示修正配置,状态与实际查找语义一致;
  e2e 相应改为 ffmpeg_path 留空 + BILILIVE_IGNORE_SYSTEM_FFMPEG=1
  环境变量屏蔽系统 FFmpeg(CI 预装 ffmpeg,无法用真实 PATH 模拟)
- 等待逻辑上移为 tools.WaitFFmpegAsyncInitDone 供多处复用:ffmpeg
  parser、pipeline 后处理阶段(convert_mp4 / burn_subtitles /
  custom_command)及 recorder 的 legacy custom commandline 在获取
  FFmpeg 路径前等待后台初始化结束,短直播后处理不再因下载未完成而失败

Copilot:
- WaitForToolsInit 轮询改用 time.NewTicker 复用计时器
- FFmpegBanner 初始状态查询失败时打印 console.warn,不再静默吞掉
- mock server 检查 w.Write 错误,客户端断开后立即停止发送

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 15:16:30 +09:00
..
2026-02-05 00:30:13 +09:00

测试工具目录

本目录包含用于本地开发和测试的工具。

开发环境设置

首次 clone 项目后,运行以下命令安装开发工具(包括 delve 调试器、gopls 语言服务器等):

# 一键安装所有开发工具
go generate ./tools/devtools.go

# 或者分别安装
go install github.com/go-delve/delve/cmd/dlv@latest
go install golang.org/x/tools/gopls@latest
go install honnef.co/go/tools/cmd/staticcheck@latest

工具版本已锁定在 go.mod 中,确保团队成员使用相同版本。


自动更新测试

测试场景

bililive-go 的自动更新流程涉及以下组件:

  1. 主程序 - 检测新版本、下载更新包、通知 Launcher
  2. Launcher - 接收更新请求、验证 SHA256、解压替换、重启主程序

方法 1:一键启动(推荐)

使用 VS Code 的复合调试配置,同时启动 Mock Server 和主程序:

  1. 打开 Run and Debug 面板 (Ctrl+Shift+D)
  2. 选择 🔄 主程序更新测试 (Mock API + Main Program)
  3. 按 F5 启动

这会:

  • 先启动 Mock 版本 API 服务器
  • 再启动主程序(配置使用本地 Mock API)

启动后,在主程序的 Web UI 中:

  1. 访问 http://localhost:8080(端口取决于你的 config.yml)
  2. 点击 关于 或 设置 中的更新检测功能
  3. 应该能看到检测到"新版本 99.0.0"
  4. 点击下载,观察下载进度
  5. 下载完成后可以应用更新

方法 2:分步调试

如果需要单步调试具体代码:

步骤 1:启动 Mock 服务器

# 先构建开发版本作为"新版本"的源文件
make dev-incremental

# 启动 Mock 服务器
go run ./test/update-mock-server -port 8888 -version 99.0.0

Mock 服务器启动后会显示:

═══════════════════════════════════════════════════════════════
  🚀 Mock 版本 API 服务器已启动
═══════════════════════════════════════════════════════════════
  监听地址:    http://localhost:8888
  模拟版本:    99.0.0
  更新包大小:  35.24 MB
  SHA256:      abc123...
═══════════════════════════════════════════════════════════════

步骤 2:调试主程序更新检测

在 VS Code 中:

  1. 选择 Debug Main Program (Local Update Test)
  2. 在 src/pkg/update/checker.go 或 src/servers/update_handler.go 设置断点
  3. 按 F5 启动调试
  4. 在 Web UI 中触发更新检测

步骤 3:调试 Launcher 更新应用

如果需要测试 Launcher 的更新解压和替换逻辑:

  1. 选择 Debug Launcher (Local Update)
  2. 在 src/cmd/launcher/main.go 的 performUpdate 函数设置断点

update-mock-server

用于测试自动升级功能的 Mock 版本 API 服务器。

功能

  • 版本检测 API - 模拟 bililive-go.com/api/versions 接口
  • 更新包下载 - 自动将本地二进制打包成 zip 并提供下载
  • SHA256 校验 - 返回正确的校验和供客户端验证

参数说明

参数 默认值 说明
-port 8888 监听端口
-version 99.0.0 模拟的最新版本号
-source bin/bililive-dev.exe 用于创建更新包的源文件
-changelog (环境变量) 更新日志,也可通过 MOCK_CHANGELOG 环境变量设置

手动运行

# 使用默认源文件
go run ./test/update-mock-server -port 8888 -version 99.0.0

# 指定其他源文件
go run ./test/update-mock-server -source ./bin/bililive-windows-amd64.exe

launcher-config-local.json

本地测试用的 Launcher 配置文件。

使用方法

  1. 复制示例文件:

    cp test/launcher-config-local.example.json test/launcher-config-local.json
    
  2. 根据需要修改配置

  3. 使用 VSCode 调试配置 Debug Launcher (Local Update)

注意事项

  • launcher-config-local.json 不会被提交到 Git(已在 .gitignore 中)
  • 请使用 launcher-config-local.example.json 作为模板