using MoShiro.Backend.Application; using MoShiro.Protocol; namespace MoShiro.Backend.Tests; public sealed class LinkRuntimeTests { private static LinkHealth Health(ControlState state) => new() { ListenerId = "agt_l", Control = { State = state } }; [Fact] public void DownSince_StaysAtTheFirstLostReport_AndClearsWhenTheControlLinkIsUp() { var runtime = new LinkRuntime(); runtime.Replace("agt_d", 1_000, [Health(ControlState.Up)]); Assert.Null(runtime.Get("agt_d", "agt_l", IpVersions.V4)!.DownSinceMs); runtime.Replace("agt_d", 2_000, [Health(ControlState.Backoff)]); runtime.Replace("agt_d", 3_000, [Health(ControlState.Dialing)]); // 重试期间状态在退避和拨号之间来回,失联的起点不变 runtime.Replace("agt_d", 4_000, [Health(ControlState.Backoff)]); Assert.Equal(2_000, runtime.Get("agt_d", "agt_l", IpVersions.V4)!.DownSinceMs); runtime.MarkDialerOffline("agt_d", 5_000); Assert.Equal(2_000, runtime.Get("agt_d", "agt_l", IpVersions.V4)!.DownSinceMs); runtime.Replace("agt_d", 6_000, [Health(ControlState.Up)]); Assert.Null(runtime.Get("agt_d", "agt_l", IpVersions.V4)!.DownSinceMs); } }