Some checks are pending
CI / Integration (mcr.microsoft.com/mssql/server:2017-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2019-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2022-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2025-latest) (push) Blocked by required conditions
CI / Build og unit tests (push) Waiting to run
- Managed Instance reports 12.0.2000.8 but is evergreen: treated as the newest engine with all capabilities; new SelfManagedInfrastructure capability so backup, CHECKDB, files, tempdb, memory, patch level and lifecycle rules report 'handled by Azure' instead of false findings - Microsoft Entra ID login (managed identity, service principal, default credential chain) via SqlConnection.AccessTokenCallback - Least-privilege script recognizes Managed Instance; deadlock collector falls back to the ring buffer when event files cannot be read - Web UI shows the right release for Managed Instance - README and installation docs: notifications and Managed Instance - Catalog test: 61 rules with unique, well-formed ids Integration suite green on SQL Server 2017 and 2022. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
117 lines
4.5 KiB
C#
117 lines
4.5 KiB
C#
using SQLInsight.Core.Instances;
|
|
|
|
namespace SQLInsight.Core.Tests;
|
|
|
|
public class InstanceCapabilitiesTests
|
|
{
|
|
private static InstanceInfo Instance(string version, bool? hadr = null) => new()
|
|
{
|
|
ServerName = "test",
|
|
Version = SqlServerVersion.Parse(version),
|
|
Edition = "Enterprise Edition",
|
|
EngineEdition = EngineEdition.Enterprise,
|
|
IsHadrEnabled = hadr,
|
|
};
|
|
|
|
[Fact]
|
|
public void Sql2000_has_no_version_gated_capabilities()
|
|
{
|
|
var capabilities = InstanceCapabilities.From(Instance("8.00.2039"));
|
|
|
|
Assert.Equal([Capability.SelfManagedInfrastructure], capabilities.All);
|
|
}
|
|
|
|
[Fact]
|
|
public void Managed_instance_is_evergreen_and_not_self_managed()
|
|
{
|
|
// Azure SQL Managed Instance always reports 12.0.2000.8.
|
|
var mi = Instance("12.0.2000.8") with { EngineEdition = EngineEdition.AzureSqlManagedInstance, IsHadrEnabled = true };
|
|
|
|
var capabilities = InstanceCapabilities.From(mi);
|
|
|
|
Assert.Equal(SqlServerRelease.AzureSqlManagedInstance, mi.Release);
|
|
Assert.True(capabilities.Has(Capability.QueryStore));
|
|
Assert.True(capabilities.Has(Capability.GranularServerPermissions));
|
|
Assert.True(capabilities.Has(Capability.QueryStatsMemoryColumns));
|
|
Assert.False(capabilities.Has(Capability.SelfManagedInfrastructure));
|
|
Assert.False(capabilities.Has(Capability.HadrEnabled)); // Azure runs the availability of MI
|
|
}
|
|
|
|
[Fact]
|
|
public void Sql2005_has_dmvs_but_no_extended_events()
|
|
{
|
|
var capabilities = InstanceCapabilities.From(Instance("9.00.5000.00"));
|
|
|
|
Assert.True(capabilities.Has(Capability.DynamicManagementViews));
|
|
Assert.True(capabilities.Has(Capability.ViewServerStatePermission));
|
|
Assert.False(capabilities.Has(Capability.ExtendedEvents));
|
|
}
|
|
|
|
[Fact]
|
|
public void Sql2008_has_system_health_without_file_target()
|
|
{
|
|
var capabilities = InstanceCapabilities.From(Instance("10.0.6000.29"));
|
|
|
|
Assert.True(capabilities.Has(Capability.SystemHealthSession));
|
|
Assert.False(capabilities.Has(Capability.SystemHealthFileTarget));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("13.0.4001.0", false)] // 2016 SP1
|
|
[InlineData("13.0.5026.0", true)] // 2016 SP2
|
|
[InlineData("14.0.1000.169", true)]
|
|
public void LastGoodCheckDbTime_requires_2016_sp2(string version, bool expected)
|
|
{
|
|
Assert.Equal(expected, InstanceCapabilities.From(Instance(version)).Has(Capability.LastGoodCheckDbTime));
|
|
}
|
|
|
|
[Fact]
|
|
public void Query_store_starts_with_2016()
|
|
{
|
|
Assert.False(InstanceCapabilities.From(Instance("12.0.6024.0")).Has(Capability.QueryStore));
|
|
Assert.True(InstanceCapabilities.From(Instance("13.0.6300.2")).Has(Capability.QueryStore));
|
|
}
|
|
|
|
[Fact]
|
|
public void Granular_permissions_start_with_2022()
|
|
{
|
|
Assert.False(InstanceCapabilities.From(Instance("15.0.4355.3")).Has(Capability.GranularServerPermissions));
|
|
Assert.True(InstanceCapabilities.From(Instance("16.0.4135.4")).Has(Capability.GranularServerPermissions));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("15.0.4355.3", true, true)]
|
|
[InlineData("15.0.4355.3", false, false)]
|
|
[InlineData("15.0.4355.3", null, false)]
|
|
[InlineData("10.50.6000.34", true, false)] // property cannot be true before 2012; ignore bad data
|
|
public void Hadr_requires_both_version_and_runtime_setting(string version, bool? hadr, bool expected)
|
|
{
|
|
Assert.Equal(expected, InstanceCapabilities.From(Instance(version, hadr)).Has(Capability.HadrEnabled));
|
|
}
|
|
|
|
[Fact]
|
|
public void Missing_lists_only_absent_capabilities()
|
|
{
|
|
var capabilities = InstanceCapabilities.From(Instance("11.0.7001.0"));
|
|
|
|
var missing = capabilities.Missing([Capability.ExtendedEvents, Capability.QueryStore, Capability.LastActualPlan]);
|
|
|
|
Assert.Equal([Capability.QueryStore, Capability.LastActualPlan], missing);
|
|
}
|
|
}
|
|
|
|
public class QueryStatsMemoryColumnsTests
|
|
{
|
|
[Theory]
|
|
[InlineData("13.0.4001.0", false)]
|
|
[InlineData("13.0.5026.0", true)]
|
|
[InlineData("14.0.1000.169", false)]
|
|
[InlineData("14.0.3015.40", true)]
|
|
[InlineData("15.0.2000.5", true)]
|
|
public void Available_from_2016_sp2_and_2017_cu3(string version, bool expected)
|
|
{
|
|
var info = new InstanceInfo { ServerName = "x", Version = SqlServerVersion.Parse(version), Edition = "e", EngineEdition = EngineEdition.Standard };
|
|
|
|
Assert.Equal(expected, InstanceCapabilities.From(info).Has(Capability.QueryStatsMemoryColumns));
|
|
}
|
|
}
|