Files
natsnet/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/Internal/ServiceManagerTests.cs
2026-02-28 07:37:17 -05:00

98 lines
2.9 KiB
C#

// Copyright 2026 The NATS Authors
// Licensed under the Apache License, Version 2.0
using Shouldly;
using ZB.MOM.NatsNet.Server.Internal;
namespace ZB.MOM.NatsNet.Server.Tests.Internal;
public sealed class ServiceManagerTests
{
public ServiceManagerTests()
{
ServiceManager.Init(static _ => null);
ServiceManager.SetServiceName("nats-server");
}
[Fact]
public void SetServiceName_WhenProvided_StoresConfiguredName()
{
ServiceManager.SetServiceName("custom-svc");
ServiceManager.CurrentServiceName.ShouldBe("custom-svc");
}
[Fact]
public void IsWindowsService_WhenDockerized_ReturnsFalse()
{
ServiceManager.Init(static key => key == "NATS_DOCKERIZED" ? "1" : null);
ServiceManager.IsWindowsService(() => true).ShouldBeFalse();
}
[Fact]
public void Run_WhenNotRunningAsWindowsService_InvokesStartAction()
{
var called = false;
var error = ServiceManager.Run(() => called = true, () => false);
error.ShouldBeNull();
called.ShouldBeTrue();
}
[Fact]
public void Execute_WhenServerNotReady_ReturnsFailureExitCode()
{
using var started = new ManualResetEventSlim(false);
var reloadCalls = 0;
var shutdownCalls = 0;
var result = ServiceManager.Execute(
startServer: () => started.Set(),
readyForConnections: _ => false,
changes: [],
reloadConfig: () => reloadCalls++,
shutdown: () => shutdownCalls++,
reopenLogFile: () => { },
enterLameDuckMode: () => { });
result.exitCode.ShouldBe((uint)1);
result.serviceSpecificExitCode.ShouldBeFalse();
started.Wait(TimeSpan.FromSeconds(1)).ShouldBeTrue();
reloadCalls.ShouldBe(0);
shutdownCalls.ShouldBe(0);
}
[Fact]
public void Execute_WhenCommandsReceived_DispatchesControlHandlers()
{
var reloadCalls = 0;
var shutdownCalls = 0;
var reopenCalls = 0;
var ldmCalled = false;
using var ldmInvoked = new ManualResetEventSlim(false);
var result = ServiceManager.Execute(
startServer: () => { },
readyForConnections: _ => true,
changes: [ServiceControlCommand.ReopenLog, ServiceControlCommand.ParamChange, ServiceControlCommand.LameDuckMode, ServiceControlCommand.Stop],
reloadConfig: () => reloadCalls++,
shutdown: () => shutdownCalls++,
reopenLogFile: () => reopenCalls++,
enterLameDuckMode: () =>
{
ldmCalled = true;
ldmInvoked.Set();
});
result.exitCode.ShouldBe((uint)0);
result.serviceSpecificExitCode.ShouldBeFalse();
reloadCalls.ShouldBe(1);
reopenCalls.ShouldBe(1);
shutdownCalls.ShouldBe(1);
ldmInvoked.Wait(TimeSpan.FromSeconds(1)).ShouldBeTrue();
ldmCalled.ShouldBeTrue();
}
}