using Shouldly; using ZB.MOM.NatsNet.Server.Internal; namespace ZB.MOM.NatsNet.Server.Tests.Internal; /// /// Tests for , mirroring ats_test.go. /// [Collection("AccessTimeService")] public sealed class AccessTimeServiceTests : IDisposable { public AccessTimeServiceTests() { AccessTimeService.Reset(); } public void Dispose() { AccessTimeService.Reset(); } [Fact] public void NotRunningValue_ShouldReturnNonZero() { // Mirror: TestNotRunningValue // No registrants; AccessTime() must still return a non-zero value. var at = AccessTimeService.AccessTime(); at.ShouldBeGreaterThan(0); // Should be stable (no background timer updating it). var atn = AccessTimeService.AccessTime(); atn.ShouldBe(at); } [Fact] public async Task RegisterAndUnregister_ShouldManageLifetime() { // Mirror: TestRegisterAndUnregister AccessTimeService.Register(); var at = AccessTimeService.AccessTime(); at.ShouldBeGreaterThan(0); // Background timer should update the time. await Task.Delay(AccessTimeService.TickInterval * 3); var atn = AccessTimeService.AccessTime(); atn.ShouldBeGreaterThan(at); // Unregister; timer should stop. AccessTimeService.Unregister(); await Task.Delay(AccessTimeService.TickInterval); at = AccessTimeService.AccessTime(); await Task.Delay(AccessTimeService.TickInterval * 3); atn = AccessTimeService.AccessTime(); atn.ShouldBe(at); // Re-register should restart the timer. AccessTimeService.Register(); try { at = AccessTimeService.AccessTime(); await Task.Delay(AccessTimeService.TickInterval * 3); atn = AccessTimeService.AccessTime(); atn.ShouldBeGreaterThan(at); } finally { AccessTimeService.Unregister(); } } [Fact] public void UnbalancedUnregister_ShouldThrow() { // Mirror: TestUnbalancedUnregister Should.Throw(() => AccessTimeService.Unregister()); } }