111 lines
4.3 KiB
PowerShell
111 lines
4.3 KiB
PowerShell
[CmdletBinding()]
|
|
param()
|
|
|
|
Set-StrictMode -Version Latest
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
$repositoryRoot = [IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..'))
|
|
$wrapper = Join-Path $repositoryRoot 'scripts\Invoke-LegacyPackageLocalStateSmoke.ps1'
|
|
$shared = Join-Path $repositoryRoot 'scripts\Invoke-LegacyPackageInputSmoke.ps1'
|
|
$harness = Join-Path $repositoryRoot 'scripts\Test-LegacyPackageLocalStateSmoke.mjs'
|
|
|
|
foreach ($path in @($wrapper, $shared, $harness)) {
|
|
if (-not [IO.File]::Exists($path)) { throw "Missing tracked smoke file: $path" }
|
|
}
|
|
|
|
foreach ($path in @($wrapper, $shared)) {
|
|
$tokens = $null
|
|
$errors = $null
|
|
[void][Management.Automation.Language.Parser]::ParseFile(
|
|
$path,
|
|
[ref]$tokens,
|
|
[ref]$errors)
|
|
if (@($errors).Count -ne 0) {
|
|
throw "PowerShell parser rejected $path."
|
|
}
|
|
}
|
|
|
|
$auditJson = & powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass `
|
|
-File $wrapper -StaticAudit
|
|
if ($LASTEXITCODE -ne 0) { throw 'The static audit action failed.' }
|
|
$audit = $auditJson | ConvertFrom-Json
|
|
if ([string]$audit.result -cne 'PASS' -or
|
|
[string]$audit.profile -cne 'local-settings-comparison-import' -or
|
|
[string]$audit.packageFlavor -cne 'DebugAppX' -or
|
|
[int]$audit.exchangeCount -ne 13 -or
|
|
[int]$audit.physicalClickCount -ne 9 -or
|
|
[int]$audit.folderPickerCancelCount -ne 3 -or
|
|
[int]$audit.fileObservationCount -ne 4 -or
|
|
[int]$audit.inputRetryCount -ne 0 -or
|
|
[string]$audit.expectedSourceSha256 -cne
|
|
'1EE76BC464FB1C44C8B6546E99CDC21C726C0E2C24AD344F5C19AE41BFC0D2F2' -or
|
|
[int]$audit.expectedSourceRows -ne 8 -or
|
|
[string]$audit.expectedFreshDestinationSha256 -cne
|
|
'13C07BA64587549EDA9C1A694F3DFA19875CB1F888F02C9E071F17C47739E087' -or
|
|
[int]$audit.expectedFreshDestinationRows -ne 1 -or
|
|
[string]$audit.expectedImportedDestinationSha256 -cne
|
|
'2575C2420800670B0022EBEE819BA3D9640DB14E9552426DF46075D079F1F697' -or
|
|
[int]$audit.expectedImportedDestinationRows -ne 9 -or
|
|
$audit.sendInputClickAvailable -ne $true -or
|
|
$audit.sendInputEscapeAvailable -ne $true) {
|
|
throw 'The static audit does not expose the closed input/file contract.'
|
|
}
|
|
|
|
$wrapperText = [IO.File]::ReadAllText($wrapper)
|
|
$sharedText = [IO.File]::ReadAllText($shared)
|
|
$harnessText = [IO.File]::ReadAllText($harness)
|
|
foreach ($token in @(
|
|
'-BuildFlavor DebugAppX',
|
|
'-DefinitionsOnly',
|
|
'[string]$LegacyDataDirectory',
|
|
"'..\MBN_STOCK_N\MBN_STOCK_N\bin\Debug\Data'",
|
|
'Assert-LocalFilePreflight',
|
|
'Wait-UniqueOwnedFolderPicker',
|
|
'SendEscapeToForegroundWindow',
|
|
'$ExpectedExchangePlan.Count',
|
|
'The app was intentionally left open; no input retry, guessed cleanup,'
|
|
'comparisonSecondImportAddedCount = 0')) {
|
|
if (-not $wrapperText.Contains($token)) { throw "Missing wrapper contract token: $token" }
|
|
}
|
|
if ($wrapperText -match '(?i)C:\\Users\\[^\\]+') {
|
|
throw 'The local-state wrapper must not commit a workstation-specific user path.'
|
|
}
|
|
foreach ($token in @(
|
|
'[switch]$DefinitionsOnly',
|
|
'public static void SendApplicationClick(',
|
|
'bool allowForegroundTransitionAfterClick',
|
|
'public static void SendEscapeToForegroundWindow(',
|
|
'if ($DefinitionsOnly)')) {
|
|
if (-not $sharedText.Contains($token)) { throw "Missing shared guard token: $token" }
|
|
}
|
|
foreach ($token in @(
|
|
'"choose-operator-folder"',
|
|
'"folder-picker-click-cancel"',
|
|
'"observe-local-files"',
|
|
'receipt?.addedPairCount === expectedFirstAdded',
|
|
'receipt?.skippedDuplicateCount === expectedFirstSkipped',
|
|
'receipt?.addedPairCount === 0',
|
|
'process.stdin.unref',
|
|
'allowMissingState: true',
|
|
'Only the input-free initial preflight',
|
|
'nextInputSequence !== 14',
|
|
'no input was retried')) {
|
|
if (-not $harnessText.Contains($token)) { throw "Missing harness contract token: $token" }
|
|
}
|
|
if ($wrapperText -match '(?im)^\s*(?:Remove-Item|Stop-Process|taskkill)\b' -or
|
|
$wrapperText.Contains('MBN_STOCK_N') -and
|
|
$wrapperText -match '(?is)(?:WriteAll|OpenWrite|FileMode\]::Create).*MBN_STOCK_N') {
|
|
throw 'The wrapper contains an unsafe cleanup or original-repository write path.'
|
|
}
|
|
|
|
[pscustomobject]@{
|
|
result = 'PASS'
|
|
exchanges = 13
|
|
physicalClicks = 9
|
|
pickerCancels = 3
|
|
observations = 4
|
|
freshImportAdded = 8
|
|
alreadyImportedAdded = 0
|
|
idempotentAdded = 0
|
|
} | ConvertTo-Json -Compress
|