public async Task TestRemotelyCloseConsumerWithMessageListenerFiresExceptionListener() { Mock <INmsConnectionListener> mockConnectionListener = new Mock <INmsConnectionListener>(); string errorMessage = "buba"; using (TestAmqpPeer testPeer = new TestAmqpPeer()) { ManualResetEvent consumerClosed = new ManualResetEvent(false); ManualResetEvent exceptionFired = new ManualResetEvent(false); mockConnectionListener .Setup(listener => listener.OnConsumerClosed(It.IsAny <IMessageConsumer>(), It.IsAny <Exception>())) .Callback(() => consumerClosed.Set()); NmsConnection connection = (NmsConnection) await EstablishConnectionAsync(testPeer); connection.AddConnectionListener(mockConnectionListener.Object); connection.ExceptionListener += exception => { exceptionFired.Set(); }; testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); // Create a consumer, then remotely end it afterwards. testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.RemotelyDetachLastOpenedLinkOnLastOpenedSession(expectDetachResponse: true, closed: true, errorType: AmqpError.RESOURCE_DELETED, errorMessage: errorMessage, 10); IQueue queue = await session.GetQueueAsync("myQueue"); IMessageConsumer consumer = await session.CreateConsumerAsync(queue); consumer.Listener += message => { }; // Verify the consumer gets marked closed testPeer.WaitForAllMatchersToComplete(1000); Assert.True(consumerClosed.WaitOne(2000), "Consumer closed callback didn't trigger"); Assert.True(exceptionFired.WaitOne(2000), "Exception listener should have fired with a MessageListener"); // Try closing it explicitly, should effectively no-op in client. // The test peer will throw during close if it sends anything. await consumer.CloseAsync(); } }
public async Task TestConsumerReceiveNoWaitThrowsIfConnectionLost() { ManualResetEvent disconnected = new ManualResetEvent(false); using (TestAmqpPeer testPeer = new TestAmqpPeer()) { NmsConnection connection = (NmsConnection) await EstablishConnectionAsync(testPeer); Mock <INmsConnectionListener> connectionListener = new Mock <INmsConnectionListener>(); connectionListener .Setup(listener => listener.OnConnectionFailure(It.IsAny <NMSException>())) .Callback(() => { disconnected.Set(); }); connection.AddConnectionListener(connectionListener.Object); await connection.StartAsync(); testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); IQueue queue = await session.GetQueueAsync("queue"); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.RemotelyCloseConnection(expectCloseResponse: true, errorCondition: ConnectionError.CONNECTION_FORCED, errorMessage: "buba"); IMessageConsumer consumer = await session.CreateConsumerAsync(queue); Assert.True(disconnected.WaitOne(), "Connection should be disconnected"); try { consumer.ReceiveNoWait(); Assert.Fail("An exception should have been thrown"); } catch (NMSException) { // Expected } } }
public async Task TestRemotelyCloseProducer() { string breadCrumb = "ErrorMessageBreadCrumb"; ManualResetEvent producerClosed = new ManualResetEvent(false); Mock <INmsConnectionListener> mockConnectionListener = new Mock <INmsConnectionListener>(); mockConnectionListener .Setup(listener => listener.OnProducerClosed(It.IsAny <NmsMessageProducer>(), It.IsAny <Exception>())) .Callback(() => { producerClosed.Set(); }); using (TestAmqpPeer testPeer = new TestAmqpPeer()) { NmsConnection connection = (NmsConnection) await EstablishConnectionAsync(testPeer); connection.AddConnectionListener(mockConnectionListener.Object); testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); // Create a producer, then remotely end it afterwards. testPeer.ExpectSenderAttach(); testPeer.RemotelyDetachLastOpenedLinkOnLastOpenedSession(expectDetachResponse: true, closed: true, errorType: AmqpError.RESOURCE_DELETED, breadCrumb, delayBeforeSend: 10); IQueue destination = await session.GetQueueAsync("myQueue"); IMessageProducer producer = await session.CreateProducerAsync(destination); // Verify the producer gets marked closed testPeer.WaitForAllMatchersToComplete(1000); Assert.True(producerClosed.WaitOne(TimeSpan.FromMilliseconds(1000)), "Producer closed callback didn't trigger"); Assert.That(() => producer.DisableMessageID, Throws.Exception.InstanceOf <IllegalStateException>(), "Producer never closed"); // Try closing it explicitly, should effectively no-op in client. // The test peer will throw during close if it sends anything. await producer.CloseAsync(); } }