File:  [parser3project] / parser3 / tests / httpd / run_tests.ps1
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Sun Oct 11 17:19:51 2026 UTC (13 days, 22 hours ago) by moko
Branches: MAIN
CVS tags: HEAD
run_tests.cmd/run_tests.ps1 added to test httpd under Windows

# httpd mode: the server runs the site with httpd class from etc/auto.p, see site/config.p
# Windows version of run_tests.sh, tests with curl (*.curl) are skipped, so the output differs from ok.log for them
# run as: powershell -ExecutionPolicy Bypass -File run_tests.ps1

param([string]$Parser = "$PSScriptRoot\..\..\src\targets\cgi\Release\parser3.exe")

$Port = 8100
$Latin1 = [Text.Encoding]::GetEncoding(28591) # bytes <-> chars as is

function Send-File($file) {
	$client = New-Object Net.Sockets.TcpClient('127.0.0.1', $Port)
	$client.ReceiveTimeout = 10000
	$stream = $client.GetStream()
	$response = New-Object IO.MemoryStream
	$buffer = New-Object byte[] 4096
	try {
		$request = [IO.File]::ReadAllBytes($file)
		$stream.Write($request, 0, $request.Length)
		while (($n = $stream.Read($buffer, 0, $buffer.Length)) -gt 0) { $response.Write($buffer, 0, $n) }
	} catch [IO.IOException] { } # connection reset or timeout, the received part is kept
	$client.Close()
	$Latin1.GetString($response.ToArray())
}

# etc/auto.p is generated by configure from auto.p.in, which is not run under Windows
$auto = "$PSScriptRoot\..\..\etc\auto.p"
$generated = -not (Test-Path $auto)
$server = $null
try {
	if ($generated) {
		$text = [IO.File]::ReadAllText("$auto.in", $Latin1) -replace '@dll_extension@', 'dll' -replace '@\w+@', '.'
		[IO.File]::WriteAllText($auto, $text, $Latin1)
	}

	$server = Start-Process $Parser -ArgumentList '-f', 'config.p', '-p', $Port -WorkingDirectory "$PSScriptRoot\site" -WindowStyle Hidden -PassThru

	# wait for the server listens
	for ($i = 0; $i -lt 50; $i++) {
		try { (New-Object Net.Sockets.TcpClient('127.0.0.1', $Port)).Close(); break } catch { Start-Sleep -Milliseconds 100 }
	}

	# the dates and the version of the server differ from run to run
	$log = New-Object Text.StringBuilder
	foreach ($f in Get-ChildItem "$PSScriptRoot\*" -Include '???.txt', '???.curl' -File | Sort-Object Name) {
		if ($f.Extension -eq '.curl') { Write-Host "skipped $($f.Name)"; continue }
		[void]$log.Append("running test $($f.Name)`n")
		[void]$log.Append((Send-File $f.FullName))
		[void]$log.Append("`n=============`n")
	}
	$text = $log.ToString() -replace '(?m)^(Date|Last-Modified): .* GMT', '$1: DATE GMT' -replace '(?m)^Server: Parser3\.[\x20-\x7E]*', 'Server: Parser3.X.X ...'
	[IO.File]::WriteAllBytes("$PSScriptRoot\tests.log", $Latin1.GetBytes($text))
} finally {
	if ($server) {
		Stop-Process -Id $server.Id -Force -ErrorAction SilentlyContinue
		$server.WaitForExit()
	}
	if ($generated) { Remove-Item $auto -ErrorAction SilentlyContinue }
}

Remove-Item "$PSScriptRoot\site\parser3.log" -ErrorAction SilentlyContinue
$diff = "$PSScriptRoot\..\..\..\win32\tools\cygwin\bin\diff.exe"
if (-not (Test-Path $diff)) { $diff = 'diff' }
Push-Location $PSScriptRoot
& $diff -u ok.log tests.log
$result = $LASTEXITCODE
Pop-Location
exit $result

E-mail: