/************************************************************************* * ModernUO * * Copyright 2019-2026 - ModernUO Development Team * * Email: hi@modernuo.com * * File: CrowdSecConfigurationTests.cs * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * *************************************************************************/ using System; using System.Text.Json; using Server.Json; using Server.Network.Bans.CrowdSec; using Xunit; namespace Server.Tests.Network.Bans; public class CrowdSecConfigurationTests { // Locks the JsonConfig casing/converter contract: JsonConfig's options are case-SENSITIVE, so // every settings member must carry an explicit [JsonPropertyName("camelCase")] or it silently // binds nothing. These tests round-trip through the exact options the loader uses. [Fact] public void CrowdSecSettings_RoundTripsThroughJsonConfig() { var original = new CrowdSecSettings { LapiUrl = "http://10.0.0.5:9090", MachineId = "shard", Password = "secret", Origin = "modernuo", ManualBanDuration = TimeSpan.FromHours(168), FlushInterval = TimeSpan.FromSeconds(1), MaxQueue = 10000 }; var json = JsonConfig.Serialize(original); // camelCase property names must be present (not PascalCase) or the case-sensitive reader binds nothing. Assert.Contains("\"lapiUrl\"", json); Assert.Contains("\"machineId\"", json); Assert.Contains("\"password\"", json); Assert.Contains("\"origin\"", json); Assert.Contains("\"manualBanDuration\"", json); Assert.Contains("\"flushInterval\"", json); Assert.Contains("\"maxQueue\"", json); var restored = JsonSerializer.Deserialize(json, JsonConfig.DefaultOptions); Assert.NotNull(restored); Assert.Equal(original.LapiUrl, restored.LapiUrl); Assert.Equal(original.MachineId, restored.MachineId); Assert.Equal(original.Password, restored.Password); Assert.Equal(original.Origin, restored.Origin); Assert.Equal(original.ManualBanDuration, restored.ManualBanDuration); // TimeSpan survives Assert.Equal(original.FlushInterval, restored.FlushInterval); // TimeSpan survives Assert.Equal(original.MaxQueue, restored.MaxQueue); Assert.True(restored.ReportingEnabled); } [Fact] public void CrowdSecSettings_Defaults_AreReportingDisabledLocalLoopback() { var settings = new CrowdSecSettings(); Assert.Equal("http://127.0.0.1:8080", settings.LapiUrl); Assert.Equal("", settings.MachineId); Assert.Equal("", settings.Password); Assert.Equal("modernuo", settings.Origin); Assert.Equal(TimeSpan.FromHours(168), settings.ManualBanDuration); Assert.Equal(TimeSpan.FromSeconds(1), settings.FlushInterval); Assert.Equal(10000, settings.MaxQueue); Assert.False(settings.ReportingEnabled); // empty machineId/password => inert } }