Files
natsdotnet/tests/NATS.Server.Clustering.Tests/Routes/RouteParityHelpersBatch1Tests.cs
Joseph Doherty 615752cdc2 refactor: extract NATS.Server.Clustering.Tests project
Move 29 clustering/routing test files from NATS.Server.Tests to a
dedicated NATS.Server.Clustering.Tests project. Update namespaces,
replace private GetFreePort/ReadUntilAsync helpers with TestUtilities
calls, and extract TestServerFactory/ClusterTestServer to TestUtilities
to fix cross-project reference from JetStreamStartupTests.
2026-03-12 15:31:58 -04:00

171 lines
5.6 KiB
C#

using System.Net;
using System.Net.Sockets;
using Microsoft.Extensions.Logging.Abstractions;
using NATS.Server.Configuration;
using NATS.Server.Protocol;
using NATS.Server.Routes;
namespace NATS.Server.Clustering.Tests.Routes;
public class RouteParityHelpersBatch1Tests
{
[Fact]
public void BuildConnectInfoJson_includes_connectinfo_compat_fields()
{
var json = RouteConnection.BuildConnectInfoJson("S1", ["A"], "topo-v1");
json.ShouldContain("\"verbose\":false");
json.ShouldContain("\"pedantic\":false");
json.ShouldContain("\"echo\":false");
json.ShouldContain("\"tls_required\":false");
json.ShouldContain("\"headers\":true");
json.ShouldContain("\"name\":\"S1\"");
json.ShouldContain("\"cluster\":\"\"");
json.ShouldContain("\"dynamic\":false");
json.ShouldContain("\"lnoc\":false");
json.ShouldContain("\"lnocu\":false");
}
[Fact]
public void HasThisRouteConfigured_matches_explicit_routes_with_scheme_normalization()
{
var manager = CreateManager(new ClusterOptions
{
Host = "127.0.0.1",
Port = 0,
Routes = ["127.0.0.1:7222"],
});
manager.HasThisRouteConfigured("127.0.0.1:7222").ShouldBeTrue();
manager.HasThisRouteConfigured("nats-route://127.0.0.1:7222").ShouldBeTrue();
manager.HasThisRouteConfigured("nats://127.0.0.1:7222").ShouldBeTrue();
manager.HasThisRouteConfigured("127.0.0.1:7999").ShouldBeFalse();
}
[Fact]
public void ProcessImplicitRoute_skips_configured_routes_and_tracks_new_routes()
{
var manager = CreateManager(new ClusterOptions
{
Host = "127.0.0.1",
Port = 0,
Routes = ["127.0.0.1:7222"],
});
var serverInfo = new ServerInfo
{
ServerId = "S2",
ServerName = "S2",
Version = NatsProtocol.Version,
Host = "127.0.0.1",
Port = 7222,
ConnectUrls = ["127.0.0.1:7222", "nats-route://127.0.0.1:7444"],
};
manager.ProcessImplicitRoute(serverInfo);
manager.DiscoveredRoutes.ShouldNotContain("127.0.0.1:7222");
manager.DiscoveredRoutes.ShouldContain("nats-route://127.0.0.1:7444");
}
[Fact]
public void RouteStillValid_checks_configured_and_discovered_routes()
{
var manager = CreateManager(new ClusterOptions
{
Host = "127.0.0.1",
Port = 0,
Routes = ["127.0.0.1:7222"],
});
manager.RouteStillValid("nats://127.0.0.1:7222").ShouldBeTrue();
manager.RouteStillValid("127.0.0.1:7555").ShouldBeFalse();
manager.ProcessImplicitRoute(new ServerInfo
{
ServerId = "S2",
ServerName = "S2",
Version = NatsProtocol.Version,
Host = "127.0.0.1",
Port = 7444,
ConnectUrls = ["127.0.0.1:7444"],
});
manager.RouteStillValid("nats-route://127.0.0.1:7444").ShouldBeTrue();
}
[Fact]
public async Task Solicited_route_helpers_upgrade_and_query_status()
{
var manager = CreateManager();
await using var connection = MakeRouteConnection();
manager.RegisterRoute("S2", connection);
manager.HasSolicitedRoute("S2").ShouldBeFalse();
manager.UpgradeRouteToSolicited("S2").ShouldBeTrue();
connection.IsSolicitedRoute().ShouldBeTrue();
manager.HasSolicitedRoute("S2").ShouldBeTrue();
manager.IsDuplicateServerName("S2").ShouldBeTrue();
}
[Fact]
public async Task RemoveRoute_cleans_hash_and_account_route_indexes()
{
var manager = CreateManager();
var connection = MakeRouteConnection();
manager.RegisterRoute("S2", connection);
manager.RegisterRouteByHash("S2", connection);
manager.RegisterAccountRoute("A", connection);
manager.HashedRouteCount.ShouldBe(1);
manager.DedicatedRouteCount.ShouldBe(1);
manager.RemoveRoute("S2").ShouldBeTrue();
manager.HashedRouteCount.ShouldBe(0);
manager.DedicatedRouteCount.ShouldBe(0);
}
[Fact]
public async Task TryParseRemoteUnsub_parses_rs_minus_and_ls_minus()
{
RouteConnection.TryParseRemoteUnsub("RS- ACCT_A foo.bar q1", out var account1, out var subject1, out var queue1).ShouldBeTrue();
account1.ShouldBe("ACCT_A");
subject1.ShouldBe("foo.bar");
queue1.ShouldBe("q1");
RouteConnection.TryParseRemoteUnsub("LS- ACCT_B foo.>", out var account2, out var subject2, out var queue2).ShouldBeTrue();
account2.ShouldBe("ACCT_B");
subject2.ShouldBe("foo.>");
queue2.ShouldBeNull();
RouteConnection.TryParseRemoteUnsub("RS+ ACCT_A foo.bar", out _, out _, out _).ShouldBeFalse();
}
private static RouteManager CreateManager(ClusterOptions? options = null)
=> new(
options ?? new ClusterOptions { Host = "127.0.0.1", Port = 0 },
new ServerStats(),
"S1",
_ => { },
_ => { },
NullLogger<RouteManager>.Instance);
private static RouteConnection MakeRouteConnection()
{
var listener = new TcpListener(IPAddress.Loopback, 0);
listener.Start();
var endpoint = (IPEndPoint)listener.LocalEndpoint;
var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(endpoint);
var server = listener.AcceptSocket();
server.Dispose();
listener.Stop();
return new RouteConnection(client);
}
}