Skip to content

Commit

Permalink
[Windows] Improve Pester tests coverage for MSYS2 (actions#3595)
Browse files Browse the repository at this point in the history
* Add ShouldReturnZeroExitCodeWithParam function and a new set of tests for MSYS2 tools

* Change get-command -> Get-Command

* Remove elevated user, return original path after msys installation and tests, resolve nitpicks

* Add BeforeEach and AfterEach blocks
These blocks change the path before each test
and return the original path after each test

* Change get-command -> Get-Command
  • Loading branch information
miketimofeev authored Jun 21, 2021
1 parent 4143d0c commit 1fb8c5d
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 17 deletions.
37 changes: 37 additions & 0 deletions images/win/scripts/ImageHelpers/TestsHelpers.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,42 @@ function ShouldReturnZeroExitCode {
}
}

# Pester Assert to check exit code of command with given parameter, the assertion performed up to 3 checks (without '-', with 1 and 2 '-') until succeeded
function ShouldReturnZeroExitCodeWithParam {
param (
[Parameter(Mandatory)] [string] $ActualValue,
[switch] $Negate,
[string] $CallParameter = "version",
[string] $CallerSessionState
)

$delimiterCharacter = ""

while ($delimiterCharacter.Length -le 2)
{
$callParameterWithDelimeter = $delimiterCharacter + $CallParameter
$commandToCheck = "$ActualValue $callParameterWithDelimeter"
[bool]$succeeded = (ShouldReturnZeroExitCode -ActualValue $commandToCheck).Succeeded

if ($succeeded)
{
break
}
$delimiterCharacter += '-'
}
if ($Negate) { $succeeded = -not $succeeded }

if (-not $succeeded)
{
$failureMessage = "Tool '$ActualValue' has not returned 0 exit code for any of these flags: '$CallParameter' or '-$CallParameter' or '--$CallParameter'"
}

return [PSCustomObject] @{
Succeeded = $succeeded
FailureMessage = $failureMessage
}
}

# Pester Assert to match output of command
function ShouldMatchCommandOutput {
Param(
Expand Down Expand Up @@ -130,5 +166,6 @@ function ShouldMatchCommandOutput {

If (Get-Command -Name Add-ShouldOperator -ErrorAction SilentlyContinue) {
Add-ShouldOperator -Name ReturnZeroExitCode -InternalName ShouldReturnZeroExitCode -Test ${function:ShouldReturnZeroExitCode}
Add-ShouldOperator -Name ReturnZeroExitCodeWithParam -InternalName ShouldReturnZeroExitCodeWithParam -Test ${function:ShouldReturnZeroExitCodeWithParam}
Add-ShouldOperator -Name MatchCommandOutput -InternalName ShouldMatchCommandOutput -Test ${function:ShouldMatchCommandOutput}
}
1 change: 1 addition & 0 deletions images/win/scripts/Installers/Install-Msys2.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ foreach ($arch in $archs)
pacman.exe -Q | grep ^${arch}-
}

$env:PATH = $origPath
Write-Host "`nMSYS2 installation completed"

Invoke-PesterTests -TestFile "MSYS2"
81 changes: 68 additions & 13 deletions images/win/scripts/Tests/MSYS2.Tests.ps1
Original file line number Diff line number Diff line change
@@ -1,23 +1,78 @@
$toolsetContent = (Get-ToolsetContent).MsysPackages
$archs = $toolsetContent.mingw.arch

BeforeAll {
$msys2BinDir = "C:\msys64\usr\bin"
$msys2mingwDir = "C:\msys64\mingw64\bin"
$msys2Dir = "C:\msys64\usr\bin"
$originalPath = $env:PATH
}

Describe "MSYS2" {
It "<ToolName>" -TestCases @(
Describe "MSYS2 packages" {
BeforeEach {
$env:PATH = "$msys2Dir;$env:PATH"
}

It "msys2Dir exists" {
$msys2Dir | Should -Exist
}

$TestCases = @(
@{ ToolName = "bash.exe" }
@{ ToolName = "tar.exe" }
@{ ToolName = "make.exe" }
) {
Join-Path $msys2BinDir $ToolName | Should -Exist
)

It "<ToolName> is installed in <msys2Dir>" -TestCases $TestCases {
(Get-Command "$ToolName").Source | Should -BeLike "$msys2Dir*"
}

It "<ToolName> is avaialable" -TestCases $TestCases {
"$ToolName" | Should -ReturnZeroExitCodeWithParam
}

It "<ToolName>" -TestCases @(
@{ ToolName = "gcc.exe" }
@{ ToolName = "cmake.exe" }
@{ ToolName = "g++.exe" }
@{ ToolName = "clang-tidy.exe" }
) {
Join-Path $msys2mingwDir $ToolName | Should -Exist
AfterEach {
$env:PATH = $originalPath
}
}

foreach ($arch in $archs) {
Describe "$arch arch packages" {
$archPackages = $toolsetContent.mingw | Where-Object { $_.arch -eq $arch }
$tools = $archPackages.runtime_packages.name

if ($arch -eq "mingw-w64-i686")
{
$ExecDir = "C:\msys64\mingw32\bin"
}
else
{
$ExecDir = "C:\msys64\mingw64\bin"
}

foreach ($tool in $tools) {
Context "$tool package"{
$executables = ($archPackages.runtime_packages | Where-Object { $_.name -eq $tool }).executables | ForEach-Object {
@{
ExecName = $_
ExecDir = $ExecDir
}
}

BeforeEach {
$env:PATH = "$ExecDir;$env:PATH"
}

It "<ExecName> is installed in <ExecDir>" -TestCases $executables {
(Get-Command "$ExecName").Source | Should -BeLike "$ExecDir*"
}

It "<ExecName> is available" -TestCases $executables {
"$ExecName" | Should -ReturnZeroExitCodeWithParam
}

AfterEach {
$env:PATH = $originalPath
}
}
}
}
}
2 changes: 0 additions & 2 deletions images/win/windows2016.json
Original file line number Diff line number Diff line change
Expand Up @@ -303,8 +303,6 @@
"environment_vars": [
"TOOLSET_JSON_PATH={{user `toolset_json_path`}}"
],
"elevated_user": "SYSTEM",
"elevated_password": "",
"scripts": [
"{{ template_dir }}/scripts/Installers/Install-Msys2.ps1"
]
Expand Down
2 changes: 0 additions & 2 deletions images/win/windows2019.json
Original file line number Diff line number Diff line change
Expand Up @@ -274,8 +274,6 @@
"environment_vars": [
"TOOLSET_JSON_PATH={{user `toolset_json_path`}}"
],
"elevated_user": "SYSTEM",
"elevated_password": "",
"scripts": [
"{{ template_dir }}/scripts/Installers/Install-Msys2.ps1"
]
Expand Down

0 comments on commit 1fb8c5d

Please sign in to comment.