#!/usr/bin/env pwsh
param([switch]$NoBuild)
$ErrorActionPreference = 'Continue'
$root = Resolve-Path (Join-Path $PSScriptRoot '..')
Set-Location $root
$composeFile = 'docker/docker-compose.test.yml'
function Compose { docker compose -f $composeFile @args }
$tests = @(
'test-model','test-m3-lsn','test-m4-fence','test-m4-watchdog','test-m4-partition',
'test-m5-rejoin','test-m5-walgone','test-compaction','test-m6-routing','test-m7-sync',
'test-quorum-consistency','test-perf','test-chaos'
)
$envMap = @{
'test-compaction' = @{ COMPACT_THRESHOLD = '8' }
'test-m5-walgone' = @{ WAL_KEEP = '8MB'; MAX_WAL = '64MB' }
'test-m7-sync' = @{ SYNCHRONOUS = 'on' }
'test-quorum-consistency' = @{ SYNCHRONOUS = 'on' }
'test-chaos' = @{ SYNCHRONOUS = 'on' }
}
$tunables = @('COMPACT_THRESHOLD','WAL_KEEP','MAX_WAL','SYNCHRONOUS')
function Clear-Tunables { foreach ($k in $tunables) { Remove-Item "env:$k" -ErrorAction SilentlyContinue } }
function Wait-Ready {
for ($i = 0; $i -lt 120; $i++) {
docker exec -u postgres -e PGPASSFILE=/var/lib/postgresql/.pgpass pgr-node1 `
psql -h 127.0.0.1 -U postgres -tAc 'SELECT 1' 2>$null | Out-Null
if ($LASTEXITCODE -eq 0) { return $true }
Start-Sleep -Seconds 1
}
return $false
}
if (-not $NoBuild) {
Write-Host '== building node + runner images =='
Compose build
if ($LASTEXITCODE -ne 0) { Write-Host 'build FAILED'; exit 1 }
}
$pass = 0; $other = 0; $summary = @()
foreach ($t in $tests) {
Compose down -v 2>$null | Out-Null
Write-Host "================ $t ================"
Clear-Tunables
if ($t -eq 'test-model') {
$out = Compose run --rm runner bash "scripts/$t.sh" 2>&1 | Out-String
} else {
if ($envMap.ContainsKey($t)) { foreach ($kv in $envMap[$t].GetEnumerator()) { Set-Item "env:$($kv.Key)" $kv.Value } }
Compose up -d node1 node2 node3 2>$null | Out-Null
if (-not (Wait-Ready)) { Write-Host ' (warning: node1 not ready in time; running test anyway)' }
$out = Compose run --rm runner bash "scripts/$t.sh" 2>&1 | Out-String
}
$lines = @($out -split "`n" | Where-Object { $_ -match '^\s+(PASS|FAIL|CHECK)' })
$lines | ForEach-Object { Write-Host $_.TrimEnd() }
if ($lines.Count -gt 0 -and $lines[0] -match '\bPASS\b') { $pass++; $mark = 'PASS' } else { $other++; $mark = 'CHECK' }
$summary += ('{0,-24} {1}' -f $t, $mark)
}
Clear-Tunables
Compose down -v 2>$null | Out-Null
Write-Host ''
Write-Host '==================== SUMMARY ===================='
$summary | ForEach-Object { Write-Host $_ }
Write-Host '------------------------------------------------'
Write-Host "$pass passed, $other need-attention, of $($tests.Count) tests"
if ($other -ne 0) { exit 1 }