Skip to content

Commit

Permalink
Make it easier to install the dotnet CLI tools (PowerShell#1139)
Browse files Browse the repository at this point in the history
* Add bootstrapping code to install dotnet

* fix logic for downloading proper dotnet installer.

* add a version checker for installed dotnet

Also harden logic for running the installation script

* Add bootstrapping code to install dotnet

* Handle missing dotnet, and install it.

* Add logic for checking the appropriate version of the Cli tools before starting to build

* Update appveyor.psm1 to use build script bootstrapping for installing dotnet CLI

update build script to handle WMF4 better (theoretically)

* make the hunt for the dotnet executable more generic and try harder to find the exe

* Fix typo when checking for usable versions of dotnet

* use -version rather than ambiguous -v when installing dotnet

* Improve error message when hunting for cli version

Use output of dotnet --version if there are problems with --list-sdks

* ignore errors when first attempting to find dotnet executable

set failure of finding dotnet as a warning, we will attempt to install it during bootstrap
this handles the case of a blank slate where dotnet has never been installed

* Improve logic for handling a system where dotnet has never been installed

* fine tune messages emitted during the hunt for dotnet

* additional logic for finding dotnet executable

* harden search for dotnet

Sometimes you can't even invoke dotnet if the version is too low

* Attempt to quieten build output.

Throw away stderr of dotnet execution under some case and emit it in others.
Change ToString of PortableVersion to enable better sorts

* Fix tostring method for portable version

* add -Raw flag to Get-GlobalJsonSdkVersion

Sometimes we need the raw version so the installation script works, but sometimes we need to be able to compare it with other versions.

* Attempt to harden the upload code

Also add additional verbose output to improve debuggability
print response from upload

* upgrade pester version to 4.4.4

* Force the testsuite TestFixture to be named 'Pester' to get through appveyors test result recognition

* Emit env:LANG to output before executing tests

We've had trouble with LANG being set to something that causes problems, so make sure we report what it is.
Removed a bit of the verbosity which was added for debugging

* Create tests for build module

Fix some errors in the module discovered by the tests

* Add additional tests

Change logic when downloading the dotnet install script
Also enforce en_US.UTF-8 language to ensure that appveyor can see our test results
  • Loading branch information
JamesWTruher authored and bergmeister committed Mar 22, 2019
1 parent b0d9908 commit 3b439ea
Show file tree
Hide file tree
Showing 4 changed files with 485 additions and 45 deletions.
153 changes: 153 additions & 0 deletions BuildModule.tests.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.

# these are tests for the build module

import-module -force "./build.psm1"
Describe "Build Module Tests" {
Context "Global.json" {
BeforeAll {
$globalJson = Get-Content (Join-Path $PSScriptRoot global.json) | ConvertFrom-Json
$expectedVersion = $globalJson.sdk.version
$result = Get-GlobalJsonSdkVersion
}
$propertyTestcases = @{ Name = "Major"; Type = "System.Int32" },
@{ Name = "Minor"; Type = "System.Int32" },
@{ Name = "Patch"; Type = "System.Int32" },
@{ Name = "PrereleaseLabel"; Type = "System.String" }
It "Get-GlobalJsonSdkVersion returns a portable version object with property '<Name>' with type '<Type>'" -TestCases $propertyTestcases {
param ( $Name, $Type )
$result.psobject.properties[$Name] | Should -BeOfType [System.Management.Automation.PSNoteProperty]
$result.psobject.properties[$Name].TypeNameOfValue | Should -Be $Type
}
It "Can retrieve the version from global.json" {
$result = Get-GlobalJsonSdkVersion
$resultString = "{0}.{1}.{2}" -f $result.Major,$result.Minor,$result.Patch
if ( $result.prereleasestring ) { $resultString += "-" + $result.prereleasestring }
$resultString | Should -Be $expectedVersion
}
}
Context "Test-SuiteableDotnet" {
It "Test-SuitableDotnet should return true when the expected version matches the installed version" {
Test-SuitableDotnet -availableVersions 2.1.2 -requiredVersion 2.1.2 | Should -Be $true
}
It "Test-SuitableDotnet should return true when the expected version matches the available versions" {
Test-SuitableDotnet -availableVersions "2.1.1","2.1.2","2.1.3" -requiredVersion 2.1.2 | Should -Be $true
}
It "Test-SuitableDotnet should return false when the expected version does not match an available" {
Test-SuitableDotnet -availableVersions "2.2.100","2.2.300" -requiredVersion 2.2.200 | Should -Be $false
}
It "Test-SuitableDotnet should return false when the expected version does not match an available" {
Test-SuitableDotnet -availableVersions "2.2.100","2.2.300" -requiredVersion 2.2.105 | Should -Be $false
}
It "Test-SuitableDotnet should return true when the expected version matches an available" {
Test-SuitableDotnet -availableVersions "2.2.150","2.2.300" -requiredVersion 2.2.105 | Should -Be $true
}
It "Test-SuitableDotnet should return false when the expected version does not match an available" {
Test-SuitableDotnet -availableVersions "2.2.400","2.2.401","2.2.405" -requiredVersion "2.2.410" | Should -Be $false
}
}

Context "Test-DotnetInstallation" {
BeforeAll {
$availableVersions = ConvertTo-PortableVersion -strVersion "2.2.400","2.2.401","2.2.405"
$foundVersion = ConvertTo-PortableVersion -strVersion 2.2.402
$missingVersion = ConvertTo-PortableVersion -strVersion 2.2.410
}

It "Test-DotnetInstallation finds a good version" {
Mock Get-InstalledCLIVersion { return $availableVersions }
Mock Get-GlobalJSonSdkVersion { return $foundVersion }
$result = Test-DotnetInstallation -requestedVersion (Get-GlobalJsonSdkVersion) -installedVersions (Get-InstalledCLIVersion)
Assert-MockCalled "Get-InstalledCLIVersion" -Times 1
Assert-MockCalled "Get-GlobalJsonSdkVersion" -Times 1
$result | Should -Be $true
}

It "Test-DotnetInstallation cannot find a good version should return false" {
Mock Get-InstalledCLIVersion { return $availableVersions }
Mock Get-GlobalJSonSdkVersion { return $missingVersion }
$result = Test-DotnetInstallation -requestedVersion (Get-GlobalJsonSdkVersion) -installedVersions (Get-InstalledCLIVersion)
Assert-MockCalled "Get-InstalledCLIVersion" -Times 1
Assert-MockCalled "Get-GlobalJsonSdkVersion" -Times 1
$result | Should -Be $false
}
}

Context "Receive-DotnetInstallScript" {

Mock -ModuleName Build Receive-File { new-item -type file TestDrive:/dotnet-install.sh }
It "Downloads the proper non-Windows file" {
try {
push-location TestDrive:
Receive-DotnetInstallScript -platform NonWindows
"TestDrive:/dotnet-install.sh" | Should -Exist
}
finally {
Pop-Location
}
}

Mock -ModuleName Build Receive-File { new-item -type file TestDrive:/dotnet-install.ps1 }
It "Downloads the proper file Windows file" {
try {
push-location TestDrive:
Receive-DotnetInstallScript -platform "Windows"
"TestDrive:/dotnet-install.ps1" | Should -Exist
}
finally {
Pop-Location
}
}

}

Context "Test result functions" {
BeforeAll {
$xmlFile = @'
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<test-results xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nunit_schema_2.5.xsd" name="Pester" total="2" errors="0" failures="1" not-run="0" inconclusive="0" ignored="0" skipped="0" invalid="0" date="2019-02-19" time="11:36:56">
<environment platform="Darwin" clr-version="Unknown" os-version="18.2.0" cwd="/Users/jimtru/src/github/forks/JamesWTruher/PSScriptAnalyzer" user="jimtru" user-domain="" machine-name="Jims-Mac-mini.guest.corp.microsoft.com" nunit-version="2.5.8.0" />
<culture-info current-culture="en-US" current-uiculture="en-US" />
<test-suite type="TestFixture" name="Pester" executed="True" result="Failure" success="False" time="0.0982" asserts="0" description="Pester">
<results>
<test-suite type="TestFixture" name="/tmp/bad.tests.ps1" executed="True" result="Failure" success="False" time="0.0982" asserts="0" description="/tmp/bad.tests.ps1">
<results>
<test-suite type="TestFixture" name="test function" executed="True" result="Failure" success="False" time="0.084" asserts="0" description="test function">
<results>
<test-case description="a passing test" name="test function.a passing test" time="0.0072" asserts="0" success="True" result="Success" executed="True" />
<test-case description="a failing test" name="test function.a failing test" time="0.0268" asserts="0" success="False" result="Failure" executed="True">
<failure>
<message>Expected 2, but got 1.</message>
<stack-trace>at &lt;ScriptBlock&gt;, /tmp/bad.tests.ps1: line 3
3: It "a failing test" { 1 | Should -Be 2 }</stack-trace>
</failure>
</test-case>
</results>
</test-suite>
</results>
</test-suite>
</results>
</test-suite>
</test-results>
'@

$xmlFile | out-file TESTDRIVE:/results.xml
$results = Get-TestResults -logfile TESTDRIVE:/results.xml
$failures = Get-TestFailures -logfile TESTDRIVE:/results.xml
}

It "Get-TestResults finds 2 results" {
$results.Count | Should -Be 2
}
It "Get-TestResults finds 1 pass" {
@($results | ?{ $_.result -eq "Success" }).Count |Should -Be 1
}
It "Get-TestResults finds 1 failure" {
@($results | ?{ $_.result -eq "Failure" }).Count |Should -Be 1
}
It "Get-TestFailures finds 1 failure" {
$failures.Count | Should -Be 1
}
}
}
9 changes: 8 additions & 1 deletion build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ param(
[switch] $Test,

[Parameter(ParameterSetName='Test')]
[switch] $InProcess
[switch] $InProcess,

[Parameter(ParameterSetName='Bootstrap')]
[switch] $Bootstrap
)

END {
Expand All @@ -58,6 +61,10 @@ END {
}
Start-ScriptAnalyzerBuild @buildArgs
}
"Bootstrap" {
Install-DotNet
return
}
"Test" {
Test-ScriptAnalyzer -InProcess:$InProcess
return
Expand Down
Loading

0 comments on commit 3b439ea

Please sign in to comment.