diff --git a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs index 7c5857db3a3..a71f93519c5 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs @@ -613,19 +613,18 @@ private PSModuleInfo LoadModuleNamedInManifest(PSModuleInfo parentModule, Module Guid? savedBaseGuid = BaseGuid; var importingModule = 0 != (manifestProcessingFlags & ManifestProcessingFlags.LoadElements); - + string extension = Path.GetExtension(moduleSpecification.Name); // First check for fully-qualified paths - either absolute or relative string rootedPath = ResolveRootedFilePath(moduleSpecification.Name, this.Context); if (String.IsNullOrEmpty(rootedPath)) { - rootedPath = Path.Combine(moduleBase, moduleSpecification.Name); + rootedPath = FixupFileName(moduleBase, moduleSpecification.Name, extension); } else { wasRooted = true; } - string extension = Path.GetExtension(moduleSpecification.Name); try { this.Context.Modules.IncrementModuleNestingDepth(this, rootedPath); diff --git a/test/powershell/engine/Module/SubmodulePathInManifest.Tests.ps1 b/test/powershell/engine/Module/SubmodulePathInManifest.Tests.ps1 new file mode 100644 index 00000000000..25c14a41730 --- /dev/null +++ b/test/powershell/engine/Module/SubmodulePathInManifest.Tests.ps1 @@ -0,0 +1,54 @@ +Describe "Tests for paths of submodules in module manifest" -tags "CI" { + + $moduleName = 'ModuleA' + $moduleFileName = "$moduleName.psd1" + $submoduleName = 'ModuleB' + $submoduleFileName = "$submoduleName.psm1" + $moduleRootPath = Join-Path $TestDrive $moduleName + $moduleFilePath = Join-Path $moduleRootPath $moduleFileName + $nestedModulePath = Join-Path $moduleRootPath $submoduleName + $nestedModuleFilePath = Join-Path $nestedModulePath $submoduleFileName + + BeforeEach { + + Remove-Module $moduleName -Force -ErrorAction SilentlyContinue + Remove-Item $moduleRootPath -Recurse -Force -ErrorAction SilentlyContinue + + New-Item -ItemType Directory -Force -Path $nestedModulePath + "function TestModuleFunction{'Hello from TestModuleFunction'}" | Out-File $nestedModuleFilePath + } + + $testCases = @( + @{ SubModulePath = "$submoduleName" } + @{ SubModulePath = "$submoduleName\$submoduleName" } + @{ SubModulePath = "$submoduleName/$submoduleName" } + @{ SubModulePath = "$submoduleName\$submoduleFileName" } + @{ SubModulePath = "$submoduleName/$submoduleFileName" } + @{ SubModulePath = ".\$submoduleName" } + @{ SubModulePath = ".\$submoduleName\$submoduleName" } + @{ SubModulePath = ".\$submoduleName/$submoduleName" } + @{ SubModulePath = ".\$submoduleName\$submoduleFileName" } + @{ SubModulePath = ".\$submoduleName/$submoduleFileName" } + @{ SubModulePath = "./$submoduleName" } + @{ SubModulePath = "./$submoduleName/$submoduleName" } + @{ SubModulePath = "./$submoduleName\$submoduleName" } + @{ SubModulePath = "./$submoduleName/$submoduleFileName" } + @{ SubModulePath = "./$submoduleName\$submoduleFileName" } + ) + + It "Test if NestedModule path is " -TestCases $testCases { + param($SubModulePath) + + New-ModuleManifest $moduleFilePath -NestedModules @($SubModulePath) + Import-Module $moduleFilePath + (Get-Module $moduleName).ExportedCommands.Keys.Contains('TestModuleFunction') | Should Be $true + } + + It "Test if RootModule path is " -TestCases $testCases { + param($SubModulePath) + + New-ModuleManifest $moduleFilePath -RootModule $SubModulePath + Import-Module $moduleFilePath + (Get-Module $moduleName).ExportedCommands.Keys.Contains('TestModuleFunction') | Should Be $true + } +}