using SQLInsight.Core.Servers;
using SQLInsight.Servers;
namespace SQLInsight.Servers.Tests;
///
/// The CIM implementation against this computer (a local CIM session, as for the agent's own server). Remote access over
/// WS-Man/DCOM with least privilege cannot be tested here; it needs a domain with a second server.
///
[Trait("Category", "Windows")]
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public class LocalCimTests
{
private static async Task ConnectAsync()
{
if (!OperatingSystem.IsWindows())
{
return null;
}
// Generous: the whole test suite (with SQL Server containers) may run at the same time.
return await new CimWindowsServerSource(new ServerConnectionOptions { OperationTimeout = TimeSpan.FromMinutes(2) }).ConnectAsync(Environment.MachineName, CancellationToken.None);
}
[Fact]
public async Task Reads_os_performance_disks_services_events_and_tasks()
{
using var session = await ConnectAsync();
if (session is null)
{
return;
}
var os = await session.GetOperatingSystemAsync(CancellationToken.None);
var first = await session.GetPerformanceAsync(DateTimeOffset.UtcNow, CancellationToken.None);
await Task.Delay(1500);
var second = await session.GetPerformanceAsync(DateTimeOffset.UtcNow, CancellationToken.None);
var sample = ServerPerformanceMath.Sample(first, second, os);
var disks = await session.GetDisksAsync(CancellationToken.None);
var services = await session.GetServicesAsync(CancellationToken.None);
var service = await session.GetServiceAsync(services[0].Name, CancellationToken.None);
var events = await session.GetEventsAsync(DateTimeOffset.UtcNow.AddDays(-1), 200, CancellationToken.None);
var tasks = await session.GetTasksAsync(name => !TaskResults.IsMicrosoftTask(name), 3, CancellationToken.None);
Assert.Equal("lokal", session.Protocol);
Assert.Contains("Windows", os.Caption, StringComparison.OrdinalIgnoreCase);
Assert.True(os.LastBootUpTime < DateTimeOffset.UtcNow);
Assert.True(os.TotalMemoryMb > 0);
Assert.True(os.LogicalProcessors > 0);
Assert.InRange(sample.CpuPercent!.Value, 0, 100);
Assert.True(sample.AvailableMb > 0);
Assert.InRange(sample.CommitPercent!.Value, 0, 100);
Assert.NotEmpty(disks);
Assert.All(disks, d => Assert.False(d.Volume.StartsWith(@"\\?\", StringComparison.Ordinal)));
Assert.All(disks, d => Assert.InRange(d.FreeGb, 0, d.SizeGb));
Assert.Contains(services, s => s.IsRunning && s.IsAutomatic);
Assert.Equal(services[0].Name, service!.Name);
Assert.Null(await session.GetServiceAsync("SQLInsight-findes-ikke", CancellationToken.None));
Assert.Equal("Event Log (RPC)", events.Method);
Assert.All(events.Entries, e => Assert.InRange(e.Level, 1, 2));
Assert.True(tasks.Visible > 0);
Assert.All(tasks.Watched, t => Assert.False(TaskResults.IsMicrosoftTask(t.FullName)));
}
[Fact]
public async Task The_test_reports_every_area()
{
if (!OperatingSystem.IsWindows())
{
return;
}
var result = await WindowsServerTester.TestAsync(new CimWindowsServerSource(new ServerConnectionOptions()), "localhost", "test", DateTimeOffset.UtcNow, CancellationToken.None);
Assert.True(result.Reachable, result.Error);
Assert.Equal(ServerArea.All, result.Areas.Select(a => a.Area));
Assert.All(result.Areas, a => Assert.True(a.Ok, a.Detail));
}
[Fact]
public async Task An_unknown_host_is_unreachable_with_a_reason()
{
if (!OperatingSystem.IsWindows())
{
return;
}
var source = new CimWindowsServerSource(new ServerConnectionOptions { OperationTimeout = TimeSpan.FromSeconds(5) });
var error = await Assert.ThrowsAsync(() => source.ConnectAsync("sqlinsight-findes-ikke.invalid", CancellationToken.None));
Assert.True(error.Problem is ServerAccessProblem.Unreachable or ServerAccessProblem.Timeout, error.Message);
Assert.Contains("sqlinsight-findes-ikke.invalid", error.Message, StringComparison.Ordinal);
}
}