Files
VRyHungry1/test/run_mp_test.ps1
T
algodoogle 96ea2dd1ea mp fix
2026-07-28 19:41:31 +01:00

99 lines
4.2 KiB
PowerShell

# Runs the two-instance multiplayer test and ALWAYS produces a GIF of the run.
#
# powershell -File test\run_mp_test.ps1
#
# Starts a server instance and a client instance on test/multiPlayerTest.tscn,
# lets test/mp_test_driver.gd drive the scripted kitchen sequence, then writes:
# logs\mptest_report.txt - every check, pass/fail, plus failure details
# logs\mptest_run.gif - both peers side by side, one frame per step
# logs\mptest_{server,client}.log - full step logs
# Exits non-zero if any check failed.
#
# The windows are visible because frame capture needs a real framebuffer: a
# headless Godot renders nothing, so there would be no GIF. Use -Headless when
# you only want the pass/fail result (faster, but no GIF).
param(
[string]$Godot = "C:\Users\Aqua Aurora\Desktop\Godot_v4.7-stable_win64.exe",
[int]$TimeoutSec = 400,
# Seconds to pause between steps, and to hold the final state on screen.
[double]$Pause = 0.4,
[double]$Hold = 3,
# Passed through to make_gif.ps1.
[int]$HalfWidth = 900,
[double]$SecondsPerStep = 1.2,
# Skip the windows entirely. No frames are captured, so no GIF is produced.
[switch]$Headless
)
$ErrorActionPreference = "Stop"
$proj = Split-Path -Parent $PSScriptRoot
# The two peers deliberately load DIFFERENT scenes, mirroring the real game:
# the host opens whatever world it is running, the client opens the bare
# multiplayer scene and must receive the entire layout over the network. That is
# also exactly what a client joining mid-session goes through.
$serverScene = "res://test/multiPlayerTest.tscn"
$clientScene = "res://Scenes/multiPlayer.tscn"
$serverLog = Join-Path $proj "logs/mptest_server.log"
$clientLog = Join-Path $proj "logs/mptest_client.log"
$report = Join-Path $proj "logs/mptest_report.txt"
$gif = Join-Path $proj "logs/mptest_run.gif"
foreach ($f in @($serverLog, $clientLog, $report, $gif)) { if (Test-Path $f) { Remove-Item $f -Force } }
. (Join-Path $PSScriptRoot "mp_window_layout.ps1")
function Start-Instance($extraArgs, $sceneFor) {
# --xr-mode off keeps it on the desktop (SteamVR's OpenXR runtime otherwise
# takes over, and two instances can't share a headset anyway).
$a = "--xr-mode off"
if ($Headless) { $a = "--headless " + $a }
$a += " --resolution 900x600 --path `"$proj`" $sceneFor -- $($extraArgs -join ' ') --mptest"
if (-not $Headless) { $a += " --mptest-frames" }
$a += " --mptest-pause $Pause --mptest-hold $Hold"
$p = Start-Process -FilePath $Godot -ArgumentList $a -PassThru -NoNewWindow:$Headless
# Touching .Handle caches it, which is what makes .ExitCode readable later.
$null = $p.Handle
return $p
}
Write-Host "Starting SERVER..."
$server = Start-Instance @("--server") $serverScene
if (-not $Headless) { $w = Move-GameWindow $server 20 60 }
Start-Sleep -Seconds 5
Write-Host "Starting CLIENT..."
$client = Start-Instance @("--join", "127.0.0.1") $clientScene
if (-not $Headless) { $null = Move-GameWindow $client (20 + $w + 12) 60 }
$deadline = (Get-Date).AddSeconds($TimeoutSec)
while ((Get-Date) -lt $deadline -and -not $server.HasExited) { Start-Sleep -Milliseconds 500 }
foreach ($p in @($server, $client)) {
if (-not $p.HasExited) { Write-Host "Killing pid $($p.Id) (still running)"; $p.Kill() }
}
Start-Sleep -Milliseconds 500
if (-not $Headless) {
Write-Host ""
Write-Host "======================== GIF ========================"
& powershell -ExecutionPolicy Bypass -File (Join-Path $PSScriptRoot "make_gif.ps1") `
-HalfWidth $HalfWidth -SecondsPerStep $SecondsPerStep
} else {
Write-Host ""
Write-Host "(headless run: no frames captured, so no GIF - drop -Headless to get one)"
}
Write-Host ""
Write-Host "======================== REPORT ========================"
if (Test-Path $report) { Get-Content $report -Encoding UTF8 } else { Write-Host "(no report written - the run did not finish)" }
$server.WaitForExit(2000) | Out-Null
$code = if ($server.HasExited) { $server.ExitCode } else { 1 }
Write-Host ""
Write-Host "report: $report"
if (-not $Headless -and (Test-Path $gif)) { Write-Host "gif: $gif" }
Write-Host "logs: $serverLog"
Write-Host " $clientLog"
Write-Host "server exit code: $code"
exit $code