public async Task TestCreateConsumerWithEmptySelector() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { var context = await EstablishNMSContextAsync(testPeer); await context.StartAsync(); testPeer.ExpectBegin(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectEnd(); testPeer.ExpectClose(); IQueue queue = await context.GetQueueAsync("myQueue"); await context.CreateConsumerAsync(queue, ""); await context.CreateConsumerAsync(queue, "", noLocal : false); await context.CloseAsync(); testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestCreateConsumerWithNullSelector() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { var context = EstablishNMSContext(testPeer); context.Start(); testPeer.ExpectBegin(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectEnd(); testPeer.ExpectClose(); IQueue queue = context.GetQueue("myQueue"); context.CreateConsumer(queue, null); context.CreateConsumer(queue, null, noLocal: false); context.Close(); testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestCreateConsumerWithEmptySelector() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = EstablishConnection(testPeer); connection.Start(); testPeer.ExpectBegin(); ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectClose(); IQueue queue = session.GetQueue("myQueue"); session.CreateConsumer(queue, ""); session.CreateConsumer(queue, "", noLocal: false); connection.Close(); testPeer.WaitForAllMatchersToComplete(1000); } }
public async Task TestCreateConsumerWithNullSelector() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = await EstablishConnectionAsync(testPeer); await connection.StartAsync(); testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectClose(); IQueue queue = await session.GetQueueAsync("myQueue"); await session.CreateConsumerAsync(queue, null); await session.CreateConsumerAsync(queue, null, noLocal : false); await connection.CloseAsync(); testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestSyncReceiveFailsWhenListenerSet() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { var context = EstablishNMSContext(testPeer); testPeer.ExpectBegin(); IQueue destination = context.GetQueue("myQueue"); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); var consumer = context.CreateConsumer(destination); consumer.Listener += message => { }; Assert.Catch <NMSException>(() => consumer.Receive(), "Should have thrown an exception."); Assert.Catch <NMSException>(() => consumer.Receive(TimeSpan.FromMilliseconds(1000)), "Should have thrown an exception."); Assert.Catch <NMSException>(() => consumer.ReceiveNoWait(), "Should have thrown an exception."); testPeer.ExpectEnd(); testPeer.ExpectClose(); context.Close(); testPeer.WaitForAllMatchersToComplete(2000); } }
public void TestCreateDurableConsumer() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { var context = EstablishNMSContext(testPeer); context.Start(); testPeer.ExpectBegin(); string topicName = "myTopic"; ITopic topic = context.GetTopic(topicName); string subscriptionName = "mySubscription"; testPeer.ExpectDurableSubscriberAttach(topicName, subscriptionName); testPeer.ExpectLinkFlow(); var durableConsumer = context.CreateDurableConsumer(topic, subscriptionName, null, false); Assert.NotNull(durableConsumer, "MessageConsumer object was null"); testPeer.ExpectEnd(); testPeer.ExpectClose(); context.Close(); testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestSyncReceiveFailsWhenListenerSet() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = EstablishConnection(testPeer); testPeer.ExpectBegin(); ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); IQueue destination = session.GetQueue("myQueue"); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); IMessageConsumer consumer = session.CreateConsumer(destination); consumer.Listener += message => { }; Assert.Catch <NMSException>(() => consumer.Receive(), "Should have thrown an exception."); Assert.Catch <NMSException>(() => consumer.Receive(TimeSpan.FromMilliseconds(1000)), "Should have thrown an exception."); Assert.Catch <NMSException>(() => consumer.ReceiveNoWait(), "Should have thrown an exception."); testPeer.ExpectClose(); connection.Close(); testPeer.WaitForAllMatchersToComplete(2000); } }
public void TestCantDeleteTemporaryQueueWithConsumers() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = EstablishConnection(testPeer); connection.Start(); testPeer.ExpectBegin(); ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); string dynamicAddress = "myTempQueueAddress"; testPeer.ExpectTempQueueCreationAttach(dynamicAddress); ITemporaryQueue temporaryQueue = session.CreateTemporaryQueue(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); IMessageConsumer consumer = session.CreateConsumer(temporaryQueue); Assert.Catch <IllegalStateException>(() => temporaryQueue.Delete(), "should not be able to delete temporary queue with active consumers"); testPeer.ExpectDetach(expectClosed: true, sendResponse: true, replyClosed: true); consumer.Close(); // Now it should be allowed testPeer.ExpectDetach(expectClosed: true, sendResponse: true, replyClosed: true); temporaryQueue.Delete(); testPeer.ExpectClose(); connection.Close(); testPeer.WaitForAllMatchersToComplete(2000); } }
public async Task TestCreateSharedDurableConsumer() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { var context = await EstablishNMSContextAsync(testPeer); await context.StartAsync(); testPeer.ExpectBegin(); string topicName = "myTopic"; ITopic topic = await context.GetTopicAsync(topicName); string subscriptionName = "mySubscription"; testPeer.ExpectSharedDurableSubscriberAttach(topicName, subscriptionName); testPeer.ExpectLinkFlow(); var durableConsumer = await context.CreateSharedDurableConsumerAsync(topic, subscriptionName, null); //, false); Assert.NotNull(durableConsumer, "MessageConsumer object was null"); testPeer.ExpectEnd(); testPeer.ExpectClose(); await context.CloseAsync(); testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestCloseDurableTopicSubscriberDetachesWithCloseFalse() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { var context = EstablishNMSContext(testPeer); context.Start(); testPeer.ExpectBegin(); string topicName = "myTopic"; string subscriptionName = "mySubscription"; ITopic topic = context.GetTopic(topicName); testPeer.ExpectDurableSubscriberAttach(topicName, subscriptionName); testPeer.ExpectLinkFlow(); var durableConsumer = context.CreateDurableConsumer(topic, subscriptionName, null, false); testPeer.ExpectDetach(expectClosed: false, sendResponse: true, replyClosed: false); durableConsumer.Close(); testPeer.ExpectEnd(); testPeer.ExpectClose(); context.Close(); testPeer.WaitForAllMatchersToComplete(1000); } }
public async Task TestCantDeleteTemporaryQueueWithConsumers() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = await EstablishConnectionAsync(testPeer); await connection.StartAsync(); testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); string dynamicAddress = "myTempTopicAddress"; testPeer.ExpectTempTopicCreationAttach(dynamicAddress); ITemporaryTopic topic = await session.CreateTemporaryTopicAsync(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); IMessageConsumer consumer = await session.CreateConsumerAsync(topic); Assert.CatchAsync <IllegalStateException>(async() => await topic.DeleteAsync(), "should not be able to delete temporary topic with active consumers"); testPeer.ExpectDetach(expectClosed: true, sendResponse: true, replyClosed: true); await consumer.CloseAsync(); // Now it should be allowed testPeer.ExpectDetach(expectClosed: true, sendResponse: true, replyClosed: true); await topic.DeleteAsync(); testPeer.ExpectClose(); await connection.CloseAsync(); testPeer.WaitForAllMatchersToComplete(2000); } }
public async Task TestCloseConsumer() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = await EstablishConnectionAsync(testPeer); testPeer.ExpectBegin(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); IQueue queue = await session.GetQueueAsync("myQueue"); IMessageConsumer consumer = await session.CreateConsumerAsync(queue); testPeer.ExpectDetach(expectClosed: true, sendResponse: true, replyClosed: true); await consumer.CloseAsync(); testPeer.ExpectClose(); await connection.CloseAsync(); testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestCloseDurableTopicSubscriberDetachesWithCloseFalse() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = EstablishConnection(testPeer); connection.Start(); testPeer.ExpectBegin(); ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); string topicName = "myTopic"; string subscriptionName = "mySubscription"; ITopic topic = session.GetTopic(topicName); testPeer.ExpectDurableSubscriberAttach(topicName, subscriptionName); testPeer.ExpectLinkFlow(); IMessageConsumer durableConsumer = session.CreateDurableConsumer(topic, subscriptionName, null, false); testPeer.ExpectDetach(expectClosed: false, sendResponse: true, replyClosed: false); durableConsumer.Close(); testPeer.ExpectClose(); connection.Close(); testPeer.WaitForAllMatchersToComplete(1000); } }
public async Task TestCreateSharedDurableConsumer() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = await EstablishConnectionAsync(testPeer); await connection.StartAsync(); testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); string topicName = "myTopic"; ITopic topic = await session.GetTopicAsync(topicName); string subscriptionName = "mySubscription"; testPeer.ExpectSharedDurableSubscriberAttach(topicName, subscriptionName); testPeer.ExpectLinkFlow(); IMessageConsumer durableConsumer = await session.CreateSharedDurableConsumerAsync(topic, subscriptionName, null); //, false); Assert.NotNull(durableConsumer, "MessageConsumer object was null"); testPeer.ExpectClose(); await connection.CloseAsync(); testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestCreateDurableConsumer() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = EstablishConnection(testPeer); connection.Start(); testPeer.ExpectBegin(); ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); string topicName = "myTopic"; ITopic topic = session.GetTopic(topicName); string subscriptionName = "mySubscription"; testPeer.ExpectDurableSubscriberAttach(topicName, subscriptionName); testPeer.ExpectLinkFlow(); IMessageConsumer durableConsumer = session.CreateDurableConsumer(topic, subscriptionName, null, false); Assert.NotNull(durableConsumer, "MessageConsumer object was null"); testPeer.ExpectClose(); connection.Close(); testPeer.WaitForAllMatchersToComplete(1000); } }
private void DoRemotelyCloseConsumerWithMessageListenerFiresNMSExceptionListenerTestImpl(Symbol errorType, string errorMessage) { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { ManualResetEvent consumerClosed = new ManualResetEvent(false); ManualResetEvent exceptionListenerFired = new ManualResetEvent(false); testPeer.ExpectSaslAnonymous(); testPeer.ExpectOpen(); testPeer.ExpectBegin(); NmsConnection connection = EstablishAnonymousConnection("failover.maxReconnectAttempts=1", testPeer); connection.ExceptionListener += exception => { exceptionListenerFired.Set(); }; Mock <INmsConnectionListener> connectionListener = new Mock <INmsConnectionListener>(); connectionListener .Setup(listener => listener.OnConsumerClosed(It.IsAny <IMessageConsumer>(), It.IsAny <Exception>())) .Callback(() => { consumerClosed.Set(); }); connection.AddConnectionListener(connectionListener.Object); testPeer.ExpectBegin(); testPeer.ExpectBegin(nextOutgoingId: 2); ISession session1 = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); ISession session2 = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); IQueue queue = session2.GetQueue("myQueue"); // Create a consumer, then remotely end it afterwards. testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectEnd(); testPeer.RemotelyDetachLastOpenedLinkOnLastOpenedSession(expectDetachResponse: true, closed: true, errorType: errorType, errorMessage: errorMessage, delayBeforeSend: 10); IMessageConsumer consumer = session2.CreateConsumer(queue); consumer.Listener += message => { }; // Close first session to allow the receiver remote close timing to be deterministic session1.Close(); // Verify the consumer gets marked closed testPeer.WaitForAllMatchersToComplete(1000); Assert.True(consumerClosed.WaitOne(TimeSpan.FromMilliseconds(2000)), "Consumer closed callback didn't trigger"); Assert.True(exceptionListenerFired.WaitOne(TimeSpan.FromMilliseconds(2000)), "NMS 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. consumer.Close(); // Shut the connection down testPeer.ExpectClose(); connection.Close(); testPeer.WaitForAllMatchersToComplete(1000); } }
public async Task TestMessageListenerClosesItsConsumer() { var latch = new ManualResetEvent(false); var exceptionListenerFired = new ManualResetEvent(false); using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = await EstablishConnectionAsync(testPeer); await connection.StartAsync(); connection.ExceptionListener += _ => exceptionListenerFired.Set(); testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); IQueue destination = await session.GetQueueAsync("myQueue"); await connection.StartAsync(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlowRespondWithTransfer(message: CreateMessageWithContent(), 1); IMessageConsumer consumer = await session.CreateConsumerAsync(destination); testPeer.ExpectLinkFlow(drain: true, sendDrainFlowResponse: true, creditMatcher: credit => Assert.AreEqual(99, credit)); // Not sure if expected credit is right testPeer.ExpectDispositionThatIsAcceptedAndSettled(); testPeer.ExpectDetach(expectClosed: true, sendResponse: true, replyClosed: true); Exception exception = null; consumer.Listener += message => { try { consumer.Close(); latch.Set(); } catch (Exception e) { exception = e; } }; Assert.True(latch.WaitOne(TimeSpan.FromMilliseconds(1000)), "Process not completed within given timeout"); Assert.IsNull(exception, "No error expected during close"); testPeer.WaitForAllMatchersToComplete(2000); testPeer.ExpectClose(); await connection.CloseAsync(); Assert.False(exceptionListenerFired.WaitOne(20), "Exception listener shouldn't have fired"); testPeer.WaitForAllMatchersToComplete(2000); } }
private async Task DoTestConsumerReceiveThrowsIfConnectionLost(bool useTimeout) { ManualResetEvent consumerReady = new ManualResetEvent(false); using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = await EstablishConnectionAsync(testPeer); testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); IQueue queue = await session.GetQueueAsync("queue"); await connection.StartAsync(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.RunAfterLastHandler(() => { consumerReady.WaitOne(2000); }); testPeer.DropAfterLastMatcher(delay: 10); IMessageConsumer consumer = await session.CreateConsumerAsync(queue); consumerReady.Set(); try { if (useTimeout) { await consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10_0000)); } else { await consumer.ReceiveAsync(); } Assert.Fail("An exception should have been thrown"); } catch (NMSException) { // Expected } testPeer.WaitForAllMatchersToComplete(1000); } }
public async Task TestUnsubscribeExclusiveDurableSubWhileActiveThenInactive() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = await EstablishConnectionAsync(testPeer); await connection.StartAsync(); testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); String topicName = "myTopic"; ITopic dest = await session.GetTopicAsync("myTopic"); String subscriptionName = "mySubscription"; // Attach the durable exclusive receiver testPeer.ExpectDurableSubscriberAttach(topicName: topicName, subscriptionName: subscriptionName); testPeer.ExpectLinkFlow(); IMessageConsumer consumer = await session.CreateDurableConsumerAsync(dest, subscriptionName, null, false); Assert.NotNull(consumer, "TopicSubscriber object was null"); // Now try to unsubscribe, should fail Assert.CatchAsync <NMSException>(async() => session.DeleteDurableConsumer(subscriptionName)); // Now close the subscriber testPeer.ExpectDetach(expectClosed: false, sendResponse: true, replyClosed: false); await consumer.CloseAsync(); // Try to unsubscribe again, should work now testPeer.ExpectDurableSubUnsubscribeNullSourceLookup(failLookup: false, shared: false, subscriptionName: subscriptionName, topicName: topicName, hasClientId: true); testPeer.ExpectDetach(expectClosed: true, sendResponse: true, replyClosed: true); session.DeleteDurableConsumer(subscriptionName); testPeer.WaitForAllMatchersToComplete(1000); testPeer.ExpectClose(); await connection.CloseAsync(); testPeer.WaitForAllMatchersToComplete(1000); } }
private void DoTestConsumerReceiveThrowsIfConnectionLost(bool useTimeout) { ManualResetEvent consumerReady = new ManualResetEvent(false); using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = EstablishConnection(testPeer); testPeer.ExpectBegin(); ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); IQueue queue = session.GetQueue("queue"); connection.Start(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.RunAfterLastHandler(() => { consumerReady.WaitOne(2000); }); testPeer.RemotelyCloseConnection(expectCloseResponse: true); IMessageConsumer consumer = session.CreateConsumer(queue); consumerReady.Set(); try { if (useTimeout) { consumer.Receive(TimeSpan.FromMilliseconds(10_0000)); } else { consumer.Receive(); } Assert.Fail("An exception should have been thrown"); } catch (NMSException) { // Expected } testPeer.WaitForAllMatchersToComplete(1000); } }
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 } } }
private void DoTestConsumerReceiveThrowsIfConnectionLost(bool useTimeout) { ManualResetEvent consumerReady = new ManualResetEvent(false); using (TestAmqpPeer testPeer = new TestAmqpPeer()) { var context = EstablishNMSContext(testPeer); testPeer.ExpectBegin(); IQueue queue = context.GetQueue("queue"); context.Start(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.RunAfterLastHandler(() => { consumerReady.WaitOne(2000); }); testPeer.DropAfterLastMatcher(delay: 10); var consumer = context.CreateConsumer(queue); consumerReady.Set(); try { if (useTimeout) { consumer.Receive(TimeSpan.FromMilliseconds(10_0000)); } else { consumer.Receive(); } Assert.Fail("An exception should have been thrown"); } catch (NMSException) { // Expected } testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestCreateConsumer() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { var context = EstablishNMSContext(testPeer); context.Start(); testPeer.ExpectBegin(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.ExpectEnd(); testPeer.ExpectClose(); var consumer = context.CreateConsumer(context.GetQueue("myQueue")); context.Close(); testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestCloseConsumer() { using (TestAmqpPeer testPeer = new TestAmqpPeer()) { var context = EstablishNMSContext(testPeer); testPeer.ExpectBegin(); testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); IQueue queue = context.GetQueue("myQueue"); var consumer = context.CreateConsumer(queue); testPeer.ExpectDetach(expectClosed: true, sendResponse: true, replyClosed: true); consumer.Close(); testPeer.ExpectEnd(); testPeer.ExpectClose(); context.Close(); testPeer.WaitForAllMatchersToComplete(1000); } }
public void TestCreateConsumerAfterConnectionDrops() { using (TestAmqpPeer originalPeer = new TestAmqpPeer()) using (TestAmqpPeer finalPeer = new TestAmqpPeer()) { ManualResetEvent originalConnected = new ManualResetEvent(false); ManualResetEvent finalConnected = new ManualResetEvent(false); // Create a peer to connect to, then one to reconnect to var originalUri = CreatePeerUri(originalPeer); var finalUri = CreatePeerUri(finalPeer); // Connect to the first peer originalPeer.ExpectSaslAnonymous(); originalPeer.ExpectOpen(); originalPeer.ExpectBegin(); originalPeer.ExpectBegin(); originalPeer.DropAfterLastMatcher(); NmsConnection connection = EstablishAnonymousConnection(originalPeer, finalPeer); Mock <INmsConnectionListener> connectionListener = new Mock <INmsConnectionListener>(); connectionListener .Setup(listener => listener.OnConnectionEstablished(It.Is <Uri>(uri => originalUri == uri.ToString()))) .Callback(() => { originalConnected.Set(); }); connectionListener .Setup(listener => listener.OnConnectionRestored(It.Is <Uri>(uri => finalUri == uri.ToString()))) .Callback(() => { finalConnected.Set(); }); connection.AddConnectionListener(connectionListener.Object); connection.Start(); Assert.True(originalConnected.WaitOne(TimeSpan.FromSeconds(5)), "Should connect to original peer"); // Post Failover Expectations of FinalPeer finalPeer.ExpectSaslAnonymous(); finalPeer.ExpectOpen(); finalPeer.ExpectBegin(); finalPeer.ExpectBegin(); finalPeer.ExpectReceiverAttach(); finalPeer.ExpectLinkFlow(drain: false, sendDrainFlowResponse: false, creditMatcher: credit => Assert.AreEqual(credit, 200)); finalPeer.ExpectDetach(expectClosed: true, sendResponse: true, replyClosed: true); finalPeer.ExpectClose(); ISession session = connection.CreateSession(); IQueue queue = session.GetQueue("myQueue"); IMessageConsumer consumer = session.CreateConsumer(queue); Assert.IsNull(consumer.Receive(TimeSpan.FromMilliseconds(500))); Assert.True(finalConnected.WaitOne(TimeSpan.FromSeconds(5)), "Should connect to final peer"); consumer.Close(); // Shut it down connection.Close(); finalPeer.WaitForAllMatchersToComplete(1000); } }
public async Task TestRemotelyEndConnectionWithSessionWithConsumer() { string errorMessage = "buba"; using (TestAmqpPeer testPeer = new TestAmqpPeer()) { IConnection connection = await EstablishConnectionAsync(testPeer); testPeer.ExpectBegin(); ISession session = await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); // Create a consumer, then remotely end the connection afterwards. testPeer.ExpectReceiverAttach(); testPeer.ExpectLinkFlow(); testPeer.RemotelyCloseConnection(expectCloseResponse: true, errorCondition: AmqpError.RESOURCE_LIMIT_EXCEEDED, errorMessage: errorMessage); IQueue queue = await session.GetQueueAsync("myQueue"); IMessageConsumer consumer = await session.CreateConsumerAsync(queue); Assert.That(() => ((NmsConnection)connection).IsConnected, Is.False.After(10_000, 100), "Connection never closes."); try { await connection.CreateSessionAsync(AcknowledgementMode.AutoAcknowledge); Assert.Fail("Expected ISE to be thrown due to being closed"); } catch (NMSConnectionException e) { Assert.True(e.ToString().Contains(AmqpError.RESOURCE_LIMIT_EXCEEDED)); Assert.True(e.ToString().Contains(errorMessage)); } // Verify the session is now marked closed try { var _ = session.AcknowledgementMode; Assert.Fail("Expected ISE to be thrown due to being closed"); } catch (IllegalStateException e) { Assert.True(e.ToString().Contains(AmqpError.RESOURCE_LIMIT_EXCEEDED)); Assert.True(e.ToString().Contains(errorMessage)); } // Verify the consumer is now marked closed try { consumer.Listener += message => { }; } catch (IllegalStateException e) { Assert.True(e.ToString().Contains(AmqpError.RESOURCE_LIMIT_EXCEEDED)); Assert.True(e.ToString().Contains(errorMessage)); } // Try closing them explicitly, should effectively no-op in client. // The test peer will throw during close if it sends anything. await consumer.CloseAsync(); await session.CloseAsync(); await connection.CloseAsync(); } }