From 40767490343b9b6d660f7540f643a756d8f46773 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Thu, 8 Aug 2019 15:02:21 -0700 Subject: [PATCH 1/2] make module name matching for get-module -FullyQualifiedName ignore case fix regression caused in #9101 --- .../engine/Modules/GetModuleCommand.cs | 4 +++- .../Microsoft.PowerShell.Core/Get-Module.Tests.ps1 | 12 ++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs b/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs index 6b8400247dc..56a715b922d 100644 --- a/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs +++ b/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs @@ -573,9 +573,11 @@ private static IEnumerable GetCandidateModuleSpecs( IDictionary moduleSpecTable, PSModuleInfo module) { + const WildcardOptions options = WildcardOptions.IgnoreCase | WildcardOptions.CultureInvariant; foreach (ModuleSpecification moduleSpec in moduleSpecTable.Values) { - if (moduleSpec.Name == module.Name || moduleSpec.Name == module.Path || module.Path.Contains(moduleSpec.Name)) + WildcardPattern namePattern = WildcardPattern.Get(moduleSpec.Name, options); + if (namePattern.IsMatch(module.Name) || moduleSpec.Name == module.Path || module.Path.Contains(moduleSpec.Name)) { yield return moduleSpec; } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 index 8d851643785..bd713cc15f3 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 @@ -114,7 +114,7 @@ Describe "Get-Module -ListAvailable" -Tags "CI" { $modules[4].Path | Should -BeExactly (Resolve-Path "$testdrive\Modules\Zoo\Too\Zoo.psm1").Path } - It "Get-Module -FullyQualifiedName -ListAvailable" { + It "Get-Module -FullyQualifiedName (case matched) -ListAvailable" { $moduleSpecification = @{ModuleName = "Foo"; ModuleVersion = "2.0"} $modules = Get-Module -FullyQualifiedName $moduleSpecification -ListAvailable $modules | Should -HaveCount 1 @@ -122,6 +122,14 @@ Describe "Get-Module -ListAvailable" -Tags "CI" { $modules.Version | Should -BeExactly "2.0" } + It "Get-Module -FullyQualifiedName (case mismatched) -ListAvailable" { + $moduleSpecification = @{ModuleName = "foo"; ModuleVersion = "2.0"} + $modules = Get-Module -FullyQualifiedName $moduleSpecification -ListAvailable + $modules | Should -HaveCount 1 + $modules.Name | Should -BeExactly "Foo" + $modules.Version | Should -BeExactly "2.0" + } + It "Get-Module -Refresh -ListAvailable" { $modules = Get-Module -Name 'Zoo' -ListAvailable $modules | Should -HaveCount 1 @@ -219,7 +227,7 @@ Describe "Get-Module -ListAvailable" -Tags "CI" { It "'Get-Module -ListAvailable' should not load the module assembly" { ## $fullName should be null and thus the result should just be the module's name. - $result = pwsh -c "`$env:PSModulePath = '$tempModulePath'; `$module = Get-Module -ListAvailable; `$fullName = [System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object Location -eq $assemblyPath | Foreach-Object FullName; `$module.Name + `$fullName" + $result = pwsh -noprofile -c "`$env:PSModulePath = '$tempModulePath'; `$module = Get-Module -ListAvailable; `$fullName = [System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object Location -eq $assemblyPath | Foreach-Object FullName; `$module.Name + `$fullName" $result | Should -BeExactly "MyModuelTest" } } From 36c8746b7d8ae549a5dc5ae5f96b875def1a03d0 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Thu, 8 Aug 2019 15:49:41 -0700 Subject: [PATCH 2/2] use test cases --- .../Get-Module.Tests.ps1 | 65 ++++++++++++++++--- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 index bd713cc15f3..8cc0c522391 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 @@ -33,6 +33,35 @@ Describe "Get-Module -ListAvailable" -Tags "CI" { @{ ModPath = "$TestDrive\Modules\Zoo\Too\Zoo.psm1"; Name = 'Zoo'; Version = '0.0'; Count = 1 } ) + $listModuleNameTestCases = @( + @{ + Name = 'Foo' + TestCaseName = 'Match case' + ExpectedName = 'Foo' + ModuleVersion = '2.0' + } + @{ + Name = 'foo' + TestCaseName = 'Mismatched case' + ExpectedName = 'Foo' + ModuleVersion = '2.0' + } + ) + $loadedModuleNameTestCases = @( + @{ + Name = 'Microsoft.PowerShell.Managemen*' + TestCaseName = 'Wildcard' + ExpectedName = 'Microsoft.PowerShell.Management' + ModuleVersion = '6.1.0.0' + } + @{ + Name = 'microsoft.powershell.managemen*' + TestCaseName = 'Mismatched case' + ExpectedName = 'Microsoft.PowerShell.Management' + ModuleVersion = '6.1.0.0' + } + ) + $env:PSModulePath = Join-Path $testdrive "Modules" } @@ -114,20 +143,38 @@ Describe "Get-Module -ListAvailable" -Tags "CI" { $modules[4].Path | Should -BeExactly (Resolve-Path "$testdrive\Modules\Zoo\Too\Zoo.psm1").Path } - It "Get-Module -FullyQualifiedName (case matched) -ListAvailable" { - $moduleSpecification = @{ModuleName = "Foo"; ModuleVersion = "2.0"} + It "Get-Module -FullyQualifiedName @{ModuleName = '' ; ModuleVersion = ''} -ListAvailable - " -TestCases $listModuleNameTestCases { + param( + [Parameter(Mandatory = $true)] + $Name, + $TestCaseName, + [Parameter(Mandatory = $true)] + $ExpectedName, + $ModuleVersion + ) + + $moduleSpecification = @{ModuleName = $name ; ModuleVersion = $ModuleVersion} $modules = Get-Module -FullyQualifiedName $moduleSpecification -ListAvailable $modules | Should -HaveCount 1 - $modules.Name | Should -BeExactly "Foo" - $modules.Version | Should -BeExactly "2.0" + $modules.Name | Should -BeExactly $ExpectedName + $modules.Version | Should -BeExactly $ModuleVersion } - It "Get-Module -FullyQualifiedName (case mismatched) -ListAvailable" { - $moduleSpecification = @{ModuleName = "foo"; ModuleVersion = "2.0"} - $modules = Get-Module -FullyQualifiedName $moduleSpecification -ListAvailable + It "Get-Module -FullyQualifiedName @{ModuleName = '' ; ModuleVersion = ''} - " -TestCases $loadedModuleNameTestCases { + param( + [Parameter(Mandatory = $true)] + $Name, + $TestCaseName, + [Parameter(Mandatory = $true)] + $ExpectedName, + $ModuleVersion + ) + + $moduleSpecification = @{ModuleName = $name ; ModuleVersion = $ModuleVersion} + $modules = Get-Module -FullyQualifiedName $moduleSpecification $modules | Should -HaveCount 1 - $modules.Name | Should -BeExactly "Foo" - $modules.Version | Should -BeExactly "2.0" + $modules.Name | Should -BeExactly $ExpectedName + $modules.Version | Should -BeExactly $ModuleVersion } It "Get-Module -Refresh -ListAvailable" {