2023-04-20 20:42:27 +08:00
<#
. DESCRIPTION
Verifies that installed on the machine . NET SDK versions match the input patterns .
Optionally checks that the nuget . config file is generated correctly .
. PARAMETER Patterns
Specifies the regular expression patterns that should be matched with the installed
on the machine . NET SDK versions . The number of patterns should be equal to the number
of installed . NET versions .
. PARAMETER CheckNugetConfig
Switches the check for the existence of the nuget . config file .
. EXAMPLE
PS > . \ verify-dotnet . ps1 -Paterns " ^3.1.200 $ " , " ^6.0 " -CheckNugetConfig
#>
param (
[ ValidateNotNullOrEmpty ( ) ]
[ Parameter ( Mandatory = $true ) ]
[ string[] ] $Patterns ,
[ switch ] $CheckNugetConfig
)
$PatternsList = [ System.Collections.ArrayList ] ( $Patterns )
if ( $CheckNugetConfig . IsPresent -and ! ( Test-Path " ../nuget.config " ) ) {
throw " The nuget.config file is not generated correctly. "
2020-01-26 14:37:54 +08:00
}
2023-04-20 20:42:27 +08:00
Write-Host " These patterns were supplied to the script: $( $PatternsList -join ', ' ) . "
2020-01-26 14:37:54 +08:00
$dotnet = Get-Command dotnet | Select-Object -First 1 | ForEach-Object { $_ . Path }
2023-04-20 20:42:27 +08:00
Write-Host " Found: ' $dotnet ' "
2020-01-26 14:37:54 +08:00
2023-04-20 20:42:27 +08:00
# SDKs are listed on multiple lines with the path afterwards in square brackets
$Versions = & $dotnet - -list -sdks | ForEach-Object { $_ . SubString ( 0 , $_ . IndexOf ( '[' ) ) . Trim ( ) }
Write-Host " Found installed versions: $( $Versions -join ', ' ) . "
$InstalledVersionCount = $Versions . Count
2020-09-16 00:36:09 +08:00
2023-04-20 20:42:27 +08:00
foreach ( $version in $Versions )
2020-09-16 00:36:09 +08:00
{
2023-04-20 20:42:27 +08:00
foreach ( $pattern in $PatternsList )
2020-09-16 00:36:09 +08:00
{
2023-04-20 20:42:27 +08:00
if ( $version -match $pattern )
{
$PatternsList . Remove ( $pattern )
$InstalledVersionCount - -
break
}
2020-09-16 00:36:09 +08:00
}
}
2020-01-26 14:37:54 +08:00
2023-04-20 20:42:27 +08:00
if ( $InstalledVersionCount -ne 0 )
2020-01-26 14:37:54 +08:00
{
2023-04-20 20:42:27 +08:00
throw " An unexpected version of Dotnet is found on the machine, please check the correctness of the -Patterns input. "
2020-01-26 14:37:54 +08:00
}
2023-04-20 20:42:27 +08:00
$workingDir = Get-Location
$testProjectDir = " ./__tests__/e2e-test-csproj "
Write-Host " Changing directory to the $testProjectDir "
Set-Location $testProjectDir
$targetFrameworkVersionMap = @ {
" 1.0 " = " netcoreapp1.0 " ;
" 1.1 " = " netcoreapp1.1 " ;
" 2.0 " = " netcoreapp2.0 " ;
" 2.1 " = " netcoreapp2.1 " ;
" 2.2 " = " netcoreapp2.2 " ;
" 3.0 " = " netcoreapp3.0 " ;
" 3.1 " = " netcoreapp3.1 " ;
" 5.0 " = " net5.0 " ;
" 6.0 " = " net6.0 " ;
" 7.0 " = " net7.0 " ;
" 8.0 " = " net8.0 " ;
}
foreach ( $version in $Versions )
2020-09-16 00:36:09 +08:00
{
2023-04-20 20:42:27 +08:00
# Creating temporary global.json file inside e2e-test-csproj dir and setting exact version of .NET inside allows to override default behavior of .NET and run build and tests on that exact version.
Write-Host " Creating temporary global.json file for $version .NET version. "
& $dotnet new globaljson - -sdk -version $version - -force | Out-Null
if ( ! ( Test-Path " ./global.json " ) )
2020-09-16 00:36:09 +08:00
{
2023-04-20 20:42:27 +08:00
throw " An error occured while creating the global.json file. Exit code: $LASTEXITCODE "
2020-09-16 00:36:09 +08:00
}
2023-04-20 20:42:27 +08:00
Write-Host " The global.json file for the version $version is created. Currently used .NET version is: $( & $dotnet - -version ) . "
# Environment variable TEST_TARGET_FRAMEWORK is used inside the test.csproj file to target required framework version
$version -match " ^(?<key>\d+\.\d+) " | Out-Null
if ( ! ( $targetFrameworkVersionMap . ContainsKey ( $Matches . key ) ) )
2021-11-23 18:03:56 +08:00
{
2023-04-20 20:42:27 +08:00
throw " The map with the framework targets doesn't contain a target name for the version $version . "
2021-11-23 18:03:56 +08:00
}
2023-04-20 20:42:27 +08:00
Write-Host " Setting the TEST_TARGET_FRAMEWORK environment variable to $( $targetFrameworkVersionMap [ $Matches . key ] ) "
[ Environment ] :: SetEnvironmentVariable ( 'TEST_TARGET_FRAMEWORK' , $ ( $targetFrameworkVersionMap [ $Matches . key ] ) )
Write-Host " Building test C# project with $version .NET version. "
& $dotnet build - -no -cache
if ( $LASTEXITCODE -ne 0 )
2020-09-16 00:36:09 +08:00
{
2023-04-20 20:42:27 +08:00
throw " Building process is not successful, exit code: $LASTEXITCODE "
2020-09-16 00:36:09 +08:00
}
2023-04-20 20:42:27 +08:00
Write-Host " Testing compiled C# project with $version .NET version. "
& $dotnet test - -no -build
if ( $LASTEXITCODE -ne 0 )
{
throw " Testing process is not successful, exit code: $LASTEXITCODE "
}
Write-Host " Tests are completed successfully! "
Write-Host " Removing temporary global.json file. "
Remove-Item . / global . json
2020-01-26 14:37:54 +08:00
}
2023-04-20 20:42:27 +08:00
Set-Location $workingDir