public async Task WhenMessageHandledThenForwardingLoopBreaks() { using var broker = new MiniMqttServer(PORT); var milestone = new SemaphoreSlim(0, 2); var callCounter = 0; var consumers = new[] { new ConsumerStub() { ShouldHandle = true, Handler = _ => milestone.Release() }, new ConsumerStub() { ShouldHandle = true, Handler = _ => Interlocked.Increment(ref callCounter) } }; using var sut = new ConnectorBuilder() .WithConsumers(consumers) .Build(); await sut.ConnectAsync(HOST, PORT); await broker.PublishAsync("boo", Encoding.ASCII.GetBytes("hoo")); Assert.True(await milestone.WaitAsync(TimeSpan.FromSeconds(5))); // publish again, so if the first message was going to sent to the second subscriber // it would not be missed await broker.PublishAsync("boo", Encoding.ASCII.GetBytes("hoo")); Assert.True(await milestone.WaitAsync(TimeSpan.FromSeconds(5))); Assert.Equal(2, consumers[0].PacketsToHandle.Count()); Assert.Equal(0, Volatile.Read(ref callCounter)); }
public async Task WhenStartedThenSubscribesForConsumers() { using var broker = new MiniMqttServer(); var consumers = new[] { new ConsumerStub { Subscriptions = new[] { "foo", "boo" } }, new ConsumerStub { Subscriptions = new[] { "moo", "shoo" } } }; using var sut = new ConnectorBuilder() .WithConsumers(consumers) .Build(); await sut.ConnectAsync(HOST, broker.Port); var expected = consumers.SelectMany(c => c.Subscriptions).OrderBy(s => s); Assert.Equal(expected, broker.Subscriptions.OrderBy(s => s)); }
public async Task WhenConsumerThrowsThenProcessingLoopContinues() { using var broker = new MiniMqttServer(); var milestone = new SemaphoreSlim(0, 1); var consumers = new[]