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); } }
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); } }