ps/Modules/Alkami.PowerShell.Services/Public/Set-DotNetCoreProfiling.tests.ps1
2023-05-30 22:51:22 -07:00

136 lines
7.2 KiB
PowerShell

. $PSScriptRoot\..\..\Load-PesterModules.ps1
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.tests\.', '.'
$functionPath = Join-Path -Path $here -ChildPath $sut
Write-Host "Overriding SUT: $functionPath"
Import-Module $functionPath -Force
$moduleForMock = ""
Describe "Set-DotNetCoreProfiling" {
$global:manifestTemplate = @"
<?xml version="1.0" encoding="utf-8"?>
<packageManifest>
<serviceManifest>
<runtime>_replaceME_</runtime>
</serviceManifest>
</packageManifest>
"@
$serviceName = "Alkami.Services.Tenant"
$ServiceRegkey = "HKLM:\SYSTEM\CurrentControlSet\Services"
$serviceDirPath = "C:\ProgramData\chocolatey\lib-bad\$serviceName"
# Mock the pieces that make sure that the app.config is a real file.
Mock -ModuleName $moduleForMock New-item {}
Mock -ModuleName $moduleForMock Get-LogLeadName {}
Mock -ModuleName $moduleForMock Get-ChocolateyInstallPath {}
Mock -ModuleName $moduleForMock Set-ItemProperty {}
Mock -ModuleName $moduleForMock Write-Host {}
Mock -ModuleName $moduleForMock Get-PackageManifest {return ""}
Mock -ModuleName $moduleForMock Write-Warning {}
Mock -ModuleName $moduleForMock Test-IsServiceManifestCore { return $true }
Mock -ModuleName $moduleForMock Get-ItemProperty { }
Context "Service is not dot net core" {
Mock -ModuleName $moduleForMock Test-IsServiceManifestCore { return $false}
It "registry work is skipped" {
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $false
Assert-MockCalled -ModuleName $moduleForMock Write-Host -Times 1 -Exactly -Scope It -ParameterFilter {
$object -eq " : Runtime of for service [$serviceName] is not dot net core, skipping registry."
}
}
}
Context "Reg key IS NOT present" {
Mock -ModuleName $moduleForMock Test-Path { return $false }
It "If enabled is false, still creates Key" {
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $false
Assert-MockCalled -ModuleName $moduleForMock New-Item -Times 1 -Exactly -Scope It -ParameterFilter {
$Path -eq "$ServiceRegkey\$serviceName"
}
}
It "If enabled is true, still creates Key" {
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $true
Assert-MockCalled -ModuleName $moduleForMock New-Item -Times 1 -Exactly -Scope It -ParameterFilter {
$Path -eq "$ServiceRegkey\$serviceName"
}
}
It "Sets value to false" {
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $false
Assert-MockCalled -ModuleName $moduleForMock Set-ItemProperty -Times 1 -Exactly -Scope It -ParameterFilter {
$Path -eq "$ServiceRegkey\$serviceName" -and $Name -eq "Environment" -and $Value -eq "CORECLR_ENABLE_PROFILING=0"
}
}
It "Sets value to true" {
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $true
Assert-MockCalled -ModuleName $moduleForMock Set-ItemProperty -Times 1 -Exactly -Scope It -ParameterFilter {
$Path -eq "$ServiceRegkey\$serviceName" -and $Name -eq "Environment" -and $Value -eq "CORECLR_ENABLE_PROFILING=1"
}
}
}
Context "Reg key IS present" {
Mock -ModuleName $moduleForMock Test-Path { return $true }
It "value already set to false, skips Setting" {
Mock -ModuleName $moduleForMock Get-ItemProperty { return @{Environment = @("CORECLR_ENABLE_PROFILING=0") } }
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $false
Assert-MockCalled -ModuleName $moduleForMock Write-Host -Times 1 -Exactly -Scope It -ParameterFilter {
$object -eq " : Registry key already set, skipping update to key."
}
}
It "value already set to true, skips Setting" {
Mock -ModuleName $moduleForMock Get-ItemProperty { return @{Environment = @("CORECLR_ENABLE_PROFILING=1") } }
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $true
Assert-MockCalled -ModuleName $moduleForMock Write-Host -Times 1 -Exactly -Scope It -ParameterFilter {
$object -eq " : Registry key already set, skipping update to key."
}
}
}
Context "Reg key IS present, and value has contents" {
Mock -ModuleName $moduleForMock Get-ItemProperty { return @{Environment = @("george=best", "learning is FUNdamental") } }
Mock -ModuleName $moduleForMock Test-Path { return $true }
It "value is not pre-set and is set to false" {
[string[]]$expectedEnvValue = "george=best" + $([char]0) + "learning is FUNdamental" + $([char]0) + "CORECLR_ENABLE_PROFILING=0" + $([char]0)
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $false
Assert-MockCalled -ModuleName $moduleForMock Set-ItemProperty -Times 1 -Exactly -Scope It -ParameterFilter {
$Path -eq "$ServiceRegkey\$serviceName" -and $Name -eq "Environment" -and $Value -eq $expectedEnvValue
}
}
It "value is not pre-set and is set to true" {
[string[]]$expectedEnvValue = "george=best" + $([char]0) + "learning is FUNdamental" + $([char]0) + "CORECLR_ENABLE_PROFILING=1" + $([char]0)
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $true
Assert-MockCalled -ModuleName $moduleForMock Set-ItemProperty -Times 1 -Exactly -Scope It -ParameterFilter {
$Path -eq "$ServiceRegkey\$serviceName" -and $Name -eq "Environment" -and $Value -eq $expectedEnvValue
}
}
}
Context "Reg key IS present, value has contents, and setting is flipped" {
Mock -ModuleName $moduleForMock Test-Path { return $true }
It "value is true and is set to false" {
Mock -ModuleName $moduleForMock Get-ItemProperty { return @{Environment = @("george=best", "CORECLR_ENABLE_PROFILING=1", "learning is FUNdamental") } }
[string[]]$expectedEnvValue = "george=best" + $([char]0) + "learning is FUNdamental" + $([char]0) + "CORECLR_ENABLE_PROFILING=0" + $([char]0)
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $false
Assert-MockCalled -ModuleName $moduleForMock Set-ItemProperty -Times 1 -Exactly -Scope It -ParameterFilter {
$Path -eq "$ServiceRegkey\$serviceName" -and $Name -eq "Environment" -and $Value -eq $expectedEnvValue
}
}
It "value is false and is set to true" {
Mock -ModuleName $moduleForMock Get-ItemProperty { return @{Environment = @("george=best", "CORECLR_ENABLE_PROFILING=0", "learning is FUNdamental") } }
[string[]]$expectedEnvValue = "george=best" + $([char]0) + "learning is FUNdamental" + $([char]0) + "CORECLR_ENABLE_PROFILING=1" + $([char]0)
Set-DotNetCoreProfiling -Path $serviceDirPath -Enabled $true
Assert-MockCalled -ModuleName $moduleForMock Set-ItemProperty -Times 1 -Exactly -Scope It -ParameterFilter {
$Path -eq "$ServiceRegkey\$serviceName" -and $Name -eq "Environment" -and $Value -eq $expectedEnvValue
}
}
}
}