Files
LinkPort/docs/testing.md
T
曾志威 d3edfea03f feat: add independent TCP forwarding and gateway operations improvements
Support target-free SOCKS5 port mappings with reference protection and UI workflows.

Include connection-stage diagnostics, SSH fingerprint confirmation, asset impact checks, listener traffic visibility, SQLite snapshots, account mapping improvements, and MySQL discovery fixes.

Update feature rationale and validation docs; Go checks, frontend build and 121 browser tests passed.
2026-09-22 15:42:58 +08:00

56 KiB
Raw Blame History

测试与版本矩阵

2026-09-22 独立 TCP 端口转发

本节记录独立网关 type: "tcp" + tcpForward: {host, port, outboundId} 的本轮验证,不替代下方其他工作批次的历史结果。功能不要求创建目标服务,也不自动生成目标;使用已有 SOCKS5 代理透传 TCP,不处理业务账号、协议或 TLS。使用说明与兼容边界见 tcp-port-mapping.md,设计原因见 change-rationale.md。

  • 使用 GOTOOLCHAIN=go1.25.0 执行 go test ./... -count=1 -timeout=120s:通过。
  • 使用 Go 1.25.0 执行 go vet ./...:通过。
  • 新增 internal/api/tcp_independent_validation_test.go,执行 go test ./internal/api -run '^TestTCPIndependentBoundary' -count=1 -timeout=120s -v:5 项测试、21 项子测试通过。覆盖无效代理/字段、账号冲突、部分更新、模式切换、引用重绑定、代理改类型及 impact 影响范围响应脱敏。
  • 首次执行 scripts/build.ps1 -SkipTests:成功完成前端 npm build 和 Go 1.25.0 编译;当时 Node 22.10 触发 Vite 版本要求警告,不将成功构建等同于该版本符合 Vite 支持要求。
  • 补充图视图调整后,使用机器已有 Node 22.22.3 再次执行 scripts/build.ps1 -SkipTests:成功完成 npm build 和 Go 1.25.0 编译,生成同一路径的最终程序 artifacts/tcp-independent/serviceport.exe。此次没有 Node 版本警告,仅保留 chunk 大小警告。-SkipTests 不表示构建脚本执行了测试,Go 测试结果来自独立执行。
  • 最终重建前,Playwright 通过 SERVICEPORT_E2E_BINARY 指定当时的新构建程序,tcp-independent.spec.ts 与 tcp-forwarding.spec.ts 共 2 项通过;最终程序的全量回归结果另列如下。
  • 新增 API 测试 TestIndependentTCPForwardTwoRoutes 使用本地带密码 SOCKS5 fixture,把两条独立网关映射转发到本地 TCP fixtures,并校验二进制字节。该结果证明受控环境中的 SOCKS5 认证与两条 TCP 数据转发链路,不是对真实用户 192.168.11.16:8080/8082、生产代理、业务认证或 TLS 的验收。
  • 全量 Playwright 首次使用默认 Node 22.10,因 node:sqlite 不可用而在测试发现阶段失败。随后执行 fnm use 22.22.3,仅对当前 shell 切换至机器已有版本,成功发现并启动 121 项测试;未安装新版本或修改持久系统环境。
  • 上述一次全量运行执行到 59 项时,被执行工具的 200 秒时限中断,未获得完整结果;这是执行时限中断,不是测试用例失败结论。随后已延长时限完成最终重跑。
  • 最终完整 Playwright:121/121 通过(6.6 分钟)。 使用 Node 22.22.3,设置 SERVICEPORT_E2E_BINARY=artifacts/tcp-independent/serviceport.exe,在隔离端口 19281/19282 运行;日志 artifacts/tcp-independent-playwright-final.log。该程序包含最终图视图修复,本条为本轮最终全量结果,不借用其他批次的成功记录。

本次图视图还调整为纯端口转发不显示“未关联目标”提示、禁止拖到目标绑定并保留手动测试按钮;这些调整已纳入最终构建,并随上述 121 项完整浏览器回归通过。

验证边界:独立模式没有目标周期健康检查,只有手动连接测试和运行指标;原目标关联模式的周期检查覆盖不能推广为独立模式覆盖。批量创建只递增监听端口,不递增目的端口。本轮没有以示例中的私网地址进行真实远端验证。

2026-09-22 连接诊断、资产影响、监听指标与完整 SQLite 备份

  • Go 固定 GOTOOLCHAIN=go1.25.0,最终源码执行 go test ./... -count=1 -timeout=120s 全部通过,包括此前失败的 API 与 cluster;日志 artifacts/optimizations-verified-go-test.log,错误日志为空。go vet ./... 通过。
  • MySQL 集群发现修复后,主节点发现与结果字符串生命周期测试重复 1,000 次、cluster 包重复 20 次通过;不增加重试或放宽断言,详见 internal/cluster/README.md。
  • node --test web/tests/account-mapping.test.mjs web/tests/connection-stages.test.mjs:8/8 通过,覆盖账号选择、协议匹配、authSource、闭集诊断清理与中英日阶段说明。Node 22.10 的直接 .ts 导入失败已通过与既有测试一致的内存转译加载修复。
  • 前端 npm.cmd --prefix web run build 通过,最终使用已有 Node 22.22.3,仅保留 Vite 大 chunk 警告;恢复 web/dist/.gitkeep 后构建内嵌资源的 Windows executable。曾因默认 PATH 的 Node 22.10 缺少无标志 node:sqlite 导致全量用例发现失败,切换已有兼容运行时后重跑,未修改系统 PATH 或安装工具。
  • 首轮 Playwright 为 113 通过、6 失败;修复窄屏布局、草稿类别取消、旧 K8s 出口残留,以及过时的确认流程/Element Plus 定位断言。随后在隔离端口 19181/19182 使用 SERVICEPORT_E2E_BINARY=artifacts/serviceport-optimizations-final.exe 完整回归:120/120 通过(6.6 分钟),日志 artifacts/optimizations-final-playwright.log。该二进制包含界面与诊断修复,但早于最后的 MySQL 结果生命周期修复,因此另行构建最终 verified 程序复验。
  • 最终程序 artifacts/serviceport-optimizations-verified.exe 包含 MySQL 修复,在隔离端口 19281/19282 再跑完整 Playwright:120/120 通过(6.4 分钟),日志 artifacts/optimizations-verified-playwright.log,截图目录 artifacts/optimizations-verified-results。程序 SHA256 为 a51cc6a5e05070c663da0e3f385a02b0c6646a2a7c44d0f7ae2d7f91307e6012。最终 git diff --check 与变更 Go 文件的 gofmt 检查通过。
  • internal/security 和 internal/gateway 在 Linux/amd64、Darwin/amd64 的 go test -c 交叉编译均通过;没有在这些系统运行测试,不能等同于平台实机验收。
  • 协议验证使用隔离 SQLite、本机 TCP/SSH/Kubernetes/数据库 fixture;完整备份测试覆盖已提交 WAL、库内密钥、管理员、目标、审计、自动 TLS、摘要确认、保底快照、停服锁和拒绝 API token。浏览器覆盖完整库下载、检查与风险确认后显示离线恢复指令;没有恢复真实 data 或修改真实目标数据。阶段 UI 与 SSH 探测 UI 的部分响应为模拟,不声称真实远程服务认证成功。
  • 未部署、未提交或推送;真实 data、审计及 TLS/旧 DPAPI 材料保留。恢复为显式停服命令,不提供运行中覆盖数据库。服务端含密钥的暂存文件写入前应用 Windows 当前用户/SYSTEM DACL 或 Unix 0600;浏览器下载目录权限仍由用户管理。

