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 0aa4976 PROTON-2393 Populate the delivery tag of scripted remote transfers 0aa4976 is described below commit 0aa4976e6df4f8d4571e812a5c11b017cb538b44 Author: Timothy Bish <tabish...@gmail.com> AuthorDate: Thu Jun 3 18:15:27 2021 -0400 PROTON-2393 Populate the delivery tag of scripted remote transfers When a remote transfer is scripted auto-fill the delivery tag unless told otherwise by the test script. Add a few additional APIs for scripting expectations as well. --- .../protonj2/client/impl/StreamReceiverTest.java | 2 +- .../test/driver/actions/TransferInjectAction.java | 38 +++++++++++++++++ .../driver/expectations/TransferExpectation.java | 8 ++++ .../protonj2/test/driver/SenderHandlingTest.java | 47 ++++++++++++++++++++++ 4 files changed, 94 insertions(+), 1 deletion(-) diff --git a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/StreamReceiverTest.java b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/StreamReceiverTest.java index aabfc12..1c1560f 100644 --- a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/StreamReceiverTest.java +++ b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/StreamReceiverTest.java @@ -634,7 +634,7 @@ class StreamReceiverTest extends ImperativeClientTestCase { peer.remoteTransfer().withHandle(0) .withDeliveryId(0) - .withDeliveryTag(new byte[] { 1 }) + .withNullDeliveryTag() .withMore(false) .withMessageFormat(0) .withPayload(payload).now(); diff --git a/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/actions/TransferInjectAction.java b/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/actions/TransferInjectAction.java index 4024d81..644975c 100644 --- a/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/actions/TransferInjectAction.java +++ b/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/actions/TransferInjectAction.java @@ -18,6 +18,7 @@ package org.apache.qpid.protonj2.test.driver.actions; import java.util.Date; import java.util.List; +import java.util.UUID; import org.apache.qpid.protonj2.test.driver.AMQPTestDriver; import org.apache.qpid.protonj2.test.driver.SessionTracker; @@ -68,6 +69,8 @@ public class TransferInjectAction extends AbstractPerformativeInjectAction<Trans private DescribedType body; private Footer footer; + private boolean explicitlyNullDeliveryTag; + public TransferInjectAction(AMQPTestDriver driver) { super(driver); } @@ -101,6 +104,10 @@ public class TransferInjectAction extends AbstractPerformativeInjectAction<Trans final SessionTracker session = driver.sessions().getSessionFromLocalChannel(UnsignedShort.valueOf(onChannel())); + if (transfer.getDeliveryTag() == null && !explicitlyNullDeliveryTag) { + transfer.setDeliveryTag(new Binary(generateUniqueDeliveryTag())); + } + // A test might be trying to send Transfer outside of session scope to check for error handling // of unexpected performatives so we just allow no session cases and send what we are told. if (session != null) { @@ -128,15 +135,23 @@ public class TransferInjectAction extends AbstractPerformativeInjectAction<Trans } public TransferInjectAction withDeliveryTag(byte[] deliveryTag) { + explicitlyNullDeliveryTag = deliveryTag == null; transfer.setDeliveryTag(new Binary(deliveryTag)); return this; } public TransferInjectAction withDeliveryTag(Binary deliveryTag) { + explicitlyNullDeliveryTag = deliveryTag == null; transfer.setDeliveryTag(deliveryTag); return this; } + public TransferInjectAction withNullDeliveryTag() { + explicitlyNullDeliveryTag = true; + transfer.setDeliveryTag(null); + return this; + } + public TransferInjectAction withMessageFormat(int messageFormat) { transfer.setMessageFormat(UnsignedInteger.valueOf(messageFormat)); return this; @@ -612,4 +627,27 @@ public class TransferInjectAction extends AbstractPerformativeInjectAction<Trans return this; } } + + private static byte[] generateUniqueDeliveryTag() { + final byte[] tag = new byte[Long.BYTES + Long.BYTES]; + final UUID uuid = UUID.randomUUID(); + + writeLong(uuid.getMostSignificantBits(), tag, 0); + writeLong(uuid.getLeastSignificantBits(), tag, Long.BYTES); + + return tag; + } + + private static byte[] writeLong(long value, byte[] destination, int offset) { + destination[offset++] = (byte) (value >>> 56); + destination[offset++] = (byte) (value >>> 48); + destination[offset++] = (byte) (value >>> 40); + destination[offset++] = (byte) (value >>> 32); + destination[offset++] = (byte) (value >>> 24); + destination[offset++] = (byte) (value >>> 16); + destination[offset++] = (byte) (value >>> 8); + destination[offset++] = (byte) (value >>> 0); + + return destination; + } } diff --git a/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/expectations/TransferExpectation.java b/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/expectations/TransferExpectation.java index 2e95937..7f8c729 100644 --- a/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/expectations/TransferExpectation.java +++ b/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/expectations/TransferExpectation.java @@ -197,6 +197,14 @@ public class TransferExpectation extends AbstractExpectation<Transfer> { return withDeliveryTag(equalTo(deliveryTag)); } + public TransferExpectation withNonNullDeliveryTag() { + return withDeliveryTag(notNullValue()); + } + + public TransferExpectation withNullDeliveryTag() { + return withDeliveryTag(nullValue()); + } + public TransferExpectation withMessageFormat(int messageFormat) { return withMessageFormat(equalTo(UnsignedInteger.valueOf(messageFormat))); } diff --git a/protonj2-test-driver/src/test/java/org/apache/qpid/protonj2/test/driver/SenderHandlingTest.java b/protonj2-test-driver/src/test/java/org/apache/qpid/protonj2/test/driver/SenderHandlingTest.java index 32b1a16..f28cd8e 100644 --- a/protonj2-test-driver/src/test/java/org/apache/qpid/protonj2/test/driver/SenderHandlingTest.java +++ b/protonj2-test-driver/src/test/java/org/apache/qpid/protonj2/test/driver/SenderHandlingTest.java @@ -341,4 +341,51 @@ class SenderHandlingTest extends TestPeerTestsBase { assertThrows(AssertionError.class, () -> peer.waitForScriptToComplete(5, TimeUnit.SECONDS)); } } + + @Test + public void testTransferAutoPopulatesDeliveryTagAndHandleFromLastOpenedLink() throws Exception { + try (ProtonTestServer peer = new ProtonTestServer(); + ProtonTestClient client = new ProtonTestClient()) { + + peer.expectAMQPHeader().respondWithAMQPHeader(); + peer.expectOpen().respond(); + peer.expectBegin().respond(); + peer.expectAttach().ofSender().respond().withHandle(42); + peer.remoteFlow().withLinkCredit(1).queue(); + peer.expectTransfer().withHandle(2) + .withDeliveryId(0) + .withNonNullDeliveryTag() + .withNonNullPayload(); + peer.expectDetach().respond(); + peer.expectEnd().respond(); + peer.start(); + + URI remoteURI = peer.getServerURI(); + + LOG.info("Test started, peer listening on: {}", remoteURI); + + client.connect(remoteURI.getHost(), remoteURI.getPort()); + client.expectAMQPHeader(); + client.expectOpen(); + client.expectBegin(); + client.expectAttach().ofReceiver().withHandle(42); + client.expectFlow().withLinkCredit(1).withHandle(42); + client.remoteTransfer().withDeliveryId(0).withPayload(new byte[] {0}).queue(); + // Now start and then await the remote grant of credit and out send of a transfer + client.remoteHeader(AMQPHeader.getAMQPHeader()).now(); + client.remoteOpen().now(); + client.remoteBegin().now(); + client.remoteAttach().ofSender().withHandle(2).now(); + + client.waitForScriptToComplete(5, TimeUnit.SECONDS); + client.expectDetach().withHandle(42); + client.expectEnd(); + + client.remoteDetach().now(); + client.remoteEnd().now(); + + client.waitForScriptToComplete(5, TimeUnit.SECONDS); + peer.waitForScriptToComplete(5, TimeUnit.SECONDS); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org