using System.Text.Json; using Fleet.Core; using Fleet.Hosting; using MoShiro.Protocol; namespace MoShiro.Probe.Tests; public sealed class OpenWrtUpdaterTests : IDisposable { private readonly string _directory = Path.Combine(Path.GetTempPath(), "moshiro-native-" + Guid.NewGuid().ToString("N")); [Fact] public void Offer_AndApply_WriteFixedFlags_NotRemoteManifestOrCommands() { var updater = new OpenWrtUpdater(_directory, Path.Combine(_directory, "status.json"), TimeProvider.System, NullNodeLog.Instance); updater.Offer(); updater.RequestApply(); Assert.Equal("check", File.ReadAllText(Path.Combine(_directory, "check.request"))); Assert.Equal("check", File.ReadAllText(Path.Combine(_directory, "apply.request"))); Assert.Equal(2, Directory.GetFiles(_directory).Length); } [Fact] public void Status_WritesHealthAndReadsHostStatus() { var store = new ConfigStore(_directory); store.Write("status.json", "{\"state\":\"rolled_back\",\"at\":123}"u8.ToArray()); var updater = new OpenWrtUpdater(_directory, Path.Combine(_directory, "status.json"), TimeProvider.System, NullNodeLog.Instance); Assert.Equal("rolled_back", updater.Status()?.State); using JsonDocument health = JsonDocument.Parse(File.ReadAllBytes(Path.Combine(_directory, "health.json"))); Assert.Equal(BuildInfo.Version, health.RootElement.GetProperty("version").GetString()); Assert.Equal(Environment.ProcessId, health.RootElement.GetProperty("pid").GetInt32()); Assert.True(health.RootElement.GetProperty("at").GetInt64() > 0); } [Fact] public void Status_MissingOrCorruptHostStatus_DoesNotStopCollector() { var updater = new OpenWrtUpdater(_directory, Path.Combine(_directory, "status.json"), TimeProvider.System, NullNodeLog.Instance); Assert.Null(updater.Status()); new ConfigStore(_directory).Write("status.json", "not json"u8.ToArray()); Assert.Null(updater.Status()); } public void Dispose() { if (Directory.Exists(_directory)) { Directory.Delete(_directory, recursive: true); } } }