Move events to server level instead of options.

This commit is contained in:
Christian
2021-10-27 22:01:45 +02:00
parent 7297336786
commit d411aa4f97
109 changed files with 1148 additions and 2096 deletions
@@ -5,7 +5,6 @@ using MQTTnet.Client;
using MQTTnet.Client.Options;
using MQTTnet.Formatter;
using MQTTnet.Protocol;
using MQTTnet.Server;
namespace MQTTnet.Tests.Server
{
@@ -34,27 +33,31 @@ namespace MQTTnet.Tests.Server
// Arrange server
var disconnectedMre = new ManualResetEventSlim();
var serverOptions = new MqttServerOptionsBuilder()
.WithConnectionValidator(context =>
{
if (string.IsNullOrEmpty(context.ClientId))
{
context.AssignedClientIdentifier = assignedClientId;
context.ReasonCode = MqttConnectReasonCode.Success;
}
});
await testEnvironment.StartServer(serverOptions);
testEnvironment.Server.UseClientConnectedHandler(args =>
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
{
if (string.IsNullOrEmpty(e.ClientId))
{
e.AssignedClientIdentifier = assignedClientId;
e.ReasonCode = MqttConnectReasonCode.Success;
}
return Task.CompletedTask;
};
testEnvironment.Server.ClientConnectedAsync += args =>
{
serverConnectedClientId = args.ClientId;
});
return Task.CompletedTask;
};
testEnvironment.Server.UseClientDisconnectedHandler(args =>
testEnvironment.Server.ClientDisconnectedAsync += args =>
{
serverDisconnectedClientId = args.ClientId;
disconnectedMre.Set();
});
return Task.CompletedTask;
};
// Arrange client
var client = testEnvironment.CreateClient();
+26 -19
View File
@@ -20,10 +20,11 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
MqttServerClientConnectedEventArgs eventArgs = null;
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>
server.ClientConnectedAsync += e =>
{
eventArgs = e;
});
return Task.CompletedTask;
};
await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));
@@ -46,10 +47,11 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
MqttServerClientDisconnectedEventArgs eventArgs = null;
server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>
server.ClientDisconnectedAsync += e =>
{
eventArgs = e;
});
return Task.CompletedTask;
};
var client = await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));
await client.DisconnectAsync();
@@ -72,10 +74,11 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
MqttServerClientSubscribedTopicEventArgs eventArgs = null;
server.ClientSubscribedTopicHandler = new MqttServerClientSubscribedTopicHandlerDelegate(e =>
server.ClientSubscribedTopicAsync += e =>
{
eventArgs = e;
});
return Task.CompletedTask;
};
var client = await testEnvironment.ConnectClient();
await client.SubscribeAsync("The/Topic", MqttQualityOfServiceLevel.AtLeastOnce);
@@ -98,10 +101,11 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
MqttServerClientUnsubscribedTopicEventArgs eventArgs = null;
server.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate(e =>
server.ClientUnsubscribedTopicAsync += e =>
{
eventArgs = e;
});
return Task.CompletedTask;
};
var client = await testEnvironment.ConnectClient();
await client.UnsubscribeAsync("The/Topic");
@@ -122,11 +126,12 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
MqttApplicationMessageReceivedEventArgs eventArgs = null;
server.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
InterceptingMqttClientPublishEventArgs eventArgs = null;
server.InterceptingClientPublishAsync += e =>
{
eventArgs = e;
});
return Task.CompletedTask;
};
var client = await testEnvironment.ConnectClient();
await client.PublishAsync("The_Topic", "The_Payload");
@@ -146,15 +151,16 @@ namespace MQTTnet.Tests.Server
{
using (var testEnvironment = CreateTestEnvironment())
{
var server = testEnvironment.CreateServer();
var server = testEnvironment.CreateServer(new MqttServerOptions());
EventArgs eventArgs = null;
server.StartedHandler = new MqttServerStartedHandlerDelegate(e =>
server.StartedAsync += e =>
{
eventArgs = e;
});
await server.StartAsync(new MqttServerOptionsBuilder().Build());
return Task.CompletedTask;
};
await server.StartAsync();
await LongTestDelay();
@@ -170,10 +176,11 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
EventArgs eventArgs = null;
server.StoppedHandler = new MqttServerStoppedHandlerDelegate(e =>
server.StoppedAsync += e =>
{
eventArgs = e;
});
return Task.CompletedTask;
};
await server.StopAsync();
+159 -108
View File
@@ -27,7 +27,7 @@ namespace MQTTnet.Tests.Server
[DataRow(null, null)]
public async Task Use_Admissible_Credentials(string username, string password)
{
using (var testEnvironment = new TestEnvironment())
using (var testEnvironment = CreateTestEnvironment())
{
await testEnvironment.StartServer();
@@ -196,7 +196,7 @@ namespace MQTTnet.Tests.Server
Assert.AreEqual(1, receivedMessagesCount);
}
}
[TestMethod]
public async Task Publish_From_Server()
{
@@ -210,9 +210,9 @@ namespace MQTTnet.Tests.Server
client.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build();
await client.SubscribeAsync(new MqttTopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
await client.SubscribeAsync(new MqttTopicFilter {Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce});
await server.PublishAsync(message);
await server.PublishAsync("server", message);
await Task.Delay(1000);
@@ -237,8 +237,8 @@ namespace MQTTnet.Tests.Server
c3.UseApplicationMessageReceivedHandler(c => { Interlocked.Increment(ref receivedMessagesCount); });
await c2.SubscribeAsync(new MqttTopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce }).ConfigureAwait(false);
await c3.SubscribeAsync(new MqttTopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce }).ConfigureAwait(false);
await c2.SubscribeAsync(new MqttTopicFilter {Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce}).ConfigureAwait(false);
await c3.SubscribeAsync(new MqttTopicFilter {Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce}).ConfigureAwait(false);
var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build();
@@ -318,11 +318,11 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(async e =>
server.ClientConnectedAsync += async e =>
{
// Every client will automatically subscribe to this topic.
await server.SubscribeAsync(e.ClientId, "topic1");
});
};
var client = await testEnvironment.ConnectClient();
var receivedMessages = new List<MqttApplicationMessage>();
@@ -379,13 +379,22 @@ namespace MQTTnet.Tests.Server
var clientConnectedCalled = 0;
var clientDisconnectedCalled = 0;
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(_ => Interlocked.Increment(ref clientConnectedCalled));
server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(_ => Interlocked.Increment(ref clientDisconnectedCalled));
server.ClientConnectedAsync += e =>
{
Interlocked.Increment(ref clientConnectedCalled);
return Task.CompletedTask;
};
server.ClientDisconnectedAsync += e =>
{
Interlocked.Increment(ref clientDisconnectedCalled);
return Task.CompletedTask;
};
var c1 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder());
await Task.Delay(1000);
Assert.AreEqual(1, clientConnectedCalled);
Assert.AreEqual(0, clientDisconnectedCalled);
@@ -490,9 +499,14 @@ namespace MQTTnet.Tests.Server
{
using (var testEnvironment = CreateTestEnvironment())
{
await testEnvironment.StartServer(
new MqttServerOptionsBuilder().WithApplicationMessageInterceptor(
c => { c.ApplicationMessage = new MqttApplicationMessage { Topic = "new_topic" }; }));
var server = await testEnvironment.StartServer();
server.InterceptingClientPublishAsync += e =>
{
e.ApplicationMessage = new MqttApplicationMessage {Topic = "new_topic"};
return Task.CompletedTask;
};
string receivedTopic = null;
var c1 = await testEnvironment.ConnectClient();
@@ -531,7 +545,15 @@ namespace MQTTnet.Tests.Server
using (var testEnvironment = CreateTestEnvironment())
{
var server = await testEnvironment.StartServer();
server.UseClientConnectedHandler(async e => { await server.PublishAsync("/test/1", "true", MqttQualityOfServiceLevel.ExactlyOnce, false); });
server.ClientConnectedAsync += async e =>
{
await server.PublishAsync("server", new MqttApplicationMessage
{
Topic = "/test/1",
Payload = Encoding.UTF8.GetBytes("true"),
QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce
});
};
string receivedTopic = null;
@@ -553,21 +575,24 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task Intercept_Message()
{
void Interceptor(MqttApplicationMessageInterceptorContext context)
{
context.ApplicationMessage.Payload = Encoding.ASCII.GetBytes("extended");
}
using (var testEnvironment = CreateTestEnvironment())
{
await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithApplicationMessageInterceptor(Interceptor));
var server = await testEnvironment.StartServer();
server.InterceptingClientPublishAsync += e =>
{
e.ApplicationMessage.Payload = Encoding.ASCII.GetBytes("extended");
return Task.CompletedTask;
};
var c1 = await testEnvironment.ConnectClient();
var c2 = await testEnvironment.ConnectClient();
await c2.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("test").Build());
var isIntercepted = false;
c2.UseApplicationMessageReceivedHandler(c => { isIntercepted = string.Compare("extended", Encoding.UTF8.GetString(c.ApplicationMessage.Payload), StringComparison.Ordinal) == 0; });
c2.UseApplicationMessageReceivedHandler(c =>
{
isIntercepted = string.Compare("extended", Encoding.UTF8.GetString(c.ApplicationMessage.Payload), StringComparison.Ordinal) == 0;
});
await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("test").Build());
await c1.DisconnectAsync();
@@ -622,13 +647,17 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task Deny_Connection()
{
var serverOptions = new MqttServerOptionsBuilder().WithConnectionValidator(context => { context.ReasonCode = MqttConnectReasonCode.NotAuthorized; });
using (var testEnvironment = CreateTestEnvironment())
{
testEnvironment.IgnoreClientLogErrors = true;
await testEnvironment.StartServer(serverOptions);
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
{
e.ReasonCode = MqttConnectReasonCode.NotAuthorized;
return Task.CompletedTask;
};
var connectingFailedException = await Assert.ThrowsExceptionAsync<MqttConnectingFailedException>(() => testEnvironment.ConnectClient());
Assert.AreEqual(MqttClientConnectResultCode.NotAuthorized, connectingFailedException.ResultCode);
@@ -637,7 +666,7 @@ namespace MQTTnet.Tests.Server
Dictionary<string, bool> _connected;
private void ConnectionValidationHandler(MqttConnectionValidatorContext eventArgs)
void ConnectionValidationHandler(ValidatingMqttClientConnectionEventArgs eventArgs)
{
if (_connected.ContainsKey(eventArgs.ClientId))
{
@@ -647,7 +676,6 @@ namespace MQTTnet.Tests.Server
_connected[eventArgs.ClientId] = true;
eventArgs.ReasonCode = MqttConnectReasonCode.Success;
return;
}
[TestMethod]
@@ -658,27 +686,36 @@ namespace MQTTnet.Tests.Server
testEnvironment.IgnoreClientLogErrors = true;
_connected = new Dictionary<string, bool>();
var options = new MqttServerOptionsBuilder();
options.WithConnectionValidator(e => ConnectionValidationHandler(e));
var server = await testEnvironment.StartServer(options);
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
{
ConnectionValidationHandler(e);
return Task.CompletedTask;
};
var events = new List<string>();
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(_ =>
server.ClientConnectedAsync += e =>
{
lock (events)
{
events.Add("c");
}
});
server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(_ =>
return Task.CompletedTask;
};
server.ClientDisconnectedAsync += e =>
{
lock (events)
{
events.Add("d");
}
});
return Task.CompletedTask;
};
var clientOptions = new MqttClientOptionsBuilder()
.WithClientId("same_id");
@@ -743,25 +780,29 @@ namespace MQTTnet.Tests.Server
{
using (var testEnvironment = CreateTestEnvironment())
{
var server = await testEnvironment.StartServer(new MqttServerOptionsBuilder());
var server = await testEnvironment.StartServer();
var events = new List<string>();
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(_ =>
server.ClientConnectedAsync += e =>
{
lock (events)
{
events.Add("c");
}
});
server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(_ =>
return Task.CompletedTask;
};
server.ClientDisconnectedAsync += e =>
{
lock (events)
{
events.Add("d");
}
});
return Task.CompletedTask;
};
var clientOptionsBuilder = new MqttClientOptionsBuilder()
.WithClientId(Guid.NewGuid().ToString());
@@ -863,7 +904,7 @@ namespace MQTTnet.Tests.Server
{
}
await server.StartAsync(new MqttServerOptionsBuilder().WithDefaultEndpointPort(testEnvironment.ServerPort).Build());
await server.StartAsync();
await testEnvironment.ConnectClient();
}
}
@@ -873,14 +914,18 @@ namespace MQTTnet.Tests.Server
{
using (var testEnvironment = CreateTestEnvironment())
{
await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithSubscriptionInterceptor(c =>
var server = await testEnvironment.StartServer();
server.InterceptingClientSubscriptionAsync += e =>
{
// This should lead to no subscriptions for "n" at all. So also no sending of retained messages.
if (c.TopicFilter.Topic == "n")
if (e.TopicFilter.Topic == "n")
{
c.Response.ReasonCode = MqttSubscribeReasonCode.UnspecifiedError;
e.Response.ReasonCode = MqttSubscribeReasonCode.UnspecifiedError;
}
}));
return Task.CompletedTask;
};
// Prepare some retained messages.
var client1 = await testEnvironment.ConnectClient();
@@ -904,7 +949,7 @@ namespace MQTTnet.Tests.Server
}
});
await client2.SubscribeAsync(new MqttTopicFilter { Topic = "y" }, new MqttTopicFilter { Topic = "n" });
await client2.SubscribeAsync(new MqttTopicFilter {Topic = "y"}, new MqttTopicFilter {Topic = "n"});
await Task.Delay(500);
@@ -964,7 +1009,7 @@ namespace MQTTnet.Tests.Server
var c2 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("sender"));
await c2.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(topic).WithPayload(new byte[0]).WithQualityOfServiceLevel(qualityOfServiceLevel).Build());
await Task.Delay(500);
await c2.DisconnectAsync().ConfigureAwait(false);
await Task.Delay(500);
@@ -982,81 +1027,87 @@ namespace MQTTnet.Tests.Server
{
var undeliverd = string.Empty;
var options = new MqttServerOptionsBuilder().WithUndeliveredMessageInterceptor(
context => { undeliverd = context.ApplicationMessage.Topic; });
await testEnvironment.StartServer(options);
var client = await testEnvironment.ConnectClient();
await client.SubscribeAsync("b");
await client.PublishAsync("a", null, MqttQualityOfServiceLevel.ExactlyOnce);
await Task.Delay(500);
Assert.AreEqual("a", undeliverd);
throw new NotImplementedException();
// var options = new MqttServerOptionsBuilder().WithUndeliveredMessageInterceptor(
// context => { undeliverd = context.ApplicationMessage.Topic; });
//
// await testEnvironment.StartServer(options);
//
// var client = await testEnvironment.ConnectClient();
//
// await client.SubscribeAsync("b");
//
// await client.PublishAsync("a", null, MqttQualityOfServiceLevel.ExactlyOnce);
//
// await Task.Delay(500);
//
// Assert.AreEqual("a", undeliverd);
}
}
[TestMethod]
public async Task Intercept_ClientMessageQueue()
{
using (var testEnvironment = CreateTestEnvironment())
{
await testEnvironment.StartServer(new MqttServerOptionsBuilder()
.WithClientMessageQueueInterceptor(c => c.ApplicationMessage.Topic = "a"));
var topicAReceived = false;
var topicBReceived = false;
var client = await testEnvironment.ConnectClient();
client.UseApplicationMessageReceivedHandler(c =>
{
if (c.ApplicationMessage.Topic == "a")
{
topicAReceived = true;
}
else if (c.ApplicationMessage.Topic == "b")
{
topicBReceived = true;
}
});
await client.SubscribeAsync("a");
await client.SubscribeAsync("b");
await client.PublishAsync("b");
await Task.Delay(500);
Assert.IsTrue(topicAReceived);
Assert.IsFalse(topicBReceived);
}
throw new NotImplementedException();
// using (var testEnvironment = CreateTestEnvironment())
// {
// await testEnvironment.StartServer(new MqttServerOptionsBuilder()
// .WithClientMessageQueueInterceptor(c => c.ApplicationMessage.Topic = "a"));
//
// var topicAReceived = false;
// var topicBReceived = false;
//
// var client = await testEnvironment.ConnectClient();
// client.UseApplicationMessageReceivedHandler(c =>
// {
// if (c.ApplicationMessage.Topic == "a")
// {
// topicAReceived = true;
// }
// else if (c.ApplicationMessage.Topic == "b")
// {
// topicBReceived = true;
// }
// });
//
// await client.SubscribeAsync("a");
// await client.SubscribeAsync("b");
//
// await client.PublishAsync("b");
//
// await Task.Delay(500);
//
// Assert.IsTrue(topicAReceived);
// Assert.IsFalse(topicBReceived);
// }
}
[TestMethod]
public async Task Intercept_ClientMessageQueue_Different_QoS_Of_Subscription_And_Message()
{
throw new NotImplementedException();
const string topic = "a";
using (var testEnvironment = CreateTestEnvironment())
{
await testEnvironment.StartServer(new MqttServerOptionsBuilder()
.WithClientMessageQueueInterceptor(c => { })); // Interceptor does nothing but has to be present.
bool receivedMessage = false;
var client = await testEnvironment.ConnectClient();
client.UseApplicationMessageReceivedHandler(c => { receivedMessage = true; });
await client.SubscribeAsync(topic, MqttQualityOfServiceLevel.AtLeastOnce);
await client.PublishAsync(new MqttApplicationMessage { Topic = topic, QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
await Task.Delay(500);
Assert.IsTrue(receivedMessage);
}
// using (var testEnvironment = CreateTestEnvironment())
// {
// await testEnvironment.StartServer(new MqttServerOptionsBuilder()
// .WithClientMessageQueueInterceptor(c => { })); // Interceptor does nothing but has to be present.
//
// bool receivedMessage = false;
// var client = await testEnvironment.ConnectClient();
// client.UseApplicationMessageReceivedHandler(c => { receivedMessage = true; });
//
// await client.SubscribeAsync(topic, MqttQualityOfServiceLevel.AtLeastOnce);
//
// await client.PublishAsync(new MqttApplicationMessage {Topic = topic, QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce});
//
// await Task.Delay(500);
//
// Assert.IsTrue(receivedMessage);
// }
}
}
}
@@ -11,14 +11,14 @@ using MQTTnet.Tests.Mockups;
namespace MQTTnet.Tests.Server
{
[TestClass]
public class MqttSubscriptionsManager_Tests : BaseTestClass
public sealed class MqttSubscriptionsManager_Tests : BaseTestClass
{
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeSingleSuccess()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventDispatcher(new TestLogger()), new MqttRetainedMessagesManager());
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(new TestLogger()), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());
@@ -35,7 +35,7 @@ namespace MQTTnet.Tests.Server
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventDispatcher(new TestLogger()), new MqttRetainedMessagesManager());
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(new TestLogger()), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilter { Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
@@ -52,7 +52,7 @@ namespace MQTTnet.Tests.Server
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventDispatcher(new TestLogger()), new MqttRetainedMessagesManager());
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(new TestLogger()), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilter { Topic = "#", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
@@ -70,7 +70,7 @@ namespace MQTTnet.Tests.Server
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventDispatcher(new TestLogger()), new MqttRetainedMessagesManager());
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(new TestLogger()), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());
@@ -85,7 +85,7 @@ namespace MQTTnet.Tests.Server
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventDispatcher(new TestLogger()), new MqttRetainedMessagesManager());
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(new TestLogger()), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());
@@ -106,15 +106,15 @@ namespace MQTTnet.Tests.Server
var logger = new TestLogger();
var options = new MqttServerOptions();
var retainedMessagesManager = new MqttRetainedMessagesManager();
var eventDispatcher = new MqttServerEventDispatcher(logger);
var eventContainer = new MqttServerEventContainer(logger);
return new MqttClientSession(
"",
new ConcurrentDictionary<object, object>(),
eventDispatcher,
options,
eventContainer,
retainedMessagesManager,
new MqttClientSessionsManager(options, retainedMessagesManager, eventDispatcher, logger));
new MqttClientSessionsManager(options, retainedMessagesManager, eventContainer, logger));
}
}
}
@@ -36,19 +36,19 @@ namespace MQTTnet.Tests.Server
Assert.AreEqual("Error while authenticating. If the User Name Flag is set to 0, the Password Flag MUST be set to 0 [MQTT-3.1.2-22].", ex.Message, false);
}
}
[TestMethod]
public Task Handle_Wrong_UserName()
{
return TestCredentials("x", "Password1");
}
[TestMethod]
public Task Handle_Wrong_Password()
{
return TestCredentials("UserName", "x");
}
[TestMethod]
public Task Handle_Wrong_UserName_And_Password()
{
@@ -61,19 +61,22 @@ namespace MQTTnet.Tests.Server
{
testEnvironment.IgnoreClientLogErrors = true;
await testEnvironment.StartServer(testEnvironment.Factory.CreateServerOptionsBuilder()
.WithConnectionValidator(c =>
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
{
if (e.Username != "UserName1")
{
if (c.Username != "UserName1")
{
c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
}
if (c.Password != "Password1")
{
c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
}
}));
e.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
}
if (e.Password != "Password1")
{
e.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
}
return Task.CompletedTask;
};
var client = testEnvironment.CreateClient();
@@ -19,14 +19,15 @@ namespace MQTTnet.Tests.Server
{
testEnvironment.IgnoreClientLogErrors = true;
await testEnvironment.StartServer(o =>
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
{
o.WithConnectionValidator(v =>
{
v.ReasonCode = MqttConnectReasonCode.ServerMoved;
v.ServerReference = "new_server";
});
});
e.ReasonCode = MqttConnectReasonCode.ServerMoved;
e.ServerReference = "new_server";
return Task.CompletedTask;
};
try
{
@@ -21,31 +21,38 @@ namespace MQTTnet.Tests.Server
{
using (var testEnvironment = CreateTestEnvironment())
{
var serverOptions = new MqttServerOptionsBuilder()
.WithConnectionValidator(delegate(MqttConnectionValidatorContext context)
{
// Don't validate anything. Just set some session items.
context.SessionItems["can_subscribe_x"] = true;
context.SessionItems["default_payload"] = "Hello World";
})
.WithSubscriptionInterceptor(delegate(MqttSubscriptionInterceptorContext context)
{
if (context.TopicFilter.Topic == "x")
{
if (context.SessionItems["can_subscribe_x"] as bool? == false)
{
context.Response.ReasonCode = MqttSubscribeReasonCode.ImplementationSpecificError;
}
}
})
.WithApplicationMessageInterceptor(delegate(MqttApplicationMessageInterceptorContext context)
{
context.ApplicationMessage.Payload =
Encoding.UTF8.GetBytes(
context.SessionItems["default_payload"] as string ?? String.Empty);
});
var server = await testEnvironment.StartServer();
await testEnvironment.StartServer(serverOptions);
server.ValidatingClientConnectionAsync += e =>
{
// Don't validate anything. Just set some session items.
e.SessionItems["can_subscribe_x"] = true;
e.SessionItems["default_payload"] = "Hello World";
return Task.CompletedTask;
};
server.InterceptingClientSubscriptionAsync += e =>
{
if (e.TopicFilter.Topic == "x")
{
if (e.SessionItems["can_subscribe_x"] as bool? == false)
{
e.Response.ReasonCode = MqttSubscribeReasonCode.ImplementationSpecificError;
}
}
return Task.CompletedTask;
};
server.InterceptingClientPublishAsync += e =>
{
e.ApplicationMessage.Payload =
Encoding.UTF8.GetBytes(
e.SessionItems["default_payload"] as string ?? String.Empty);
return Task.CompletedTask;
};
string receivedPayload = null;
@@ -73,15 +80,16 @@ namespace MQTTnet.Tests.Server
{
using (var testEnvironment = CreateTestEnvironment())
{
var serverOptions = new MqttServerOptionsBuilder()
.WithConnectionValidator(delegate(MqttConnectionValidatorContext context)
{
// Don't validate anything. Just set some session items.
context.SessionItems["can_subscribe_x"] = true;
context.SessionItems["default_payload"] = "Hello World";
});
var server = await testEnvironment.StartServer();
await testEnvironment.StartServer(serverOptions);
server.ValidatingClientConnectionAsync += e =>
{
// Don't validate anything. Just set some session items.
e.SessionItems["can_subscribe_x"] = true;
e.SessionItems["default_payload"] = "Hello World";
return Task.CompletedTask;
};
await testEnvironment.ConnectClient();
@@ -19,13 +19,16 @@ namespace MQTTnet.Tests.Server
{
using (var testEnvironment = CreateTestEnvironment())
{
await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithSubscriptionInterceptor(
c =>
{
// Set the topic to "a" regards what the client wants to subscribe.
c.TopicFilter.Topic = "a";
}));
var server = await testEnvironment.StartServer();
server.InterceptingClientSubscriptionAsync += e =>
{
// Set the topic to "a" regards what the client wants to subscribe.
e.TopicFilter.Topic = "a";
return Task.CompletedTask;
};
var topicAReceived = false;
var topicBReceived = false;
@@ -74,10 +77,11 @@ namespace MQTTnet.Tests.Server
Assert.AreEqual(0, receivedMessagesCount);
var subscribeEventCalled = false;
server.ClientSubscribedTopicHandler = new MqttServerClientSubscribedTopicHandlerDelegate(e =>
server.ClientSubscribedTopicAsync += e =>
{
subscribeEventCalled = e.TopicFilter.Topic == "a" && e.ClientId == c1.Options.ClientId;
});
return Task.CompletedTask;
};
await c1.SubscribeAsync(new MqttTopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
await Task.Delay(250);
@@ -88,10 +92,11 @@ namespace MQTTnet.Tests.Server
Assert.AreEqual(1, receivedMessagesCount);
var unsubscribeEventCalled = false;
server.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate(e =>
server.ClientUnsubscribedTopicAsync += e =>
{
unsubscribeEventCalled = e.TopicFilter == "a" && e.ClientId == c1.Options.ClientId;
});
return Task.CompletedTask;
};
await c1.UnsubscribeAsync("a");
await Task.Delay(250);
@@ -260,14 +265,17 @@ namespace MQTTnet.Tests.Server
{
using (var testEnvironment = CreateTestEnvironment(MqttProtocolVersion.V500))
{
await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithSubscriptionInterceptor(
c =>
var server = await testEnvironment.StartServer();
server.InterceptingClientSubscriptionAsync += e =>
{
if (e.TopicFilter.Topic == "not_allowed_topic")
{
if (c.TopicFilter.Topic == "not_allowed_topic")
{
c.Response.ReasonCode = MqttSubscribeReasonCode.TopicFilterInvalid;
}
}));
e.Response.ReasonCode = MqttSubscribeReasonCode.TopicFilterInvalid;
}
return Task.CompletedTask;
};
var client = await testEnvironment.ConnectClient();