mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Add exe wrapper for Microsoft Update scenarios (#14737)
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
|
||||
Describe -Name "Windows EXE" -Fixture {
|
||||
BeforeAll {
|
||||
function Test-Elevated {
|
||||
[CmdletBinding()]
|
||||
[OutputType([bool])]
|
||||
Param()
|
||||
|
||||
# if the current Powershell session was called with administrator privileges,
|
||||
# the Administrator Group's well-known SID will show up in the Groups for the current identity.
|
||||
# Note that the SID won't show up unless the process is elevated.
|
||||
return (([Security.Principal.WindowsIdentity]::GetCurrent()).Groups -contains "S-1-5-32-544")
|
||||
}
|
||||
|
||||
function Invoke-ExeInstaller {
|
||||
param(
|
||||
[Parameter(ParameterSetName = 'Install', Mandatory)]
|
||||
[Switch]$Install,
|
||||
|
||||
[Parameter(ParameterSetName = 'Uninstall', Mandatory)]
|
||||
[Switch]$Uninstall,
|
||||
|
||||
[Parameter(Mandatory)]
|
||||
[ValidateScript({Test-Path -Path $_})]
|
||||
[String]$ExePath
|
||||
)
|
||||
$action = "$($PSCmdlet.ParameterSetName)ing"
|
||||
if ($Install) {
|
||||
$switch = '/install'
|
||||
} else {
|
||||
$switch = '/uninstall'
|
||||
}
|
||||
|
||||
$installProcess = Start-Process -wait $ExePath -ArgumentList $switch, '/quiet', '/norestart' -PassThru
|
||||
if ($installProcess.ExitCode -ne 0) {
|
||||
$exitCode = $installProcess.ExitCode
|
||||
throw "$action EXE failed and returned error code $exitCode."
|
||||
}
|
||||
}
|
||||
|
||||
$exePath = $env:PsExePath
|
||||
$channel = $env:PSMsiChannel
|
||||
$runtime = $env:PSMsiRuntime
|
||||
|
||||
# Get any existing powershell in the path
|
||||
$beforePath = @(([System.Environment]::GetEnvironmentVariable('PATH', 'MACHINE')) -split ';' |
|
||||
Where-Object {$_ -like '*files\powershell*'})
|
||||
|
||||
foreach ($pathPart in $beforePath) {
|
||||
Write-Warning "Found existing PowerShell path: $pathPart"
|
||||
}
|
||||
|
||||
if (!(Test-Elevated)) {
|
||||
Write-Warning "Tests must be elevated"
|
||||
}
|
||||
}
|
||||
BeforeEach {
|
||||
$error.Clear()
|
||||
}
|
||||
|
||||
Context "$Channel-$Runtime" {
|
||||
BeforeAll {
|
||||
Write-Verbose "cr-$channel-$runtime" -Verbose
|
||||
switch ("$channel-$runtime") {
|
||||
"preview-win7-x64" {
|
||||
$msiUpgradeCode = '39243d76-adaf-42b1-94fb-16ecf83237c8'
|
||||
}
|
||||
"stable-win7-x64" {
|
||||
$msiUpgradeCode = '31ab5147-9a97-4452-8443-d9709f0516e1'
|
||||
}
|
||||
"preview-win7-x86" {
|
||||
$msiUpgradeCode = '86abcfbd-1ccc-4a88-b8b2-0facfde29094'
|
||||
}
|
||||
"stable-win7-x86" {
|
||||
$msiUpgradeCode = '1d00683b-0f84-4db8-a64f-2f98ad42fe06'
|
||||
}
|
||||
default {
|
||||
throw "'$_' not a valid channel runtime combination"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
It "$Channel MSI should not be installed before test" -Skip:(!(Test-Elevated)) {
|
||||
$result = @(Get-CimInstance -Query "SELECT Value FROM Win32_Property WHERE Property='UpgradeCode' and Value = '{$msiUpgradeCode}'")
|
||||
$result.Count | Should -Be 0 -Because "Query should return nothing if $channel $runtime is not installed"
|
||||
}
|
||||
|
||||
It "EXE should install without error" -Skip:(!(Test-Elevated)) {
|
||||
{
|
||||
Invoke-ExeInstaller -Install -ExePath $exePath
|
||||
} | Should -Not -Throw
|
||||
}
|
||||
|
||||
It "Upgrade code should be correct" -Skip:(!(Test-Elevated)) {
|
||||
$result = @(Get-CimInstance -Query "SELECT Value FROM Win32_Property WHERE Property='UpgradeCode' and Value = '{$msiUpgradeCode}'")
|
||||
$result.Count | Should -Be 1 -Because "Query should return 1 result if Upgrade code is for $runtime $channel"
|
||||
}
|
||||
|
||||
It "MSI should have updated path" -Skip:(!(Test-Elevated)) {
|
||||
if ($channel -eq 'preview') {
|
||||
$pattern = '*files*\powershell*\preview*'
|
||||
} else {
|
||||
$pattern = '*files*\powershell*'
|
||||
}
|
||||
|
||||
$psPath = ([System.Environment]::GetEnvironmentVariable('PATH', 'MACHINE')) -split ';' |
|
||||
Where-Object { $_ -like $pattern -and $_ -notin $beforePath }
|
||||
|
||||
if (!$psPath) {
|
||||
([System.Environment]::GetEnvironmentVariable('PATH', 'MACHINE')) -split ';' |
|
||||
Where-Object { $_ -notin $beforePath } |
|
||||
ForEach-Object { Write-Verbose -Verbose $_ }
|
||||
}
|
||||
|
||||
$psPath | Should -Not -BeNullOrEmpty
|
||||
}
|
||||
|
||||
It "MSI should uninstall without error" -Skip:(!(Test-Elevated)) {
|
||||
{
|
||||
Invoke-ExeInstaller -Uninstall -ExePath $exePath
|
||||
} | Should -Not -Throw
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -106,7 +106,7 @@ Describe -Name "Windows MSI" -Fixture {
|
||||
|
||||
It "$Channel MSI should not be installed before test" -Skip:(!(Test-Elevated)) {
|
||||
$result = @(Get-CimInstance -Query "SELECT Value FROM Win32_Property WHERE Property='UpgradeCode' and Value = '{$msiUpgradeCode}'")
|
||||
$result.Count | Should -Be 0 -Because "Query should return nothing if $channel x64 is not installed"
|
||||
$result.Count | Should -Be 0 -Because "Query should return nothing if $channel $runtime is not installed"
|
||||
}
|
||||
|
||||
It "MSI should install without error" -Skip:(!(Test-Elevated)) {
|
||||
@@ -117,7 +117,7 @@ Describe -Name "Windows MSI" -Fixture {
|
||||
|
||||
It "Upgrade code should be correct" -Skip:(!(Test-Elevated)) {
|
||||
$result = @(Get-CimInstance -Query "SELECT Value FROM Win32_Property WHERE Property='UpgradeCode' and Value = '{$msiUpgradeCode}'")
|
||||
$result.Count | Should -Be 1 -Because "Query should return 1 result if Upgrade code is for x64 $channel"
|
||||
$result.Count | Should -Be 1 -Because "Query should return 1 result if Upgrade code is for $runtime $channel"
|
||||
}
|
||||
|
||||
It "MSI should uninstall without error" -Skip:(!(Test-Elevated)) {
|
||||
|
||||
Reference in New Issue
Block a user