From 36b9dfa6542424f9de68a17545e56c08bd20f14c Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Thu, 12 Mar 2026 15:54:07 -0400 Subject: [PATCH] refactor: extract NATS.Server.Auth.Tests project Move 50 auth/accounts/permissions/JWT/NKey test files from NATS.Server.Tests into a dedicated NATS.Server.Auth.Tests project. Update namespaces, replace private GetFreePort/ReadUntilAsync helpers with TestUtilities calls, replace Task.Delay with TaskCompletionSource in test doubles, and add InternalsVisibleTo. 690 tests pass. --- NatsDotNet.slnx | 1 + src/NATS.Server/NATS.Server.csproj | 1 + .../AccountIsolationTests.cs | 17 +++------ .../AccountResolverTests.cs | 2 +- .../AccountStatsTests.cs | 2 +- .../AccountTests.cs | 2 +- .../Accounts/AccountImportExportTests.cs | 17 ++------- .../Accounts/AccountIsolationTests.cs | 24 ++++++------ .../Accounts/AuthCalloutTests.cs | 20 +++++----- .../Accounts/AuthMechanismTests.cs | 13 ++----- .../Accounts/PermissionTests.cs | 16 +++----- .../Auth/AccountClaimReloadTests.cs | 2 +- .../Auth/AccountExpirationTests.cs | 2 +- .../Auth/AccountGoParityTests.cs | 2 +- .../Auth/AccountImportExportTests.cs | 2 +- .../Auth/AccountLimitsTests.cs | 2 +- ...untResponseAndInterestParityBatch1Tests.cs | 2 +- .../Auth/AccountRoutingTests.cs | 2 +- .../Auth/ActivationExpirationTests.cs | 2 +- .../Auth/AuthCalloutGoParityTests.cs | 7 +++- .../Auth/AuthExtensionParityTests.cs | 2 +- ...AuthModelAndCalloutConstantsParityTests.cs | 2 +- .../Auth/AuthServiceParityBatch4Tests.cs | 2 +- .../Auth/ExternalAuthCalloutTests.cs | 7 +++- .../Auth/ImportShadowingTests.cs | 2 +- .../Auth/JwtGoParityTests.cs | 4 +- .../Auth/NKeyRevocationTests.cs | 2 +- .../Auth/ProxyAuthTests.cs | 2 +- .../Auth/ResponseThresholdTests.cs | 2 +- .../Auth/ReverseResponseMapTests.cs | 2 +- .../Auth/ServiceLatencyTrackerTests.cs | 2 +- .../Auth/StreamImportCycleTests.cs | 2 +- .../Auth/SubPermissionCacheTests.cs | 2 +- .../Auth/SystemAccountTests.cs | 38 ++----------------- .../Auth/TlsMapAuthParityBatch1Tests.cs | 2 +- .../Auth/WildcardExportTests.cs | 2 +- .../AuthConfigTests.cs | 2 +- .../AuthIntegrationTests.cs | 13 ++----- .../AuthProtocolTests.cs | 2 +- .../AuthServiceTests.cs | 2 +- .../ClientPermissionsTests.cs | 2 +- .../ImportExportTests.cs | 17 ++------- .../JwtAuthenticatorTests.cs | 2 +- .../JwtTests.cs | 2 +- .../NATS.Server.Auth.Tests.csproj | 28 ++++++++++++++ .../NKeyAuthenticatorTests.cs | 2 +- .../NKeyIntegrationTests.cs | 14 ++----- .../PermissionIntegrationTests.cs | 14 ++----- .../PermissionLruCacheTests.cs | 2 +- .../PermissionTemplateTests.cs | 2 +- .../SimpleUserPasswordAuthenticatorTests.cs | 2 +- .../TokenAuthenticatorTests.cs | 2 +- .../UserPasswordAuthenticatorTests.cs | 2 +- 53 files changed, 138 insertions(+), 185 deletions(-) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/AccountIsolationTests.cs (88%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/AccountResolverTests.cs (98%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/AccountStatsTests.cs (97%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/AccountTests.cs (98%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Accounts/AccountImportExportTests.cs (97%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Accounts/AccountIsolationTests.cs (97%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Accounts/AuthCalloutTests.cs (98%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Accounts/AuthMechanismTests.cs (98%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Accounts/PermissionTests.cs (97%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AccountClaimReloadTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AccountExpirationTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AccountGoParityTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AccountImportExportTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AccountLimitsTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AccountResponseAndInterestParityBatch1Tests.cs (98%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AccountRoutingTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/ActivationExpirationTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AuthCalloutGoParityTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AuthExtensionParityTests.cs (95%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AuthModelAndCalloutConstantsParityTests.cs (97%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/AuthServiceParityBatch4Tests.cs (98%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/ExternalAuthCalloutTests.cs (84%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/ImportShadowingTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/JwtGoParityTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/NKeyRevocationTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/ProxyAuthTests.cs (95%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/ResponseThresholdTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/ReverseResponseMapTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/ServiceLatencyTrackerTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/StreamImportCycleTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/SubPermissionCacheTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/SystemAccountTests.cs (87%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/TlsMapAuthParityBatch1Tests.cs (98%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/Auth/WildcardExportTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/AuthConfigTests.cs (93%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/AuthIntegrationTests.cs (95%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/AuthProtocolTests.cs (97%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/AuthServiceTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/ClientPermissionsTests.cs (98%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/ImportExportTests.cs (96%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/JwtAuthenticatorTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/JwtTests.cs (99%) create mode 100644 tests/NATS.Server.Auth.Tests/NATS.Server.Auth.Tests.csproj rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/NKeyAuthenticatorTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/NKeyIntegrationTests.cs (86%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/PermissionIntegrationTests.cs (91%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/PermissionLruCacheTests.cs (97%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/PermissionTemplateTests.cs (99%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/SimpleUserPasswordAuthenticatorTests.cs (98%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/TokenAuthenticatorTests.cs (97%) rename tests/{NATS.Server.Tests => NATS.Server.Auth.Tests}/UserPasswordAuthenticatorTests.cs (99%) diff --git a/NatsDotNet.slnx b/NatsDotNet.slnx index f7a2aab..a502fae 100644 --- a/NatsDotNet.slnx +++ b/NatsDotNet.slnx @@ -13,6 +13,7 @@ + diff --git a/src/NATS.Server/NATS.Server.csproj b/src/NATS.Server/NATS.Server.csproj index d5fce43..e2c99cc 100644 --- a/src/NATS.Server/NATS.Server.csproj +++ b/src/NATS.Server/NATS.Server.csproj @@ -8,6 +8,7 @@ + diff --git a/tests/NATS.Server.Tests/AccountIsolationTests.cs b/tests/NATS.Server.Auth.Tests/AccountIsolationTests.cs similarity index 88% rename from tests/NATS.Server.Tests/AccountIsolationTests.cs rename to tests/NATS.Server.Auth.Tests/AccountIsolationTests.cs index 8f6be47..c5a6813 100644 --- a/tests/NATS.Server.Tests/AccountIsolationTests.cs +++ b/tests/NATS.Server.Auth.Tests/AccountIsolationTests.cs @@ -4,7 +4,9 @@ using Microsoft.Extensions.Logging.Abstractions; using NATS.Client.Core; using NATS.Server.Auth; -namespace NATS.Server.Tests; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests; public class AccountIsolationTests : IAsyncLifetime { @@ -12,17 +14,9 @@ public class AccountIsolationTests : IAsyncLifetime private int _port; private readonly CancellationTokenSource _cts = new(); private Task _serverTask = null!; - - private static int GetFreePort() - { - using var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)sock.LocalEndPoint!).Port; - } - public async Task InitializeAsync() { - _port = GetFreePort(); + _port = TestPortAllocator.GetFreePort(); _server = new NatsServer(new NatsOptions { Port = _port, @@ -100,7 +94,8 @@ public class AccountIsolationTests : IAsyncLifetime } catch (OperationCanceledException) { - // Expected — no message received (timeout) + // Expected — no message received means accounts are properly isolated + return; } } } diff --git a/tests/NATS.Server.Tests/AccountResolverTests.cs b/tests/NATS.Server.Auth.Tests/AccountResolverTests.cs similarity index 98% rename from tests/NATS.Server.Tests/AccountResolverTests.cs rename to tests/NATS.Server.Auth.Tests/AccountResolverTests.cs index 691148e..3418483 100644 --- a/tests/NATS.Server.Tests/AccountResolverTests.cs +++ b/tests/NATS.Server.Auth.Tests/AccountResolverTests.cs @@ -1,6 +1,6 @@ using NATS.Server.Auth.Jwt; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class AccountResolverTests { diff --git a/tests/NATS.Server.Tests/AccountStatsTests.cs b/tests/NATS.Server.Auth.Tests/AccountStatsTests.cs similarity index 97% rename from tests/NATS.Server.Tests/AccountStatsTests.cs rename to tests/NATS.Server.Auth.Tests/AccountStatsTests.cs index 362dd18..7af16a4 100644 --- a/tests/NATS.Server.Tests/AccountStatsTests.cs +++ b/tests/NATS.Server.Auth.Tests/AccountStatsTests.cs @@ -1,6 +1,6 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class AccountStatsTests { diff --git a/tests/NATS.Server.Tests/AccountTests.cs b/tests/NATS.Server.Auth.Tests/AccountTests.cs similarity index 98% rename from tests/NATS.Server.Tests/AccountTests.cs rename to tests/NATS.Server.Auth.Tests/AccountTests.cs index 459479b..1723676 100644 --- a/tests/NATS.Server.Tests/AccountTests.cs +++ b/tests/NATS.Server.Auth.Tests/AccountTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using NATS.Server.Subscriptions; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class AccountTests { diff --git a/tests/NATS.Server.Tests/Accounts/AccountImportExportTests.cs b/tests/NATS.Server.Auth.Tests/Accounts/AccountImportExportTests.cs similarity index 97% rename from tests/NATS.Server.Tests/Accounts/AccountImportExportTests.cs rename to tests/NATS.Server.Auth.Tests/Accounts/AccountImportExportTests.cs index 4f9604f..d17c6fa 100644 --- a/tests/NATS.Server.Tests/Accounts/AccountImportExportTests.cs +++ b/tests/NATS.Server.Auth.Tests/Accounts/AccountImportExportTests.cs @@ -4,7 +4,9 @@ using NATS.Server.Auth; using NATS.Server.Imports; using NATS.Server.Subscriptions; -namespace NATS.Server.Tests.Accounts; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests.Accounts; /// /// Tests for cross-account stream/service export/import delivery, authorization, and mapping. @@ -380,20 +382,9 @@ public class AccountImportExportTests private static NatsServer CreateTestServer() { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); return new NatsServer(new NatsOptions { Port = port }, NullLoggerFactory.Instance); } - - private static int GetFreePort() - { - using var sock = new System.Net.Sockets.Socket( - System.Net.Sockets.AddressFamily.InterNetwork, - System.Net.Sockets.SocketType.Stream, - System.Net.Sockets.ProtocolType.Tcp); - sock.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Loopback, 0)); - return ((System.Net.IPEndPoint)sock.LocalEndPoint!).Port; - } - /// /// Minimal test double for INatsClient used in import/export tests. /// diff --git a/tests/NATS.Server.Tests/Accounts/AccountIsolationTests.cs b/tests/NATS.Server.Auth.Tests/Accounts/AccountIsolationTests.cs similarity index 97% rename from tests/NATS.Server.Tests/Accounts/AccountIsolationTests.cs rename to tests/NATS.Server.Auth.Tests/Accounts/AccountIsolationTests.cs index 7809b07..9f37a45 100644 --- a/tests/NATS.Server.Tests/Accounts/AccountIsolationTests.cs +++ b/tests/NATS.Server.Auth.Tests/Accounts/AccountIsolationTests.cs @@ -7,7 +7,9 @@ using NATS.Server.Auth; using NATS.Server.Imports; using NATS.Server.Subscriptions; -namespace NATS.Server.Tests.Accounts; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests.Accounts; /// /// Tests for account creation, registration, isolation, and basic account lifecycle. @@ -17,16 +19,9 @@ namespace NATS.Server.Tests.Accounts; /// public class AccountIsolationTests { - private static int GetFreePort() - { - using var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)sock.LocalEndPoint!).Port; - } - private static NatsServer CreateTestServer(NatsOptions? options = null) { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); options ??= new NatsOptions(); options.Port = port; return new NatsServer(options, NullLoggerFactory.Instance); @@ -34,7 +29,7 @@ public class AccountIsolationTests private static async Task<(NatsServer server, int port, CancellationTokenSource cts)> StartServerAsync(NatsOptions options) { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); options.Port = port; var server = new NatsServer(options, NullLoggerFactory.Instance); var cts = new CancellationTokenSource(); @@ -208,7 +203,8 @@ public class AccountIsolationTests } catch (OperationCanceledException) { - // Expected + // Expected — timeout confirms cross-account isolation prevented delivery + return; } } finally @@ -301,7 +297,8 @@ public class AccountIsolationTests } catch (OperationCanceledException) { - // Expected + // Expected — timeout confirms different-account isolation blocks delivery + return; } } finally @@ -434,7 +431,8 @@ public class AccountIsolationTests } catch (OperationCanceledException) { - // Expected — accounts are isolated + // Expected — timeout confirms subject-mapped accounts remain isolated + return; } } finally diff --git a/tests/NATS.Server.Tests/Accounts/AuthCalloutTests.cs b/tests/NATS.Server.Auth.Tests/Accounts/AuthCalloutTests.cs similarity index 98% rename from tests/NATS.Server.Tests/Accounts/AuthCalloutTests.cs rename to tests/NATS.Server.Auth.Tests/Accounts/AuthCalloutTests.cs index 8cbc4aa..c0174b9 100644 --- a/tests/NATS.Server.Tests/Accounts/AuthCalloutTests.cs +++ b/tests/NATS.Server.Auth.Tests/Accounts/AuthCalloutTests.cs @@ -8,7 +8,9 @@ using NATS.Server.Imports; using NATS.Server.Protocol; using NATS.Server.Subscriptions; -namespace NATS.Server.Tests.Accounts; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests.Accounts; /// /// Tests for auth callout behavior, account limits (max connections / max subscriptions), @@ -19,16 +21,9 @@ namespace NATS.Server.Tests.Accounts; /// public class AuthCalloutTests { - private static int GetFreePort() - { - using var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)sock.LocalEndPoint!).Port; - } - private static NatsServer CreateTestServer(NatsOptions? options = null) { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); options ??= new NatsOptions(); options.Port = port; return new NatsServer(options, NullLoggerFactory.Instance); @@ -36,7 +31,7 @@ public class AuthCalloutTests private static async Task<(NatsServer server, int port, CancellationTokenSource cts)> StartServerAsync(NatsOptions options) { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); options.Port = port; var server = new NatsServer(options, NullLoggerFactory.Instance); var cts = new CancellationTokenSource(); @@ -772,7 +767,10 @@ public class AuthCalloutTests { public async Task AuthorizeAsync(ExternalAuthRequest request, CancellationToken ct) { - await Task.Delay(delay, ct); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + await using var reg = ct.Register(() => tcs.TrySetCanceled(ct)); + using var timer = new Timer(_ => tcs.TrySetResult(true), null, delay, Timeout.InfiniteTimeSpan); + await tcs.Task; return new ExternalAuthDecision(true, "delayed"); } } diff --git a/tests/NATS.Server.Tests/Accounts/AuthMechanismTests.cs b/tests/NATS.Server.Auth.Tests/Accounts/AuthMechanismTests.cs similarity index 98% rename from tests/NATS.Server.Tests/Accounts/AuthMechanismTests.cs rename to tests/NATS.Server.Auth.Tests/Accounts/AuthMechanismTests.cs index 7ad3cc7..b298dd5 100644 --- a/tests/NATS.Server.Tests/Accounts/AuthMechanismTests.cs +++ b/tests/NATS.Server.Auth.Tests/Accounts/AuthMechanismTests.cs @@ -6,7 +6,9 @@ using NATS.Server; using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests.Accounts; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests.Accounts; /// /// Tests for authentication mechanisms: username/password, token, NKey-based auth, @@ -16,16 +18,9 @@ namespace NATS.Server.Tests.Accounts; /// public class AuthMechanismTests { - private static int GetFreePort() - { - using var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)sock.LocalEndPoint!).Port; - } - private static async Task<(NatsServer server, int port, CancellationTokenSource cts)> StartServerAsync(NatsOptions options) { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); options.Port = port; var server = new NatsServer(options, NullLoggerFactory.Instance); var cts = new CancellationTokenSource(); diff --git a/tests/NATS.Server.Tests/Accounts/PermissionTests.cs b/tests/NATS.Server.Auth.Tests/Accounts/PermissionTests.cs similarity index 97% rename from tests/NATS.Server.Tests/Accounts/PermissionTests.cs rename to tests/NATS.Server.Auth.Tests/Accounts/PermissionTests.cs index f59ce18..d35b49e 100644 --- a/tests/NATS.Server.Tests/Accounts/PermissionTests.cs +++ b/tests/NATS.Server.Auth.Tests/Accounts/PermissionTests.cs @@ -5,7 +5,9 @@ using NATS.Client.Core; using NATS.Server; using NATS.Server.Auth; -namespace NATS.Server.Tests.Accounts; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests.Accounts; /// /// Tests for publish/subscribe permission enforcement, account-level limits, @@ -15,16 +17,9 @@ namespace NATS.Server.Tests.Accounts; /// public class PermissionTests { - private static int GetFreePort() - { - using var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)sock.LocalEndPoint!).Port; - } - private static async Task<(NatsServer server, int port, CancellationTokenSource cts)> StartServerAsync(NatsOptions options) { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); options.Port = port; var server = new NatsServer(options, NullLoggerFactory.Instance); var cts = new CancellationTokenSource(); @@ -356,7 +351,8 @@ public class PermissionTests } catch (OperationCanceledException) { - // Expected — message was blocked by permissions + // Expected — timeout confirms permission denial blocked the message + return; } } finally diff --git a/tests/NATS.Server.Tests/Auth/AccountClaimReloadTests.cs b/tests/NATS.Server.Auth.Tests/Auth/AccountClaimReloadTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/AccountClaimReloadTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AccountClaimReloadTests.cs index 96731f6..7737be2 100644 --- a/tests/NATS.Server.Tests/Auth/AccountClaimReloadTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AccountClaimReloadTests.cs @@ -3,7 +3,7 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class AccountClaimReloadTests { diff --git a/tests/NATS.Server.Tests/Auth/AccountExpirationTests.cs b/tests/NATS.Server.Auth.Tests/Auth/AccountExpirationTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/AccountExpirationTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AccountExpirationTests.cs index 640bb0c..11b7db3 100644 --- a/tests/NATS.Server.Tests/Auth/AccountExpirationTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AccountExpirationTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using Shouldly; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; // Go reference: server/accounts.go — account expiry / SetExpirationTimer diff --git a/tests/NATS.Server.Tests/Auth/AccountGoParityTests.cs b/tests/NATS.Server.Auth.Tests/Auth/AccountGoParityTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/AccountGoParityTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AccountGoParityTests.cs index fffbdd1..3fe48b5 100644 --- a/tests/NATS.Server.Tests/Auth/AccountGoParityTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AccountGoParityTests.cs @@ -5,7 +5,7 @@ using NATS.Server.Auth; using NATS.Server.Imports; using ServerSubscriptions = NATS.Server.Subscriptions; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; /// /// Parity tests ported from Go server/accounts_test.go exercising account diff --git a/tests/NATS.Server.Tests/Auth/AccountImportExportTests.cs b/tests/NATS.Server.Auth.Tests/Auth/AccountImportExportTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/AccountImportExportTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AccountImportExportTests.cs index e76e021..23da028 100644 --- a/tests/NATS.Server.Tests/Auth/AccountImportExportTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AccountImportExportTests.cs @@ -4,7 +4,7 @@ using NATS.Server.Auth; using NATS.Server.Imports; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class AccountImportExportTests { diff --git a/tests/NATS.Server.Tests/Auth/AccountLimitsTests.cs b/tests/NATS.Server.Auth.Tests/Auth/AccountLimitsTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/AccountLimitsTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AccountLimitsTests.cs index 3506706..3ab8fe5 100644 --- a/tests/NATS.Server.Tests/Auth/AccountLimitsTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AccountLimitsTests.cs @@ -3,7 +3,7 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class AccountLimitsTests { diff --git a/tests/NATS.Server.Tests/Auth/AccountResponseAndInterestParityBatch1Tests.cs b/tests/NATS.Server.Auth.Tests/Auth/AccountResponseAndInterestParityBatch1Tests.cs similarity index 98% rename from tests/NATS.Server.Tests/Auth/AccountResponseAndInterestParityBatch1Tests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AccountResponseAndInterestParityBatch1Tests.cs index 856bb99..a48ec20 100644 --- a/tests/NATS.Server.Tests/Auth/AccountResponseAndInterestParityBatch1Tests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AccountResponseAndInterestParityBatch1Tests.cs @@ -2,7 +2,7 @@ using NATS.Server.Auth; using NATS.Server.Imports; using NATS.Server.Subscriptions; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class AccountResponseAndInterestParityBatch1Tests { diff --git a/tests/NATS.Server.Tests/Auth/AccountRoutingTests.cs b/tests/NATS.Server.Auth.Tests/Auth/AccountRoutingTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/AccountRoutingTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AccountRoutingTests.cs index 4b82b66..211e3d6 100644 --- a/tests/NATS.Server.Tests/Auth/AccountRoutingTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AccountRoutingTests.cs @@ -6,7 +6,7 @@ using NATS.Server.Auth; using NATS.Server.Imports; using NATS.Server.Subscriptions; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; /// /// Parity tests ported from Go server/accounts_test.go covering: diff --git a/tests/NATS.Server.Tests/Auth/ActivationExpirationTests.cs b/tests/NATS.Server.Auth.Tests/Auth/ActivationExpirationTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/ActivationExpirationTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/ActivationExpirationTests.cs index 9b3fb6c..a3dbabf 100644 --- a/tests/NATS.Server.Tests/Auth/ActivationExpirationTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/ActivationExpirationTests.cs @@ -6,7 +6,7 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class ActivationExpirationTests { diff --git a/tests/NATS.Server.Tests/Auth/AuthCalloutGoParityTests.cs b/tests/NATS.Server.Auth.Tests/Auth/AuthCalloutGoParityTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/AuthCalloutGoParityTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AuthCalloutGoParityTests.cs index 27113d5..bb9544e 100644 --- a/tests/NATS.Server.Tests/Auth/AuthCalloutGoParityTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AuthCalloutGoParityTests.cs @@ -7,7 +7,7 @@ using System.Security.Cryptography.X509Certificates; using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; /// /// Parity tests ported from Go server/auth_callout_test.go covering the auth callout @@ -1399,7 +1399,10 @@ internal sealed class SlowCalloutClient : IExternalAuthClient public async Task AuthorizeAsync(ExternalAuthRequest request, CancellationToken ct) { - await Task.Delay(_delay, ct); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + await using var reg = ct.Register(() => tcs.TrySetCanceled(ct)); + using var timer = new Timer(_ => tcs.TrySetResult(true), null, _delay, Timeout.InfiniteTimeSpan); + await tcs.Task; return new ExternalAuthDecision(true, _identity ?? request.Username ?? "slow_user", _account); } } diff --git a/tests/NATS.Server.Tests/Auth/AuthExtensionParityTests.cs b/tests/NATS.Server.Auth.Tests/Auth/AuthExtensionParityTests.cs similarity index 95% rename from tests/NATS.Server.Tests/Auth/AuthExtensionParityTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AuthExtensionParityTests.cs index ccf27a0..b0c8b76 100644 --- a/tests/NATS.Server.Tests/Auth/AuthExtensionParityTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AuthExtensionParityTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class AuthExtensionParityTests { diff --git a/tests/NATS.Server.Tests/Auth/AuthModelAndCalloutConstantsParityTests.cs b/tests/NATS.Server.Auth.Tests/Auth/AuthModelAndCalloutConstantsParityTests.cs similarity index 97% rename from tests/NATS.Server.Tests/Auth/AuthModelAndCalloutConstantsParityTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AuthModelAndCalloutConstantsParityTests.cs index 36457df..9368ead 100644 --- a/tests/NATS.Server.Tests/Auth/AuthModelAndCalloutConstantsParityTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AuthModelAndCalloutConstantsParityTests.cs @@ -1,6 +1,6 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class AuthModelAndCalloutConstantsParityTests { diff --git a/tests/NATS.Server.Tests/Auth/AuthServiceParityBatch4Tests.cs b/tests/NATS.Server.Auth.Tests/Auth/AuthServiceParityBatch4Tests.cs similarity index 98% rename from tests/NATS.Server.Tests/Auth/AuthServiceParityBatch4Tests.cs rename to tests/NATS.Server.Auth.Tests/Auth/AuthServiceParityBatch4Tests.cs index 8dc5aa9..74ee0c2 100644 --- a/tests/NATS.Server.Tests/Auth/AuthServiceParityBatch4Tests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/AuthServiceParityBatch4Tests.cs @@ -2,7 +2,7 @@ using NATS.NKeys; using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class AuthServiceParityBatch4Tests { diff --git a/tests/NATS.Server.Tests/Auth/ExternalAuthCalloutTests.cs b/tests/NATS.Server.Auth.Tests/Auth/ExternalAuthCalloutTests.cs similarity index 84% rename from tests/NATS.Server.Tests/Auth/ExternalAuthCalloutTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/ExternalAuthCalloutTests.cs index 7bd3be6..c8fefb7 100644 --- a/tests/NATS.Server.Tests/Auth/ExternalAuthCalloutTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/ExternalAuthCalloutTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class ExternalAuthCalloutTests { @@ -51,7 +51,10 @@ public class ExternalAuthCalloutTests { public async Task AuthorizeAsync(ExternalAuthRequest request, CancellationToken ct) { - await Task.Delay(delay, ct); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + await using var reg = ct.Register(() => tcs.TrySetCanceled(ct)); + using var timer = new Timer(_ => tcs.TrySetResult(true), null, delay, Timeout.InfiniteTimeSpan); + await tcs.Task; return new ExternalAuthDecision(true, "slow"); } } diff --git a/tests/NATS.Server.Tests/Auth/ImportShadowingTests.cs b/tests/NATS.Server.Auth.Tests/Auth/ImportShadowingTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/ImportShadowingTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/ImportShadowingTests.cs index b64d992..69c735a 100644 --- a/tests/NATS.Server.Tests/Auth/ImportShadowingTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/ImportShadowingTests.cs @@ -5,7 +5,7 @@ using NATS.Server.Auth; using NATS.Server.Imports; using NATS.Server.Subscriptions; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class ImportShadowingTests { diff --git a/tests/NATS.Server.Tests/Auth/JwtGoParityTests.cs b/tests/NATS.Server.Auth.Tests/Auth/JwtGoParityTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/JwtGoParityTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/JwtGoParityTests.cs index f44d904..db89240 100644 --- a/tests/NATS.Server.Tests/Auth/JwtGoParityTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/JwtGoParityTests.cs @@ -11,7 +11,7 @@ using NATS.Server.Auth; using NATS.Server.Auth.Jwt; using NATS.Server.Protocol; -namespace NATS.Server.Tests.Auth +namespace NATS.Server.Auth.Tests.Auth { /// @@ -1767,4 +1767,4 @@ internal sealed class JwtTestSubjectPerm [JsonPropertyName("deny")] public string[]? Deny { get; set; } } -} // namespace NATS.Server.Tests.Auth +} // namespace NATS.Server.Auth.Tests.Auth diff --git a/tests/NATS.Server.Tests/Auth/NKeyRevocationTests.cs b/tests/NATS.Server.Auth.Tests/Auth/NKeyRevocationTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/NKeyRevocationTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/NKeyRevocationTests.cs index 0d8339f..dd48ed2 100644 --- a/tests/NATS.Server.Tests/Auth/NKeyRevocationTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/NKeyRevocationTests.cs @@ -4,7 +4,7 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class NKeyRevocationTests { diff --git a/tests/NATS.Server.Tests/Auth/ProxyAuthTests.cs b/tests/NATS.Server.Auth.Tests/Auth/ProxyAuthTests.cs similarity index 95% rename from tests/NATS.Server.Tests/Auth/ProxyAuthTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/ProxyAuthTests.cs index d51a7f3..4fbfac8 100644 --- a/tests/NATS.Server.Tests/Auth/ProxyAuthTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/ProxyAuthTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class ProxyAuthTests { diff --git a/tests/NATS.Server.Tests/Auth/ResponseThresholdTests.cs b/tests/NATS.Server.Auth.Tests/Auth/ResponseThresholdTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/ResponseThresholdTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/ResponseThresholdTests.cs index cbe9898..bb5d700 100644 --- a/tests/NATS.Server.Tests/Auth/ResponseThresholdTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/ResponseThresholdTests.cs @@ -5,7 +5,7 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class ResponseThresholdTests { diff --git a/tests/NATS.Server.Tests/Auth/ReverseResponseMapTests.cs b/tests/NATS.Server.Auth.Tests/Auth/ReverseResponseMapTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/ReverseResponseMapTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/ReverseResponseMapTests.cs index e768c86..f62d79d 100644 --- a/tests/NATS.Server.Tests/Auth/ReverseResponseMapTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/ReverseResponseMapTests.cs @@ -3,7 +3,7 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class ReverseResponseMapTests { diff --git a/tests/NATS.Server.Tests/Auth/ServiceLatencyTrackerTests.cs b/tests/NATS.Server.Auth.Tests/Auth/ServiceLatencyTrackerTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/ServiceLatencyTrackerTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/ServiceLatencyTrackerTests.cs index 1e5cf3a..e97dc32 100644 --- a/tests/NATS.Server.Tests/Auth/ServiceLatencyTrackerTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/ServiceLatencyTrackerTests.cs @@ -3,7 +3,7 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class ServiceLatencyTrackerTests { diff --git a/tests/NATS.Server.Tests/Auth/StreamImportCycleTests.cs b/tests/NATS.Server.Auth.Tests/Auth/StreamImportCycleTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/StreamImportCycleTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/StreamImportCycleTests.cs index a090073..74d8ade 100644 --- a/tests/NATS.Server.Tests/Auth/StreamImportCycleTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/StreamImportCycleTests.cs @@ -3,7 +3,7 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class StreamImportCycleTests { diff --git a/tests/NATS.Server.Tests/Auth/SubPermissionCacheTests.cs b/tests/NATS.Server.Auth.Tests/Auth/SubPermissionCacheTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/SubPermissionCacheTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/SubPermissionCacheTests.cs index e526184..5e2b412 100644 --- a/tests/NATS.Server.Tests/Auth/SubPermissionCacheTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/SubPermissionCacheTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using Shouldly; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; /// /// Tests for SUB permission caching and generation-based invalidation. diff --git a/tests/NATS.Server.Tests/Auth/SystemAccountTests.cs b/tests/NATS.Server.Auth.Tests/Auth/SystemAccountTests.cs similarity index 87% rename from tests/NATS.Server.Tests/Auth/SystemAccountTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/SystemAccountTests.cs index 87c76da..52e393f 100644 --- a/tests/NATS.Server.Tests/Auth/SystemAccountTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/SystemAccountTests.cs @@ -8,7 +8,9 @@ using System.Text; using Microsoft.Extensions.Logging.Abstractions; using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests.Auth; /// /// Tests for the $SYS system account functionality including: @@ -22,16 +24,9 @@ public class SystemAccountTests { // ─── Helpers ──────────────────────────────────────────────────────────── - private static int GetFreePort() - { - using var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)sock.LocalEndPoint!).Port; - } - private static async Task<(NatsServer server, int port, CancellationTokenSource cts)> StartServerAsync(NatsOptions options) { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); options.Port = port; var server = new NatsServer(options, NullLoggerFactory.Instance); var cts = new CancellationTokenSource(); @@ -40,31 +35,6 @@ public class SystemAccountTests return (server, port, cts); } - private static async Task RawConnectAsync(int port) - { - var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - await sock.ConnectAsync(IPAddress.Loopback, port); - var buf = new byte[4096]; - await sock.ReceiveAsync(buf, SocketFlags.None); - return sock; - } - - private static async Task ReadUntilAsync(Socket sock, string expected, int timeoutMs = 5000) - { - using var cts = new CancellationTokenSource(timeoutMs); - var sb = new StringBuilder(); - var buf = new byte[4096]; - while (!sb.ToString().Contains(expected, StringComparison.Ordinal)) - { - int n; - try { n = await sock.ReceiveAsync(buf, SocketFlags.None, cts.Token); } - catch (OperationCanceledException) { break; } - if (n == 0) break; - sb.Append(Encoding.ASCII.GetString(buf, 0, n)); - } - return sb.ToString(); - } - // ─── Tests ────────────────────────────────────────────────────────────── /// diff --git a/tests/NATS.Server.Tests/Auth/TlsMapAuthParityBatch1Tests.cs b/tests/NATS.Server.Auth.Tests/Auth/TlsMapAuthParityBatch1Tests.cs similarity index 98% rename from tests/NATS.Server.Tests/Auth/TlsMapAuthParityBatch1Tests.cs rename to tests/NATS.Server.Auth.Tests/Auth/TlsMapAuthParityBatch1Tests.cs index 8c8b67a..f9d621c 100644 --- a/tests/NATS.Server.Tests/Auth/TlsMapAuthParityBatch1Tests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/TlsMapAuthParityBatch1Tests.cs @@ -2,7 +2,7 @@ using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using NATS.Server.Auth; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class TlsMapAuthParityBatch1Tests { diff --git a/tests/NATS.Server.Tests/Auth/WildcardExportTests.cs b/tests/NATS.Server.Auth.Tests/Auth/WildcardExportTests.cs similarity index 99% rename from tests/NATS.Server.Tests/Auth/WildcardExportTests.cs rename to tests/NATS.Server.Auth.Tests/Auth/WildcardExportTests.cs index 0f7cdea..8a428cb 100644 --- a/tests/NATS.Server.Tests/Auth/WildcardExportTests.cs +++ b/tests/NATS.Server.Auth.Tests/Auth/WildcardExportTests.cs @@ -4,7 +4,7 @@ using NATS.Server.Auth; using NATS.Server.Imports; -namespace NATS.Server.Tests.Auth; +namespace NATS.Server.Auth.Tests.Auth; public class WildcardExportTests { diff --git a/tests/NATS.Server.Tests/AuthConfigTests.cs b/tests/NATS.Server.Auth.Tests/AuthConfigTests.cs similarity index 93% rename from tests/NATS.Server.Tests/AuthConfigTests.cs rename to tests/NATS.Server.Auth.Tests/AuthConfigTests.cs index f52d253..963105d 100644 --- a/tests/NATS.Server.Tests/AuthConfigTests.cs +++ b/tests/NATS.Server.Auth.Tests/AuthConfigTests.cs @@ -1,7 +1,7 @@ using NATS.Server; using NATS.Server.Auth; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class AuthConfigTests { diff --git a/tests/NATS.Server.Tests/AuthIntegrationTests.cs b/tests/NATS.Server.Auth.Tests/AuthIntegrationTests.cs similarity index 95% rename from tests/NATS.Server.Tests/AuthIntegrationTests.cs rename to tests/NATS.Server.Auth.Tests/AuthIntegrationTests.cs index e8151dd..10f32b1 100644 --- a/tests/NATS.Server.Tests/AuthIntegrationTests.cs +++ b/tests/NATS.Server.Auth.Tests/AuthIntegrationTests.cs @@ -5,17 +5,12 @@ using NATS.Client.Core; using NATS.Server; using NATS.Server.Auth; -namespace NATS.Server.Tests; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests; public class AuthIntegrationTests { - private static int GetFreePort() - { - using var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)sock.LocalEndPoint!).Port; - } - /// /// Checks whether any exception in the chain contains the given substring. /// The NATS client wraps server errors in outer NatsException messages, @@ -36,7 +31,7 @@ public class AuthIntegrationTests private static (NatsServer server, int port, CancellationTokenSource cts) StartServer(NatsOptions options) { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); options.Port = port; var server = new NatsServer(options, NullLoggerFactory.Instance); var cts = new CancellationTokenSource(); diff --git a/tests/NATS.Server.Tests/AuthProtocolTests.cs b/tests/NATS.Server.Auth.Tests/AuthProtocolTests.cs similarity index 97% rename from tests/NATS.Server.Tests/AuthProtocolTests.cs rename to tests/NATS.Server.Auth.Tests/AuthProtocolTests.cs index 4286616..47e0d8f 100644 --- a/tests/NATS.Server.Tests/AuthProtocolTests.cs +++ b/tests/NATS.Server.Auth.Tests/AuthProtocolTests.cs @@ -1,7 +1,7 @@ using System.Text.Json; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class AuthProtocolTests { diff --git a/tests/NATS.Server.Tests/AuthServiceTests.cs b/tests/NATS.Server.Auth.Tests/AuthServiceTests.cs similarity index 99% rename from tests/NATS.Server.Tests/AuthServiceTests.cs rename to tests/NATS.Server.Auth.Tests/AuthServiceTests.cs index fd7a15e..6478217 100644 --- a/tests/NATS.Server.Tests/AuthServiceTests.cs +++ b/tests/NATS.Server.Auth.Tests/AuthServiceTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class AuthServiceTests { diff --git a/tests/NATS.Server.Tests/ClientPermissionsTests.cs b/tests/NATS.Server.Auth.Tests/ClientPermissionsTests.cs similarity index 98% rename from tests/NATS.Server.Tests/ClientPermissionsTests.cs rename to tests/NATS.Server.Auth.Tests/ClientPermissionsTests.cs index d2882c0..53a9311 100644 --- a/tests/NATS.Server.Tests/ClientPermissionsTests.cs +++ b/tests/NATS.Server.Auth.Tests/ClientPermissionsTests.cs @@ -1,6 +1,6 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class ClientPermissionsTests { diff --git a/tests/NATS.Server.Tests/ImportExportTests.cs b/tests/NATS.Server.Auth.Tests/ImportExportTests.cs similarity index 96% rename from tests/NATS.Server.Tests/ImportExportTests.cs rename to tests/NATS.Server.Auth.Tests/ImportExportTests.cs index a259e5c..853381b 100644 --- a/tests/NATS.Server.Tests/ImportExportTests.cs +++ b/tests/NATS.Server.Auth.Tests/ImportExportTests.cs @@ -4,7 +4,9 @@ using NATS.Server.Auth; using NATS.Server.Imports; using NATS.Server.Subscriptions; -namespace NATS.Server.Tests; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests; public class ImportExportTests { @@ -298,20 +300,9 @@ public class ImportExportTests private static NatsServer CreateTestServer() { - var port = GetFreePort(); + var port = TestPortAllocator.GetFreePort(); return new NatsServer(new NatsOptions { Port = port }, NullLoggerFactory.Instance); } - - private static int GetFreePort() - { - using var sock = new System.Net.Sockets.Socket( - System.Net.Sockets.AddressFamily.InterNetwork, - System.Net.Sockets.SocketType.Stream, - System.Net.Sockets.ProtocolType.Tcp); - sock.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Loopback, 0)); - return ((System.Net.IPEndPoint)sock.LocalEndPoint!).Port; - } - /// /// Minimal test double for INatsClient used in import/export tests. /// diff --git a/tests/NATS.Server.Tests/JwtAuthenticatorTests.cs b/tests/NATS.Server.Auth.Tests/JwtAuthenticatorTests.cs similarity index 99% rename from tests/NATS.Server.Tests/JwtAuthenticatorTests.cs rename to tests/NATS.Server.Auth.Tests/JwtAuthenticatorTests.cs index 7e60f76..ed3501b 100644 --- a/tests/NATS.Server.Tests/JwtAuthenticatorTests.cs +++ b/tests/NATS.Server.Auth.Tests/JwtAuthenticatorTests.cs @@ -4,7 +4,7 @@ using NATS.Server.Auth; using NATS.Server.Auth.Jwt; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class JwtAuthenticatorTests { diff --git a/tests/NATS.Server.Tests/JwtTests.cs b/tests/NATS.Server.Auth.Tests/JwtTests.cs similarity index 99% rename from tests/NATS.Server.Tests/JwtTests.cs rename to tests/NATS.Server.Auth.Tests/JwtTests.cs index 61f2807..ce42339 100644 --- a/tests/NATS.Server.Tests/JwtTests.cs +++ b/tests/NATS.Server.Auth.Tests/JwtTests.cs @@ -3,7 +3,7 @@ using System.Text.Json; using NATS.NKeys; using NATS.Server.Auth.Jwt; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class JwtTests { diff --git a/tests/NATS.Server.Auth.Tests/NATS.Server.Auth.Tests.csproj b/tests/NATS.Server.Auth.Tests/NATS.Server.Auth.Tests.csproj new file mode 100644 index 0000000..a58fb16 --- /dev/null +++ b/tests/NATS.Server.Auth.Tests/NATS.Server.Auth.Tests.csproj @@ -0,0 +1,28 @@ + + + + false + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/NATS.Server.Tests/NKeyAuthenticatorTests.cs b/tests/NATS.Server.Auth.Tests/NKeyAuthenticatorTests.cs similarity index 99% rename from tests/NATS.Server.Tests/NKeyAuthenticatorTests.cs rename to tests/NATS.Server.Auth.Tests/NKeyAuthenticatorTests.cs index d7941f6..25f9149 100644 --- a/tests/NATS.Server.Tests/NKeyAuthenticatorTests.cs +++ b/tests/NATS.Server.Auth.Tests/NKeyAuthenticatorTests.cs @@ -2,7 +2,7 @@ using NATS.NKeys; using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class NKeyAuthenticatorTests { diff --git a/tests/NATS.Server.Tests/NKeyIntegrationTests.cs b/tests/NATS.Server.Auth.Tests/NKeyIntegrationTests.cs similarity index 86% rename from tests/NATS.Server.Tests/NKeyIntegrationTests.cs rename to tests/NATS.Server.Auth.Tests/NKeyIntegrationTests.cs index 83309f6..313425f 100644 --- a/tests/NATS.Server.Tests/NKeyIntegrationTests.cs +++ b/tests/NATS.Server.Auth.Tests/NKeyIntegrationTests.cs @@ -5,7 +5,9 @@ using NATS.Client.Core; using NATS.NKeys; using NATS.Server.Auth; -namespace NATS.Server.Tests; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests; public class NKeyIntegrationTests : IAsyncLifetime { @@ -16,17 +18,9 @@ public class NKeyIntegrationTests : IAsyncLifetime private KeyPair _userKeyPair = null!; private string _userSeed = null!; private string _userPublicKey = null!; - - private static int GetFreePort() - { - using var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)sock.LocalEndPoint!).Port; - } - public async Task InitializeAsync() { - _port = GetFreePort(); + _port = TestPortAllocator.GetFreePort(); _userKeyPair = KeyPair.CreatePair(PrefixByte.User); _userPublicKey = _userKeyPair.GetPublicKey(); _userSeed = _userKeyPair.GetSeed(); diff --git a/tests/NATS.Server.Tests/PermissionIntegrationTests.cs b/tests/NATS.Server.Auth.Tests/PermissionIntegrationTests.cs similarity index 91% rename from tests/NATS.Server.Tests/PermissionIntegrationTests.cs rename to tests/NATS.Server.Auth.Tests/PermissionIntegrationTests.cs index 358da95..302ce6a 100644 --- a/tests/NATS.Server.Tests/PermissionIntegrationTests.cs +++ b/tests/NATS.Server.Auth.Tests/PermissionIntegrationTests.cs @@ -4,7 +4,9 @@ using Microsoft.Extensions.Logging.Abstractions; using NATS.Client.Core; using NATS.Server.Auth; -namespace NATS.Server.Tests; +using NATS.Server.TestUtilities; + +namespace NATS.Server.Auth.Tests; public class PermissionIntegrationTests : IAsyncLifetime { @@ -12,17 +14,9 @@ public class PermissionIntegrationTests : IAsyncLifetime private int _port; private readonly CancellationTokenSource _cts = new(); private Task _serverTask = null!; - - private static int GetFreePort() - { - using var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)sock.LocalEndPoint!).Port; - } - public async Task InitializeAsync() { - _port = GetFreePort(); + _port = TestPortAllocator.GetFreePort(); _server = new NatsServer(new NatsOptions { Port = _port, diff --git a/tests/NATS.Server.Tests/PermissionLruCacheTests.cs b/tests/NATS.Server.Auth.Tests/PermissionLruCacheTests.cs similarity index 97% rename from tests/NATS.Server.Tests/PermissionLruCacheTests.cs rename to tests/NATS.Server.Auth.Tests/PermissionLruCacheTests.cs index 03955f6..236368b 100644 --- a/tests/NATS.Server.Tests/PermissionLruCacheTests.cs +++ b/tests/NATS.Server.Auth.Tests/PermissionLruCacheTests.cs @@ -1,6 +1,6 @@ using NATS.Server.Auth; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class PermissionLruCacheTests { diff --git a/tests/NATS.Server.Tests/PermissionTemplateTests.cs b/tests/NATS.Server.Auth.Tests/PermissionTemplateTests.cs similarity index 99% rename from tests/NATS.Server.Tests/PermissionTemplateTests.cs rename to tests/NATS.Server.Auth.Tests/PermissionTemplateTests.cs index 9e9de7c..655aacc 100644 --- a/tests/NATS.Server.Tests/PermissionTemplateTests.cs +++ b/tests/NATS.Server.Auth.Tests/PermissionTemplateTests.cs @@ -1,4 +1,4 @@ -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; using NATS.Server.Auth.Jwt; diff --git a/tests/NATS.Server.Tests/SimpleUserPasswordAuthenticatorTests.cs b/tests/NATS.Server.Auth.Tests/SimpleUserPasswordAuthenticatorTests.cs similarity index 98% rename from tests/NATS.Server.Tests/SimpleUserPasswordAuthenticatorTests.cs rename to tests/NATS.Server.Auth.Tests/SimpleUserPasswordAuthenticatorTests.cs index fc31e13..51fc465 100644 --- a/tests/NATS.Server.Tests/SimpleUserPasswordAuthenticatorTests.cs +++ b/tests/NATS.Server.Auth.Tests/SimpleUserPasswordAuthenticatorTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class SimpleUserPasswordAuthenticatorTests { diff --git a/tests/NATS.Server.Tests/TokenAuthenticatorTests.cs b/tests/NATS.Server.Auth.Tests/TokenAuthenticatorTests.cs similarity index 97% rename from tests/NATS.Server.Tests/TokenAuthenticatorTests.cs rename to tests/NATS.Server.Auth.Tests/TokenAuthenticatorTests.cs index 0c680c6..889ee21 100644 --- a/tests/NATS.Server.Tests/TokenAuthenticatorTests.cs +++ b/tests/NATS.Server.Auth.Tests/TokenAuthenticatorTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class TokenAuthenticatorTests { diff --git a/tests/NATS.Server.Tests/UserPasswordAuthenticatorTests.cs b/tests/NATS.Server.Auth.Tests/UserPasswordAuthenticatorTests.cs similarity index 99% rename from tests/NATS.Server.Tests/UserPasswordAuthenticatorTests.cs rename to tests/NATS.Server.Auth.Tests/UserPasswordAuthenticatorTests.cs index 2a70a85..416975f 100644 --- a/tests/NATS.Server.Tests/UserPasswordAuthenticatorTests.cs +++ b/tests/NATS.Server.Auth.Tests/UserPasswordAuthenticatorTests.cs @@ -1,7 +1,7 @@ using NATS.Server.Auth; using NATS.Server.Protocol; -namespace NATS.Server.Tests; +namespace NATS.Server.Auth.Tests; public class UserPasswordAuthenticatorTests {