aboutsummaryrefslogtreecommitdiff
path: root/scripts/windows_install_conpty_package_test.ps1
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/windows_install_conpty_package_test.ps1')
-rw-r--r--scripts/windows_install_conpty_package_test.ps1146
1 files changed, 146 insertions, 0 deletions
diff --git a/scripts/windows_install_conpty_package_test.ps1 b/scripts/windows_install_conpty_package_test.ps1
new file mode 100644
index 00000000..062c2cfe
--- /dev/null
+++ b/scripts/windows_install_conpty_package_test.ps1
@@ -0,0 +1,146 @@
+param(
+ [Parameter(Mandatory = $true)]
+ [string]$ArchivePath
+)
+
+Set-StrictMode -Version Latest
+$ErrorActionPreference = "Stop"
+
+$archive = (Resolve-Path -LiteralPath $ArchivePath).Path
+$root = Join-Path $env:RUNNER_TEMP ("herdr-installer-test-" + [Guid]::NewGuid().ToString("N"))
+$webRoot = Join-Path $root "web"
+$herdrHome = Join-Path $root "home"
+$installDir = Join-Path $root "bin"
+New-Item -ItemType Directory -Force -Path $webRoot | Out-Null
+Copy-Item -LiteralPath $archive -Destination (Join-Path $webRoot "herdr-windows-x86_64.zip")
+$hash = (Get-FileHash -Algorithm SHA256 $archive).Hash.ToLowerInvariant()
+
+$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Loopback, 0)
+$listener.Start()
+$port = ([System.Net.IPEndPoint]$listener.LocalEndpoint).Port
+$listener.Stop()
+$manifest = @{
+ channel = "preview"
+ base_version = "0.0.0"
+ build_id = "installer-test"
+ assets = @{
+ "windows-x86_64" = @{
+ url = "http://127.0.0.1:$port/herdr-windows-x86_64.zip"
+ sha256 = $hash
+ format = "zip"
+ }
+ }
+} | ConvertTo-Json -Depth 5
+$manifestPath = Join-Path $webRoot "preview.json"
+$manifest | Out-File -LiteralPath $manifestPath -Encoding utf8
+
+$server = $null
+$oldHerdrHome = $env:HERDR_HOME
+try {
+ $server = Start-Process python -ArgumentList @("-m", "http.server", "$port", "--bind", "127.0.0.1", "--directory", $webRoot) -PassThru -WindowStyle Hidden
+ $env:HERDR_HOME = Join-Path $root "unused\..\home"
+ $manifestUrl = "http://127.0.0.1:$port/preview.json"
+ for ($attempt = 0; $attempt -lt 20; $attempt++) {
+ try {
+ Invoke-WebRequest -Uri $manifestUrl -UseBasicParsing | Out-Null
+ break
+ } catch {
+ if ($attempt -eq 19) { throw }
+ Start-Sleep -Milliseconds 100
+ }
+ }
+
+ & "$PSScriptRoot\..\website\install.ps1" `
+ -ManifestUrl $manifestUrl `
+ -InstallDir $installDir `
+ -ExpectedBuildId "installer-test"
+
+ $required = @(
+ "herdr.exe",
+ "conpty\herdr-conpty.json",
+ "conpty\conpty.dll",
+ "conpty\x64\OpenConsole.exe",
+ "conpty\arm64\OpenConsole.exe",
+ "THIRD-PARTY-NOTICES\Microsoft.Windows.Console.ConPTY-LICENSE.txt",
+ "THIRD-PARTY-NOTICES\Microsoft.Windows.Console.ConPTY-NOTICE.md"
+ )
+ foreach ($relative in $required) {
+ if (-not (Test-Path -LiteralPath (Join-Path $installDir $relative) -PathType Leaf)) {
+ throw "installer did not activate required file $relative"
+ }
+ }
+
+ $releaseDir = Get-ChildItem -LiteralPath (Join-Path $herdrHome "packages\standalone\releases") -Directory |
+ Where-Object { -not $_.Name.StartsWith(".staging.") } |
+ Select-Object -First 1
+ if ($null -eq $releaseDir) {
+ throw "installer did not create a versioned release"
+ }
+ Remove-Item -LiteralPath (Join-Path $releaseDir.FullName "conpty\conpty.dll") -Force
+
+ $badManifest = $manifest | ConvertFrom-Json
+ $badManifest.assets."windows-x86_64".url = "http://127.0.0.1:$port/missing.zip"
+ $badManifest | ConvertTo-Json -Depth 5 | Out-File -LiteralPath $manifestPath -Encoding utf8
+ $downloadFailed = $false
+ try {
+ & "$PSScriptRoot\..\website\install.ps1" `
+ -ManifestUrl $manifestUrl `
+ -InstallDir $installDir `
+ -ExpectedBuildId "installer-test"
+ } catch {
+ if ($_.Exception.Message -notmatch "(?i)(404|not found)") {
+ throw
+ }
+ $downloadFailed = $true
+ }
+ if (-not $downloadFailed) {
+ throw "installer repair unexpectedly accepted a missing archive"
+ }
+ if (-not (Test-Path -LiteralPath (Join-Path $releaseDir.FullName "herdr.exe") -PathType Leaf)) {
+ throw "failed repair removed the existing release"
+ }
+
+ $manifest | Out-File -LiteralPath $manifestPath -Encoding utf8
+ & "$PSScriptRoot\..\website\install.ps1" `
+ -ManifestUrl $manifestUrl `
+ -InstallDir $installDir `
+ -ExpectedBuildId "installer-test"
+ if (-not (Test-Path -LiteralPath (Join-Path $installDir "conpty\conpty.dll") -PathType Leaf)) {
+ throw "installer did not repair an incomplete release"
+ }
+
+ $x64HostDir = Join-Path $releaseDir.FullName "conpty\x64"
+ $junctionTarget = Join-Path $root "junction-target"
+ Move-Item -LiteralPath $x64HostDir -Destination $junctionTarget
+ New-Item -ItemType Junction -Path $x64HostDir -Target $junctionTarget | Out-Null
+ & "$PSScriptRoot\..\website\install.ps1" `
+ -ManifestUrl $manifestUrl `
+ -InstallDir $installDir `
+ -ExpectedBuildId "installer-test"
+ $repairedHostDir = Get-Item -LiteralPath (Join-Path $installDir "conpty\x64") -Force
+ if ($repairedHostDir.Attributes -band [IO.FileAttributes]::ReparsePoint) {
+ throw "installer accepted a reparse-point ConPTY directory"
+ }
+
+ $rejected = $false
+ try {
+ & "$PSScriptRoot\..\website\install.ps1" `
+ -ManifestUrl $manifestUrl `
+ -InstallDir $installDir `
+ -ExpectedBuildId "different-build"
+ } catch {
+ if ($_.Exception.Message -notlike "Preview manifest changed while updating.*") {
+ throw
+ }
+ $rejected = $true
+ }
+ if (-not $rejected) {
+ throw "installer accepted a manifest that did not match the updater-selected build"
+ }
+} finally {
+ $env:HERDR_HOME = $oldHerdrHome
+ if ($null -ne $server -and -not $server.HasExited) {
+ Stop-Process -Id $server.Id -Force -ErrorAction SilentlyContinue
+ }
+ Remove-Item -LiteralPath $root -Recurse -Force -ErrorAction SilentlyContinue
+}