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
@@ -28,7 +28,7 @@ namespace MQTTnet.Tests.Mockups
public MqttFactory Factory { get; } = new MqttFactory();
public IMqttServer Server { get; private set; }
public MqttServer Server { get; private set; }
public bool IgnoreClientLogErrors { get; set; }
@@ -173,46 +173,60 @@ namespace MQTTnet.Tests.Mockups
return new MqttRpcClient(await ConnectClient(), options);
}
public IMqttServer CreateServer()
public MqttServer CreateServer(MqttServerOptions options)
{
if (Server != null)
{
throw new InvalidOperationException("Server already started.");
}
Server = new TestServerWrapper(Factory.CreateMqttServer(ServerLogger), TestContext, this);
Server = Factory.CreateMqttServer(options, ServerLogger);
Server.ValidatingClientConnectionAsync += e =>
{
if (TestContext != null)
{
// Null is used when the client id is assigned from the server!
if (!string.IsNullOrEmpty(e.ClientId) && !e.ClientId.StartsWith(TestContext.TestName))
{
TrackException(new InvalidOperationException($"Invalid client ID used ({e.ClientId}). It must start with UnitTest name."));
e.ReasonCode = Protocol.MqttConnectReasonCode.ClientIdentifierNotValid;
}
}
return Task.CompletedTask;
};
return Server;
}
public Task<IMqttServer> StartServer()
public Task<MqttServer> StartServer()
{
return StartServer(Factory.CreateServerOptionsBuilder());
}
public async Task<IMqttServer> StartServer(MqttServerOptionsBuilder options)
public async Task<MqttServer> StartServer(MqttServerOptionsBuilder options)
{
var server = CreateServer();
var server = CreateServer(options.Build());
options.WithDefaultEndpointPort(ServerPort);
options.WithMaxPendingMessagesPerClient(int.MaxValue);
await server.StartAsync(options.Build());
await server.StartAsync();
return server;
}
public async Task<IMqttServer> StartServer(Action<MqttServerOptionsBuilder> options)
public async Task<MqttServer> StartServer(Action<MqttServerOptionsBuilder> options)
{
var server = CreateServer();
var optionsBuilder = Factory.CreateServerOptionsBuilder();
optionsBuilder.WithDefaultEndpointPort(ServerPort);
optionsBuilder.WithMaxPendingMessagesPerClient(int.MaxValue);
options?.Invoke(optionsBuilder);
options.Invoke(optionsBuilder);
await server.StartAsync(optionsBuilder.Build());
var server = CreateServer(optionsBuilder.Build());
await server.StartAsync();
return server;
}
@@ -1,147 +0,0 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MQTTnet.Client.Publishing;
using MQTTnet.Client.Receiving;
using MQTTnet.Server;
using MQTTnet.Server.Status;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace MQTTnet.Tests.Mockups
{
public sealed class TestServerWrapper : IMqttServer
{
public TestServerWrapper(IMqttServer implementation, TestContext testContext, TestEnvironment testEnvironment)
{
Implementation = implementation;
TestContext = testContext;
TestEnvironment = testEnvironment;
}
public IMqttServer Implementation { get; }
public TestContext TestContext { get; }
public TestEnvironment TestEnvironment { get; }
public bool IsStarted { get; }
public IMqttServerStartedHandler StartedHandler
{
get => Implementation.StartedHandler;
set => Implementation.StartedHandler = value;
}
public IMqttServerStoppedHandler StoppedHandler
{
get => Implementation.StoppedHandler;
set => Implementation.StoppedHandler = value;
}
public IMqttServerClientConnectedHandler ClientConnectedHandler
{
get => Implementation.ClientConnectedHandler;
set => Implementation.ClientConnectedHandler = value;
}
public IMqttServerClientDisconnectedHandler ClientDisconnectedHandler
{
get => Implementation.ClientDisconnectedHandler;
set => Implementation.ClientDisconnectedHandler = value;
}
public IMqttServerClientSubscribedTopicHandler ClientSubscribedTopicHandler
{
get => Implementation.ClientSubscribedTopicHandler;
set => Implementation.ClientSubscribedTopicHandler = value;
}
public IMqttServerClientUnsubscribedTopicHandler ClientUnsubscribedTopicHandler
{
get => Implementation.ClientUnsubscribedTopicHandler;
set => Implementation.ClientUnsubscribedTopicHandler = value;
}
public IMqttServerOptions Options => Implementation.Options;
public IMqttApplicationMessageReceivedHandler ApplicationMessageReceivedHandler
{
get => Implementation.ApplicationMessageReceivedHandler;
set => Implementation.ApplicationMessageReceivedHandler = value;
}
public event Func<MqttApplicationMessageReceivedEventArgs, Task> ApplicationMessageReceivedAsync
{
add => Implementation.ApplicationMessageReceivedAsync += value;
remove => Implementation.ApplicationMessageReceivedAsync -= value;
}
public Task ClearRetainedApplicationMessagesAsync()
{
return Implementation.ClearRetainedApplicationMessagesAsync();
}
public Task<IList<IMqttClientStatus>> GetClientStatusAsync()
{
return Implementation.GetClientStatusAsync();
}
public Task<IList<MqttApplicationMessage>> GetRetainedApplicationMessagesAsync()
{
return Implementation.GetRetainedApplicationMessagesAsync();
}
public Task<IList<IMqttSessionStatus>> GetSessionStatusAsync()
{
return Implementation.GetSessionStatusAsync();
}
public Task<MqttClientPublishResult> PublishAsync(MqttApplicationMessage applicationMessage, CancellationToken cancellationToken)
{
return Implementation.PublishAsync(applicationMessage, cancellationToken);
}
public Task StartAsync(IMqttServerOptions options)
{
if (TestContext != null)
{
var serverOptions = (MqttServerOptions)options;
if (serverOptions.ConnectionValidator == null)
{
serverOptions.ConnectionValidator = new MqttServerConnectionValidatorDelegate(ConnectionValidator);
}
}
return Implementation.StartAsync(options);
}
public Task StopAsync()
{
return Implementation.StopAsync();
}
public Task SubscribeAsync(string clientId, ICollection<MqttTopicFilter> topicFilters)
{
return Implementation.SubscribeAsync(clientId, topicFilters);
}
public Task UnsubscribeAsync(string clientId, ICollection<string> topicFilters)
{
return Implementation.UnsubscribeAsync(clientId, topicFilters);
}
public void Dispose()
{
Implementation.Dispose();
}
void ConnectionValidator(MqttConnectionValidatorContext ctx)
{
if (!ctx.ClientId.StartsWith(TestContext.TestName))
{
TestEnvironment.TrackException(new InvalidOperationException($"Invalid client ID used ({ctx.ClientId}). It must start with UnitTest name."));
ctx.ReasonCode = Protocol.MqttConnectReasonCode.ClientIdentifierNotValid;
}
}
}
}