From 180a15970f461b60527b6ce1498e27bb3fcca3c6 Mon Sep 17 00:00:00 2001 From: IvanZosimov Date: Wed, 19 Apr 2023 13:40:44 +0200 Subject: [PATCH] Update e2e test infrastructure --- .github/workflows/e2e-tests.yml | 48 ++++++++------ .github/workflows/test-dotnet.yml | 8 +-- .gitignore | 4 +- __tests__/e2e-test-csproj/Test.cs | 8 ++- __tests__/e2e-test-csproj/test.csproj | 2 +- __tests__/verify-dotnet.ps1 | 90 ++++++++++++++++----------- __tests__/verify-dotnet.sh | 44 ------------- 7 files changed, 92 insertions(+), 112 deletions(-) delete mode 100755 __tests__/verify-dotnet.sh diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index fd6e85b..9963bbc 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -33,7 +33,7 @@ jobs: 3.0.x - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 2.2.402, 3.1.404, 3.0 + run: __tests__/verify-dotnet.ps1 -Patterns "^2.2.402$", "^3.1.404$", "^3.0" test-setup-full-version: runs-on: ${{ matrix.operating-system }} @@ -62,7 +62,7 @@ jobs: NUGET_AUTH_TOKEN: NOTATOKEN - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 3.1.201, 2.2.402 -CheckNugetConfig + run: __tests__/verify-dotnet.ps1 -Patterns "^3.1.201$", "^2.2.402$" -CheckNugetConfig test-setup-without-patch-version: runs-on: ${{ matrix.operating-system }} @@ -87,7 +87,7 @@ jobs: dotnet-version: '2.2' - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 3.1, 2.2 + run: __tests__/verify-dotnet.ps1 -Patterns "^3.1", "^2.2" test-setup-prerelease-version: runs-on: ${{ matrix.operating-system }} @@ -107,7 +107,7 @@ jobs: dotnet-version: '3.1.100-preview1-014459' - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 3.1.100-preview1-014459 + run: __tests__/verify-dotnet.ps1 -Patterns "3.1.100-preview1-014459" test-setup-latest-patch-version: runs-on: ${{ matrix.operating-system }} @@ -131,7 +131,7 @@ jobs: dotnet-version: 2.2.X - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 2.2, 3.1 + run: __tests__/verify-dotnet.ps1 -Patterns "^2.2", "^3.1" test-setup-with-wildcard: runs-on: ${{ matrix.operating-system }} @@ -155,7 +155,7 @@ jobs: dotnet-version: 2.2.* - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 3.1, 2.2 + run: __tests__/verify-dotnet.ps1 -Patterns "^3.1", "^2.2" test-setup-global-json-specified-and-version: runs-on: ${{ matrix.operating-system }} @@ -181,7 +181,7 @@ jobs: global-json-file: ./subdirectory/global.json - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 2.2.207, 3.1 + run: __tests__/verify-dotnet.ps1 -Patterns "^2.2", "^3.1" test-setup-with-dotnet-quality: runs-on: ${{ matrix.operating-system }} @@ -203,7 +203,7 @@ jobs: dotnet-quality: 'preview' - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 7.0 -ContainedPattern "preview" + run: __tests__/verify-dotnet.ps1 -Patterns "^7\.0\.\d+-" test-dotnet-version-output-during-single-version-installation: runs-on: ${{ matrix.operating-system }} @@ -262,7 +262,7 @@ jobs: test-proxy: runs-on: ubuntu-latest container: - image: mcr.microsoft.com/dotnet/core/runtime-deps:3.0-bionic + image: ubuntu:latest options: --dns 127.0.0.1 services: squid-proxy: @@ -275,22 +275,29 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - - name: Clear tool cache - run: rm -rf "/usr/share/dotnet" - - name: Install curl + - name: Install Powershell run: | - apt update - apt -y install curl - - name: Setup dotnet 3.1.201 + apt-get update + apt-get install -y wget apt-transport-https software-properties-common + wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb" + dpkg -i packages-microsoft-prod.deb + rm packages-microsoft-prod.deb + apt-get update + apt-get install -y powershell + - name: Clear toolcache + shell: pwsh + run: __tests__/clear-toolcache.ps1 ${{ runner.os }} + - name: Setup dotnet 6.0 uses: ./ with: - dotnet-version: 3.1.201 + dotnet-version: 6.0 source-url: https://api.nuget.org/v3/index.json env: NUGET_AUTH_TOKEN: NOTATOKEN - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 3.1.201 -CheckNugetConfig + run: | + __tests__/verify-dotnet.ps1 -Patterns "^6.0" -CheckNugetConfig test-bypass-proxy: runs-on: ubuntu-latest @@ -300,8 +307,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - - name: Clear tool cache - run: rm -rf "/usr/share/dotnet" + - name: Clear toolcache + shell: pwsh + run: __tests__/clear-toolcache.ps1 ${{ runner.os }} - name: Setup dotnet 3.1.201 uses: ./ with: @@ -311,4 +319,4 @@ jobs: NUGET_AUTH_TOKEN: NOTATOKEN - name: Verify dotnet shell: pwsh - run: __tests__/verify-dotnet.ps1 -Patterns 3.1.201 -CheckNugetConfig + run: __tests__/verify-dotnet.ps1 -Patterns "^3.1.201$" -CheckNugetConfig diff --git a/.github/workflows/test-dotnet.yml b/.github/workflows/test-dotnet.yml index 0b37d28..760167b 100644 --- a/.github/workflows/test-dotnet.yml +++ b/.github/workflows/test-dotnet.yml @@ -18,7 +18,7 @@ jobs: fail-fast: false matrix: operating-system: [ubuntu-latest, windows-latest, macOS-latest] - dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0'] + dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0', '6.0', '7.0'] steps: - name: Checkout uses: actions/checkout@v3 @@ -29,9 +29,7 @@ jobs: uses: ./ with: dotnet-version: ${{ matrix.dotnet-version }} - - name: Check installed version + - name: Verify installed version shell: pwsh run: | - $version = & dotnet --version - Write-Host "Installed version: $version" - if (-not $version.StartsWith("${{ matrix.dotnet-version }}")) { throw "Unexpected version" } + __tests__/verify-dotnet.ps1 -Patterns "^${{ matrix.dotnet-version }}" diff --git a/.gitignore b/.gitignore index b339e2c..1cb082a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,8 @@ global.json lib/ node_modules/ __tests__/runner/* -__tests__/sample-csproj/bin/ -__tests__/sample-csproj/obj/ +__tests__/e2e-test-csproj/bin/ +__tests__/e2e-test-csproj/obj/ # Rest of the file pulled from https://github.com/github/gitignore/blob/master/Node.gitignore # Logs diff --git a/__tests__/e2e-test-csproj/Test.cs b/__tests__/e2e-test-csproj/Test.cs index 533bdb8..ba9573a 100644 --- a/__tests__/e2e-test-csproj/Test.cs +++ b/__tests__/e2e-test-csproj/Test.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; namespace test_csproj { @@ -7,8 +8,11 @@ namespace test_csproj { [TestMethod] public void TestMethod() - { - Assert.AreEqual((1 + 1), 2); + { + Console.WriteLine("TestMethod"); + int calculatedResult = 1000 / 25; + int expectedResult = 40; + Assert.AreEqual(calculatedResult, expectedResult); } } } diff --git a/__tests__/e2e-test-csproj/test.csproj b/__tests__/e2e-test-csproj/test.csproj index 370186a..769269f 100644 --- a/__tests__/e2e-test-csproj/test.csproj +++ b/__tests__/e2e-test-csproj/test.csproj @@ -2,11 +2,11 @@ $(TEST_TARGET_FRAMEWORK) - false + diff --git a/__tests__/verify-dotnet.ps1 b/__tests__/verify-dotnet.ps1 index 53befbb..496fec2 100755 --- a/__tests__/verify-dotnet.ps1 +++ b/__tests__/verify-dotnet.ps1 @@ -1,57 +1,68 @@ +<# + .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, - [ValidateNotNullOrEmpty()] - [string]$ContainedPattern, [switch]$CheckNugetConfig ) -if ($CheckNugetConfig.IsPresent) { - if (!(Test-Path "../nuget.config")) - { - throw "The nuget.config file is not generated correctly." - } +$PatternsList = [System.Collections.ArrayList]($Patterns) + +if ($CheckNugetConfig.IsPresent -and !(Test-Path "../nuget.config")) { + throw "The nuget.config file is not generated correctly." } -if (!$Patterns.Count) -{ - throw "At least 1 dotnet-version pattern should be supplied to script." -} +$PatternsCount = $PatternsList.Count -Write-Host "Those patterns were supplied to the script: $($Patterns -join ', ')." +Write-Host "Those patterns were supplied to the script: $($PatternsList -join ', ')." $dotnet = Get-Command dotnet | Select-Object -First 1 | ForEach-Object { $_.Path } Write-Host "Found: '$dotnet'" # 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 "Installed versions: $($versions -join ', ')." -$InstalledVersionCount = 0 -foreach($pattern in $Patterns) +$Versions = & $dotnet --list-sdks | ForEach-Object { $_.SubString(0, $_.IndexOf('[')).Trim() } +Write-Host "Found installed versions: $($Versions -join ', ')." +$InstalledVersionCount = $Versions.Count + +foreach($version in $Versions) { - foreach ($version in $versions) + foreach($pattern in $PatternsList) { - if ($ContainedPattern) - { - if ($version.StartsWith($pattern.ToString()) -and $version.Contains($ContainedPattern)) - { - $InstalledVersionCount++ - } - } - elseif ($version.StartsWith($pattern.ToString())) - { - $InstalledVersionCount++ - } + if ($version -match $pattern) + { + $PatternsList.Remove($pattern) + $InstalledVersionCount-- + break + } } } -if ( $InstalledVersionCount -ne $Patterns.Count) + +if ( $InstalledVersionCount -ne 0) { - throw "An unexpected version of Dotnet is found on the machine, please check the script's dotnet-version patterns." + throw "An unexpected version of Dotnet is found on the machine, please check the correctness of the -Patterns input." } Write-Host "Changing directory to the ./__tests__/e2e-test-csproj" -Set-Location ./__tests__/e2e-test-csproj +$workingDir = Get-Location +$testProjectDir = "./__tests__/e2e-test-csproj" +Set-Location $testProjectDir -$targetFrameworkVersionMapping = @{ +$targetFrameworkVersionMap = @{ "1.0" = "netcoreapp1.0"; "1.1" = "netcoreapp1.1"; "2.0" = "netcoreapp2.0"; @@ -64,14 +75,17 @@ $targetFrameworkVersionMapping = @{ "7.0" = "net7.0"; } -foreach ($version in $versions) +foreach ($version in $Versions) { + # 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 - Write-Host "The global.json file for the version $version is created. Currently used .NET version is: $(& $dotnet --version)" + 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 "^(?\d+\.\d+)" - Write-Host "Setting the TEST_TARGET_FRAMEWORK environment variable to $($targetFrameworkVersionMapping[$Matches.key])" - [Environment]::SetEnvironmentVariable('TEST_TARGET_FRAMEWORK', $($targetFrameworkVersionMapping[$Matches.key])) + 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 @@ -89,8 +103,8 @@ foreach ($version in $versions) Write-Host "Tests are completed successfully!" - Write-Host "Removing temprary global.json file." + Write-Host "Removing temporary global.json file." Remove-Item ./global.json } -Set-Location ../.. \ No newline at end of file +Set-Location $workingDir \ No newline at end of file diff --git a/__tests__/verify-dotnet.sh b/__tests__/verify-dotnet.sh deleted file mode 100755 index 098d076..0000000 --- a/__tests__/verify-dotnet.sh +++ /dev/null @@ -1,44 +0,0 @@ -if [ -z "$1" ]; then - echo "Must supply dotnet version argument" - exit 1 -fi - -if [ ! -f "../nuget.config" ]; then - echo "nuget file not generated correctly" - exit 1 -fi - -dotnet_version="$(dotnet --version)" -echo "Found dotnet version '$dotnet_version'" -if [ -z "$(echo $dotnet_version | grep $1)" ]; then - echo "Unexpected version" - exit 1 -fi - -if [ -n "$2" ]; then - dotnet_version="$(dotnet --list-sdks)" - echo "Found dotnet version '$dotnet_version'" - if [ -z "$(echo $dotnet_version | grep $2)" ]; then - echo "Unexpected version" - exit 1 - fi -fi - -echo "Building sample csproj" -dotnet build __tests__/sample-csproj/ --no-cache || exit 1 - -echo "Testing compiled app" -sample_output=$(dotnet test __tests__/sample-csproj/ --no-build) -echo "Sample output: $sample_output" -# For Side-by-Side installs we want to run the tests twice, for a single install the tests will run once -if [ -n "$2" ]; then - if [ -z "$(echo $sample_output | grep "Test Run Successful.*Test Run Successful.")" ]; then - echo "Unexpected output" - exit 1 - fi -else - if [ -z "$(echo $sample_output | grep "Test Run Successful.")" ]; then - echo "Unexpected output" - exit 1 - fi -fi \ No newline at end of file