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 3593a3fc PROTON-2804 Send half the idle timeout value in 
ConnectionOptions
3593a3fc is described below

commit 3593a3fc679fd2f210754ae4659ea2b5b2accdff
Author: Timothy Bish <[email protected]>
AuthorDate: Thu Mar 14 15:51:39 2024 -0400

    PROTON-2804 Send half the idle timeout value in ConnectionOptions
    
    The ConnectionOptions API docs state the idle timeout value will be
    halved when sent in the open frame but this is not being done currently.
    Fix and test this to ensure it is handled and check the range as the
    value is a UInt ranged setting.
---
 .../qpid/protonj2/client/ConnectionOptions.java    |  3 +-
 .../protonj2/client/impl/ClientConnection.java     |  2 +-
 .../protonj2/client/ConnectionOptionsTest.java     |  9 +++++
 .../qpid/protonj2/client/impl/ConnectionTest.java  | 38 ++++++++++++++++++++++
 4 files changed, 50 insertions(+), 2 deletions(-)

diff --git 
a/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/ConnectionOptions.java
 
b/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/ConnectionOptions.java
index c37e2990..04428410 100644
--- 
a/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/ConnectionOptions.java
+++ 
b/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/ConnectionOptions.java
@@ -26,6 +26,7 @@ import java.util.function.BiConsumer;
 
 import 
org.apache.qpid.protonj2.client.exceptions.ClientOperationTimedOutException;
 import org.apache.qpid.protonj2.client.exceptions.ClientSendTimedOutException;
+import org.apache.qpid.protonj2.types.UnsignedInteger;
 import org.apache.qpid.protonj2.types.transport.Open;
 
 /**
@@ -388,7 +389,7 @@ public class ConnectionOptions implements Cloneable {
      * @return this {@link ConnectionOptions} instance.
      */
     public ConnectionOptions idleTimeout(long timeout, TimeUnit units) {
-        this.idleTimeout = units.toMillis(timeout);
+        this.idleTimeout = 
UnsignedInteger.valueOf(units.toMillis(timeout)).longValue();;
         return this;
     }
 
diff --git 
a/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/impl/ClientConnection.java
 
b/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/impl/ClientConnection.java
index 97ae1d67..a3057e51 100644
--- 
a/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/impl/ClientConnection.java
+++ 
b/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/impl/ClientConnection.java
@@ -895,7 +895,7 @@ public final class ClientConnection implements Connection {
         protonConnection.setLinkedResource(this);
         protonConnection.setChannelMax(options.channelMax());
         protonConnection.setMaxFrameSize(options.maxFrameSize());
-        protonConnection.setIdleTimeout((int) options.idleTimeout());
+        protonConnection.setIdleTimeout(options.idleTimeout() / 2);
         
protonConnection.setOfferedCapabilities(ClientConversionSupport.toSymbolArray(options.offeredCapabilities()));
         
protonConnection.setDesiredCapabilities(ClientConversionSupport.toSymbolArray(options.desiredCapabilities()));
         
protonConnection.setProperties(ClientConversionSupport.toSymbolKeyedMap(options.properties()));
diff --git 
a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/ConnectionOptionsTest.java
 
b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/ConnectionOptionsTest.java
index 3edda0c5..3b6f7af8 100644
--- 
a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/ConnectionOptionsTest.java
+++ 
b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/ConnectionOptionsTest.java
@@ -20,10 +20,12 @@ import static 
org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotSame;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.qpid.protonj2.types.UnsignedInteger;
 import org.junit.jupiter.api.Test;
 
 public class ConnectionOptionsTest {
@@ -37,6 +39,13 @@ public class ConnectionOptionsTest {
         assertNull(options.virtualHost());
     }
 
+    @Test
+    public void testSetIdleTimeoutValidesUIntRange() {
+        ConnectionOptions options = new ConnectionOptions();
+
+        assertThrows(NumberFormatException.class, () -> 
options.idleTimeout(UnsignedInteger.MAX_VALUE.longValue() + 1));
+    }
+
     @Test
     public void testCreateDefaultsTimeouts() {
         ConnectionOptions options = new ConnectionOptions();
diff --git 
a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/ConnectionTest.java
 
b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/ConnectionTest.java
index 44a69b9d..e6915238 100644
--- 
a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/ConnectionTest.java
+++ 
b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/ConnectionTest.java
@@ -58,6 +58,7 @@ import 
org.apache.qpid.protonj2.test.driver.codec.messaging.TerminusDurability;
 import 
org.apache.qpid.protonj2.test.driver.codec.messaging.TerminusExpiryPolicy;
 import org.apache.qpid.protonj2.test.driver.codec.security.SaslCode;
 import org.apache.qpid.protonj2.test.driver.matchers.messaging.SourceMatcher;
+import org.apache.qpid.protonj2.types.UnsignedInteger;
 import org.apache.qpid.protonj2.types.messaging.AmqpValue;
 import org.apache.qpid.protonj2.types.transport.AMQPHeader;
 import org.apache.qpid.protonj2.types.transport.AmqpError;
@@ -1827,6 +1828,43 @@ public class ConnectionTest extends 
ImperativeClientTestCase {
         }
     }
 
+    @Test
+    public void testCreateConnectionWithNoIdleTimeout() throws Exception {
+        doTestCreateConnectionWithIdleTimeoutSendsExpectedValue(0, 0);
+    }
+
+    @Test
+    public void testCreateConnectionWithHalfIdleTimeout() throws Exception {
+        doTestCreateConnectionWithIdleTimeoutSendsExpectedValue(10_000, 5_000);
+    }
+
+    @Test
+    public void testCreateConnectionWithHalfLargeIdleTimeout() throws 
Exception {
+        
doTestCreateConnectionWithIdleTimeoutSendsExpectedValue(UnsignedInteger.MAX_VALUE.longValue(),
 UnsignedInteger.MAX_VALUE.longValue() / 2);
+    }
+
+    private void doTestCreateConnectionWithIdleTimeoutSendsExpectedValue(long 
setValue, long expectedValue) throws Exception {
+        try (ProtonTestServer peer = new 
ProtonTestServer(testServerOptions())) {
+            peer.expectSASLAnonymousConnect();
+            peer.expectOpen().withIdleTimeOut(expectedValue).respond();
+            peer.expectClose().respond();
+            peer.start();
+
+            URI remoteURI = peer.getServerURI();
+
+            LOG.info("Connect test started, peer listening on: {}", remoteURI);
+
+            Client container = Client.create();
+            ConnectionOptions options = 
connectionOptions().idleTimeout(setValue);
+            Connection connection = container.connect(remoteURI.getHost(), 
remoteURI.getPort(), options);
+
+            connection.openFuture().get(10, TimeUnit.SECONDS);
+            connection.closeAsync().get(10, TimeUnit.SECONDS);
+
+            peer.waitForScriptToComplete(5, TimeUnit.SECONDS);
+        }
+    }
+
     @Disabled("Disabled due to requirement of hard coded port")
     @Test
     public void testLocalPortOption() throws Exception {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to