test(install): cover Unicode paths in Desktop hidden PowerShell hosts

This commit is contained in:
择梦舟
2026-10-04 02:44:30 +08:00
committed by brooklyn!
parent c3f925242a
commit debe7c8c4f

View File

@@ -2,7 +2,9 @@
# The existing test_install_ps1_script_suites.py runs this under 5.1 and 7.
# Native fixtures write raw bytes to a pipe: a PowerShell function returning
# a .NET string would bypass the decoder and silently miss this regression.
param([switch]$HiddenChild)
$ErrorActionPreference = 'Stop'
$suitePath = $PSCommandPath
$repoRoot = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path))
$installer = Join-Path $repoRoot 'scripts/install.ps1'
$testRoot = Join-Path ([IO.Path]::GetTempPath()) ('hermes-utf8-' + [guid]::NewGuid())
@@ -16,9 +18,59 @@ function Assert-Equal($Expected, $Actual, [string]$Label) {
}
try {
if (-not $HiddenChild) {
# Match Desktop's CREATE_NO_WINDOW + piped stdout/stderr, with stdin
# closed. Run this same behavioral suite in a genuinely console-less host.
$psi = New-Object System.Diagnostics.ProcessStartInfo
$psi.FileName = (Get-Process -Id $PID).Path
$psi.Arguments = '-NoProfile -NonInteractive -ExecutionPolicy Bypass -File "' + $suitePath + '" -HiddenChild'
$psi.UseShellExecute = $false
$psi.CreateNoWindow = $true
$psi.RedirectStandardInput = $true
$psi.RedirectStandardOutput = $true
$psi.RedirectStandardError = $true
$psi.StandardOutputEncoding = New-Object System.Text.UTF8Encoding($false)
$psi.StandardErrorEncoding = New-Object System.Text.UTF8Encoding($false)
$child = New-Object System.Diagnostics.Process
$child.StartInfo = $psi
try {
if (-not $child.Start()) { throw 'could not start hidden PowerShell host' }
$child.StandardInput.Close()
$stdoutTask = $child.StandardOutput.ReadToEndAsync()
$stderrTask = $child.StandardError.ReadToEndAsync()
if (-not $child.WaitForExit(120000)) {
$child.Kill()
throw 'hidden PowerShell regression timed out'
}
$stdout = $stdoutTask.Result
$stderr = $stderrTask.Result
if ($child.ExitCode -ne 0) { throw "hidden PowerShell regression failed: $stdout $stderr" }
Assert-Equal $true ($stdout.Contains('Hidden host boundary verified:')) 'hidden boundary checks executed'
Assert-Equal $true ($stdout.Contains('UTF-8 native capture and dependency-stage regression tests passed.')) 'hidden suite completed'
Write-Host 'Desktop hidden-host regression passed under all three code pages.'
} finally {
$child.Dispose()
}
}
if ($HiddenChild) {
Add-Type @'
using System;
using System.Runtime.InteropServices;
public static class HermesUtf8Host {
[DllImport("kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
}
'@
Assert-Equal ([IntPtr]::Zero) ([HermesUtf8Host]::GetConsoleWindow()) 'hidden host has no attached console'
Assert-Equal $true ([Console]::IsInputRedirected) 'hidden host stdin is redirected'
Assert-Equal $true ([Console]::IsOutputRedirected) 'hidden host stdout is redirected'
Assert-Equal $true ([Console]::IsErrorRedirected) 'hidden host stderr is redirected'
Write-Host 'Hidden host boundary verified: no console, redirected stdin/stdout/stderr.'
}
# ASCII source works when PS 5.1 reads this BOM-less test from a checkout.
# The actual on-disk path includes CJK, an accent, a space and an apostrophe.
$profileName = ([string][char]0x5F20) + [char]0x4E09 + ' Ren' + [char]0xE9 + " O'Brien"
# Include the Polish U+0142 from #128326 alongside CJK, accent and quoting.
$profileName = ([string][char]0x5F20) + [char]0x4E09 + ' Ren' + [char]0xE9 + " O'Brien Pawe" + [char]0x142
$profileDir = Join-Path $testRoot $profileName
New-Item -ItemType Directory -Path $profileDir -Force | Out-Null
$env:HERMES_HOME = Join-Path $profileDir 'hermes-home'