use of org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger in project qpid-broker-j by apache.
the class FlowTest method asynchronousNotification.
@Test
@SpecificationTest(section = "2.6.9", description = "Asynchronous notification can be accomplished as follows." + " The receiver maintains a target amount of link-credit for that link." + " As transfer arrive on the link, the sender’s link-credit decreases" + " as the delivery-count increases. When the sender’s link-credit falls below a threshold," + " the flow state MAY be sent to increase the sender’s link-credit back" + " to the desired target amount.")
public void asynchronousNotification() throws Exception {
BrokerAdmin brokerAdmin = getBrokerAdmin();
brokerAdmin.createQueue(BrokerAdmin.TEST_QUEUE_NAME);
String messageContent1 = "Test1";
String messageContent2 = "Test2";
String messageContent3 = "Test2";
brokerAdmin.putMessageOnQueue(BrokerAdmin.TEST_QUEUE_NAME, messageContent1);
brokerAdmin.putMessageOnQueue(BrokerAdmin.TEST_QUEUE_NAME, messageContent2);
brokerAdmin.putMessageOnQueue(BrokerAdmin.TEST_QUEUE_NAME, messageContent3);
final InetSocketAddress addr = brokerAdmin.getBrokerAddress(BrokerAdmin.PortType.ANONYMOUS_AMQP);
try (FrameTransport transport = new FrameTransport(addr).connect()) {
Interaction interaction = transport.newInteraction().negotiateProtocol().consumeResponse().open().consumeResponse(Open.class).begin().consumeResponse(Begin.class).attachRole(Role.RECEIVER).attachSourceAddress(BrokerAdmin.TEST_QUEUE_NAME).attach().consumeResponse(Attach.class);
Attach remoteAttach = interaction.getLatestResponse(Attach.class);
UnsignedInteger remoteHandle = remoteAttach.getHandle();
assertThat(remoteHandle, is(notNullValue()));
UnsignedInteger delta = UnsignedInteger.ONE;
UnsignedInteger incomingWindow = UnsignedInteger.valueOf(3);
Object receivedMessageContent1 = interaction.flowIncomingWindow(incomingWindow).flowNextIncomingId(UnsignedInteger.ZERO).flowLinkCredit(delta).flowHandleFromLinkHandle().flow().receiveDelivery().decodeLatestDelivery().getDecodedLatestDelivery();
assertThat(receivedMessageContent1, is(equalTo(messageContent1)));
assertThat(interaction.getLatestDeliveryId(), is(equalTo(UnsignedInteger.ZERO)));
Object receivedMessageContent2 = interaction.flowIncomingWindow(incomingWindow).flowNextIncomingId(UnsignedInteger.ONE).flowLinkCredit(delta).flowHandleFromLinkHandle().flow().receiveDelivery().decodeLatestDelivery().getDecodedLatestDelivery();
assertThat(receivedMessageContent2, is(equalTo(messageContent2)));
assertThat(interaction.getLatestDeliveryId(), is(equalTo(UnsignedInteger.ONE)));
// send session flow with echo=true to verify that no message is delivered without issuing a credit
Flow responseFlow = interaction.flowNextIncomingId(UnsignedInteger.valueOf(2)).flowLinkCredit(null).flowHandle(null).flowEcho(Boolean.TRUE).flow().consumeResponse().getLatestResponse(Flow.class);
assertThat(responseFlow.getHandle(), is(nullValue()));
}
}
use of org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger in project qpid-broker-j by apache.
the class ResumeDeliveriesTest method resumeSendingLinkWithIncompleteUnsettled.
@Ignore("QPID-7845")
@Test
@SpecificationTest(section = "2.7.3", description = "If the local unsettled map is too large to be encoded within a frame of the agreed maximum" + " frame size then the session MAY be ended with the frame-size-too-small error. The" + " endpoint SHOULD make use of the ability to send an incomplete unsettled map (see below)" + " to avoid sending an error.")
public void resumeSendingLinkWithIncompleteUnsettled() throws Exception {
final String destination = BrokerAdmin.TEST_QUEUE_NAME;
try (FrameTransport transport = new FrameTransport(_brokerAddress).connect()) {
final Interaction interaction = transport.newInteraction();
interaction.negotiateProtocol().consumeResponse();
// 0. Open connection with small max-frame-size
final Open open = interaction.openMaxFrameSize(UnsignedInteger.valueOf(MIN_MAX_FRAME_SIZE)).open().consumeResponse().getLatestResponse(Open.class);
interaction.begin().consumeResponse(Begin.class);
// 1. attach with ReceiverSettleMode.SECOND
final UnsignedInteger linkHandle1 = UnsignedInteger.ZERO;
interaction.attachHandle(linkHandle1).attachRole(Role.SENDER).attachRcvSettleMode(ReceiverSettleMode.SECOND).attachTargetAddress(destination).attach().consumeResponse(Attach.class).consumeResponse(Flow.class);
// 2. send enough unsettled deliveries to cause incomplete-unsettled to be true
// assume each delivery requires at least 1 byte, therefore max-frame-size deliveries should be enough
interaction.transferHandle(linkHandle1).transferPayloadData(TEST_MESSAGE_CONTENT);
Map<Binary, DeliveryState> localUnsettled = new HashMap<>(open.getMaxFrameSize().intValue());
for (int i = 0; i < open.getMaxFrameSize().intValue(); ++i) {
final Binary deliveryTag = new Binary(String.valueOf(i).getBytes(StandardCharsets.UTF_8));
final Disposition responseDisposition = interaction.transferDeliveryId(UnsignedInteger.valueOf(i)).transferDeliveryTag(deliveryTag).transfer().consumeResponse(Disposition.class).getLatestResponse(Disposition.class);
assertThat(responseDisposition.getRole(), is(Role.RECEIVER));
assertThat(responseDisposition.getSettled(), is(Boolean.FALSE));
localUnsettled.put(deliveryTag, null);
}
// 3. detach the link
interaction.detach().consumeResponse(Detach.class);
// 4. resume the link
final UnsignedInteger linkHandle2 = UnsignedInteger.ONE;
final Binary sampleLocalUnsettled = localUnsettled.keySet().iterator().next();
Map<Binary, DeliveryState> unsettled = Collections.singletonMap(sampleLocalUnsettled, localUnsettled.get(sampleLocalUnsettled));
final Response<?> latestResponse = interaction.attachHandle(linkHandle2).attachUnsettled(unsettled).attachIncompleteUnsettled(true).attach().consumeResponse(End.class, Attach.class).getLatestResponse();
if (latestResponse.getBody() instanceof End) {
// 5.a assert session end error
final End responseEnd = (End) latestResponse.getBody();
final Error error = responseEnd.getError();
assertThat(error, is(notNullValue()));
assertThat(error.getCondition().getValue(), is(equalTo(AmqpError.FRAME_SIZE_TOO_SMALL)));
assumeTrue("Broker does not support incomplete unsettled", false);
} else if (latestResponse.getBody() instanceof Attach) {
// 5.b assert content of unsettled map
final Attach responseAttach2 = (Attach) latestResponse.getBody();
assertThat(responseAttach2.getTarget(), is(notNullValue()));
final Map<Binary, DeliveryState> remoteUnsettled = responseAttach2.getUnsettled();
assertThat(remoteUnsettled, is(notNullValue()));
assertThat(remoteUnsettled.keySet(), is(not(empty())));
for (Binary deliveryTag : remoteUnsettled.keySet()) {
assertThat(deliveryTag, isIn(localUnsettled.keySet()));
}
assertThat(responseAttach2.getIncompleteUnsettled(), is(equalTo(true)));
} else {
fail(String.format("Unexpected response. Expected End or Attach. Got '%s'.", latestResponse.getBody()));
}
}
}
use of org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger in project qpid-broker-j by apache.
the class ResumeDeliveriesTest method incompleteUnsettledReceiving.
@Ignore("QPID-7845")
@Test
@SpecificationTest(section = "2.7.3", description = "If set to true [incomplete-unsettled] indicates that the unsettled map provided is not complete. " + "When the map is incomplete the recipient of the map cannot take the absence of a delivery tag from " + "the map as evidence of settlement. On receipt of an incomplete unsettled map a sending endpoint MUST " + "NOT send any new deliveries (i.e. deliveries where resume is not set to true) to its partner (and " + "a receiving endpoint which sent an incomplete unsettled map MUST detach with an error on " + "receiving a transfer which does not have the resume flag set to true).")
public void incompleteUnsettledReceiving() throws Exception {
for (int i = 0; i < MIN_MAX_FRAME_SIZE; i++) {
getBrokerAdmin().putMessageOnQueue(BrokerAdmin.TEST_QUEUE_NAME, TEST_MESSAGE_CONTENT + "-" + i);
}
final InetSocketAddress addr = getBrokerAdmin().getBrokerAddress(BrokerAdmin.PortType.ANONYMOUS_AMQP);
try (FrameTransport transport = new FrameTransport(addr).connect()) {
// 1. open with small max-frame=512, begin, attach receiver with
// with rcv-settle-mode=second, snd-settle-mode=unsettled,
// flow with incoming-window=MAX_INTEGER and link-credit=MAX_INTEGER
final Interaction interaction = transport.newInteraction();
interaction.negotiateProtocol().consumeResponse().openMaxFrameSize(UnsignedInteger.valueOf(MIN_MAX_FRAME_SIZE)).open().consumeResponse().begin().consumeResponse(Begin.class).attachRole(Role.RECEIVER).attachRcvSettleMode(ReceiverSettleMode.SECOND).attachSndSettleMode(SenderSettleMode.UNSETTLED).attachSourceAddress(BrokerAdmin.TEST_QUEUE_NAME).attach().consumeResponse(Attach.class);
Attach attach = interaction.getLatestResponse(Attach.class);
assumeThat(attach.getSndSettleMode(), is(equalTo(SenderSettleMode.UNSETTLED)));
interaction.flowIncomingWindow(UnsignedInteger.valueOf(Integer.MAX_VALUE)).flowLinkCredit(UnsignedInteger.valueOf(Integer.MAX_VALUE)).flowHandleFromLinkHandle().flow();
// 2. Receive transfers
final Map<Binary, DeliveryState> localUnsettled = new HashMap<>();
for (int i = 0; i < MIN_MAX_FRAME_SIZE; ) {
Response<?> response = interaction.consumeResponse().getLatestResponse();
if (response.getBody() instanceof Transfer) {
assertThat(response.getBody(), Matchers.is(instanceOf(Transfer.class)));
Transfer responseTransfer = (Transfer) response.getBody();
assertThat(responseTransfer.getMore(), is(not(equalTo(true))));
assertThat(responseTransfer.getSettled(), is(not(equalTo(true))));
localUnsettled.putIfAbsent(responseTransfer.getDeliveryTag(), responseTransfer.getState());
i++;
} else if (response.getBody() instanceof Flow || response.getBody() instanceof Disposition) {
// ignore
} else {
fail("Unexpected frame " + response.getBody());
}
}
// 3. detach the link
interaction.detach().consumeResponse(Detach.class);
// 4. resume the link
final Binary sampleLocalUnsettled = localUnsettled.keySet().iterator().next();
Map<Binary, DeliveryState> unsettled = Collections.singletonMap(sampleLocalUnsettled, localUnsettled.get(sampleLocalUnsettled));
final UnsignedInteger linkHandle2 = UnsignedInteger.ONE;
Response<?> latestResponse = interaction.attachHandle(linkHandle2).attachUnsettled(unsettled).attachIncompleteUnsettled(true).attach().consumeResponse(End.class, Attach.class).getLatestResponse();
assumeThat(latestResponse.getBody(), is(instanceOf(Attach.class)));
final Attach resumingAttach = (Attach) latestResponse.getBody();
final Map<Binary, DeliveryState> remoteUnsettled = resumingAttach.getUnsettled();
assertThat(remoteUnsettled, is(notNullValue()));
assertThat(remoteUnsettled.keySet(), is(not(empty())));
for (Binary deliveryTag : remoteUnsettled.keySet()) {
assertThat(deliveryTag, isIn(localUnsettled.keySet()));
}
assertThat(resumingAttach.getIncompleteUnsettled(), is(equalTo(true)));
interaction.flowHandle(linkHandle2).flow();
boolean received = false;
while (!received) {
Response<?> nextResponse = interaction.consumeResponse().getLatestResponse();
assertThat(nextResponse, is(notNullValue()));
if (nextResponse.getBody() instanceof Transfer) {
assertThat(nextResponse.getBody(), is(instanceOf(Transfer.class)));
Transfer responseTransfer = (Transfer) nextResponse.getBody();
assertThat(responseTransfer.getMore(), is(not(equalTo(true))));
assertThat(responseTransfer.getSettled(), is(not(equalTo(true))));
assertThat(responseTransfer.getDeliveryTag(), is(equalTo(sampleLocalUnsettled)));
received = true;
} else if (nextResponse.getBody() instanceof Flow || nextResponse.getBody() instanceof Disposition) {
// ignore
} else {
fail("Unexpected frame " + nextResponse.getBody());
}
}
interaction.doCloseConnection();
}
}
use of org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger in project qpid-broker-j by apache.
the class Interaction method createTransactionTransfer.
private Transfer createTransactionTransfer(final UnsignedInteger handle) {
Transfer transfer = new Transfer();
transfer.setHandle(handle);
transfer.setDeliveryId(getNextDeliveryId());
transfer.setDeliveryTag(new Binary(("transaction-" + transfer.getDeliveryId()).getBytes(StandardCharsets.UTF_8)));
return transfer;
}
use of org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger in project qpid-broker-j by apache.
the class ResumeDeliveriesTest method resumeSendingLinkSinglePartialDelivery.
@Ignore("QPID-7845")
@Test
@SpecificationTest(section = "2.6.13", description = "When a suspended link having unsettled deliveries is resumed, the unsettled field from the" + " attach frame will carry the delivery-tags and delivery state of all deliveries" + " considered unsettled by the issuing link endpoint.")
public void resumeSendingLinkSinglePartialDelivery() throws Exception {
final String destination = BrokerAdmin.TEST_QUEUE_NAME;
final Binary deliveryTag = new Binary("testDeliveryTag".getBytes(StandardCharsets.UTF_8));
QpidByteBuffer[] messagePayload = Utils.splitPayload("testData1", 2);
try (FrameTransport transport = new FrameTransport(_brokerAddress).connect()) {
final UnsignedInteger linkHandle1 = UnsignedInteger.ZERO;
final Interaction interaction = transport.newInteraction();
interaction.negotiateProtocol().consumeResponse().open().consumeResponse(Open.class).begin().consumeResponse(Begin.class);
// 1. attach with ReceiverSettleMode.SECOND
interaction.attachHandle(linkHandle1).attachRole(Role.SENDER).attachTargetAddress(destination).attach().consumeResponse(Attach.class).consumeResponse(Flow.class);
// 2. send a partial delivery
interaction.transferHandle(linkHandle1).transferDeliveryId(UnsignedInteger.ZERO).transferDeliveryTag(deliveryTag).transferMore(true).transferPayload(messagePayload[0]).transfer();
// 3. detach the link
interaction.detach().consumeResponse(Detach.class);
// 4. resume the link
final UnsignedInteger linkHandle2 = UnsignedInteger.ONE;
final Attach responseAttach2 = interaction.attachHandle(linkHandle2).attachUnsettled(Collections.singletonMap(deliveryTag, null)).attach().consumeResponse().getLatestResponse(Attach.class);
// 5. assert content of unsettled map
assertThat(responseAttach2.getTarget(), is(notNullValue()));
final Map<Binary, DeliveryState> remoteUnsettled = responseAttach2.getUnsettled();
assertThat(remoteUnsettled, is(notNullValue()));
assertThat(remoteUnsettled.keySet(), is(equalTo(Collections.singleton(deliveryTag))));
interaction.transferHandle(linkHandle2).transferResume(true).transfer().sync().transferMore(false).transferPayload(messagePayload[1]).transfer();
for (final QpidByteBuffer payload : messagePayload) {
payload.dispose();
}
boolean settled = false;
do {
interaction.consumeResponse();
Response<?> response = interaction.getLatestResponse();
assertThat(response, is(notNullValue()));
Object body = response.getBody();
if (body instanceof Disposition) {
Disposition disposition = (Disposition) body;
assertThat(disposition.getSettled(), is(Matchers.equalTo(true)));
assertThat(disposition.getFirst(), equalTo(UnsignedInteger.ZERO));
settled = true;
} else if (!(body instanceof Flow)) {
fail("Unexpected response " + body);
}
} while (!settled);
interaction.doCloseConnection();
}
}
Aggregations