Files
natsdotnet/tests/NATS.Server.Tests/Monitoring/ClosedReasonTests.cs
Joseph Doherty a6e7778c6c feat: complete system event payload fields (Gap 10.6)
Add EventBuilder static class to EventTypes.cs with helpers for constructing
fully-populated ConnectEventMsg, DisconnectEventMsg, AccountNumConns, and
ServerStatsMsg. Also add RemoteServerShutdownEvent, RemoteServerUpdateEvent,
LeafNodeConnectEvent, and LeafNodeDisconnectEvent advisory types.

Add FullEventPayloadTests.cs (10 tests) covering all builders, GenerateEventId
uniqueness, GetTimestamp ISO 8601 format, DataStats zero defaults, and
ConnectEventMsg JSON roundtrip.
2026-02-25 13:11:58 -05:00

153 lines
5.7 KiB
C#

// Go reference: server/monitor.go ClosedState.String() — reason strings emitted by
// the /connz endpoint, and server/auth.go getAuthErrClosedState — auth-related reasons.
// These tests verify the ClosedReason enum and ClosedReasonHelper helpers introduced
// in Task 89 (Gap 10.7: consistently populate closed connection reasons).
using NATS.Server.Monitoring;
namespace NATS.Server.Tests.Monitoring;
public class ClosedReasonTests
{
// -----------------------------------------------------------------------
// 1. ToReasonString_ClientClosed_ReturnsExpected
// -----------------------------------------------------------------------
/// <summary>
/// ClientClosed maps to the Go-compatible "Client Closed" string.
/// Go reference: server/monitor.go ClosedState.String() case ClientClosed.
/// </summary>
[Fact]
public void ToReasonString_ClientClosed_ReturnsExpected()
{
ClosedReasonHelper.ToReasonString(ClosedReason.ClientClosed).ShouldBe("Client Closed");
}
// -----------------------------------------------------------------------
// 2. ToReasonString_AllReasonsHaveStrings
// -----------------------------------------------------------------------
/// <summary>
/// Every ClosedReason enum value must produce a non-null, non-empty string.
/// Go reference: server/monitor.go ClosedState.String() — all cases covered.
/// </summary>
[Fact]
public void ToReasonString_AllReasonsHaveStrings()
{
foreach (var reason in Enum.GetValues<ClosedReason>())
{
var s = ClosedReasonHelper.ToReasonString(reason);
s.ShouldNotBeNull();
s.ShouldNotBeEmpty();
}
}
// -----------------------------------------------------------------------
// 3. FromReasonString_ValidString_ReturnsEnum
// -----------------------------------------------------------------------
/// <summary>
/// A valid Go-compatible reason string parses back to the correct enum value.
/// Go reference: server/monitor.go ClosedState.String() "Server Shutdown".
/// </summary>
[Fact]
public void FromReasonString_ValidString_ReturnsEnum()
{
ClosedReasonHelper.FromReasonString("Server Shutdown").ShouldBe(ClosedReason.ServerShutdown);
}
// -----------------------------------------------------------------------
// 4. FromReasonString_Unknown_ReturnsUnknown
// -----------------------------------------------------------------------
/// <summary>
/// An unrecognised string returns ClosedReason.Unknown.
/// </summary>
[Fact]
public void FromReasonString_Unknown_ReturnsUnknown()
{
ClosedReasonHelper.FromReasonString("Not a real reason").ShouldBe(ClosedReason.Unknown);
}
// -----------------------------------------------------------------------
// 5. FromReasonString_Null_ReturnsUnknown
// -----------------------------------------------------------------------
/// <summary>
/// A null reason string returns ClosedReason.Unknown.
/// </summary>
[Fact]
public void FromReasonString_Null_ReturnsUnknown()
{
ClosedReasonHelper.FromReasonString(null).ShouldBe(ClosedReason.Unknown);
}
// -----------------------------------------------------------------------
// 6. IsClientInitiated_ClientClosed_True
// -----------------------------------------------------------------------
/// <summary>
/// ClientClosed is the only client-initiated close reason.
/// Go reference: server/client.go closeConnection — client disconnect path.
/// </summary>
[Fact]
public void IsClientInitiated_ClientClosed_True()
{
ClosedReasonHelper.IsClientInitiated(ClosedReason.ClientClosed).ShouldBeTrue();
}
// -----------------------------------------------------------------------
// 7. IsClientInitiated_ServerShutdown_False
// -----------------------------------------------------------------------
/// <summary>
/// ServerShutdown is not a client-initiated close.
/// </summary>
[Fact]
public void IsClientInitiated_ServerShutdown_False()
{
ClosedReasonHelper.IsClientInitiated(ClosedReason.ServerShutdown).ShouldBeFalse();
}
// -----------------------------------------------------------------------
// 8. IsAuthRelated_AuthTimeout_True
// -----------------------------------------------------------------------
/// <summary>
/// AuthTimeout is auth-related.
/// Go reference: server/auth.go getAuthErrClosedState — auth timeout path.
/// </summary>
[Fact]
public void IsAuthRelated_AuthTimeout_True()
{
ClosedReasonHelper.IsAuthRelated(ClosedReason.AuthTimeout).ShouldBeTrue();
}
// -----------------------------------------------------------------------
// 9. IsAuthRelated_WriteError_False
// -----------------------------------------------------------------------
/// <summary>
/// WriteError is not auth-related.
/// </summary>
[Fact]
public void IsAuthRelated_WriteError_False()
{
ClosedReasonHelper.IsAuthRelated(ClosedReason.WriteError).ShouldBeFalse();
}
// -----------------------------------------------------------------------
// 10. IsResourceLimit_MaxConnections_True
// -----------------------------------------------------------------------
/// <summary>
/// MaxConnectionsExceeded is a resource-limit close reason.
/// Go reference: server/client.go maxConnectionsExceeded — max connections path.
/// </summary>
[Fact]
public void IsResourceLimit_MaxConnections_True()
{
ClosedReasonHelper.IsResourceLimit(ClosedReason.MaxConnectionsExceeded).ShouldBeTrue();
}
}