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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        public async Task WhenConsumerThrowsThenProcessingLoopContinues()
        {
            using var broker = new MiniMqttServer();

            var milestone = new SemaphoreSlim(0, 1);
            var consumers = new[]