// 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
// -----------------------------------------------------------------------
///
/// ClientClosed maps to the Go-compatible "Client Closed" string.
/// Go reference: server/monitor.go ClosedState.String() case ClientClosed.
///
[Fact]
public void ToReasonString_ClientClosed_ReturnsExpected()
{
ClosedReasonHelper.ToReasonString(ClosedReason.ClientClosed).ShouldBe("Client Closed");
}
// -----------------------------------------------------------------------
// 2. ToReasonString_AllReasonsHaveStrings
// -----------------------------------------------------------------------
///
/// Every ClosedReason enum value must produce a non-null, non-empty string.
/// Go reference: server/monitor.go ClosedState.String() — all cases covered.
///
[Fact]
public void ToReasonString_AllReasonsHaveStrings()
{
foreach (var reason in Enum.GetValues())
{
var s = ClosedReasonHelper.ToReasonString(reason);
s.ShouldNotBeNull();
s.ShouldNotBeEmpty();
}
}
// -----------------------------------------------------------------------
// 3. FromReasonString_ValidString_ReturnsEnum
// -----------------------------------------------------------------------
///
/// A valid Go-compatible reason string parses back to the correct enum value.
/// Go reference: server/monitor.go ClosedState.String() "Server Shutdown".
///
[Fact]
public void FromReasonString_ValidString_ReturnsEnum()
{
ClosedReasonHelper.FromReasonString("Server Shutdown").ShouldBe(ClosedReason.ServerShutdown);
}
// -----------------------------------------------------------------------
// 4. FromReasonString_Unknown_ReturnsUnknown
// -----------------------------------------------------------------------
///
/// An unrecognised string returns ClosedReason.Unknown.
///
[Fact]
public void FromReasonString_Unknown_ReturnsUnknown()
{
ClosedReasonHelper.FromReasonString("Not a real reason").ShouldBe(ClosedReason.Unknown);
}
// -----------------------------------------------------------------------
// 5. FromReasonString_Null_ReturnsUnknown
// -----------------------------------------------------------------------
///
/// A null reason string returns ClosedReason.Unknown.
///
[Fact]
public void FromReasonString_Null_ReturnsUnknown()
{
ClosedReasonHelper.FromReasonString(null).ShouldBe(ClosedReason.Unknown);
}
// -----------------------------------------------------------------------
// 6. IsClientInitiated_ClientClosed_True
// -----------------------------------------------------------------------
///
/// ClientClosed is the only client-initiated close reason.
/// Go reference: server/client.go closeConnection — client disconnect path.
///
[Fact]
public void IsClientInitiated_ClientClosed_True()
{
ClosedReasonHelper.IsClientInitiated(ClosedReason.ClientClosed).ShouldBeTrue();
}
// -----------------------------------------------------------------------
// 7. IsClientInitiated_ServerShutdown_False
// -----------------------------------------------------------------------
///
/// ServerShutdown is not a client-initiated close.
///
[Fact]
public void IsClientInitiated_ServerShutdown_False()
{
ClosedReasonHelper.IsClientInitiated(ClosedReason.ServerShutdown).ShouldBeFalse();
}
// -----------------------------------------------------------------------
// 8. IsAuthRelated_AuthTimeout_True
// -----------------------------------------------------------------------
///
/// AuthTimeout is auth-related.
/// Go reference: server/auth.go getAuthErrClosedState — auth timeout path.
///
[Fact]
public void IsAuthRelated_AuthTimeout_True()
{
ClosedReasonHelper.IsAuthRelated(ClosedReason.AuthTimeout).ShouldBeTrue();
}
// -----------------------------------------------------------------------
// 9. IsAuthRelated_WriteError_False
// -----------------------------------------------------------------------
///
/// WriteError is not auth-related.
///
[Fact]
public void IsAuthRelated_WriteError_False()
{
ClosedReasonHelper.IsAuthRelated(ClosedReason.WriteError).ShouldBeFalse();
}
// -----------------------------------------------------------------------
// 10. IsResourceLimit_MaxConnections_True
// -----------------------------------------------------------------------
///
/// MaxConnectionsExceeded is a resource-limit close reason.
/// Go reference: server/client.go maxConnectionsExceeded — max connections path.
///
[Fact]
public void IsResourceLimit_MaxConnections_True()
{
ClosedReasonHelper.IsResourceLimit(ClosedReason.MaxConnectionsExceeded).ShouldBeTrue();
}
}