185 lines
7.4 KiB
PowerShell
185 lines
7.4 KiB
PowerShell
# Copyright (c) Microsoft Corporation.
|
|
# Licensed under the MIT License.
|
|
|
|
Describe "New-ModuleManifest basic tests" -tags "CI" {
|
|
BeforeAll {
|
|
$moduleName = 'test'
|
|
$modulePath = "$TestDrive/Modules/$moduleName"
|
|
$manifestPath = Join-Path $modulePath "$moduleName.psd1"
|
|
|
|
New-Item -Path "$TestDrive/Modules/$moduleName" -ItemType Directory
|
|
}
|
|
|
|
AfterEach {
|
|
Remove-Item -Path $manifestPath -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
AfterAll {
|
|
Remove-Item -Path $modulePath -Recurse -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
It "Verify manifest fields 1" {
|
|
New-ModuleManifest -Path $manifestPath
|
|
$module = Test-ModuleManifest -Path $manifestPath
|
|
$module.Name | Should -BeExactly "test"
|
|
$module.ModuleType | Should -BeExactly "Manifest"
|
|
$module.Version | Should -BeExactly "0.0.1"
|
|
$module.PrivateData.PSData.RequireLicenseAcceptance | Should -BeNullOrEmpty
|
|
}
|
|
|
|
It "Verify manifest fields 2" {
|
|
New-ModuleManifest -Path $manifestPath `
|
|
-Author 'author' `
|
|
-CompanyName 'company' `
|
|
-Copyright 'copyright' `
|
|
-ModuleVersion '1.2.3' `
|
|
-Description 'description' `
|
|
-PowerShellVersion '6.0' `
|
|
-ClrVersion '1.2.3' `
|
|
-DotNetFrameworkVersion '3.2.1' `
|
|
-PowerShellHostVersion '1.2.3' `
|
|
-Tags @('tag1', 'tag2') `
|
|
-ReleaseNotes 'release note' `
|
|
-RequiredModules @('PSReadline') `
|
|
-ExternalModuleDependencies @('PSReadline') `
|
|
-Prerelease 'prerelease' `
|
|
-RequireLicenseAcceptance
|
|
|
|
$module = Test-ModuleManifest -Path $manifestPath
|
|
$module.Name | Should -BeExactly "test"
|
|
$module.Author | Should -BeExactly "author"
|
|
$module.Version | Should -BeExactly "1.2.3"
|
|
$module.Description | Should -BeExactly "description"
|
|
$module.PowerShellVersion | Should -BeExactly "6.0"
|
|
$module.ClrVersion | Should -BeExactly "1.2.3"
|
|
$module.DotNetFrameworkVersion | Should -BeExactly "3.2.1"
|
|
$module.PowerShellHostVersion | Should -BeExactly "1.2.3"
|
|
$module.Tags | Should -BeExactly @('tag1', 'tag2')
|
|
$module.ReleaseNotes | Should -BeExactly 'release note'
|
|
$module.RequiredModules | Should -BeExactly 'PSReadline'
|
|
$module.PrivateData.PSData.ExternalModuleDependencies | Should -BeExactly 'PSReadline'
|
|
$module.PrivateData.PSData.Prerelease | Should -BeExactly 'prerelease'
|
|
$module.PrivateData.PSData.RequireLicenseAcceptance | Should -BeExactly $true
|
|
}
|
|
}
|
|
|
|
Describe "New-ModuleManifest tests" -tags "CI" {
|
|
BeforeAll {
|
|
$moduleName = 'test'
|
|
$modulePath = "$TestDrive/Modules/$moduleName"
|
|
$manifestPath = Join-Path $modulePath "$moduleName.psd1"
|
|
|
|
New-Item -Path "$TestDrive/Modules/$moduleName" -ItemType Directory
|
|
|
|
if ($IsWindows) {
|
|
$ExpectedManifestBytes = @(35,13) # CR
|
|
} else {
|
|
$ExpectedManifestBytes = @(35,10) # LF
|
|
}
|
|
}
|
|
|
|
AfterEach {
|
|
Remove-Item -Path $manifestPath -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
AfterAll {
|
|
Remove-Item -Path $modulePath -Recurse -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
|
|
It "Uris with spaces are allowed and escaped correctly" {
|
|
$testUri = [Uri]"http://foo.com/hello world"
|
|
$absoluteUri = $testUri.AbsoluteUri
|
|
|
|
New-ModuleManifest -Path $manifestPath -ProjectUri $testUri -LicenseUri $testUri -IconUri $testUri -HelpInfoUri $testUri
|
|
$module = Test-ModuleManifest -Path $manifestPath
|
|
$module.HelpInfoUri | Should -BeExactly $absoluteUri
|
|
$module.PrivateData.PSData.IconUri | Should -BeExactly $absoluteUri
|
|
$module.PrivateData.PSData.LicenseUri | Should -BeExactly $absoluteUri
|
|
$module.PrivateData.PSData.ProjectUri | Should -BeExactly $absoluteUri
|
|
}
|
|
|
|
function TestNewModuleManifestEncoding {
|
|
param ([byte[]]$expected)
|
|
New-ModuleManifest -Path $manifestPath
|
|
(Get-Content -AsByteStream -Path $manifestPath -TotalCount $expected.Length) -join ',' | Should -Be ($expected -join ',')
|
|
}
|
|
|
|
It "Verify module manifest encoding" {
|
|
|
|
# verify first line of the manifest:
|
|
# 2 characters - '#' '\n' - in UTF-8 no BOM - this should be @(35,10)
|
|
TestNewModuleManifestEncoding -expected $ExpectedManifestBytes
|
|
}
|
|
|
|
It "Relative URIs are not allowed" {
|
|
$testUri = [Uri]"../foo"
|
|
|
|
{ New-ModuleManifest -Path $manifestPath -ProjectUri $testUri -LicenseUri $testUri -IconUri $testUri } | Should -Throw -ErrorId "System.InvalidOperationException,Microsoft.PowerShell.Commands.NewModuleManifestCommand"
|
|
}
|
|
|
|
# We skip the test on Unix-s because there Roslyn compilation works in another way.
|
|
It "New-ModuleManifest works with assembly architecture: <moduleArch>" -Skip:(!$IsWindows) -TestCases @(
|
|
# All values from [System.Reflection.ProcessorArchitecture]
|
|
@{ moduleArch = "None" },
|
|
@{ moduleArch = "MSIL" },
|
|
@{ moduleArch = "X86" },
|
|
@{ moduleArch = "IA64" },
|
|
@{ moduleArch = "Amd64" },
|
|
@{ moduleArch = "Arm" }
|
|
) {
|
|
param($moduleArch)
|
|
|
|
$roslynArch = [System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture
|
|
|
|
switch ($moduleArch)
|
|
{
|
|
"None" { Set-ItResult -Skipped -Because "the test assembly architecture can not be tested"; return }
|
|
"MSIL" { Set-ItResult -Skipped -Because "the test assembly architecture can not be tested"; return }
|
|
"IA64" { $roslynArch = 'Itanium' }
|
|
}
|
|
|
|
$arch = [int].Assembly.GetName().ProcessorArchitecture
|
|
|
|
# Skip tests if the module architecture does not match the platform architecture
|
|
# but X86 works on Amd64/X64 and Arm works on Arm64.
|
|
if ($moduleArch -ne $arch -and -not ($moduleArch -eq "X86" -and $arch -eq "Amd64") -and -not ($moduleArch -eq "Arm" -and $arch -eq "Arm64"))
|
|
{
|
|
Set-ItResult -Skipped -Because "the $moduleArch assembly architecture is not supported on the $arch platform"
|
|
return
|
|
}
|
|
|
|
$a=@"
|
|
using System;
|
|
using System.Management.Automation;
|
|
|
|
namespace Test.Manifest {
|
|
|
|
[Cmdlet(VerbsCommon.Get, "TP")]
|
|
public class TPCommand0 : PSCmdlet
|
|
{
|
|
protected override void EndProcessing()
|
|
{
|
|
WriteObject("$arch");
|
|
}
|
|
}
|
|
}
|
|
"@
|
|
try {
|
|
# We can not unload the module assembly and so we can not use Pester TestDrive without cleanup error reporting
|
|
$testFolder = Join-Path $([System.IO.Path]::GetTempPath()) $([System.IO.Path]::GetRandomFileName())
|
|
New-Item -Type Directory -Path $testFolder -Force > $null
|
|
|
|
$assemblyPath = Join-Path $testFolder "TP_$arch.dll"
|
|
$modulePath = Join-Path $testFolder "TP_$arch.psd1"
|
|
Add-Type -TypeDefinition $a -CompilerOptions "/platform:$roslynArch" -OutputAssembly $assemblyPath
|
|
New-ModuleManifest -Path $modulePath -NestedModules "TP_$arch.dll" -RequiredAssemblies "TP_$arch.dll" -ProcessorArchitecture $arch -CmdletsToExport "Get-TP"
|
|
Import-Module $modulePath
|
|
|
|
Get-TP -ErrorAction SilentlyContinue | Should -BeExactly "$arch"
|
|
} finally {
|
|
Remove-Module "TP_$arch" -Force
|
|
Remove-Item -LiteralPath $testFolder -Recurse -Force -ErrorAction SilentlyContinue > $null
|
|
}
|
|
}
|
|
}
|