2026-09-22 脚本相对路径与跨机器调用

  • 从系统临时目录而非项目目录调用 Windows PowerShell 测试:go-toolchain.test.ps1 的 12 项断言、node-toolchain.test.ps1 的 8 项断言通过。覆盖项目便携工具优先于 PATH、项目相对覆盖、错误覆盖不降级、配套 npm、带空格目录与缺失提示。使用临时伪文件,不执行或安装工具,不修改持久环境变量。
  • Node 内置测试 node --test scripts/project-paths.test.mjs 三项通过:验证脚本复制到带空格/方括号的新目录后,路径仍以新项目为基准,并从无关目录启动子进程验证;同时检查三个验证脚本与浏览器启动器使用统一解析,以及维护脚本没有固定盘符/机器安装目录扫描。
  • 所有 scripts/*.ps1 的 PowerShell 语法解析通过;Git Bash 分别对 build.sh、test-matrix.sh 和容器 start-replica.sh 执行 bash -n 通过。未在实际 Linux/macOS 上构建,也未启动 Docker 协议矩阵。git diff --check 通过。
  • 从项目外调用 scripts/start-dev.test.ps1 既有隔离回归通过,覆盖相对入口、调用目录、构建锁、参数/失败隔离、数据路径、备份及错误保护;使用临时程序 fixture,不接触真实服务和数据库。
  • 实际从项目外调用 start-dev.ps1 -BuildOnly:正确定位项目、Go 与 Node,前端构建通过(仅现有大 chunk 警告);随后 Go 编译被工作区并行新增的 internal/outbound/kubernetes.go:184 中 done 重名/类型冲突阻断。本轮没有修改该业务文件,也没有用上次候选程序假装完成新构建。打包和 Playwright 后续步骤因新程序未生成而未执行。
  • 上一版工具发现实现的 BuildOnly 成功日志保留在 artifacts/go-discovery,但不能替代最终相对路径版本的完整构建验证。本轮日志位于 artifacts/relative-scripts;未重跑全量 Go/go vet/UI,不宣称全量通过。未部署、提交或修改真实数据,其他并行工作区改动保持原样。

2026-09-22 WebDAV 同步备份替代 S3

  • 使用 Go 1.25.0 运行 go test ./... -count=1 -timeout=120s:本次变更涉及的 backup、syncjob、store、api、model、MongoDB/HTTP 协议包均通过;全量仅 internal/cluster 的 TestMySQLReplicationAndGroupDiscovery/mysql-group-replication 失败,报 cluster has no available primary or router,与本文件此前记录的既有间歇失败一致。本轮未修改该逻辑,不将全量 Go 标记通过。日志 artifacts/webdav-sync/go-test.log。
  • go vet ./...、npm.cmd --prefix web run build 通过,前端只有现有大 chunk 警告。Vite 完成后恢复 web/dist/.gitkeep,再构建 artifacts/webdav-sync/serviceport.exe,未覆盖正式程序。
  • 设置 SERVICEPORT_E2E_BINARY 指向新程序,使用隔离 SQLite 与 19491/19492 端口:全量 Playwright 113 通过、4 失败(6.4 分钟)。四项仍为 global-assets-proxy-project:98、kubeconfig-selection:23、target-outbound-selection:3、workspace:98,分别涉及资产草稿、目标字段显示及连接错误文本;与之前合并及空密码版本相同,不宣称全量浏览器通过。日志 artifacts/webdav-sync/full-web.log;最终退出状态见 results.json。
  • 新 WebDAV 两项、目标认证七项均在完整浏览器运行中通过;此前 WebDAV/menu-search/target-auth 专项组合 11 项通过(26.3 秒,focused.log)。覆盖响应式布局、保存和秘密清空、冲突确认、独立备份以及实际隔离 API 到本机 WebDAV 上传的链路。
  • Go HTTP fixture 覆盖目录和路径编码、Basic/匿名、强 ETag、条件创建/覆盖、拒绝重定向与错误正文泄漏、大小限制、两设备同步与冲突、租约、旧 S3 设置隔离。独立备份测试验证加密可解密、凭据可恢复、文件名唯一、共享文件不被访问且基线/冲突不变;API 测试覆盖跨地址/用户名不继承旧密码、显式清除及会话/CSRF/API Token 边界。
  • 协议测试是 Go fixture,端到端 WebDAV 服务是 Node fixture,未连接外部真实 WebDAV 服务,不能据此保证任意服务商的条件写入兼容。智能体只读复核未发现阻断问题;同步和备份共用最近执行状态的边界已写入 docs/webdav-sync.md。
  • 测试进程退出后隔离端口已释放;git diff --check 通过。没有部署、提交、修改真实数据库或目标数据。升级说明要求停服备份完整 data 后再运行新版;当前仍保留工作区原有 SSH 指纹改动。

2026-09-22 目标空密码与无认证连接

  • Go 1.25.0 go test ./... -count=1 -timeout=120s 和 go vet ./... 均通过,结果记录 artifacts/target-auth/go-result.json。新增模型/API 用例覆盖仅允许指定协议无认证、具名空密码、显式清除、草稿不落库及网关认证保留。
  • MongoDB 和 HTTP 使用本机上游 fixture,验证无认证请求、网关错误密码拒绝及 Authorization 不泄漏;Redis 无凭据时跳过 AUTH 由现有 fixture 覆盖,没有连接实际生产服务器。
  • 前端构建和新程序构建通过。使用隔离 SQLite/端口运行无认证版本全量 Playwright:112 通过、4 失败(6.4 分钟),日志 artifacts/target-auth/full-web.log。失败为 global-assets-proxy-project:98、kubeconfig-selection:23、target-outbound-selection:3、workspace:98,与此前合并验证相同,涉及资产草稿断言、目标字段显示和连接错误文本,不宣称全量通过。
  • 随后与 WebDAV 专项一起运行 target-auth.spec.ts 全部 7 项通过(组合共 11 项,artifacts/webdav-sync/focused.log),包括新建空密码、无认证表单/草稿、旧账号默认模式、显式清除、协议限制及手机布局。浏览器部分远程结果使用模拟,不代表真实目标兼容验证。
  • 未部署或修改实际目标数据,保留工作区已有 SSH 跳过指纹改动;本项无需数据库迁移。

2026-09-22 SSH 转发可选跳过指纹

  • Go 1.25.0 go test ./... -count=1 -timeout=120s 全部通过(本轮 cluster 亦通过),日志 artifacts/ssh-skip-go-test.log;go vet ./... 通过。
  • npm.cmd --prefix web run build 通过,仅大 chunk 提示;恢复 web/dist/.gitkeep 后构建新程序 artifacts/serviceport-ssh-skip.exe。未替换正式程序或访问真实数据库。
  • 使用 SERVICEPORT_E2E_BINARY 指定新程序,在隔离端口/SQLite 运行 ssh-forward-skip.spec.ts、host-identity.spec.ts:3 项通过(13.5 秒)。新增用例首次因 Element Plus 隐藏 checkbox 的操作方式及校验文本定位失败,修正测试定位后重跑通过。本次未重跑全量浏览器套件。
  • 新增模型测试验证仅显式开关允许空指纹、仍要求密码。SSH fixture 验证空/错误指纹跳过、实际转发字节回显、返回实际服务器指纹、错误密码拒绝及关闭跳过后的严格校验;不声称真实 SSH 跳板机验证。

2026-09-22 合并 origin/main 943ea75

  • 前端 npm.cmd --prefix web run build 通过(仅大 chunk 提示);Windows Go 1.25.0 新程序构建通过,恢复并保留 web/dist/.gitkeep。
  • go test ./... -count=1 -timeout=120s:除 internal/cluster 的 TestMySQLReplicationAndGroupDiscovery/mysql-group-replication 返回 cluster has no available primary or router 外全部包通过。该失败在合并前已有记录;本次未改集群发现代码。go vet ./... 通过。
  • Linux/amd64、Darwin/amd64 的 go test -c ./internal/desktop 通过;仅交叉编译,未在对应系统实际启动。
  • node scripts/verify-package.mjs artifacts/merge-verification-20260922/package、node scripts/verify-desktop.mjs artifacts/merge-verification-20260922/package/serviceport.exe 均通过,覆盖单 EXE、内嵌资源、隔离登录、库内主密钥、自动 TLS、重启与目录迁移。桌面脚本首次在清理阶段重复等待已退出进程,修复后完整重跑通过。
  • 启动脚本隔离回归使用 Windows PowerShell 运行 scripts/start-dev.test.ps1 通过。PowerShell 7 的 Add-Type 不支持测试 fixture 所需 ConsoleApplication;Windows PowerShell 首次又发现 fixture 未创建旧 desktop.lock,改为在隔离目录 OpenOrCreate 后通过。不修改真实数据库或服务。
  • Playwright 使用 SERVICEPORT_E2E_BINARY 指定本次新编译程序、隔离 SQLite 和 18681/18682 端口:104 通过、4 失败(6.1 分钟)。失败位于 global-assets-proxy-project、kubeconfig-selection、target-outbound-selection、workspace 各一项,涉及资产草稿断言、目标字段显示及连接错误文本;不将全量浏览器回归标记为通过。TCP 映射、请求诊断元数据、范围维护、保存/标签页和响应式专项均在本轮通过。
  • 日志、截图和测试程序位于忽略目录 artifacts/merge-verification-20260922;协议测试使用本机 fixture,并非真实 MongoDB/K8s 生产连接验证。没有部署、推送或真实数据迁移。

以下为历史分支验证记录,不替代本节合并结果。

2026-09-21 TCP 端口映射

  • Go 1.25.0 全量命令 go test ./... -count=1 -timeout=120s 已运行两次;除 internal/cluster 的 TestMySQLReplicationAndGroupDiscovery 外其他包通过。该未改动测试在 mysql-replication / mysql-group-replication 子用例间歇返回 cluster has no available primary or router,单独 -count=20 也出现五次失败。本轮没有修改集群发现逻辑,不将全量 Go 测试标记为通过。日志:artifacts/tcp-go-test.log、artifacts/tcp-go-test-final.log。
  • 本次相关 API、model、gateway、outbound、tcpproxy 包测试通过;最后补充断连必须非超时、认证计数不伪造以及出口包装半关闭测试后,model/gateway/outbound/tcpproxy 四包复跑通过。go vet ./... 通过。
  • 新测试覆盖 TCP 无账号创建/保存/测试/断开、默认 0.0.0.0、拒绝只读及 TLS 终止、普通协议约束保留、直连/SOCKS5/SSH/K8s 配置、真实 loopback 字节透传与半关闭、取消清理、来源白名单与连接数限制、运行中切换保留旧连接、停服断连及无账号定时健康检查。上游和 SSH/K8s 测试均为本地 fixture,并非生产目标验证。
  • npm.cmd --prefix web run build 通过(仅 chunk 大小警告),Vite 完成后生成 artifacts/serviceport-tcp-forwarding.exe;恢复 web/dist/.gitkeep。使用该新程序和隔离端口/SQLite,TCP、账号级连线、网关路径、断开重连、多对一六项回归通过(20.9s)。检查了 TCP 连线图截图。
  • 全量浏览器运行中,新增 TCP 用例受到其他测试遗留资源影响,长画布拖拽定位失败;为用例的目标和网关增加独立项目筛选后,与 gateway-management、target-accounts 连续复跑六项通过(17.1s),含本机二进制字节回显。产品源码未因此变化。完整 UI 结果记录见下方补充;不能用专项通过替代全量通过。
  • 完整 Playwright:97 通过、10 失败(10.0m,日志 artifacts/tcp-playwright.log)。除上述随后修正并复跑通过的 TCP 测试外,其余九项为此前相同失败集合:account-editor 一项、global-assets-proxy-project 两项、kubeconfig-selection 一项、target-outbound-selection 一项、workspace-features 三项、workspace 一项。修正测试隔离后未再次运行全量,只复跑上述相关组合;不将完整 suite 标记通过。
  • 未替换 bin/serviceport.exe,未操作正式数据,也未提交本次改动。新程序需单独部署后功能才生效。

2026-09-21 MongoDB 网关非 admin 认证库

  • Go 1.25.0:go test ./... -count=1 -timeout=120s、go vet ./... 通过。
  • TestGatewayAuthenticationDatabase 覆盖 admin、ttx-xwms-test、speculative SCRAM;拒绝错误密码、未知用户名、空认证库和会话中切换认证库。TestOfficialDriver 扩展为两种认证库与读写/只读的四组合,均通过。使用官方 Go 驱动和本地上游 fixture,未连接真实目标,未测试 Java 驱动。
  • npm.cmd --prefix web run build 通过(仅 chunk 大小警告);Vite 完成后构建 artifacts/serviceport-mongo-authsource.exe,恢复 dist/.gitkeep。
  • 设置 SERVICEPORT_E2E_BINARY 指向该新程序,隔离端口 18381/18382 和临时 SQLite;gateway-connection-path、account-targets、connection-diagnostics 六项 Playwright 通过(12.3s)。本次仅复跑相关浏览器用例,未重跑全量 UI;此前全量失败记录仍保留,不宣称全量 UI 通过。
  • 未替换运行中的 bin/serviceport.exe,未修改实际数据库或目标数据。

2026-09-21 网关账号到目标账号的路径测试

  • 最终目标多账号常驻展开版本:前端构建后生成 serviceport-multi-account.exe;gateway-connection-path、account-targets、many-to-one、disconnect 五项专项回归通过(18.3s)。account-targets 另行截图复跑一项通过(4.5s),已检查 desktop/mobile 截图;覆盖未选择源时账号可见、选择前后位置稳定、账号级连线及独立映射。

  • 前一个 serviceport-account-path.exe 的完整 Playwright 结果为 97 通过、9 失败(9.9m)。失败为 account-editor 一项、global-assets-proxy-project 两项、kubeconfig-selection 一项、target-outbound-selection 一项、workspace-features 三项、workspace 一项,与此前记录的失败集合一致。该全量运行不包含最后的目标账号常驻展开改动,不能代替最终版本的全量验证;最终版本仅运行上述专项回归。两份程序均未部署覆盖正在运行的服务。

  • TestGatewayConnectionUsesAccountMapping 与原有 TestConnectionErrorsExposeStageWithoutDiagnostic 通过,使用隔离 SQLite 和 recording handler;覆盖无默认目标的账号选路、目标凭据/地址/SOCKS5 出口、拒绝未知和禁用账号、测试不改映射。

  • go test ./... -count=1 -timeout=120s(Go 1.25.0)、go vet ./...、前端生产构建通过。构建仅有 chunk 大小警告。

  • account-targets、connection-diagnostics、gateway-connection-path 共六项 Playwright 通过。补充多账号显式选择后,gateway-connection-path 两项复跑通过,验证请求 query、实际目标账号、K8s 资源路径及不泄露凭据/原始错误;单账号拖拽不改其他映射。新增 fixture 最初漏填 TargetTLS=false 被正常拒绝,修正测试配置后通过;多账号选择测试改为点击 Element Plus select 容器后通过。

  • 使用新嵌入式 serviceport-account-path.exe、隔离端口/SQLite;完整日志位于 artifacts/mongo-live-check-20260921-160801/account-path-playwright.log。本轮没有真实 MongoDB 连接测试或正式数据变更,不将模拟响应当作真实连接成功。

2026-09-21 资产统一居中弹框

  • npm.cmd --prefix web run build 通过,仅有 chunk 大小警告;恢复 .gitkeep 后构建 serviceport-asset-dialog.exe。
  • Go 1.25.0 的 go test ./... -count=1 -timeout=120s 与 go vet ./... 均通过。
  • 新增 asset-editor-dialog.spec.ts 两项通过:文件/连接资产与目标弹框尺寸一致、居中、无抽屉、无空页签、底部按钮可见;覆盖 1440/390/320px;取消保留草稿、Escape 放弃、再次打开清空。截图禁用过渡动画后已检查。
  • 既有 asset-remarks.spec.ts 一项、usability-assets.spec.ts 两项通过,覆盖上传保存、编辑/清空备注、内联创建回填与父草稿保护。
  • 共享弹框复用后,responsive.spec.ts 原先假定全部 connection-editor 都有连接页签和“保存配置”按钮;更新为保留尺寸/滚动/固定操作区断言,仅对存在的页签验证键盘导航,并识别各表单保存按钮。单独重跑 responsive.spec.ts 两项通过,覆盖 320/390/768/1920px。一次组合回归命令被终端 60 秒时限截断并报 EPIPE,不作为通过记录。
  • 测试使用 SERVICEPORT_E2E_BINARY 指向新嵌入式程序、隔离 SQLite 和端口。全量执行日志为 artifacts/mongo-live-check-20260921-160801/asset-dialog-playwright.log。未修改真实资产作测试,未停止/覆盖用户运行服务。
  • 全量首跑结果为 94 通过、10 失败(9.6 分钟):包括上一轮已失败的 9 项,以及本次共享容器导致 responsive 用例旧假定失效的 1 项。后者更新断言后所在 responsive.spec.ts 两项已单独通过,其余 9 项未在本任务中修复。不将单独复跑结果合并成一次全量通过;git diff --check 通过。

2026-09-21 菜单与资源侧栏切换

  • npm.cmd --prefix web run build 通过(只有既有 chunk 大小警告),构建后恢复 .gitkeep 并生成 serviceport-sidebar.exe。
  • SERVICEPORT_E2E_BINARY 指向该新程序,使用独立 SQLite 和 18181/18182 端口。sidebar-panels.spec.ts 两项通过,覆盖桌面/手机、键盘及本地偏好;桌面菜单和资源截图已检查。
  • 更新既有 DBX 宽度期望,以及 workspace-features/global-assets 用例中的资源视图切换入口。未更改真实业务数据来运行 UI 测试。
  • 最新全量 Playwright:93 项通过、9 项失败(9.6 分钟)。侧栏新增两项、DBX 三项、菜单搜索及响应式用例通过。失败为 account-editor、global-assets-proxy-project 两项、kubeconfig-selection、target-outbound-selection、workspace-features 三项和 workspace 的旧诊断断言;涉及小屏表单高度、重复未保存确认、超时和旧显示期望,本轮未扩大范围修复。全量执行日志位于 artifacts/mongo-live-check-20260921-160801/sidebar-playwright.log。不能声明全量浏览器回归通过。
  • 嵌入新前端后的全量 Go 测试与 vet 再次通过,git diff --check 通过。新版程序已生成,但未停止或替换用户当前运行的 bin/serviceport.exe。

2026-09-21 MongoDB 兼容握手与真实连接

  • TestLegacyAndModernHandshake:初次 isMaster/helloOk 协商,连续两次刷新选择正确命令,使用本地 net.Pipe fixture。
  • TestUpstreamSCRAMNegotiationAndEmptyFinish:认证库机制探测、SHA-256 优先、SHA-1 默认、额外空结束交换及异常结束载荷拒绝,使用本地 SCRAM fixture。
  • TestMongoHelloUnsupported:只允许 CommandNotFound 回退,认证、权限和网络错误不能触发回退。
  • 最新 GOTOOLCHAIN=go1.25.0 go test ./... -count=1 -timeout=120s 和 go vet ./... 均通过。中间一次 cluster MySQL fixture 间歇失败,最新全量通过;不代表间歇性根因已修复。
  • npm.cmd --prefix web run build 已通过(有 chunk 大小警告),不再是此前的 esbuild EPERM 阻塞。构建后恢复 web/dist/.gitkeep,再构建嵌入新前端的隔离测试程序。
  • 实际使用已保存 Kubeconfig,经 K8s port-forward 对 wall-e-test/statefulset/mongo-shopee:27017 进行握手、SCRAM、buildInfo 查询。用户提供认证库/凭据后成功返回版本 4.1.13、standalone、TLS=false、zlib。保存配置并重新读取后再次成功。未执行业务数据写入。
  • Playwright 首轮使用 SERVICEPORT_E2E_BINARY 指向 artifacts/mongo-live-check-20260921-160801/serviceport.exe,独立临时 SQLite 和端口,91 项通过、9 项失败;其中部分工作区用例执行期间又加入了后续侧栏变更,因此以后续 serviceport-sidebar.exe 全量运行结果为准,不将首轮当作干净的对照基线。

2026-09-21 连接路径与分阶段诊断

  • 新增 TestMongoFailureStages:本地 net.Pipe fixture 区分 TCP、TLS、hello 拒绝/断连、SCRAM 认证拒绝/交换断连、buildInfo 权限拒绝/断连,不依赖真实服务器。
  • 新增 gateway 和 API 白名单阶段测试:保留结构化阶段及内部 cause,未知阶段安全回退,管理响应与错误字符串不泄露凭据和服务器任意诊断文本。
  • 新增 connection-diagnostics.spec.ts:阶段中文映射、网络/认证区别、K8s 资产名与资源路径、无敏感内容及未知阶段回退;浏览器用例使用模拟失败响应,不连接真实集群。
  • 加入诊断后的全量 Go 测试:除既有 MySQL group-replication fixture 再次间歇失败外,API、gateway、Mongo、model、store 等包均通过;该 fixture 单独重跑通过。go vet ./... 通过。此前资产合并阶段的一轮全量通过,不能据此宣称间歇性测试已修复。
  • Vue 类型检查、Node 中执行的阶段区别/安全回退/K8s 路径纯函数断言、git diff --check 通过。Playwright --list 成功发现 100 项用例、43 个文件,仅验证用例可发现,不代表执行通过。
  • 最后一次 npm.cmd --prefix web run build 仍在 Vite/esbuild 启动时报 spawn EPERM。没有新前端包、没有部署、没有浏览器 E2E 结果;不能把类型/纯函数检查当作浏览器验证已通过。

2026-09-21 资产合并与目标内联 Kubernetes(当前源码)

  • Go 1.25.0:最后一轮 go test ./... -count=1 -timeout=120s 和 go vet ./... 全部通过。期间既有 MySQL group-replication fixture 曾间歇失败;单独重跑和最终全量通过,未修改该集群实现。
  • 新增 API/model 回归覆盖:目标不填写 IP 即可保存/草稿测试 StatefulSet、不生成中间代理、内联 Kubeconfig 解析、TLS/直连仍要求地址。存储 fixture 验证资产更新及版本恢复后使用最新内容、清除旧主机指纹、禁止删除被引用资产且不把 Kubeconfig 正文复制到目标记录。
  • Vue 类型检查通过;Node 执行 TypeScript 转译后的纯函数断言通过,覆盖目标 payload、不泄漏资产内容、连接引用/直连切换及 K8s 单节点和保活校验。
  • npm.cmd --prefix web run build 的类型检查阶段通过,但 Vite/esbuild 启动被当前环境以 spawn EPERM 阻止。没有新前端包,未构建/部署含新界面的运行程序,未执行浏览器端到端验证。下方旧版本的成功浏览器记录不代表此合并功能已通过 E2E。
  • 前端用例按新资产类别、连接字段、StatefulSet 目标直接配置、旧引用兼容和文件更新导航调整。使用隔离 API/模拟响应,不宣称真实 Kubernetes、MongoDB、SSH/SOCKS5 连通性;未操作真实 data 或重启服务。

2026-09-21 新建目标选择代理验证

  • 新增 target-outbound-selection.spec.ts,先对上一轮构建的程序执行首个用例,确认默认「连接信息」页没有可见的代理选择器;修改后新增 3 项用例通过。
  • npm.cmd --prefix web run build 通过,包含 Vue 类型检查与 Vite 构建,仅有原有主包体积警告。待构建完成后使用 Go 1.25.0 生成 artifacts/target-outbound-selection/serviceport.exe,保留 web/dist/.gitkeep。
  • 使用上述新程序、独立数据及 19291/19292 端口执行 target-outbound-selection.spec.ts、kubeconfig-selection.spec.ts、kubernetes.spec.ts、project-scope.spec.ts、target-editor-test.spec.ts,21 项全部通过。覆盖首屏直连/SSH/SOCKS5/K8s 选择、服务类型和页签切换保留引用、Mongo 草稿测试参数、实际 API 保存与重新编辑回读、改回直连、跨项目选择、空列表、不可用引用及 390px 小屏。
  • Go 1.25.0:go test ./... -count=1 -timeout=120s 和 go vet ./... 全部通过,先完成后端检查再执行全量浏览器测试,避免目录清理竞争。
  • 全量 Playwright 使用新程序执行 npm.cmd --prefix web test -- --max-failures=3:82 通过、3 失败、8 未运行。失败仍是已记录的 account-editor.spec.ts 320×568 权限页多出 14px 滚动,以及 workspace-features.spec.ts 的 URL 参数和搜索/树导航两项超时。
  • 对上述未运行的 8 项补跑:workspace.spec.ts 7 项全部通过,覆盖 SSH/SOCKS5 目标配置、共享代理引用、凭据保留与删除保护等;workspace-features.spec.ts 的表格列设置用例在对隐藏 checkbox 执行 uncheck 时超时。再用本次修改前的 artifacts/kubeconfig-selection/serviceport.exe 单独复跑该列设置用例,同样失败,确认不是本次代理入口引入。两轮合计 89 项通过、4 项既有失败,未扩展修复这些无关功能。
  • Mongo 草稿连接结果、跨范围列表和不可用引用场景使用浏览器模拟;三类代理创建、Kubeconfig 资产保存、Mongo 目标保存与切回直连通过隔离 API。未连接真实 MongoDB、SSH/SOCKS5 代理或 Kubernetes 集群;Go 协议测试使用本地 fixture。未替换现用程序或操作真实数据。
  • git diff --check 通过,构建占位文件恢复原样;所有测试结束后确认隔离端口 19291/19292 不再监听。
  • 验证边界:本轮程序于 2026-09-21 13:21 构建,Go 检查于 13:25 完成。收尾发现 internal/store/audit_shards.go、commands.go、event_shards.go、store.go 在 13:34 出现其他修改;本任务未触碰或回退它们,上述构建及测试结果不覆盖这些后续修改。

2026-09-21 Kubeconfig 资产选择验证

  • 修改前,在新构建 EXE 上创建“数据库平台 · 正式”的 Kubeconfig,再以“默认项目 · 测试”新建代理,复现资产被范围过滤且无提示/展开入口;回归用例明确失败。
  • npm.cmd --prefix web run build 通过,包含 vue-tsc 与 Vite 生产构建;仅有原有主包体积警告。构建后保留 web/dist/.gitkeep,再使用 Go 1.25.0 构建 artifacts/kubeconfig-selection/serviceport.exe,未并发替换嵌入资产。
  • 使用该新 EXE、独立数据及 19191/19192 端口,kubeconfig-selection.spec.ts、kubernetes.spec.ts、usability-assets.spec.ts、project-scope.spec.ts 共 7 项通过。新增 2 项覆盖跨范围 Kubeconfig 显式选择、排除普通文件、隐藏范围后保留引用、保存代理与 Mongo 目标并回读、空态类型提示、刷新失败重试和 390px 小屏。
  • Kubernetes 命名空间/资源查询使用浏览器模拟响应;资产、代理和 Mongo 目标保存经过真实隔离 API。没有调用真实 Kubernetes API 或连接真实 MongoDB,不将 UI/引用验证表述为实时 port-forward 成功。
  • Go 1.25.0:go test ./... -count=1 -timeout=120s 和 go vet ./... 串行复跑全部通过,包括 internal/cluster。首次与 Playwright 并发运行时,Go 枚举目录遇到正在清理的 web/test-results,报 pattern ./...: open web\test-results: The system cannot find the file specified.;待浏览器结束后重跑消除该竞争。协议测试使用本地 fixture,未连接真实数据库或 SSH 服务。
  • 全量 Playwright 使用同一新 EXE,执行 npm.cmd test -- --max-failures=3:79 通过、3 失败、8 未运行,达到失败上限后停止。失败与 2026-09-20 已记录情况一致:account-editor.spec.ts 的 320×568 权限页多出 14px 滚动,以及 workspace-features.spec.ts 的 URL 参数、搜索/树导航两项超时;新增 2 项均通过,未修改上述无关功能。
  • 未改动用户真实数据、未替换现用程序;测试结束后确认隔离端口 19191/19192 不再监听,git diff --check 通过。

2026-09-21 库内密钥、历史整合与工作区回归

  • Go 1.25.0:go test ./... -count=1 -timeout=120s 和 go vet ./... 全部通过,包含新增库内密钥与离线整合测试。协议测试仍为隔离 fixture。
  • 密钥验证覆盖首次入库、无外置密钥文件、重启、只复制主 SQLite 后仍能解密原密码/私钥、缺失/损坏记录不重建、显式环境密钥不匹配拒绝,以及外置文件不自动导入或覆盖。
  • 离线工具 fixture 覆盖当前配置优先、独有资源合并、新增网关停止、旧管理员不覆盖、使用不同源密钥时正确重加密、完整备份、准备模式不改源库、应用模式替换主库、旧库与旧密钥保持。流程测试通过注入测试密钥执行,不依赖真实 DPAPI。真实密钥最初在代理环境解密失败,随后用户在原 Windows 会话执行整合成功,详见 历史数据说明。
  • 真实整合结果复核:consolidate-20260920T171719.754430900Z/report.json 为 applied:true;16 个备份文件及 10 个保留原文件哈希通过。ready/ 的主库复制件完整性、库内密钥和全部资源解密通过,8 个目标、4 个网关、1 个资产,2 个导入网关停止。实际安装主库在代理环境读取返回 EPERM,未直接核对其内容或启动真实服务。
  • 前端 vue-tsc/Vite 构建通过并保留 .gitkeep,存在已知 bundle 体积警告。账号编辑器 320×568 全页签以及 URL、搜索导航、列设置专项通过;测试未放宽滚动阈值,使用可见 checkbox 标签并保留状态断言。
  • node scripts/package.mjs --all 完成六目标构建,发布目录 artifacts/releases/2026-09-20T16-40-11-688Z-701d60e4/ 的六份 SHA256 均与清单一致。Windows x64 原生包与本地启动(无外置密钥、可选认证、TLS、重启与搬移)验收通过。Linux/macOS × amd64/arm64 的桌面测试二进制也编译通过,未实机执行;远程 CI 未执行。
  • 全量 Playwright 使用此次新程序 artifacts/db-key-verification/serviceport.exe,通过 SERVICEPORT_E2E_BINARY 指定,隔离数据库和端口 18485/24687。首轮 91 通过、4 失败:工作区 helper 仍匹配精简前的白名单说明文字,重试又遇到前次创建的重复 fixture。已同步文案断言并重建两套隔离测试库重跑;首轮目录为 artifacts/db-key-verification/full,最终目录为 artifacts/db-key-verification/full-final。
  • 最终完整运行设置 --retries=0,95 项全部通过(7.0 分钟),包含此前失败的四项工作区/小屏用例及主题切换。测试结束后停止本轮两套隔离服务;未部署到真实数据目录。

2026-09-20 三平台与明文主密钥验证

  • Go 1.25.0:go test ./... -count=1 -timeout=120s、go vet ./... 全部通过,包含 Windows 本地密钥、运行锁、缺失密钥保护,以及旧 DPAPI 文件不转换且保留的回归。协议测试使用本地 fixture,未连接真实上游服务器。
  • node scripts/build-web.mjs --force 完成前端类型检查及 Vite 生产构建,保留 web/dist/.gitkeep;仅有 bundle 体积警告。之后执行 node scripts/package.mjs --all,生成 Windows/Linux/macOS × amd64/arm64 六个平台的独立程序,文件校验和均与清单一致。
  • Windows x64 使用此次实际程序通过单文件发布验收(版本信息、内嵌网页、隔离启动和登录)及 verify-desktop.mjs(免登录、可选管理员设置、自动 TLS、未加密密钥持久化、认证重启和搬移数据)。其他五个目标为编译验证。另对 Linux/macOS × amd64/arm64 的 internal/desktop 测试代码执行 go test -c,全部编译成功,未在异系统执行。
  • Node 脚本语法、三个 Unix shell 入口的 Git Bash bash -n、CI YAML 解析及矩阵检查、git diff --check 通过。Windows 启动脚本 fixture 回归在 Get-CimInstance Win32_Process 遇到当前环境权限拒绝,未完成源码启动和备份验收;不计为通过。远程三系统 CI 已配置但未执行。
  • 产物:artifacts/releases/2026-09-20T13-38-02-849Z-dc352132/;浏览器验证使用复制出的新程序 artifacts/platform-verification/serviceport.exe,通过 SERVICEPORT_E2E_BINARY 指定,测试服务使用隔离数据及 8485/14687 端口。未部署到真实数据目录,未转换或删除实际 master-key.dpapi。
  • 全量 Playwright 95 项、不重试:90 通过、5 失败。最后的主题用例在 browser.newContext 阶段因浏览器关闭失败,用新浏览器单独复跑后通过;剩余 4 项为此前已在旧程序复现的账号权限页 320×568 多出 14px 滚动,以及 workspace-features.spec.ts 的 URL 参数、搜索/树导航、表格列设置三项超时。整套结果不计为通过。本轮环境保存、请求报错信息、SQLite、RabbitMQ 版本、Sentinel 认证用例均通过。报告目录为 artifacts/platform-verification/playwright 和 artifacts/platform-verification/theme。

2026-09-20 Windows 多路径启动验证

  • Go 1.25.0:go test ./internal/desktop ./cmd/serviceport -count=1 -timeout=120s 通过,覆盖当前目录新库、AppData 已有库、双库优先级、相对/绝对显式路径、不依赖 AppData 环境、手动主密钥模式不遍历、目录占位错误、已有库缺密钥,以及 data-path 命令无初始化副作用与参数校验。
  • powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/start-dev.test.ps1 通过:临时含空格项目、异目录调用、调用者目录恢复、构建锁、BuildOnly/FullCheck/RebuildWeb、构建/路径解析失败隔离;源码/发布入口不强制数据路径且保留显式设置;完整备份实际选中目录,并拒绝递归备份和被其他实例占用的数据。该脚本使用只记录环境变量的可执行 fixture,不启动真实服务。
  • go vet ./...、npm.cmd --prefix web run build、git diff --check 通过。Vite 报告主包体积警告,未作为失败处理;构建后保留 web/dist/.gitkeep,待 Vite 完成后再构建嵌入前端的新 EXE。
  • node scripts/verify-desktop.mjs artifacts/path-validation/serviceport.exe 使用此次新构建程序及 Edge 无头浏览器,通过当前目录创建、首次账号设置、自动 TLS、DPAPI 密钥保持、认证重启,以及将测试库移至隔离 AppData 后复用旧账号且不另建本地库。原桌面脚本的管理员字段定位已更新为实际表单标签“登录账号/登录密码”。
  • 全量 go test ./... -count=1 -timeout=120s 未全绿:未改动的 internal/cluster 中 TestMySQLReplicationAndGroupDiscovery 出现“无可用主节点”,单包复跑还出现拓扑不符;其余包通过。协议覆盖全部为本地 fixture,未连接真实 MySQL/MongoDB/SSH 服务。
  • Playwright 使用新 EXE、独立数据和 19091/19092 端口,执行 npm.cmd test -- --max-failures=3:77 通过、3 失败、8 未运行,达到失败上限后停止。失败为 account-editor.spec.ts 的 320×568 权限页多出 14px 滚动,以及 workspace-features.spec.ts 的 URL 参数、搜索/树导航两项超时;未修改这些前端功能或把此轮报告为全套通过。
  • 未运行实际项目的启动入口、未替换现用 EXE、未读写真实项目数据或用户 AppData 数据;路径变更无需数据库表结构迁移。

本地生成文件与 Git 忽略规则

.gitignore 排除本地 data、bin、artifacts、tmp、依赖目录和环境凭据;前端构建输出保留 web/dist/.gitkeep。Playwright 可从项目根目录或 web 运行,两处的 test-results、playwright-report、blob-report、缓存和隔离临时目录均不进入版本控制。

SQLite 的 .sqlite、.sqlite3 及其 journal/WAL/SHM 文件忽略;根目录临时 .db 及其侧文件也忽略。数据目录中的审计、DPAPI 主密钥与 TLS 文件保持本地,另外排除根目录可选的 tls 目录。规则不全局忽略所有 .db、证书、归档或配置文件,避免隐藏协议 fixture 和源码资产;.env.example、依赖锁文件、测试代码和文档应继续可提交。

修改规则后使用 git check-ignore --no-index 验证正反例,并检查 git ls-files 确认生成目录未被跟踪(dist 仅保留占位文件)。忽略规则不会删除文件,也不会让已经跟踪的文件自动退出版本控制。

2026-09-18 未保存目标连接测试

  • 新接口覆盖全部 10 种协议的草稿分派、未完成的非选中账号、按账号 ID 保留或临时覆盖密码、配置与历史不变、网关引用不变、CSRF 与字段校验、错误脱敏、私钥和 Kubeconfig 资产解析。
  • SSH 使用隔离的本机协议 fixture,验证未确认/错误指纹时不进行认证、确认后连接成功、后续测试不会继承临时信任。其他协议的新增接口测试使用记录型 handler;浏览器测试模拟远端结果。未连接生产服务或进行真实数据库版本验收。
  • go test ./... -count=1 -timeout=120s 中 API、存储、模型及协议包通过;Windows 桌面 TestLocalKeyPersistenceAndLock 仍报 The system cannot find the file specified.。网关 TestShutdownClosesAfterGracePeriod 首次报 handler not started,随后单独重跑整个 internal/gateway 包通过,因此不宣称首次全量通过。
  • go vet ./...、Vue 类型检查与 Vite 构建通过。Vite 保留大包体积提示;前端构建完成后用 Go 1.25.0 生成新的嵌入式测试程序,恢复 web/dist/.gitkeep。
  • 默认 18081/18082 被另一轮测试占用,本轮设置 SERVICEPORT_E2E_PORT=19081、SERVICEPORT_E2E_AUTH_PORT=19082 并通过 SERVICEPORT_E2E_BINARY 指定新程序;使用独立临时数据和结果目录,未停止其他服务、未部署实际数据目录。
  • target-editor-test.spec.ts 的 13 项用例全部通过:修改后按指定账号测试且不保存、10 种协议新建草稿测试、390px 手机下 MongoDB URI 副本集草稿测试、SSH 临时指纹取消与确认。其他协议的远端连接结果由浏览器路由模拟,后端 SSH 认证由上面的本地 fixture 验证。
  • 整套浏览器运行先通过 35 项,随后并行工作新增的 rabbit-version.spec.ts 在创建测试目标时失败:fixture 账号缺少保存接口必需的名称,尚未进入连接测试。未修改该并行文件,余下用例另起隔离服务继续运行;不能把这一轮称为首次全套通过。
  • 余下 32 项先通过 31 项,最后的主题用例在创建浏览器上下文时遇到 Edge 退出;用新浏览器单独重跑通过。最终本轮范围内的 67 项浏览器用例分批通过,另有上述并行 RabbitMQ 用例失败记录。Windows 测试服务退出等待期间仅停止本轮指定路径的测试程序,未停止用户服务或另一轮测试程序。

改动原因和行为边界见 未保存配置的连接测试 与 变更原因与设计记录。

2026-09-18 账号路由与免滚动编辑验证

以下是本轮实际执行记录;下方早期版本的“全量通过”不代表本轮 Windows 环境所有测试通过。

  • 前端:npm.cmd --prefix web run build(Vue 类型检查及 Vite 生产构建)通过。使用 Go 1.25.0 在前端构建结束后生成新的嵌入式测试程序,并通过 SERVICEPORT_E2E_BINARY 运行 Playwright;恢复了受版本控制的 web/dist/.gitkeep。
  • 最终 55 项浏览器用例分批验证通过。全量运行先通过 48 项;旧工作区测试仍假设白名单位于登录表单,按新分组入口修正后,该文件的 6 项业务用例通过。最后的主题用例在创建浏览器上下文时遇到 Edge 退出,使用新浏览器单独重跑通过。因此不是一次完整运行零失败。
  • 新增免滚动用例使用 12 个已有账号,检查 1440×900、375×812、320×568 的登录、目标、权限、更多分组内容高度;验证新增第 13 个账号立即聚焦、切换保留草稿、跨账号错误定位及保存后凭据保留。小屏溢出修正后该用例通过。
  • 账号路由后端改动执行 go test ./... -count=1 -timeout=120s。相关模型、存储、API、网关及协议包通过;internal/desktop 的 TestLocalKeyPersistenceAndLock 仍报 The system cannot find the file specified.,因此完整命令返回失败。go vet ./... 通过。
  • 随后补充的双目标 SSH 账号切换/重连测试单独运行通过,覆盖同一监听端口按账号访问不同目标、只切换一个账号、新连接更新路由以及已有会话保持原目标。SSH、HTTP TLS、MongoDB 和 RabbitMQ 路由测试使用隔离 fixture,没有对实际生产服务做验收。
  • 最新免滚动编辑调整只涉及前端及文档,重新执行前端构建和浏览器验证,未把此前后端结果表述为重新运行后的结果。测试使用独立数据库和端口,未部署或迁移实际使用的数据目录。

改动原因见 变更原因与设计记录,使用方式见 易用性 与 账号说明。

0.3.0 验证

  • 共享代理出口:Go 全套测试与静态检查通过,覆盖旧出口原子迁移/幂等性、凭据不重复保存、目标引用解析、共享更新、运行中修改阻止、引用删除阻止和密码查看权限。八项浏览器流程验证代理独立菜单、目标下拉、多目标共享、解绑删除及既有服务功能;主题测试遇到 Edge 进程退出后独立重跑通过。桌面/390px 手机截图无页面溢出或抽屉裁切。

  • Go 全量测试和 go vet 通过;Vue 类型检查和生产构建通过。

  • 内置 Kubernetes 测试使用模拟 API 与真实 SPDY 流,覆盖 TLS/Token、双向数据、建连取消、成功连接不受拨号 context 取消影响、关闭清理,以及 Service selector 和命名 targetPort。未连接真实 Kubernetes 集群。

  • 七项浏览器流程覆盖既有功能、K8s 配置保存/编辑、缺失 kubeconfig 错误和版本信息;手机抽屉位置、宽度及截图验证通过。主题测试在整套运行时遇到 Edge 进程退出,独立重跑通过。

  • 版本 CLI/API、无数据初始化的版本查询及 Windows 元数据注入构建通过。Linux/Docker 构建尚未运行。

本次验证记录

2026-09-09,Windows / Go 1.25.0 / Node.js 24 / Microsoft Edge:

  • go test ./... 通过,真实服务测试在未提供环境变量时明确跳过。
  • go vet ./... 通过。
  • Vue 类型检查与生产构建通过,生成并嵌入 Go 可执行文件。
  • Playwright 两条完整流程通过:MySQL 默认读写/可选只读/密码查看,MongoDB 与 SSH 的 SOCKS5 配置及编辑后凭据保留。
  • 已检查桌面与移动端截图,移动端使用独立卡片布局且无页面横向溢出。
  • PowerShell、Bash、MongoDB 初始化脚本语法检查及主密钥生成检查通过。
  • MySQL AST 和 MongoDB wire/BSON 只读检查器完成短时模糊测试。

Docker 真实服务矩阵尚未在本机执行,不能据此宣称全部目标版本已完成兼容认证。

本地测试

统一使用 Go 1.25.0。Windows 已安装更高版本 Go 时设置 GOTOOLCHAIN=go1.25.0;首次使用需下载兼容工具链。

$env:GOTOOLCHAIN = 'go1.25.0'
go test ./...
go vet ./...
npm.cmd --prefix web run build
go build -o bin/serviceport.exe ./cmd/serviceport
npm.cmd --prefix web test

浏览器测试使用隔离的临时 SQLite、随机主密钥和仅供测试的登录密码,监听 127.0.0.1:18081,结束后清理。不连接用户的数据库。默认使用已安装的 Edge;其他平台可安装 Playwright Chromium 并设置 SERVICEPORT_BROWSER_CHANNEL=chromium。截图输出到忽略版本控制的 web/test-results。

已有自动化覆盖

模块 覆盖范围
API 登录、会话/CSRF、默认读写、CRUD 脱敏、密码保留和重新认证查看、限流、停止前禁止修改、主机指纹字段防绕过
存储 AES-GCM 随机 nonce、篡改/用途/错误密钥拒绝、SQLite 加密持久化、登录密码重置及会话版本
运行管理 CIDR、来源限制、并发上限、端口冲突、可选 TLS、启停和连接清理
SOCKS5 无认证/密码认证、禁止降级、远端 DNS、IPv4/IPv6、失败不直连、超时和取消
MySQL TLS 网关、raw packet 转发、二进制预编译、重置、可选只读、LOCAL INFILE 拒绝、AST 模糊测试
MongoDB 官方 Go 驱动连接、双端 SCRAM、推测认证、上下游 TLS、BSON/OP_MSG、批量写入/游标、只读递归检查与模糊测试
SSH 进程内真实 SSH 协议、密码/公钥、带口令私钥、固定指纹、PTY/window、exec/退出码、SFTP channel、限制转发及取消
管理界面 登录、新建三类代理、默认读写、切换只读、SOCKS5 配置、凭据保留、密码查看、桌面及移动端布局

进程内协议测试使用可控服务端,不等同于真实数据库版本或 OpenSSH 的完整兼容认证。

Docker 真实版本测试

需要安装并运行 Docker Engine/Compose。所有服务为独立测试实例,端口只绑定到本机;脚本使用独立 Compose 项目,测试会创建并删除临时数据库,结束后删除该项目的测试卷。不要将这些测试指向生产服务。

.\scripts\test-matrix.ps1
bash scripts/test-matrix.sh

固定镜像和端口以 Compose 文件 为准:

服务 版本 本机端口
MySQL 5.7.44 / 8.0.43 / 8.4.6 13357 / 13380 / 13384
MongoDB 6.0.26 / 7.0.24 / 8.0.13 27060 / 27070 / 27080
OpenSSH 测试 Dockerfile 固定基础镜像 12222
SOCKS5 仓库内测试实现,无认证 / 密码 11080 / 11081

生成的测试 CA 用于目标 TLS 验证。MongoDB 8.0 测试实例配置单节点副本集,脚本负责初始化以验证事务。脚本对全部数据库版本及 SSH/SFTP 分别执行直连、无认证 SOCKS5、密码 SOCKS5 三条路径;SOCKS5 路径使用仅 Docker 内可解析的服务名,检查远端 DNS。服务凭据仅供这些一次性测试实例使用,详见 Compose。

手动启动测试实例:

docker compose -f deploy/compose.test.yml up -d --build --wait
docker compose -f deploy/compose.test.yml run --rm --no-deps mongo80-init

独立连接已准备好的目标测试实例:

  • MySQL:SERVICEPORT_MYSQL_TEST_ADDR、SERVICEPORT_MYSQL_TEST_USER、SERVICEPORT_MYSQL_TEST_PASSWORD、可选 SERVICEPORT_MYSQL_TEST_CA(CA 文件路径),执行 go test ./internal/protocol/mysqlproxy -run TestRealMySQL -count=1 -v。
  • MongoDB:SERVICEPORT_MONGO_TEST_ADDR、SERVICEPORT_MONGO_TEST_USER、SERVICEPORT_MONGO_TEST_PASSWORD、可选 SERVICEPORT_MONGO_TEST_CA(PEM 内容),执行 go test ./internal/protocol/mongoproxy -run TestRealMongo -count=1 -v。
  • SSH:SERVICEPORT_SSH_TEST_ADDR、SERVICEPORT_SSH_TEST_USER、SERVICEPORT_SSH_TEST_PASSWORD,执行 go test ./internal/protocol/sshproxy -run TestRealSSH -count=1 -v。验证远程输出和退出码、SFTP 上传下载及清理、禁止 TCP 转发。

三类测试可额外设置 SERVICEPORT_TEST_SOCKS_ADDR 和可选 SERVICEPORT_TEST_SOCKS_USER/PASSWORD,使用真实生产出站层经 SOCKS5 连接上述目标。测试中的首次 SSH 指纹探测仅适用于已明确指定的一次性测试服务,不替代生产环境的管理员独立核对流程。

测试账号须允许创建和删除独立测试库;未设置地址时真实版本测试明确跳过。省略上游 CA 时测试按明文上游运行,但网关客户端仍执行 TLS。

验证边界

当前开发机器没有 Docker、MySQL 或 MongoDB 服务,真实版本矩阵和 OpenSSH/mongosh 客户端组合尚未在此机器执行。Docker 镜像启动、数据库各版本 TLS/认证差异、真实副本集事务以及所有服务经 SOCKS5 的端到端组合,需要运行测试环境后再确认。

只读是严格请求白名单,不等同数据库权限保证;MongoDB 只读游标按客户端连接限制,多文档事务不在只读兼容范围。完整边界见 只读说明 和 开发计划。

Windows 双击启动验证

已通过 go test ./...、go vet ./...,以及 Edge 无头浏览器的桌面启动回归。验证包括无管理员/主密钥环境变量启动、从其他工作目录启动、首次页面创建管理员、自动本机 TLS、DPAPI 密钥持久化、重启后原账号登录。初始化单元测试覆盖错误 token、跨来源请求和重复初始化;Windows 测试覆盖独占锁和数据库存在时禁止替换丢失密钥。

对解压后的发行包运行:

node scripts/verify-package.mjs <单EXE交付目录或serviceport.exe路径>
node scripts/verify-desktop.mjs <解压后的目录>/serviceport.exe

脚本只在独立临时工作目录中测试:无已有库时创建 data 且不创建隔离的 AppData;随后将测试数据移至隔离的 AppData,验证旧库复用、原账号登录、密钥不变且不另建本地库。整个过程不读取实际用户配置。桌面脚本用 Edge 自动操作首次设置页面,禁用系统浏览器弹窗并使用随机本机端口;系统默认浏览器关联及资源管理器双击交互未由此脚本覆盖。

0.2.0 新增验证范围

  • 独立目标 CRUD、多网关复用、目标修改/删除约束、旧版事务迁移、密码/SSH 身份/启用状态保留、网关存储不重复保存上游秘密。
  • 本机免登录开发会话、Host/来源/CSRF 限制;认证启用时的既有登录与重新认证测试。
  • MySQL 模拟服务压缩协商/回退、流量缩减、结果集和预编译;MongoDB 压缩协商/回退、压缩报文边界、凭据命令不压缩、只读网关转发。真实目标压缩仍需实际版本矩阵验证。
  • SQL/MongoDB 放行与拦截审计、预编译模板、日志故障阻止转发;SSH exec/输入/SFTP 解析;日志内容加密、分页、筛选和 7 天保留。
  • Edge 验证默认免登录、独立目标与网关表单、共享目标/只读策略、MongoDB/SSH/SOCKS5、压缩配置、三种主题及系统跟随/持久化、移动布局和命令审计入口。

2026-09-09 扩展验收

  • Go 1.25.0 全量单元、协议、API、迁移测试与 go vet 通过;Vue 类型检查与生产构建通过。
  • 隔离的真实 MySQL 5.7.44 实例通过 TLS + zlib、读写/只读、SHOW TABLE STATUS、SHOW FULL PROCESSLIST 和指定三语句批次测试;结果见 artifacts/mysql-verification/show-batches-mysql57.log。测试库自动清理,实例验证后关闭。
  • Redis 使用可控 RESP 服务验证认证、HELLO、流水线、订阅、取消及审计;RabbitMQ 使用 amqp091-go 客户端连接模拟 broker;PostgreSQL 使用 pgconn 客户端连接模拟后端,验证简单/扩展查询、参数化、认证及审计。尚未对真实 Redis、RabbitMQ、PostgreSQL 部署做版本兼容验收。
  • 审计测试覆盖跨三日 411 条记录分页、跨日关键词和完整导出、密文迁移、失败重试/冲突保护、7 天清理、取消和并发。连接事件覆盖旧记录迁移、跨日筛选/分页及 CSV 导出。未执行 Go race 检查(当前未配置所需 C 工具链)。
  • Edge 六项流程通过,覆盖拖拽连接、审计筛选/导出、共享目标、可选只读、SSH/SOCKS5 出口、三种新增服务配置、主题及移动布局。最后一项首次因 Edge 进程退出失败,单独重跑通过。