tests/checks/InstanceChecks.Tests.ps1
# load all of the assertion functions (Get-ChildItem $PSScriptRoot/../../internal/assertions/).ForEach{. $Psitem.FullName} Describe "Checking Instance.Tests.ps1 checks" -Tag UnitTest { Context "Checking Backup Compression" { # Mock the version check for running tests Mock Connect-DbaInstance {@{Version = @{Major = 14}}} # Define test cases for the results to fail test and fill expected message # So the results of SPConfigure is 1, we expect $false but the result is true and the results of SPConfigure is 0, we expect $true but the result is false $TestCases = @{spconfig = 1; expected = $false; actual = $true}, @{spconfig = 0; expected = $true; actual = $false} It "Fails Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $actual, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} {Assert-BackupCompression -Instance 'Dummy' -defaultbackupcompression $expected} | Should -Throw -ExpectedMessage "Expected `$$expected, because The default backup compression should be set correctly, but got `$$actual" } $TestCases = @{spconfig = 0; expected = $false}, @{spconfig = 1; expected = $true; } It "Passes Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} Assert-BackupCompression -Instance 'Dummy' -defaultbackupcompression $expected } # Validate we have called the mock the correct number of times It "Should call the mocks" { $assertMockParams = @{ 'CommandName' = 'Get-DbaSpConfigure' 'Times' = 4 'Exactly' = $true } Assert-MockCalled @assertMockParams } <# It "Should not run for SQL 2005 and below"{ # Mock Get-Version function Get-Version {} Mock Get-Version {9} # Mock the version check for not running the tests Mock Get-DbaSpConfigure {@{"ConfiguredValue" = 1}} $Pester = Invoke-DbcCheck -SQLInstance Dummy -Check DefaultBackupCompression -PassThru -Show None # $Pester.TotalCount | Should -Be 1 # $Pester.SkippedCount | Should -Be 1 $assertMockParams = @{ 'CommandName' = 'Get-Version' 'Times' = 1 'Exactly' = $true } Assert-MockCalled @assertMockParams } #> } Context "Checking Instance MaxDop" { # if Userecommended it should pass if CurrentInstanceMaxDop property returned from Test-DbaMaxDop matches the RecommendedMaxDop property It "Passes Check Correctly with the use recommended parameter set to true" { # Mock to pass Mock Test-DbaMaxDop {@{"CurrentInstanceMaxDop" = 0; "RecommendedMaxDop" = 0}} Assert-InstanceMaxDop -Instance 'Dummy' -UseRecommended } # if Userecommended it should fail if CurrentInstanceMaxDop property returned from Test-DbaMaxDop does not match the RecommendedMaxDop property It "Fails Check Correctly with the use recommended parameter set to true" { # Mock to fail Mock Test-DbaMaxDop {@{"CurrentInstanceMaxDop" = 0; "RecommendedMaxDop" = 5}} {Assert-InstanceMaxDop -Instance 'Dummy' -UseRecommended} | Should -Throw -ExpectedMessage "Expected 5, because We expect the MaxDop Setting to be the recommended value 5" } $TestCases = @{"MaxDopValue" = 5} # if not UseRecommended - it should pass if the CurrentInstanceMaxDop property returned from Test-DbaMaxDop matches the MaxDopValue parameter It "Passes Check Correctly with a specified value <MaxDopValue>" -TestCases $TestCases { Param($MaxDopValue) # Mock to pass Mock Test-DbaMaxDop {@{"CurrentInstanceMaxDop" = 5; "RecommendedMaxDop" = $MaxDopValue}} Assert-InstanceMaxDop -Instance 'Dummy' -MaxDopValue $MaxDopValue } $TestCases = @{"MaxDopValue" = 5}, @{"MaxDopValue" = 0} # if not UseRecommended - it should fail if the CurrentInstanceMaxDop property returned from Test-DbaMaxDop does not match the MaxDopValue parameter It "Fails Check Correctly with with a specified value <MaxDopValue>" -TestCases $TestCases { Param($MaxDopValue) # Mock to fail Mock Test-DbaMaxDop {@{"CurrentInstanceMaxDop" = 4; "RecommendedMaxDop" = 73}} {Assert-InstanceMaxDop -Instance 'Dummy' -MaxDopValue $MaxDopValue} | Should -Throw -ExpectedMessage "Expected $MaxDopValue, because We expect the MaxDop Setting to be $MaxDopValue" } # Validate we have called the mock the correct number of times It "Should call the mocks" { $assertMockParams = @{ 'CommandName' = 'Test-DbaMaxDop' 'Times' = 5 'Exactly' = $true } Assert-MockCalled @assertMockParams } } Context "Checking tempdb size" { Mock Get-DbaDbFile {@( [PSCustomObject]@{ Type = 0 Size = [PSCustomObject]@{ Megabyte = 8 } }, [PSCustomObject]@{ Type = 0 Size = [PSCustomObject]@{ Megabyte = 8 } }, [PSCustomObject]@{ Type = 0 Size = [PSCustomObject]@{ Megabyte = 8 } }, [PSCustomObject]@{ Type = 0 Size = [PSCustomObject]@{ Megabyte = 8 } } )} It "Should pass the test when all tempdb files are the same size" { Assert-TempDBSize -Instance Dummy } Mock Get-DbaDbFile {@( [PSCustomObject]@{ Type = 0 Size = [PSCustomObject]@{ Megabyte = 8 } }, [PSCustomObject]@{ Type = 0 Size = [PSCustomObject]@{ Megabyte = 6 } }, [PSCustomObject]@{ Type = 0 Size = [PSCustomObject]@{ Megabyte = 8 } }, [PSCustomObject]@{ Type = 0 Size = [PSCustomObject]@{ Megabyte = 7 } } )} It "Should fail when all of the tempdb files are not the same size" { {Assert-TempDBSize -Instance Dummy} | Should -Throw -ExpectedMessage "We want all the tempdb data files to be the same size - See https://blogs.sentryone.com/aaronbertrand/sql-server-2016-tempdb-fixes/ and https://www.brentozar.com/blitz/tempdb-data-files/ for more information" } } Context "Checking Supported Build" { [DateTime]$Date = Get-Date -Format O $TestCases = @{"Date" = $Date; "BuildBehind" = "1SP"; }, @{"Date" = $Date; "BuildBehind" = "1CU"; } #if BuildBehind it should pass if build is >= SP/CU specified & Support Dates are valid It "Passed check correctly when the current build is not behind the BuildBehind value of <BuildBehind>" -TestCases $TestCases { Param($BuildBehind, $Date) #Mock to pass Mock Test-DbaBuild {@{"SPLevel" = "{SP4, LATEST}"; "CULevel" = "CU4"; "Compliant" = $true; "SupportedUntil" = $Date.AddMonths(1)}} Assert-InstanceSupportedBuild -Instance 'Dummy' -BuildBehind $BuildBehind -Date $Date } $TestCases = @{"Date" = $Date; "BuildBehind" = "1SP"; "BuildWarning" = 6; "expected" = $true; "actual" = $false}, @{"Date" = $Date; "BuildBehind" = "1CU"; "BuildWarning" = 6; "expected" = $true; "actual" = $false} #if BuildBehind it should fail if build is <= SP/CU specified & Support dates are valid It "Failed check correctly when the current build is behind the BuildBehind value of <BuildBehind>" -TestCases $TestCases { Param($BuildBehind, $Date, $expected, $actual) #Mock to fail Mock Test-DbaBuild {@{"SPLevel" = "{SP2}"; "CULevel" = "CU2"; "SPTarget" = "SP4"; "CUTarget" = "CU4"; "Compliant" = $false; "SupportedUntil" = $Date.AddMonths(1); "Build" = 42}} { Assert-InstanceSupportedBuild -Instance 'Dummy' -BuildBehind $BuildBehind -Date $Date} | Should -Throw -ExpectedMessage "Expected `$$expected, because this build 42 should not be behind the required build, but got `$$actual" } $TestCases = @{"Date" = $Date} #if neither BuildBehind nor BuildWarning it should pass if support dates are valid It "Passed check correctly with a SupportedUntil date > today" -TestCases $TestCases { Param($Date) #Mock to pass Mock Test-DbaBuild {@{"SupportedUntil" = $Date.AddMonths(1)}} Assert-InstanceSupportedBuild -Instance 'Dummy' -Date $Date } $TestCases = @{"Date" = $Date} #if neither BuildBehind nor BuildWarning it should fail if support date is out of the support window It "Failed check correctly with a SupportedUntil date < today" -TestCases $TestCases { Param($Date) #Mock to fail Mock Test-DbaBuild {@{"SupportedUntil" = $Date.AddMonths(-1); "Build" = 42}} $SupportedUntil = Get-Date $Date.AddMonths(-1) -Format O $Date = Get-Date $Date -Format O { Assert-InstanceSupportedBuild -Instance 'Dummy' -Date $Date } | Should -Throw -ExpectedMessage "Expected the actual value to be greater than $Date, because this build 42 is now unsupported by Microsoft, but got $SupportedUntil" } $TestCases = @{"Date" = $Date; "BuildWarning" = 6} #if BuildWarning it should fail if support date is in the warning window It "Passed check correctly with the BuildWarning window > today" -TestCases $TestCases { Param($Date, $BuildWarning) #Mock to pass Mock Test-DbaBuild {@{"SupportedUntil" = $Date.AddMonths(9); "Build" = 42}} { Assert-InstanceSupportedBuild -Instance 'Dummy' -Date $Date -BuildWarning $BuildWarning } } $TestCases = @{"Date" = $Date; "BuildWarning" = 6} #if BuildWarning it should fail if support date is in the warning window It "Failed check correctly with the BuildWarning window < today" -TestCases $TestCases { Param($Date, $BuildWarning) #Mock to fail Mock Test-DbaBuild {@{"SupportedUntil" = $Date.AddMonths(3); "Build" = 42}} $SupportedUntil = Get-Date $Date.AddMonths(3) -Format O $expected = Get-Date $Date.AddMonths($BuildWarning) -Format O { Assert-InstanceSupportedBuild -Instance 'Dummy' -Date $Date -BuildWarning $BuildWarning } | Should -Throw -ExpectedMessage "Expected the actual value to be greater than $expected, because this build 42 will be unsupported by Microsoft on $SupportedUntil which is less than $BuildWarning months away, but got $SupportedUntil" } } Context "Checking Trace Flags" { ## Mock for one trace flag Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 } } It "Should pass correctly when the trace flag exists and it is the only one" { Assert-TraceFlag -SQLInstance Dummy -ExpectedTraceFlag 118 } It "Should fail correctly when the trace flag does not exist but there is a different trace flag" { {Assert-TraceFlag -SQLInstance Dummy -ExpectedTraceFlag 117} | Should -Throw -ExpectedMessage "Expected 117 to be found in collection 118, because We expect that Trace Flag 117 will be set on Dummy, but it was not found." } It "Should fail correctly when the trace flag does not exist and there is no trace flag" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 } } {Assert-TraceFlag -SQLInstance Dummy -ExpectedTraceFlag 117} | Should -Throw -ExpectedMessage "Expected 117 to be found in collection 118, because We expect that Trace Flag 117 will be set on Dummy, but it was not found." } It "Should Pass Correctly for more than one trace flag when they all exist" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 117 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 3604 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 3605 } } Assert-TraceFlag -SQLInstance Dummy -ExpectedTraceFlag 118, 117, 3604, 3605 } It "Should Pass Correctly for more than one trace flag when they exist but there are extra trace flags" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 117 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 3604 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 3605 } } Assert-TraceFlag -SQLInstance Dummy -ExpectedTraceFlag 118, 117, 3604 } It "Should Fail Correctly when checking more than one trace flag when 1 is missing" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 117 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 3604 } } {Assert-TraceFlag -SQLInstance Dummy -ExpectedTraceFlag 118, 117, 3604, 3605} | Should -Throw -ExpectedMessage "Expected 3605 to be found in collection @(117, 118, 3604), because We expect that Trace Flag 3605 will be set on Dummy, but it was not found." } It "Should Fail Correctly when checking more than one trace flag when 2 are missing" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 117 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 } } {Assert-TraceFlag -SQLInstance Dummy -ExpectedTraceFlag 118, 117, 3604, 3605} | Should -Throw -ExpectedMessage "Expected 3604 to be found in collection @(117, 118), because We expect that Trace Flag 3604 will be set on Dummy, but it was not found" } It "Should pass correctly when no trace flag exists and none expected" { Mock Get-DbaTraceFlag { } Assert-TraceFlag -SQLInstance Dummy -ExpectedTraceFlag $null } It "Should fail correctly when a trace flag exists and none expected" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 117 } } {Assert-TraceFlag -SQLInstance Dummy -ExpectedTraceFlag $null} | Should -Throw -ExpectedMessage "Expected `$null or empty, because We expect that there will be no Trace Flags set on Dummy, but got 117" } } Context "Checking Trace Flags Not Expected" { ## Mock for one trace flag Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 } } It "Should pass correctly when the trace flag exists and it is not the one expected to be running" { Assert-NotTraceFlag -SQLInstance Dummy -NotExpectedTraceFlag 117 } It "Should pass correctly when no trace flag is running" { Mock Get-DbaTraceFlag {} Assert-NotTraceFlag -SQLInstance Dummy -NotExpectedTraceFlag 117 } It "Should fail correctly when the trace flag is running and is the only one" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 } } {Assert-NotTraceFlag -SQLInstance Dummy -NotExpectedTraceFlag 118} | Should -Throw -ExpectedMessage "Expected 118 to not be found in collection 118, because We expect that Trace Flag 118 will not be set on Dummy, but it was found." } It "Should fail correctly for one trace flag when the trace flag is running but there is another one running as well" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 117 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 } } {Assert-NotTraceFlag -SQLInstance Dummy -NotExpectedTraceFlag 117} | Should -Throw -ExpectedMessage "Expected 117 to not be found in collection @(117, 118), because We expect that Trace Flag 117 will not be set on Dummy, but it was found." } It "Should Pass Correctly for more than one trace flag when no trace flag is set" { Mock Get-DbaTraceFlag {} Assert-NotTraceFlag -SQLInstance Dummy -NotExpectedTraceFlag 118, 117, 3604, 3605 } It "Should Pass Correctly for more than one trace flag when a different one is running" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 117 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 } } Assert-NotTraceFlag -SQLInstance Dummy -NotExpectedTraceFlag 3604, 3605 } It "Should Fail Correctly for more than one trace flag when one is running" { Mock Get-DbaTraceFlag { [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 117 }, [PSObject]@{ 'ComputerName' = 'ComputerName' 'Global' = 1 'InstanceName' = 'MSSQLSERVER' 'Session' = 0 'SqlInstance' = 'SQLInstance' 'Status' = 1 'TraceFlag' = 118 } } {Assert-NotTraceFlag -SQLInstance Dummy -NotExpectedTraceFlag 117, 3604, 3605} | Should -Throw -ExpectedMessage "Expected 117 to not be found in collection @(117, 118), because We expect that Trace Flag 117 will not be set on Dummy, but it was found." } } Context "Checking CLR Enabled" { # Mock the version check for running tests Mock Connect-DbaInstance {} # Define test cases for the results to fail test and fill expected message # So the results of SPConfigure is 1, we expect $false but the result is true and the results of SPConfigure is 0, we expect $true but the result is false $TestCases = @{spconfig = 1; expected = $false; actual = $true}, @{spconfig = 0; expected = $true; actual = $false} It "Fails Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $actual, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} {Assert-CLREnabled -SQLInstance 'Dummy' -CLREnabled $expected} | Should -Throw -ExpectedMessage "Expected `$$expected, because The CLR Enabled should be set correctly, but got `$$actual" } $TestCases = @{spconfig = 0; expected = $false}, @{spconfig = 1; expected = $true; } It "Passes Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} Assert-CLREnabled -SQLInstance 'Dummy' -CLREnabled $expected } # Validate we have called the mock the correct number of times It "Should call the mocks" { $assertMockParams = @{ 'CommandName' = 'Get-DbaSpConfigure' 'Times' = 4 'Exactly' = $true } Assert-MockCalled @assertMockParams } } Context "Checking Cross DB Ownership Chaining" { # Mock the version check for running tests Mock Connect-DbaInstance {} # Define test cases for the results to fail test and fill expected message # So the results of SPConfigure is 1, we expect $false but the result is true and the results of SPConfigure is 0, we expect $true but the result is false $TestCases = @{spconfig = 1; expected = $false; actual = $true}, @{spconfig = 0; expected = $true; actual = $false} It "Fails Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $actual, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} {Assert-CrossDBOwnershipChaining -SQLInstance 'Dummy' -CrossDBOwnershipChaining $expected} | Should -Throw -ExpectedMessage "Expected `$$expected, because The Cross Database Ownership Chaining setting should be set correctly, but got `$$actual" } $TestCases = @{spconfig = 0; expected = $false}, @{spconfig = 1; expected = $true; } It "Passes Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} Assert-CrossDBOwnershipChaining -SQLInstance 'Dummy' -CrossDBOwnershipChaining $expected } # Validate we have called the mock the correct number of times It "Should call the mocks" { $assertMockParams = @{ 'CommandName' = 'Get-DbaSpConfigure' 'Times' = 4 'Exactly' = $true } Assert-MockCalled @assertMockParams } } Context "Checking AdHoc Distributed Queries Enabled" { # Mock the version check for running tests Mock Connect-DbaInstance {} # Define test cases for the results to fail test and fill expected message # So the results of SPConfigure is 1, we expect $false but the result is true and the results of SPConfigure is 0, we expect $true but the result is false $TestCases = @{spconfig = 1; expected = $false; actual = $true}, @{spconfig = 0; expected = $true; actual = $false} It "Fails Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $actual, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} {Assert-AdHocDistributedQueriesEnabled -SQLInstance 'Dummy' -AdHocDistributedQueriesEnabled $expected} | Should -Throw -ExpectedMessage "Expected `$$expected, because The AdHoc Distributed Queries Enabled setting should be set correctly, but got `$$actual" } $TestCases = @{spconfig = 0; expected = $false}, @{spconfig = 1; expected = $true; } It "Passes Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} Assert-AdHocDistributedQueriesEnabled -SQLInstance 'Dummy' -AdHocDistributedQueriesEnabled $expected } # Validate we have called the mock the correct number of times It "Should call the mocks" { $assertMockParams = @{ 'CommandName' = 'Get-DbaSpConfigure' 'Times' = 4 'Exactly' = $true } Assert-MockCalled @assertMockParams } } Context "Checking XPCmdShell is disabled" { # Mock the version check for running tests Mock Connect-DbaInstance {} # Define test cases for the results to fail test and fill expected message # This one is different from the others as we are checking for disabled !! # So the results of SPConfigure is 1, we expect $true but the result is false and the results of SPConfigure is 0, we expect $false but the result is true $TestCases = @{spconfig = 1; expected = $true; actual = $false}, @{spconfig = 0; expected = $false; actual = $true} It "Fails Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $actual, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} {Assert-XpCmdShellDisabled -SQLInstance 'Dummy' -XpCmdShellDisabled $expected} | Should -Throw -ExpectedMessage "Expected `$$expected, because The XP CmdShell setting should be set correctly, but got `$$actual" } # again this one is different from the others as we are checking for disabled $TestCases = @{spconfig = 1; expected = $false}, @{spconfig = 0; expected = $true; } It "Passes Check Correctly for Config <spconfig> and expected value <expected>" -TestCases $TestCases { Param($spconfig, $expected) Mock Get-DbaSpConfigure {@{"ConfiguredValue" = $spconfig}} Assert-XpCmdShellDisabled -SQLInstance 'Dummy' -XpCmdShellDisabled $expected } # Validate we have called the mock the correct number of times It "Should call the mocks" { $assertMockParams = @{ 'CommandName' = 'Get-DbaSpConfigure' 'Times' = 4 'Exactly' = $true } Assert-MockCalled @assertMockParams } } Context "Checking ErrorLog Count" { # if configured value is 30 and test value 30 it will pass It "Passes Check Correctly with the number of error log files set to 30" { # Mock to pass Mock Get-DbaErrorLogConfig {@{"LogCount" = 30}} Assert-ErrorLogCount -SQLInstance 'Dummy' -errorLogCount 30 } # if configured value is less than the current value it fails It "Fails Check Correctly with the number of error log files being 10 instead of 30 or higher" { # Mock to fail Mock Get-DbaErrorLogConfig {@{"LogCount" = 10}} {Assert-ErrorLogCount -SQLInstance 'Dummy' -errorLogCount 30} | Should -Throw -ExpectedMessage "Expected the actual value to be greater than or equal to 30, because We expect to have at least 30 number of error log files, but got 10." } # if configured value is higher than the current value it fails It "Passes Check Correctly with the number of error log files being 40 and test of 30 or higher" { # Mock to Pass Mock Get-DbaErrorLogConfig {@{"LogCount" = 40}} Assert-ErrorLogCount -SQLInstance 'Dummy' -errorLogCount 30 } # Validate we have called the mock the correct number of times It "Should call the mocks" { $assertMockParams = @{ 'CommandName' = 'Get-DbaErrorLogConfig' 'Times' = 3 'Exactly' = $true } Assert-MockCalled @assertMockParams } } } InModuleScope dbachecks { (Get-ChildItem $PSScriptRoot/../../internal/assertions/).ForEach{. $Psitem.FullName} Describe "Testing AllInstanceInfo and Relevant Assertions" -Tag AllInstanceInfo { function Get-ErrorLogEntry {} Mock Get-DbcConfigValue {} -ParameterFilter {$Name -and $Name -eq 'policy.errorlog.warningwindow'} Context "Checking Get-AllInstanceInfo" { Mock Get-ErrorLogEntry {} It "Should return the correct results for ErrorLog Entries when there are no severities" { (Get-AllInstanceInfo -Instance Dummy -Tags ErrorLog -There $true).ErrorLog | Should -BeNullOrEmpty -Because "We need no entries when we have no sev 17 to 24 errors" } It "Should return the correct results for ErrorLog Entries when there are severities" { Mock Get-ErrorLogEntry {[PSCustomObject]@{ LogDate = '2019-02-14 23:00' ProcessInfo = 'spid55' Text = 'Error: 50000, Severity: 18, State: 1.' } } (Get-AllInstanceInfo -Instance Dummy -Tags ErrorLog -There $true).ErrorLog | Should -BeOfType PSCustomObject -Because "We need entries when we have sev 17 to 24 errors" } It "Should return the correct results for Default Trace when it is enabled" { Mock Get-DbaSpConfigure {@{ 'ConfiguredValue' = 1 }} (Get-AllInstanceInfo -Instance Dummy -Tags DefaultTrace -There $true).DefaultTrace.ConfiguredValue | Should -Be 1 -Because "We need to return one when we have default trace enabled" } It "Should return the correct results for Default Trace when it is not enabled" { Mock Get-DbaSpConfigure {[pscustomobject]@{ ConfiguredValue = 0 }} (Get-AllInstanceInfo -Instance Dummy -Tags DefaultTrace -There $true).DefaultTrace.ConfiguredValue | Should -Be 0 -Because "We need to return zero when default trace is not enabled" } } Context "Checking ErrorLog Entries" { It "Should pass the test successfully when there are no Severity Errors" { # Mock for success Mock Get-AllInstanceInfo {} Assert-ErrorLogEntry -AllInstanceInfo (Get-AllInstanceInfo) } It "Should fail the test successfully when there are Severity Errors" { # MOck for failing test Mock Get-AllInstanceInfo {[PSCustomObject]@{ ErrorLog = [PSCustomObject]@{ LogDate = '2019-02-14 23:00' ProcessInfo = 'spid55' Text = 'Error: 50000, Severity: 18, State: 1.' } }} {Assert-ErrorLogEntry -AllInstanceInfo (Get-AllInstanceInfo)} | Should -Throw -ExpectedMessage "Expected `$null or empty, because these severities indicate serious problems, but got @(@{LogDate=2019-02-14 23:00; ProcessInfo=spid55; Text=Error: 50000, Severity: 18, State: 1.})." } } Context "Checking Default Trace Entries" { It "Should pass the test successfully when default trace is enabled" { # Mock for success Mock Get-AllInstanceInfo {[PSCustomObject]@{ DefaultTrace = [PSCustomObject]@{ ConfiguredValue = 1 } }} Assert-DefaultTrace -AllInstanceInfo (Get-AllInstanceInfo) } It "Should fail the test successfully when when default trace is not enabled" { # Mock for failing test Mock Get-AllInstanceInfo {[PSCustomObject]@{ DefaultTrace = [PSCustomObject]@{ ConfiguredValue = 0 } } } {Assert-DefaultTrace -AllInstanceInfo (Get-AllInstanceInfo)} | Should -Throw -ExpectedMessage "Expected 1, because We expected the Default Trace to be enabled, but got 0." } } Context "Checking OLE Automation Procedures Entries" { It "Should pass the test successfully when OLE Automation Procedures is disabled" { # Mock for success # This should pass when the configured value for OleAutomationProcedures enabled is 0 (ie disabled) Mock Get-AllInstanceInfo {[PSCustomObject]@{ OleAutomationProceduresDisabled = [PSCustomObject]@{ ConfiguredValue = 0 } } } Assert-OLEAutomationProcedures -AllInstanceInfo (Get-AllInstanceInfo) } It "Should fail the test successfully when when OLE Automation Procedures is enabled" { # Mock for failing test # This should pass when the configured value for OleAutomationProcedures enabled is 1 (ie enabled) Mock Get-AllInstanceInfo {[PSCustomObject]@{ OleAutomationProceduresDisabled = [PSCustomObject]@{ ConfiguredValue = 1 } } } {Assert-OLEAutomationProcedures -AllInstanceInfo (Get-AllInstanceInfo)} | Should -Throw -ExpectedMessage "Expected 0, because we expect the OLE Automation Procedures to be disabled, but got 1." } } Context "Checking Remote Access Entries" { It "Should pass the test successfully when remote access is disabled" { # Mock for success Mock Get-AllInstanceInfo {[PSCustomObject]@{ RemoteAccessDisabled = [PSCustomObject]@{ ConfiguredValue = 0 } } } Assert-RemoteAccess -AllInstanceInfo (Get-AllInstanceInfo) } It "Should fail the test successfully when remote access is enabled" { # Mock for failing test Mock Get-AllInstanceInfo {[PSCustomObject]@{ RemoteAccessDisabled = [PSCustomObject]@{ ConfiguredValue = 1 } } } {Assert-RemoteAccess -AllInstanceInfo (Get-AllInstanceInfo)} | Should -Throw -ExpectedMessage "Expected 0, because we expected Remote Access to be enabled, but got 1." } } Context "Checking Scan For Startup Procedures Entries" { It "Should pass the test successfully when scan for startup procedures is disabled" { # Mock for success # Mock for success Mock Get-AllInstanceInfo {[PSCustomObject]@{ ScanForStartupProceduresDisabled = [PSCustomObject]@{ ConfiguredValue = 0 } } } Assert-ScanForStartupProcedures -AllInstanceInfo (Get-AllInstanceInfo) } It "Should fail the test successfully when when scan for startup procedures is enabled" { # Mock for failing test Mock Get-AllInstanceInfo {[PSCustomObject]@{ ScanForStartupProceduresDisabled = [PSCustomObject]@{ ConfiguredValue = 1 } }} {Assert-ScanForStartupProcedures -AllInstanceInfo (Get-AllInstanceInfo)} | Should -Throw -ExpectedMessage "Expected 0, because We expected the scan for startup procedures to be disabled, but got 1." } } Context "Checking Max Dump Entries" { It "Should pass the test successfully when the number of dumps is less than config" { # Mock for success Mock Get-AllInstanceInfo {[PSCustomObject]@{ MaxDump = [PSCustomObject]@{ Count = 0 } } } $maxdumps = 1 Assert-MaxDump -AllInstanceInfo (Get-AllInstanceInfo) -maxdumps $maxdumps } It "Should fail the test successfully when the number of dumps is more than config" { # Mock for failing test Mock Get-AllInstanceInfo { [PSCustomObject]@{ MaxDump = [PSCustomObject]@{ Count = 7 } } } $maxdumps = 4 {Assert-MaxDump -AllInstanceInfo (Get-AllInstanceInfo) -maxdumps $maxdumps} | Should -Throw -ExpectedMessage "Expected the actual value to be less than 4, because We expected less than 4 dumps but found 7. Memory dumps often suggest issues with the SQL Server instance, but got 7" } } } } # SIG # Begin signature block # MIINEAYJKoZIhvcNAQcCoIINATCCDP0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU3zT39A2lyXiuj8g4j77KCVG1 # vq2gggpSMIIFGjCCBAKgAwIBAgIQAsF1KHTVwoQxhSrYoGRpyjANBgkqhkiG9w0B # AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE3MDUwOTAwMDAwMFoXDTIwMDUx # MzEyMDAwMFowVzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMQ8wDQYD # VQQHEwZWaWVubmExETAPBgNVBAoTCGRiYXRvb2xzMREwDwYDVQQDEwhkYmF0b29s # czCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAI8ng7JxnekL0AO4qQgt # Kr6p3q3SNOPh+SUZH+SyY8EA2I3wR7BMoT7rnZNolTwGjUXn7bRC6vISWg16N202 # 1RBWdTGW2rVPBVLF4HA46jle4hcpEVquXdj3yGYa99ko1w2FOWzLjKvtLqj4tzOh # K7wa/Gbmv0Si/FU6oOmctzYMI0QXtEG7lR1HsJT5kywwmgcjyuiN28iBIhT6man0 # Ib6xKDv40PblKq5c9AFVldXUGVeBJbLhcEAA1nSPSLGdc7j4J2SulGISYY7ocuX3 # tkv01te72Mv2KkqqpfkLEAQjXgtM0hlgwuc8/A4if+I0YtboCMkVQuwBpbR9/6ys # Z+sCAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaAFFrEuXsqCqOl6nEDwGD5LfZldQ5Y # MB0GA1UdDgQWBBRcxSkFqeA3vvHU0aq2mVpFRSOdmjAOBgNVHQ8BAf8EBAMCB4Aw # EwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0fBHAwbjA1oDOgMYYvaHR0cDovL2Ny # bDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1jcy1nMS5jcmwwNaAzoDGGL2h0 # dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEuY3JsMEwG # A1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3 # LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQBMIGEBggrBgEFBQcBAQR4MHYwJAYI # KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBOBggrBgEFBQcwAoZC # aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJ # RENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQAD # ggEBANuBGTbzCRhgG0Th09J0m/qDqohWMx6ZOFKhMoKl8f/l6IwyDrkG48JBkWOA # QYXNAzvp3Ro7aGCNJKRAOcIjNKYef/PFRfFQvMe07nQIj78G8x0q44ZpOVCp9uVj # sLmIvsmF1dcYhOWs9BOG/Zp9augJUtlYpo4JW+iuZHCqjhKzIc74rEEiZd0hSm8M # asshvBUSB9e8do/7RhaKezvlciDaFBQvg5s0fICsEhULBRhoyVOiUKUcemprPiTD # xh3buBLuN0bBayjWmOMlkG1Z6i8DUvWlPGz9jiBT3ONBqxXfghXLL6n8PhfppBhn # daPQO8+SqF5rqrlyBPmRRaTz2GQwggUwMIIEGKADAgECAhAECRgbX9W7ZnVTQ7Vv # lVAIMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp # Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0Rp # Z2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xMzEwMjIxMjAwMDBaFw0yODEw # MjIxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx # GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNI # QTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUA # A4IBDwAwggEKAoIBAQD407Mcfw4Rr2d3B9MLMUkZz9D7RZmxOttE9X/lqJ3bMtdx # 6nadBS63j/qSQ8Cl+YnUNxnXtqrwnIal2CWsDnkoOn7p0WfTxvspJ8fTeyOU5JEj # lpB3gvmhhCNmElQzUHSxKCa7JGnCwlLyFGeKiUXULaGj6YgsIJWuHEqHCN8M9eJN # YBi+qsSyrnAxZjNxPqxwoqvOf+l8y5Kh5TsxHM/q8grkV7tKtel05iv+bMt+dDk2 # DZDv5LVOpKnqagqrhPOsZ061xPeM0SAlI+sIZD5SlsHyDxL0xY4PwaLoLFH3c7y9 # hbFig3NBggfkOItqcyDQD2RzPJ6fpjOp/RnfJZPRAgMBAAGjggHNMIIByTASBgNV # HRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEF # BQcDAzB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp # Z2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDig # NoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v # dENBLmNybDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # QXNzdXJlZElEUm9vdENBLmNybDBPBgNVHSAESDBGMDgGCmCGSAGG/WwAAgQwKjAo # BggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAKBghghkgB # hv1sAzAdBgNVHQ4EFgQUWsS5eyoKo6XqcQPAYPkt9mV1DlgwHwYDVR0jBBgwFoAU # Reuir/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQELBQADggEBAD7sDVoks/Mi # 0RXILHwlKXaoHV0cLToaxO8wYdd+C2D9wz0PxK+L/e8q3yBVN7Dh9tGSdQ9RtG6l # jlriXiSBThCk7j9xjmMOE0ut119EefM2FAaK95xGTlz/kLEbBw6RFfu6r7VRwo0k # riTGxycqoSkoGjpxKAI8LpGjwCUR4pwUR6F6aGivm6dcIFzZcbEMj7uo+MUSaJ/P # QMtARKUT8OZkDCUIQjKyNookAv4vcn4c10lFluhZHen6dGRrsutmQ9qzsIzV6Q3d # 9gEgzpkxYz0IGhizgZtPxpMQBvwHgfqL2vmCSfdibqFT+hKUGIUukpHqaGxEMrJm # oecYpJpkUe8xggIoMIICJAIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM # RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQD # EyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhACwXUo # dNXChDGFKtigZGnKMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgACh # AoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAM # BgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBSGUXCG13OfAv5/0pfenyNd4nxE # HzANBgkqhkiG9w0BAQEFAASCAQA3Oz2mbycV6Q4ns38NGrSqedo4pV0TmWpQ7oxr # IpZQisFu095UwNQQ+dmWlwjT411VBlvw0ud0Njt+EFGt458CvvVU9T6nqkkmK2OG # JLkJOkzwDLrFG7H92LdJRq8LtREnBBz488xz/Tpb4HJs/Drgwi0muC99mug9Cv9C # ffTv69G9bf7C9yDuGHfftArerPIg+c3OVLOLuEYPgGQb84yb7k5UmtSQmRwI+puw # H88Byh7MRR5sTHhwSMlla0ESvTSnks/XJwWYXw/IyqyCyD9PwPJejccwiI+pC1Os # TKVpI+AhTilaojWO0qr5jYawjd1JndKREFl5MtrsIdUX5PVM # SIG # End signature block |