Exemplo n.º 1
0
        public async Task Concurrent_Processing(MqttQualityOfServiceLevel qos)
        {
            long concurrency = 0;
            var  success     = false;

            using (var testEnvironment = new TestEnvironment(TestContext))
            {
                await testEnvironment.StartServer();

                var publisher = await testEnvironment.ConnectClient();

                var subscriber = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId(qos.ToString()));

                await subscriber.SubscribeAsync("#", qos);

                subscriber.ApplicationMessageReceivedAsync += e =>
                {
                    e.AutoAcknowledge = false;

                    async Task InvokeInternal()
                    {
                        if (Interlocked.Increment(ref concurrency) > 1)
                        {
                            success = true;
                        }

                        await Task.Delay(100);

                        Interlocked.Decrement(ref concurrency);
                    }

                    _ = InvokeInternal();
                    return(PlatformAbstractionLayer.CompletedTask);
                };

                var publishes = Task.WhenAll(publisher.PublishStringAsync("a", null, qos), publisher.PublishStringAsync("b", null, qos));

                await Task.Delay(200);

                await publishes;
                Assert.IsTrue(success);
            }
        }
Exemplo n.º 2
0
        public async Task Retry_If_Not_PubAck(MqttQualityOfServiceLevel qos)
        {
            long count = 0;

            using (var testEnvironment = CreateTestEnvironment())
            {
                await testEnvironment.StartServer(o => o.WithPersistentSessions());

                var publisher = await testEnvironment.ConnectClient();

                var subscriber = await testEnvironment.ConnectClient(o => o.WithClientId(qos.ToString()).WithCleanSession(false));

                subscriber.ApplicationMessageReceivedAsync += c =>
                {
                    c.AutoAcknowledge = false;
                    ++count;
                    Console.WriteLine("process");
                    return(PlatformAbstractionLayer.CompletedTask);
                };

                await subscriber.SubscribeAsync("#", qos);

                var pub = publisher.PublishStringAsync("a", null, qos);

                await Task.Delay(100);

                await subscriber.DisconnectAsync();

                await subscriber.ConnectAsync(subscriber.Options);

                await Task.Delay(100);

                var res = await pub;

                Assert.AreEqual(MqttClientPublishReasonCode.Success, res.ReasonCode);
                Assert.AreEqual(2, count);
            }
        }