- Rename tests/NATS.Server.Tests -> tests/NATS.Server.Core.Tests - Update solution file, InternalsVisibleTo, and csproj references - Remove JETSTREAM_INTEGRATION_MATRIX and NATS.NKeys from csproj (moved to JetStream.Tests and Auth.Tests) - Update all namespaces from NATS.Server.Tests.* to NATS.Server.Core.Tests.* - Replace private GetFreePort/ReadUntilAsync helpers with TestUtilities calls - Fix stale namespace in Transport.Tests/NetworkingGoParityTests.cs
170 lines
5.6 KiB
C#
170 lines
5.6 KiB
C#
// Tests for ConfigReloader.ApplyLoggingChanges.
|
|
// Go reference: golang/nats-server/server/reload.go — traceOption.Apply, debugOption.Apply.
|
|
|
|
using NATS.Server;
|
|
using NATS.Server.Configuration;
|
|
using Shouldly;
|
|
|
|
namespace NATS.Server.Core.Tests.Configuration;
|
|
|
|
public class LoggingReloadTests
|
|
{
|
|
// ─── helpers ────────────────────────────────────────────────────
|
|
|
|
private static NatsOptions BaseOpts() => new NatsOptions();
|
|
|
|
// ─── tests ──────────────────────────────────────────────────────
|
|
|
|
[Fact]
|
|
public void No_changes_returns_no_changes()
|
|
{
|
|
// Go reference: reload.go traceOption.Apply — no-op when flags unchanged
|
|
var old = BaseOpts();
|
|
var updated = BaseOpts();
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
result.HasChanges.ShouldBeFalse();
|
|
result.LevelChanged.ShouldBeFalse();
|
|
result.TraceChanged.ShouldBeFalse();
|
|
result.DebugChanged.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void Level_changed_detected()
|
|
{
|
|
// Go reference: reload.go debugOption.Apply — enabling debug changes effective level
|
|
var old = BaseOpts(); // Debug=false, Trace=false → "Information"
|
|
var updated = BaseOpts();
|
|
updated.Debug = true; // Debug=true → "Debug"
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
result.HasChanges.ShouldBeTrue();
|
|
result.LevelChanged.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Trace_enabled_detected()
|
|
{
|
|
// Go reference: reload.go traceOption.Apply — enabling trace flag
|
|
var old = BaseOpts();
|
|
var updated = BaseOpts();
|
|
updated.Trace = true;
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
result.HasChanges.ShouldBeTrue();
|
|
result.TraceChanged.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Trace_disabled_detected()
|
|
{
|
|
// Go reference: reload.go traceOption.Apply — disabling trace flag
|
|
var old = BaseOpts();
|
|
old.Trace = true;
|
|
var updated = BaseOpts(); // Trace=false
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
result.HasChanges.ShouldBeTrue();
|
|
result.TraceChanged.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Debug_enabled_detected()
|
|
{
|
|
// Go reference: reload.go debugOption.Apply — enabling debug flag
|
|
var old = BaseOpts();
|
|
var updated = BaseOpts();
|
|
updated.Debug = true;
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
result.HasChanges.ShouldBeTrue();
|
|
result.DebugChanged.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Debug_disabled_detected()
|
|
{
|
|
// Go reference: reload.go debugOption.Apply — disabling debug flag
|
|
var old = BaseOpts();
|
|
old.Debug = true;
|
|
var updated = BaseOpts(); // Debug=false
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
result.HasChanges.ShouldBeTrue();
|
|
result.DebugChanged.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void OldLevel_and_NewLevel_set()
|
|
{
|
|
// Go reference: reload.go — level transition is reported with explicit before/after values
|
|
var old = BaseOpts(); // Information
|
|
var updated = BaseOpts();
|
|
updated.Trace = true; // Trace takes precedence
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
result.LevelChanged.ShouldBeTrue();
|
|
result.OldLevel.ShouldBe("Information");
|
|
result.NewLevel.ShouldBe("Trace");
|
|
}
|
|
|
|
[Fact]
|
|
public void Case_insensitive_level_comparison()
|
|
{
|
|
// Same effective level produced regardless of flag combination that yields the same tier
|
|
// Debug=true on both sides → "Debug" == "Debug", no level change
|
|
var old = BaseOpts();
|
|
old.Debug = true;
|
|
var updated = BaseOpts();
|
|
updated.Debug = true;
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
result.LevelChanged.ShouldBeFalse();
|
|
result.HasChanges.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void Null_level_defaults_to_Information()
|
|
{
|
|
// Go reference: reload.go — absent log level is treated as Information
|
|
// When neither Debug nor Trace is set the effective level is "Information"
|
|
var old = BaseOpts();
|
|
var updated = BaseOpts();
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
// No change, and effective level should be "Information" for both sides
|
|
result.LevelChanged.ShouldBeFalse();
|
|
result.OldLevel.ShouldBeNull(); // only populated when a level change is detected
|
|
result.NewLevel.ShouldBeNull();
|
|
}
|
|
|
|
[Fact]
|
|
public void Multiple_changes_detected()
|
|
{
|
|
// Go reference: reload.go — independent trace and debug options both apply
|
|
var old = BaseOpts();
|
|
old.Debug = true;
|
|
|
|
var updated = BaseOpts();
|
|
updated.Trace = true; // Debug removed, Trace added — both flags changed
|
|
|
|
var result = ConfigReloader.ApplyLoggingChanges(old, updated);
|
|
|
|
result.HasChanges.ShouldBeTrue();
|
|
result.TraceChanged.ShouldBeTrue();
|
|
result.DebugChanged.ShouldBeTrue();
|
|
result.LevelChanged.ShouldBeTrue();
|
|
result.OldLevel.ShouldBe("Debug");
|
|
result.NewLevel.ShouldBe("Trace");
|
|
}
|
|
}
|