using RackPeek.Domain.Discovery; using RackPeek.Domain.Resources.SystemResources; namespace Tests.Discovery; /// /// Everywhere else in this project the probes are bypassed and the parser is driven /// from fixtures. These tests do the opposite: they run the real probe against the /// real machine, which is the only way to catch a wrong path or a changed command. /// Each one is skipped off its own platform, so the CI matrix covers Linux on the /// ubuntu runner and macOS on the macos runner. /// public class RealProbeTests { [Fact] public async Task The_linux_probe_reads_this_machine() { // No-op off Linux. xUnit v2 has no skip-at-runtime, and a custom attribute is // more machinery than this needs — the CI matrix is what makes it run. if (!OperatingSystem.IsLinux()) return; RawSystemSnapshot snapshot = await new LinuxSystemProbe().ReadAsync(CancellationToken.None); Assert.False(string.IsNullOrWhiteSpace(snapshot.Hostname)); Assert.True(snapshot.Cores > 0); // Each of these guards a hard-coded path. If one is wrong the probe silently // returns null and the resource quietly loses a field, which no fixture can catch. AssertReadIfPresent("/etc/os-release", snapshot.OsReleaseFile); AssertReadIfPresent("/proc/meminfo", snapshot.MemInfoFile); AssertReadIfPresent("/proc/1/cgroup", snapshot.CgroupFile); AssertReadIfPresent("/etc/machine-id", snapshot.MachineIdFile); AssertReadIfPresent("/sys/class/dmi/id/sys_vendor", snapshot.DmiVendor); AssertReadIfPresent("/sys/class/dmi/id/product_name", snapshot.DmiProduct); if (Directory.Exists("/sys/block") && Directory.EnumerateDirectories("/sys/block").Any()) Assert.NotEmpty(snapshot.BlockDevices); AssertUsable(SystemFactsParser.Parse(snapshot)); } [Fact] public async Task The_macos_probe_reads_this_machine() { if (!OperatingSystem.IsMacOS()) return; RawSystemSnapshot snapshot = await new MacSystemProbe().ReadAsync(CancellationToken.None); Assert.False(string.IsNullOrWhiteSpace(snapshot.Hostname)); Assert.True(snapshot.Cores > 0); // These come from sw_vers, sysctl and ioreg — all shell-outs, none of which a // fixture can prove are still spelled correctly. Assert.StartsWith("macOS", snapshot.OsName); Assert.True(snapshot.MemoryBytes > 0); Assert.False(string.IsNullOrWhiteSpace(snapshot.PlatformUuid)); AssertUsable(SystemFactsParser.Parse(snapshot)); } [Fact] public void Exactly_one_probe_claims_this_platform() { ISystemProbe[] probes = [new LinuxSystemProbe(), new MacSystemProbe()]; var supported = probes.Count(p => p.IsSupported); Assert.Equal(OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() ? 1 : 0, supported); } /// /// Reads the file itself and, if this machine actually has content there, insists /// the probe found it too. Note the test has to read rather than stat: everything /// under /proc reports a length of zero, so a size check silently passes and /// covers none of the paths that matter most. /// private static void AssertReadIfPresent(string path, string? value) { string? actual; try { actual = File.Exists(path) ? File.ReadAllText(path) : null; } catch { return; // Present but unreadable for this user; nothing to hold the probe to. } if (string.IsNullOrWhiteSpace(actual)) return; Assert.False( string.IsNullOrWhiteSpace(value), $"{path} has content on this machine but the probe read nothing from it."); } private static void AssertUsable(SystemFacts facts) { Assert.Contains(facts.Type, SystemResource.ValidSystemTypes); Assert.NotEqual("Unknown", facts.Os); Assert.True(facts.RamGb > 0); // The schema requires type, os, cores and ram, so a real machine has to produce // something importable rather than a half-filled resource. Fixture.AssertConformsToSchema( DiscoveryDocument.ToYaml([SystemResourceMapper.ToResource(facts)])); } }