Files
reverse-skill/skills/scripts/test-routing.ps1
T
kin9-0rz 0bc4ec960d fix(scripts): 统一 PowerShell 子进程入口并修复 r2 工具索引 fallback
- 新增 lib/HostRuntime.ps1 的 Resolve-ReverseHostExe,子进程调用统一经当前进程优先解析(pwsh→powershell→系统兜底),替代 verify/case-init/test-routing/test-p0-friction 中硬编码的 & powershell / Start-Process powershell.exe,修复仅装 PowerShell 7+ 环境下子进程调用失败
- ToolDiscovery.ps1 的 r2 Fallbacks 补充 r2.bat 与 radare2.exe 路径,修复 radare2 Windows 发行版(无 r2.exe)下 tool-index 误报 no
- verify-routing-coherence.ps1 的 pin gate 改用 hashtable 索引访问 capabilities 可选属性,修复 Set-StrictMode -Latest 下访问不存在属性抛错(此前被 powershell 硬编码失败掩盖)
- 回写 field-journal 并同步 _index.md
2026-08-17 14:20:38 +08:00

99 lines
3.7 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#Requires -Version 5.1
# reverse-skill 路由回归测试器:跑 routing-benchmark.json 全部用例,比对 PRIMARY 期望。
# 用法:
# powershell -NoProfile -ExecutionPolicy Bypass -File skills/scripts/test-routing.ps1
# powershell -File skills/scripts/test-routing.ps1 -Quick # 只跑 quick 最小回归集
# powershell -File skills/scripts/test-routing.ps1 -Benchmark <path> -LogDir <dir>
# 退出码:0 全绿 / 1 有用例失败(failures 详情写入 LogDir)
param(
[string] $Benchmark = '',
[switch] $Quick,
[string] $LogDir = '',
[string] $PackageRoot = ''
)
$ErrorActionPreference = 'Stop'
$scriptDir = $PSScriptRoot
if (-not $scriptDir) { $scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path }
$skillsRoot = Split-Path -Parent $scriptDir
if (-not $PackageRoot) { $PackageRoot = Split-Path -Parent $skillsRoot }
. (Join-Path (Join-Path $scriptDir 'lib') 'HostRuntime.ps1')
$HostExe = Resolve-ReverseHostExe
if ([string]::IsNullOrWhiteSpace($Benchmark)) {
$Benchmark = Join-Path $skillsRoot 'tests\routing-benchmark.json'
}
if (-not (Test-Path -LiteralPath $Benchmark)) {
Write-Host ("ERROR: benchmark not found: {0}" -f $Benchmark) -ForegroundColor Red
exit 2
}
$bm = Get-Content -LiteralPath $Benchmark -Raw -Encoding UTF8 | ConvertFrom-Json
# $env:TEMP 在 Linux/macOS runner 上可能未设置,统一用 GetTempPath fallback
$tmpBase = if ($env:TEMP) { $env:TEMP } else { [System.IO.Path]::GetTempPath() }
if ([string]::IsNullOrWhiteSpace($LogDir)) {
$LogDir = Join-Path $tmpBase ("rs-routing-test-{0}" -f (Get-Date -Format 'yyyyMMdd-HHmmss'))
}
New-Item -ItemType Directory -Force -Path $LogDir | Out-Null
$masterRoute = Join-Path $scriptDir 'master-route.ps1'
$cases = @($bm.cases)
if ($Quick) { $cases = @($cases | Where-Object { $_.quick }) }
$fail = New-Object System.Collections.Generic.List[string]
$pass = 0
$failCount = 0
$detail = New-Object System.Collections.Generic.List[string]
Write-Host ("=== test-routing | {0} cases (quick={1}) ===" -f $cases.Count, [bool]$Quick)
foreach ($c in $cases) {
$tmp = Join-Path $tmpBase ("rs-rt-{0}" -f [guid]::NewGuid().ToString('n'))
$got = 'ERR'
try {
$null = & $HostExe -NoProfile -ExecutionPolicy Bypass -File $masterRoute -Hint $c.hint -OutDir $tmp 2>&1
$scope = Join-Path $tmp 'route-scope.md'
if (Test-Path -LiteralPath $scope) {
$text = Get-Content -LiteralPath $scope -Raw -Encoding UTF8
if ($text -match 'primary:\s*(\S+)') { $got = $Matches[1] }
}
} catch {
$got = 'EXC:' + $_.Exception.Message
} finally {
Remove-Item -Recurse -Force $tmp -ErrorAction SilentlyContinue
}
if ($got -eq $c.expect) {
$pass++
[void]$detail.Add(("PASS {0} -> {1}" -f $c.expect, $c.hint))
} else {
$failCount++
$msg = ("FAIL hint='{0}' expect={1} got={2}" -f $c.hint, $c.expect, $got)
Write-Host ("[FAIL] {0}" -f $msg) -ForegroundColor Red
[void]$fail.Add($msg)
[void]$detail.Add($msg)
}
}
$detail -join [Environment]::NewLine | Set-Content -LiteralPath (Join-Path $LogDir 'cases.txt') -Encoding UTF8
$summary = @(
"TOTAL=$($cases.Count)",
"PASS=$pass",
"FAIL=$failCount",
"QUICK=$([bool]$Quick)",
"LogDir=$LogDir"
)
$summary -join [Environment]::NewLine | Set-Content -LiteralPath (Join-Path $LogDir 'SUMMARY.txt') -Encoding UTF8
Write-Host ('=== ROUTING TEST SUMMARY ===')
$summary | ForEach-Object { Write-Host $_ }
if ($failCount -gt 0) {
$fail | Set-Content -LiteralPath (Join-Path $LogDir 'failures.txt') -Encoding UTF8
Write-Host "OVERALL: FAIL ($failCount)" -ForegroundColor Red
exit 1
}
Write-Host "OVERALL: ALL PASS ($pass)" -ForegroundColor Green
exit 0