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
{