diff --git a/NatsDotNet.slnx b/NatsDotNet.slnx
index 7fed1de..657789f 100644
--- a/NatsDotNet.slnx
+++ b/NatsDotNet.slnx
@@ -7,6 +7,7 @@
+
diff --git a/src/NATS.Server/NATS.Server.csproj b/src/NATS.Server/NATS.Server.csproj
index 719e71b..91b5087 100644
--- a/src/NATS.Server/NATS.Server.csproj
+++ b/src/NATS.Server/NATS.Server.csproj
@@ -2,6 +2,7 @@
+
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttAdvancedParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttAdvancedParityTests.cs
similarity index 98%
rename from tests/NATS.Server.Tests/Mqtt/MqttAdvancedParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttAdvancedParityTests.cs
index 1743d31..a7651b8 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttAdvancedParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttAdvancedParityTests.cs
@@ -12,8 +12,9 @@ using System.Net;
using System.Net.Sockets;
using System.Text;
using NATS.Server.Mqtt;
+using NATS.Server.TestUtilities;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttAdvancedParityTests
{
@@ -763,10 +764,22 @@ public class MqttAdvancedParityTests
// Disconnect
client.Dispose();
- // Server should not crash
- await Task.Delay(100);
+ // Verify server is still operational by polling until it accepts a new connection
+ var connected = await PollHelper.WaitUntilAsync(async () =>
+ {
+ try
+ {
+ using var probe = new TcpClient();
+ await probe.ConnectAsync(IPAddress.Loopback, listener.Port);
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }, timeoutMs: 2000, intervalMs: 10);
+ connected.ShouldBeTrue("Server should still accept connections after client disconnect");
- // Verify server is still operational
using var client2 = new TcpClient();
await client2.ConnectAsync(IPAddress.Loopback, listener.Port);
var s2 = client2.GetStream();
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttAuthIntegrationTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttAuthIntegrationTests.cs
similarity index 95%
rename from tests/NATS.Server.Tests/Mqtt/MqttAuthIntegrationTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttAuthIntegrationTests.cs
index b315908..24d2535 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttAuthIntegrationTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttAuthIntegrationTests.cs
@@ -2,7 +2,7 @@ using System.Net;
using System.Net.Sockets;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttAuthIntegrationTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttAuthParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttAuthParityTests.cs
similarity index 96%
rename from tests/NATS.Server.Tests/Mqtt/MqttAuthParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttAuthParityTests.cs
index 638a298..277594a 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttAuthParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttAuthParityTests.cs
@@ -9,8 +9,9 @@ using System.Net.Sockets;
using System.Text;
using NATS.Server.Auth;
using NATS.Server.Mqtt;
+using NATS.Server.TestUtilities;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttAuthParityTests
{
@@ -202,10 +203,13 @@ public class MqttAuthParityTests
await MqttAuthWire.WriteLineAsync(stream, "CONNECT keepalive-client clean=true keepalive=1");
(await MqttAuthWire.ReadLineAsync(stream, 1000)).ShouldBe("CONNACK");
- await Task.Delay(2500);
-
- var result = await MqttAuthWire.ReadRawAsync(stream, 500);
- (result == null || result == "__timeout__").ShouldBeTrue();
+ // Poll until the server closes the connection due to keepalive expiry (keepalive=1s)
+ var disconnected = await PollHelper.WaitUntilAsync(async () =>
+ {
+ var result = await MqttAuthWire.ReadRawAsync(stream, 200);
+ return result == null || result == "__timeout__";
+ }, timeoutMs: 5000, intervalMs: 100);
+ disconnected.ShouldBeTrue("Server should disconnect idle client after keepalive timeout");
}
// =========================================================================
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttBinaryParserTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttBinaryParserTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttBinaryParserTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttBinaryParserTests.cs
index 32b1973..ed610ef 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttBinaryParserTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttBinaryParserTests.cs
@@ -8,7 +8,7 @@
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttBinaryParserTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttFlapperDetectionTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttFlapperDetectionTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttFlapperDetectionTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttFlapperDetectionTests.cs
index 4525be7..0a96555 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttFlapperDetectionTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttFlapperDetectionTests.cs
@@ -4,7 +4,7 @@
using NATS.Server.Mqtt;
using Shouldly;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttFlapperDetectionTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttFlowControllerTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttFlowControllerTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttFlowControllerTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttFlowControllerTests.cs
index 534577b..369eedb 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttFlowControllerTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttFlowControllerTests.cs
@@ -3,7 +3,7 @@
using NATS.Server.Mqtt;
using Shouldly;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public sealed class MqttFlowControllerTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttGoParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttGoParityTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttGoParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttGoParityTests.cs
index a90cdab..ba4b5d2 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttGoParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttGoParityTests.cs
@@ -8,7 +8,7 @@
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
///
/// Parity tests ported from Go server/mqtt_test.go exercising MQTT binary
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttKeepAliveTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttKeepAliveTests.cs
similarity index 59%
rename from tests/NATS.Server.Tests/Mqtt/MqttKeepAliveTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttKeepAliveTests.cs
index d57954a..81b5805 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttKeepAliveTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttKeepAliveTests.cs
@@ -1,8 +1,9 @@
using System.Net;
using System.Net.Sockets;
using NATS.Server.Mqtt;
+using NATS.Server.TestUtilities;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttKeepAliveTests
{
@@ -20,7 +21,12 @@ public class MqttKeepAliveTests
await MqttRuntimeWire.WriteLineAsync(stream, "CONNECT keepalive-client keepalive=1");
(await MqttRuntimeWire.ReadLineAsync(stream, 1000)).ShouldBe("CONNACK");
- await Task.Delay(2000);
- (await MqttRuntimeWire.ReadRawAsync(stream, 1000)).ShouldBeNull();
+ // Poll until the server closes the connection due to keepalive expiry (keepalive=1s)
+ var disconnected = await PollHelper.WaitUntilAsync(async () =>
+ {
+ var result = await MqttRuntimeWire.ReadRawAsync(stream, 200);
+ return result == null;
+ }, timeoutMs: 5000, intervalMs: 100);
+ disconnected.ShouldBeTrue("Server should disconnect idle client after keepalive timeout");
}
}
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttListenerParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttListenerParityTests.cs
similarity index 98%
rename from tests/NATS.Server.Tests/Mqtt/MqttListenerParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttListenerParityTests.cs
index 69167e3..2caf700 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttListenerParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttListenerParityTests.cs
@@ -3,7 +3,7 @@ using System.Net.Sockets;
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests;
+namespace NATS.Server.Mqtt.Tests;
public class MqttListenerParityTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttModelParityBatch3Tests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttModelParityBatch3Tests.cs
similarity index 98%
rename from tests/NATS.Server.Tests/Mqtt/MqttModelParityBatch3Tests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttModelParityBatch3Tests.cs
index c1a8762..8ec9095 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttModelParityBatch3Tests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttModelParityBatch3Tests.cs
@@ -1,6 +1,6 @@
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttModelParityBatch3Tests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttPacketParserTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPacketParserTests.cs
similarity index 95%
rename from tests/NATS.Server.Tests/Mqtt/MqttPacketParserTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPacketParserTests.cs
index 3b9c814..dd36b9c 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttPacketParserTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPacketParserTests.cs
@@ -1,6 +1,6 @@
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttPacketParserTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttPacketParsingParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPacketParsingParityTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttPacketParsingParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPacketParsingParityTests.cs
index 88c3777..df4fed6 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttPacketParsingParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPacketParsingParityTests.cs
@@ -5,7 +5,7 @@
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttPacketParsingParityTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttPacketWriterTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPacketWriterTests.cs
similarity index 94%
rename from tests/NATS.Server.Tests/Mqtt/MqttPacketWriterTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPacketWriterTests.cs
index b5ac4ff..1ae616d 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttPacketWriterTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPacketWriterTests.cs
@@ -1,6 +1,6 @@
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttPacketWriterTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttProtocolConstantsParityBatch1Tests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttProtocolConstantsParityBatch1Tests.cs
similarity index 98%
rename from tests/NATS.Server.Tests/Mqtt/MqttProtocolConstantsParityBatch1Tests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttProtocolConstantsParityBatch1Tests.cs
index 2376ffa..ed27a25 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttProtocolConstantsParityBatch1Tests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttProtocolConstantsParityBatch1Tests.cs
@@ -1,7 +1,7 @@
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttProtocolConstantsParityBatch1Tests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttProtocolConstantsParityBatch2Tests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttProtocolConstantsParityBatch2Tests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttProtocolConstantsParityBatch2Tests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttProtocolConstantsParityBatch2Tests.cs
index cb109fa..8e94695 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttProtocolConstantsParityBatch2Tests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttProtocolConstantsParityBatch2Tests.cs
@@ -1,7 +1,7 @@
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttProtocolConstantsParityBatch2Tests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttPublishSubscribeParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPublishSubscribeParityTests.cs
similarity index 97%
rename from tests/NATS.Server.Tests/Mqtt/MqttPublishSubscribeParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPublishSubscribeParityTests.cs
index 64def53..f8832c9 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttPublishSubscribeParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttPublishSubscribeParityTests.cs
@@ -2,7 +2,7 @@ using System.Net;
using System.Net.Sockets;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests;
+namespace NATS.Server.Mqtt.Tests;
public class MqttPublishSubscribeParityTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttQoSTrackingTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQoSTrackingTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttQoSTrackingTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQoSTrackingTests.cs
index 0ca8676..a4c6fe8 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttQoSTrackingTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQoSTrackingTests.cs
@@ -4,7 +4,7 @@
using NATS.Server.Mqtt;
using Shouldly;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public sealed class MqttQoSTrackingTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttQosAckRuntimeTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQosAckRuntimeTests.cs
similarity index 95%
rename from tests/NATS.Server.Tests/Mqtt/MqttQosAckRuntimeTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQosAckRuntimeTests.cs
index b792dfa..2e09ab9 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttQosAckRuntimeTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQosAckRuntimeTests.cs
@@ -2,7 +2,7 @@ using System.Net;
using System.Net.Sockets;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttQosAckRuntimeTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttQosDeliveryParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQosDeliveryParityTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttQosDeliveryParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQosDeliveryParityTests.cs
index 1cd1cb0..0aa20c0 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttQosDeliveryParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQosDeliveryParityTests.cs
@@ -6,7 +6,7 @@ using System.Net.Sockets;
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttQosDeliveryParityTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttQosTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQosTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttQosTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQosTests.cs
index 9d893bf..486a2cb 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttQosTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttQosTests.cs
@@ -6,7 +6,7 @@
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttQosTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttRetainedDeliveryTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttRetainedDeliveryTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttRetainedDeliveryTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttRetainedDeliveryTests.cs
index c5df2a4..7b51937 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttRetainedDeliveryTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttRetainedDeliveryTests.cs
@@ -6,7 +6,7 @@ using System.Text;
using NATS.Server.Mqtt;
using Shouldly;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttRetainedDeliveryTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttRetainedMessageParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttRetainedMessageParityTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttRetainedMessageParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttRetainedMessageParityTests.cs
index a518e16..7cd911b 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttRetainedMessageParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttRetainedMessageParityTests.cs
@@ -8,7 +8,7 @@ using System.Net.Sockets;
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttRetainedMessageParityTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttSessionParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttSessionParityTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttSessionParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttSessionParityTests.cs
index 1e55aaf..6cdf5a1 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttSessionParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttSessionParityTests.cs
@@ -7,7 +7,7 @@ using System.Net.Sockets;
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttSessionParityTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttSessionPersistenceTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttSessionPersistenceTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttSessionPersistenceTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttSessionPersistenceTests.cs
index 711d991..fc370f0 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttSessionPersistenceTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttSessionPersistenceTests.cs
@@ -5,7 +5,7 @@
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttSessionPersistenceTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttSessionRuntimeTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttSessionRuntimeTests.cs
similarity index 98%
rename from tests/NATS.Server.Tests/Mqtt/MqttSessionRuntimeTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttSessionRuntimeTests.cs
index d3ecbcb..a14cc51 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttSessionRuntimeTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttSessionRuntimeTests.cs
@@ -3,7 +3,7 @@ using System.Net.Sockets;
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttSessionRuntimeTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttTopicMappingParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttTopicMappingParityTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttTopicMappingParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttTopicMappingParityTests.cs
index b09e8b9..9b39d33 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttTopicMappingParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttTopicMappingParityTests.cs
@@ -4,7 +4,7 @@
// golang/nats-server/server/mqtt.go — mqttTopicToNATSPubSubject, mqttFilterToNATSSubject,
// natsSubjectToMQTTTopic, mqttToNATSSubjectConversion
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
///
/// Tests MQTT topic to NATS subject conversion and vice versa, porting the
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttWillMessageParityTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttWillMessageParityTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttWillMessageParityTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttWillMessageParityTests.cs
index 22b5df4..90a970f 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttWillMessageParityTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttWillMessageParityTests.cs
@@ -7,7 +7,7 @@ using System.Net.Sockets;
using System.Text;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttWillMessageParityTests
{
diff --git a/tests/NATS.Server.Tests/Mqtt/MqttWillMessageTests.cs b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttWillMessageTests.cs
similarity index 99%
rename from tests/NATS.Server.Tests/Mqtt/MqttWillMessageTests.cs
rename to tests/NATS.Server.Mqtt.Tests/Mqtt/MqttWillMessageTests.cs
index 56ef0ba..9de1340 100644
--- a/tests/NATS.Server.Tests/Mqtt/MqttWillMessageTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/Mqtt/MqttWillMessageTests.cs
@@ -5,7 +5,7 @@
using NATS.Server.Mqtt;
using Shouldly;
-namespace NATS.Server.Tests.Mqtt;
+namespace NATS.Server.Mqtt.Tests.Mqtt;
public class MqttWillMessageTests
{
diff --git a/tests/NATS.Server.Tests/MqttPersistenceTests.cs b/tests/NATS.Server.Mqtt.Tests/MqttPersistenceTests.cs
similarity index 98%
rename from tests/NATS.Server.Tests/MqttPersistenceTests.cs
rename to tests/NATS.Server.Mqtt.Tests/MqttPersistenceTests.cs
index 477c5a7..e78ad54 100644
--- a/tests/NATS.Server.Tests/MqttPersistenceTests.cs
+++ b/tests/NATS.Server.Mqtt.Tests/MqttPersistenceTests.cs
@@ -2,7 +2,7 @@ using NSubstitute;
using NATS.Server.JetStream.Storage;
using NATS.Server.Mqtt;
-namespace NATS.Server.Tests;
+namespace NATS.Server.Mqtt.Tests;
// Go reference: server/mqtt.go ($MQTT_msgs, $MQTT_sess, $MQTT_rmsgs JetStream streams)
diff --git a/tests/NATS.Server.Mqtt.Tests/NATS.Server.Mqtt.Tests.csproj b/tests/NATS.Server.Mqtt.Tests/NATS.Server.Mqtt.Tests.csproj
new file mode 100644
index 0000000..81a4151
--- /dev/null
+++ b/tests/NATS.Server.Mqtt.Tests/NATS.Server.Mqtt.Tests.csproj
@@ -0,0 +1,25 @@
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+