Files
TheM14 ea30786711
build / windows (push) Has been cancelled
build / release (push) Has been cancelled
Fix files past MAX_PATH not being claimed or decoded
2026-10-01 14:07:34 +08:00

74 lines
3.1 KiB
PowerShell

# Runs a portable test bed unattended: start it, let it work, exit cleanly, dump the log.
#
# pwsh -File tools/run.ps1 -TestBed ..\fb2k-test -Play ..\sample.eac3
# pwsh -File tools/run.ps1 -TestBed D:\fb2k -Platform x64 -Play D:\x.eac3 -WaitSeconds 25
#
# The test bed is an existing portable foobar2000 installation with the component
# deployed into it (tools/deploy.ps1). Two things this script exists to get right:
#
# * foobar2000 is closed with /exit, never force-killed. A force-killed instance
# leaves <profile>\running behind, and every later start then reports "another
# foobar2000 instance appears to be running with the same configuration data"
# and idles without loading any user component.
# * the component's log is written next to the DLL, so it is read from wherever
# the component was deployed.
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)][string]$TestBed,
[ValidateSet('Win32', 'x64')][string]$Platform = 'Win32',
[string[]]$Play,
[int]$WaitSeconds = 15,
[switch]$KeepRunning
)
$ErrorActionPreference = 'Stop'
if (-not (Test-Path -LiteralPath (Join-Path $TestBed 'foobar2000.exe'))) {
throw "no foobar2000.exe in $TestBed"
}
$exe = Join-Path $TestBed 'foobar2000.exe'
# A leftover "running" marker makes the next start refuse to load components.
$running = Join-Path $TestBed 'profile\running'
if (Test-Path -LiteralPath $running) {
if (Get-Process foobar2000 -ErrorAction SilentlyContinue) {
throw 'a foobar2000 process is running; close it (or /exit) before starting a run'
}
Remove-Item -LiteralPath $running -Force
Write-Host 'cleared a stale profile\running marker'
}
$arguments = @()
# Start-Process joins the array with spaces and quotes nothing itself, so a path with
# a space in it would reach foobar2000 as several arguments and nothing would play --
# silently, which is the worst way for a test bed to fail.
if ($Play) { $arguments += ($Play | ForEach-Object { '"' + $_ + '"' }) }
$process = Start-Process -FilePath $exe -ArgumentList $arguments -PassThru
Write-Host "started pid=$($process.Id) $($Play -join ', ')"
Start-Sleep -Seconds $WaitSeconds
if (-not $KeepRunning) {
& $exe /exit | Out-Null
Start-Sleep -Seconds 6
$left = Get-Process foobar2000 -ErrorAction SilentlyContinue
if ($left) {
# A component that still holds a decode thread can keep /exit from
# finishing. Kill it, and clear the marker that the kill leaves behind,
# or the next start will refuse to load user components.
Write-Host 'exit did not finish; terminating and clearing the profile marker' -ForegroundColor Yellow
$left | Stop-Process -Force
Start-Sleep -Seconds 2
if (Test-Path -LiteralPath $running) { Remove-Item -LiteralPath $running -Force }
}
}
Write-Host '--- component log ---' -ForegroundColor Cyan
$logs = Get-ChildItem $TestBed -Recurse -Filter 'joc_decoder.log' -ErrorAction SilentlyContinue
if (-not $logs) {
Write-Host 'no joc_decoder.log found: the component never ran' -ForegroundColor Yellow
}
foreach ($log in $logs) {
Write-Host "# $($log.FullName)"
Get-Content -LiteralPath $log.FullName
}