using System.Text; using Ludarium.Application; using Ludarium.Infrastructure; namespace Ludarium.IntegrationTests; public sealed class SwitchRuntimeProvisionerTests { [Fact] public async Task VerifiedPersonalKeysAreAtomicallyProvisionedOutsideTheSourceLibrary() { var root = Path.Combine(Path.GetTempPath(), $"ludarium-switch-{Guid.NewGuid():N}"); var vaultRoot = Path.Combine(root, "vault"); var runtimeRoot = Path.Combine(root, "eden-keys"); try { var vault = new FirmwareVaultFileStore(vaultRoot); var provisioner = new SwitchRuntimeProvisioner(runtimeRoot); var requirement = FirmwarePolicy.Get("switch", "prod-keys"); const string fixture = "synthetic-switch-provisioning-fixture\n"; await using var input = new MemoryStream(Encoding.UTF8.GetBytes(fixture)); var asset = await vault.SaveAsync(requirement, Guid.NewGuid(), "prod.keys", input, input.Length, CancellationToken.None); await provisioner.ProvisionAsync(asset, vault, CancellationToken.None); var target = Path.Combine(runtimeRoot, "prod.keys"); Assert.True(provisioner.Configured); Assert.Equal(fixture, await File.ReadAllTextAsync(target)); if (!OperatingSystem.IsWindows()) Assert.Equal(UnixFileMode.UserRead | UnixFileMode.UserWrite, File.GetUnixFileMode(target)); Assert.Empty(Directory.GetFiles(runtimeRoot, "*.uploading")); provisioner.Remove(asset); Assert.False(File.Exists(target)); } finally { if (Directory.Exists(root)) Directory.Delete(root, true); } } [Fact] public async Task DisabledProvisionerNeverCopiesKeys() { var provisioner = new SwitchRuntimeProvisioner(null); var asset = new Ludarium.Domain.FirmwareAsset(Guid.NewGuid(), "switch", "prod-keys", Ludarium.Domain.FirmwareAssetKind.KeySet, "prod.keys", 1, new string('0', 64), "missing", true, DateTimeOffset.UtcNow, DateTimeOffset.UtcNow); await provisioner.ProvisionAsync(asset, null!, CancellationToken.None); Assert.False(provisioner.Configured); } }