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

Reply via email to