Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c3bbd00
commit 6137a36
Showing
1 changed file
with
24 additions
and
225 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,242 +1,41 @@ | ||
<# | ||
.summary | ||
Test that describes code. | ||
.PARAMETER Force | ||
Used to force any installations to occur without confirming with | ||
the user. | ||
#> | ||
[CmdletBinding()] | ||
Param ( | ||
[Boolean]$Force = $false | ||
) | ||
|
||
if (!$PSScriptRoot) # $PSScriptRoot is not defined in 2.0 | ||
{ | ||
$PSScriptRoot = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path) | ||
} | ||
# Make sure MetaFixers.psm1 is loaded - it contains Get-TextFilesList | ||
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'MetaFixers.psm1') -Force | ||
|
||
# Load the TestHelper module which contains the *-ResourceDesigner functions | ||
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelper.psm1') -Force | ||
|
||
$ErrorActionPreference = 'stop' | ||
Set-StrictMode -Version latest | ||
|
||
$RepoRoot = (Resolve-Path $PSScriptRoot\..).Path | ||
$PSVersion = $PSVersionTable.PSVersion | ||
|
||
# Install and/or Import xDSCResourceDesigner Module | ||
if ($env:APPVEYOR) { | ||
# Running in AppVeyor so force silent install of xDSCResourceDesigner | ||
$PSBoundParameters.Force = $true | ||
} | ||
|
||
$xDSCResourceDesignerModuleName = "xDscResourceDesigner" | ||
$xDSCResourceDesignerModulePath = "$env:USERPROFILE\Documents\WindowsPowerShell\Modules\$xDSCResourceDesignerModuleName" | ||
$xDSCResourceDesignerModule = Install-ModuleFromPowerShellGallery -ModuleName $xDSCResourceDesignerModuleName -ModulePath $xDSCResourceDesignerModulePath @PSBoundParameters | ||
|
||
if ($xDSCResourceDesignerModule) { | ||
# Import the module if it is available | ||
$xDSCResourceDesignerModule | Import-Module -Force | ||
} | ||
else | ||
{ | ||
# Module could not/would not be installed - so warn user that tests will fail. | ||
Write-Warning -Message ( @( | ||
"The 'xDSCResourceDesigner' module is not installed. " | ||
"The 'PowerShell DSC resource modules' Pester Tests in Meta.Tests.ps1 " | ||
'will fail until this module is installed.' | ||
) -Join '' ) | ||
} | ||
|
||
# PSScriptAnalyzer requires PowerShell 5.0 or higher | ||
if ($PSVersion.Major -ge 5) | ||
{ | ||
Write-Verbose -Verbose "Installing PSScriptAnalyzer" | ||
$PSScriptAnalyzerModuleName = "PSScriptAnalyzer" | ||
$PSScriptAnalyzerModulePath = "$env:USERPROFILE\Documents\WindowsPowerShell\Modules\$PSScriptAnalyzerModuleName" | ||
$PSScriptAnalyzerModule = Install-ModuleFromPowerShellGallery -ModuleName $PSScriptAnalyzerModuleName -ModulePath $PSScriptAnalyzerModulePath @PSBoundParameters | ||
# Make sure MetaFixers.psm1 is loaded - it contains Get-TextFilesList | ||
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'MetaFixers.psm1') -Verbose:$false -Force | ||
|
||
if ($PSScriptAnalyzerModule) { | ||
# Import the module if it is available | ||
$PSScriptAnalyzerModule | Import-Module -Force | ||
} | ||
else | ||
{ | ||
# Module could not/would not be installed - so warn user that tests will fail. | ||
Write-Warning -Message ( @( | ||
"The 'PSScriptAnalyzer' module is not installed. " | ||
"The 'PowerShell DSC resource modules' Pester Tests in Meta.Tests.ps1 " | ||
'will fail until this module is installed.' | ||
) -Join '' ) | ||
} | ||
} | ||
else | ||
{ | ||
Write-Verbose -Verbose "Skipping installation of PSScriptAnalyzer since it requires PSVersion 5.0 or greater. Used PSVersion: $($PSVersion)" | ||
$projectRoot = $ENV:BHProjectPath | ||
if(-not $projectRoot) { | ||
$projectRoot = $PSScriptRoot | ||
} | ||
|
||
# The folder where this module is found | ||
[String] $moduleRoot = Split-Path -Parent (Split-Path -Parent $Script:MyInvocation.MyCommand.Path) | ||
Describe 'Text files formatting' { | ||
|
||
# Modify PSModulePath of the current PowerShell session. | ||
# We want to make sure we always test the development version of the resource | ||
# in the current build directory. | ||
[String] $script:OldModulePath = $env:PSModulePath | ||
[String] $NewModulePath = $script:OldModulePath | ||
if (($NewModulePath.Split(';') | Select-Object -First 1) -ne $moduleRoot) | ||
{ | ||
# Add the ModuleRoot to the beginning if it is not already at the front. | ||
$env:PSModulePath = "$moduleRoot;$env:PSModulePath" | ||
} | ||
|
||
# Wrap tests in a try so that if anything goes wrong or user terminates we roll back | ||
# any enviroment changes (e.g. $ENV:PSModulePath) | ||
try | ||
{ | ||
Describe 'Text files formatting' { | ||
|
||
$allTextFiles = Get-TextFilesList $RepoRoot | ||
|
||
Context 'Files encoding' { | ||
$allTextFiles = Get-TextFilesList $projectRoot | ||
|
||
It "Doesn't use Unicode encoding" { | ||
$unicodeFilesCount = 0 | ||
$allTextFiles | %{ | ||
if (Test-FileUnicode $_) { | ||
$unicodeFilesCount += 1 | ||
Write-Warning "File $($_.FullName) contains 0x00 bytes. It's probably uses Unicode and need to be converted to UTF-8. Use Fixer 'Get-UnicodeFilesList `$pwd | ConvertTo-UTF8'." | ||
} | ||
Context 'Files encoding' { | ||
It "Doesn't use Unicode encoding" { | ||
$unicodeFilesCount = 0 | ||
$allTextFiles | %{ | ||
if (Test-FileUnicode $_) { | ||
$unicodeFilesCount += 1 | ||
Write-Warning "File $($_.FullName) contains 0x00 bytes. It's probably uses Unicode and need to be converted to UTF-8. Use Fixer 'Get-UnicodeFilesList `$pwd | ConvertTo-UTF8'." | ||
} | ||
$unicodeFilesCount | Should Be 0 | ||
} | ||
} | ||
|
||
Context 'Indentations' { | ||
|
||
It 'Uses spaces for indentation, not tabs' { | ||
$totalTabsCount = 0 | ||
$allTextFiles | %{ | ||
$fileName = $_.FullName | ||
$tabStrings = (Get-Content $_.FullName -Raw) | Select-String "`t" | % { | ||
Write-Warning "There are tab in $fileName. Use Fixer 'Get-TextFilesList `$pwd | ConvertTo-SpaceIndentation'." | ||
$totalTabsCount++ | ||
} | ||
} | ||
$totalTabsCount | Should Be 0 | ||
} | ||
$unicodeFilesCount | Should Be 0 | ||
} | ||
} | ||
|
||
Describe 'PowerShell DSC resource modules' { | ||
|
||
# PSScriptAnalyzer requires PowerShell 5.0 or higher | ||
if ($PSVersion.Major -ge 5) | ||
{ | ||
Context 'PSScriptAnalyzer' { | ||
It 'passes Invoke-ScriptAnalyzer' { | ||
|
||
# Perform PSScriptAnalyzer scan. | ||
# Using ErrorAction SilentlyContinue not to cause it to fail due to parse errors caused by unresolved resources. | ||
# Many of our examples try to import different modules which may not be present on the machine and PSScriptAnalyzer throws parse exceptions even though examples are valid. | ||
# Errors will still be returned as expected. | ||
$excludedRules = @( | ||
'PSAvoidUsingUserNameAndPassWordParams' | ||
) | ||
$PSScriptAnalyzerErrors = Invoke-ScriptAnalyzer -path $RepoRoot -Severity Error -Recurse -ErrorAction SilentlyContinue -ExcludeRule $excludedRules | ||
if ($PSScriptAnalyzerErrors -ne $null) { | ||
Write-Warning -Message 'There are PSScriptAnalyzer errors that need to be fixed:' | ||
@($PSScriptAnalyzerErrors).Foreach( { Write-Warning -Message "$($_.Scriptname) (Line $($_.Line)): $($_.Message)" } ) | ||
Write-Warning -Message 'For instructions on how to run PSScriptAnalyzer on your own machine, please go to https://github.com/powershell/psscriptAnalyzer/' | ||
$PSScriptAnalyzerErrors.Count | Should Be $null | ||
} | ||
} | ||
} | ||
} | ||
|
||
# Force convert to array | ||
$psm1Files = @( | ||
Get-ChildItem -Path $RepoRoot\DscResources -Recurse -Filter '*.psm1' -File | | ||
Foreach-Object { | ||
# Ignore Composite configurations | ||
# They requires additional resources to be installed on the box | ||
if (-not ($_.Name -like '*.schema.psm1')) | ||
{ | ||
$MofFileName = "$($_.BaseName).schema.mof" | ||
$MofFilePath = Join-Path -Path $_.DirectoryName -ChildPath $MofFileName | ||
if (Test-Path -Path $MofFilePath -ErrorAction SilentlyContinue) | ||
{ | ||
Write-Output -InputObject $_ | ||
} | ||
} | ||
} | ||
) | ||
|
||
if (-not $psm1Files) { | ||
Write-Verbose -Verbose 'There are no resource files to analyze' | ||
} else { | ||
|
||
Write-Verbose -Verbose "Analyzing $($psm1Files.Count) resources" | ||
|
||
Context 'Correctness' { | ||
|
||
function Get-ParseErrors | ||
{ | ||
param( | ||
[Parameter(ValueFromPipeline=$True,Mandatory=$True)] | ||
[string]$fileName | ||
) | ||
|
||
$tokens = $null | ||
$errors = $null | ||
$ast = [System.Management.Automation.Language.Parser]::ParseFile($fileName, [ref] $tokens, [ref] $errors) | ||
return $errors | ||
} | ||
|
||
|
||
It 'all .psm1 files don''t have parse errors' { | ||
$errors = @() | ||
$psm1Files | ForEach-Object { | ||
$localErrors = Get-ParseErrors $_.FullName | ||
if ($localErrors) { | ||
Write-Warning "There are parsing errors in $($_.FullName)" | ||
Write-Warning ($localErrors | Format-List | Out-String) | ||
} | ||
$errors += $localErrors | ||
} | ||
$errors.Count | Should Be 0 | ||
} | ||
} | ||
|
||
foreach ($psm1file in $psm1Files) | ||
{ | ||
Context "Schema Validation of $($psm1file.BaseName)" { | ||
|
||
It 'should pass Test-xDscResource' { | ||
$result = Test-xDscResource -Name $psm1file.DirectoryName | ||
$result | Should Be $true | ||
} | ||
|
||
It 'should pass Test-xDscSchema' { | ||
$Splat = @{ | ||
Path = $psm1file.DirectoryName | ||
ChildPath = "$($psm1file.BaseName).schema.mof" | ||
} | ||
$result = Test-xDscSchema -Path (Join-Path @Splat -Resolve -ErrorAction Stop) | ||
$result | Should Be $true | ||
} | ||
Context 'Indentations' { | ||
It 'Uses spaces for indentation, not tabs' { | ||
$totalTabsCount = 0 | ||
$allTextFiles | %{ | ||
$fileName = $_.FullName | ||
(Get-Content $_.FullName -Raw) | Select-String "`t" | % { | ||
Write-Warning "There are tab in $fileName. Use Fixer 'Get-TextFilesList `$pwd | ConvertTo-SpaceIndentation'." | ||
$totalTabsCount++ | ||
} | ||
} | ||
$totalTabsCount | Should Be 0 | ||
} | ||
} | ||
} | ||
finally | ||
{ | ||
# Restore PSModulePath | ||
if ($script:OldModulePath -ne $env:PSModulePath) | ||
{ | ||
$env:PSModulePath = $OldModulePath | ||
} | ||
} |