This is an automated email from the ASF dual-hosted git repository. tabish pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-protonj2.git
The following commit(s) were added to refs/heads/main by this push: new 3af6e3f Add some tests that check open timeout propagates across reconnect 3af6e3f is described below commit 3af6e3fe25e2a0f5986b39fb459b90c590c8f7b8 Author: Timothy Bish <tabish...@gmail.com> AuthorDate: Thu Apr 29 13:02:52 2021 -0400 Add some tests that check open timeout propagates across reconnect Test that a session open that doesn't get a response prior to connection drop still enforces the open timeout after reconnection. --- .../protonj2/client/impl/ReconnectSessionTest.java | 74 +++++++++++++++++++++- .../test/driver/actions/ConnectionDropAction.java | 5 ++ 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/ReconnectSessionTest.java b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/ReconnectSessionTest.java index 64a471d..b8d60ef 100644 --- a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/ReconnectSessionTest.java +++ b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/ReconnectSessionTest.java @@ -17,19 +17,23 @@ package org.apache.qpid.protonj2.client.impl; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.fail; import java.net.URI; +import java.util.concurrent.TimeUnit; import org.apache.qpid.protonj2.client.Client; import org.apache.qpid.protonj2.client.Connection; import org.apache.qpid.protonj2.client.ConnectionOptions; import org.apache.qpid.protonj2.client.Receiver; import org.apache.qpid.protonj2.client.Session; +import org.apache.qpid.protonj2.client.SessionOptions; import org.apache.qpid.protonj2.client.test.ImperativeClientTestCase; import org.apache.qpid.protonj2.test.driver.ProtonTestServer; -import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Tests that validate client Session behavior after a client reconnection. @@ -37,6 +41,8 @@ import org.junit.jupiter.api.Timeout; @Timeout(20) class ReconnectSessionTest extends ImperativeClientTestCase { + private static final Logger LOG = LoggerFactory.getLogger(ReconnectSessionTest.class); + @Test public void testOpenedSessionRecoveredAfterConnectionDropped() throws Exception { try (ProtonTestServer firstPeer = new ProtonTestServer(); @@ -121,10 +127,10 @@ class ReconnectSessionTest extends ImperativeClientTestCase { } } - @RepeatedTest(10) + @Test public void testMultipleSessionCreationRecoversAfterDropWithNoBeginResponse() throws Exception { try (ProtonTestServer firstPeer = new ProtonTestServer(); - ProtonTestServer intermediatePeer = new ProtonTestServer(); + ProtonTestServer intermediatePeer = new ProtonTestServer(); ProtonTestServer finalPeer = new ProtonTestServer()) { firstPeer.expectSASLAnonymousConnect(); @@ -184,4 +190,66 @@ class ReconnectSessionTest extends ImperativeClientTestCase { finalPeer.waitForScriptToComplete(1000); } } + + @Test + public void testSessionOpenTimeoutWhenNoRemoteBeginArrivesTimeoutWithReconnection() throws Exception { + doTestSessionOpenTimeoutWhenNoRemoteBeginArrives(true); + } + + @Test + public void testSessionOpenTimeoutWhenNoRemoteBeginArrivesNoTimeoutWithReconnection() throws Exception { + doTestSessionOpenTimeoutWhenNoRemoteBeginArrives(false); + } + + /* + * Tests that session open timeout is preserved across reconnection boundaries + */ + private void doTestSessionOpenTimeoutWhenNoRemoteBeginArrives(boolean timeout) throws Exception { + try (ProtonTestServer firstPeer = new ProtonTestServer(); + ProtonTestServer finalPeer = new ProtonTestServer()) { + + firstPeer.expectSASLAnonymousConnect(); + firstPeer.expectOpen().respond(); + firstPeer.expectBegin(); + firstPeer.dropAfterLastHandler(); + firstPeer.start(); + + finalPeer.expectSASLAnonymousConnect(); + finalPeer.expectOpen().respond(); + finalPeer.expectBegin().optional(); // Might not arrive if timed out already + finalPeer.expectEnd().optional(); + finalPeer.expectClose().respond(); + finalPeer.start(); + + final URI firstURI = firstPeer.getServerURI(); + final URI finalURI = finalPeer.getServerURI(); + + LOG.info("Test started, peer listening on: {}", firstURI); + + ConnectionOptions options = new ConnectionOptions(); + options.reconnectOptions().reconnectEnabled(true); + options.reconnectOptions().addReconnectLocation(finalURI.getHost(), finalURI.getPort()); + + Client container = Client.create(); + Connection connection = container.connect(firstURI.getHost(), firstURI.getPort(), options); + Session session = connection.openSession(new SessionOptions().openTimeout(500)); + + try { + if (timeout) { + session.openFuture().get(500, TimeUnit.MILLISECONDS); + } else { + session.openFuture().get(); + } + + fail("Session Open should timeout when no Begin response and complete future with error."); + } catch (Throwable error) { + LOG.info("Session open failed with error: ", error); + } + + connection.closeAsync().get(); + + firstPeer.waitForScriptToComplete(5, TimeUnit.SECONDS); + finalPeer.waitForScriptToComplete(5, TimeUnit.SECONDS); + } + } } diff --git a/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/actions/ConnectionDropAction.java b/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/actions/ConnectionDropAction.java index 07686a0..45908f5 100644 --- a/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/actions/ConnectionDropAction.java +++ b/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/actions/ConnectionDropAction.java @@ -19,12 +19,16 @@ package org.apache.qpid.protonj2.test.driver.actions; import org.apache.qpid.protonj2.test.driver.AMQPTestDriver; import org.apache.qpid.protonj2.test.driver.ProtonTestPeer; import org.apache.qpid.protonj2.test.driver.ScriptedAction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Action that drops the netty connection to the remote once invoked. */ public class ConnectionDropAction implements ScriptedAction { + private static final Logger LOG = LoggerFactory.getLogger(ConnectionDropAction.class); + private final ProtonTestPeer peer; private int delay = -1; @@ -34,6 +38,7 @@ public class ConnectionDropAction implements ScriptedAction { @Override public ScriptedAction now() { + LOG.info("Connection Drop Action closing test peer as scripted"); peer.close(); return this; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org