use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow 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);
final String[] contents = Utils.createTestMessageContents(3, getTestName());
Utils.putMessageOnQueue(getBrokerAdmin(), BrokerAdmin.TEST_QUEUE_NAME, contents);
try (FrameTransport transport = new FrameTransport(getBrokerAdmin()).connect()) {
Interaction interaction = transport.newInteraction().negotiateOpen().begin().consumeResponse(Begin.class).attachRole(Role.RECEIVER).attachSourceAddress(BrokerAdmin.TEST_QUEUE_NAME).attach().consumeResponse(Attach.class);
UnsignedInteger delta = UnsignedInteger.ONE;
UnsignedInteger incomingWindow = UnsignedInteger.valueOf(3);
Object receivedMessageContent1 = interaction.flowIncomingWindow(incomingWindow).flowNextIncomingIdFromPeerLatestSessionBeginAndDeliveryCount().flowLinkCredit(delta).flowHandleFromLinkHandle().flowDeliveryCount().flowOutgoingWindow(UnsignedInteger.ZERO).flowNextOutgoingId(UnsignedInteger.ZERO).flow().receiveDelivery().decodeLatestDelivery().getDecodedLatestDelivery();
assertThat(receivedMessageContent1, is(equalTo(contents[0])));
UnsignedInteger firstDeliveryId = interaction.getLatestDeliveryId();
Object receivedMessageContent2 = interaction.flowIncomingWindow(incomingWindow).flowNextIncomingIdFromPeerLatestSessionBeginAndDeliveryCount().flowLinkCredit(delta).flowHandleFromLinkHandle().flowOutgoingWindow(UnsignedInteger.ZERO).flowNextOutgoingId(UnsignedInteger.ZERO).flowDeliveryCount().flow().receiveDelivery().decodeLatestDelivery().getDecodedLatestDelivery();
assertThat(receivedMessageContent2, is(equalTo(contents[1])));
UnsignedInteger secondDeliveryId = interaction.getLatestDeliveryId();
interaction.dispositionSettled(true).dispositionRole(Role.RECEIVER).dispositionFirst(firstDeliveryId).dispositionLast(secondDeliveryId).dispositionState(new Accepted()).disposition();
// detach link and consume detach to verify that no transfer was delivered
interaction.detachClose(true).detach().consume(Detach.class, Flow.class);
}
assertThat(Utils.receiveMessage(brokerAdmin, BrokerAdmin.TEST_QUEUE_NAME), is(equalTo(contents[2])));
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow in project qpid-broker-j by apache.
the class FlowTest method drainEmptyQueue.
@Test
@SpecificationTest(section = "2.6.7", description = "If the sender's drain flag is set and there are no available messages," + " the sender MUST advance its delivery-count until link-credit is zero," + " and send its updated flow state to the receiver.")
public void drainEmptyQueue() throws Exception {
getBrokerAdmin().createQueue(BrokerAdmin.TEST_QUEUE_NAME);
try (FrameTransport transport = new FrameTransport(getBrokerAdmin()).connect()) {
Flow responseFlow = transport.newInteraction().negotiateOpen().begin().consumeResponse(Begin.class).attachRole(Role.RECEIVER).attachSourceAddress(BrokerAdmin.TEST_QUEUE_NAME).attach().consumeResponse(Attach.class).flowIncomingWindow(UnsignedInteger.valueOf(2047)).flowNextIncomingId(UnsignedInteger.ZERO).flowOutgoingWindow(UnsignedInteger.valueOf(2147483647)).flowNextOutgoingId(UnsignedInteger.ONE).flowDeliveryCount(UnsignedInteger.ZERO).flowLinkCredit(UnsignedInteger.ONE).flowDrain(Boolean.TRUE).flowHandleFromLinkHandle().flow().consumeResponse().getLatestResponse(Flow.class);
assertThat(responseFlow.getHandle(), is(notNullValue()));
assertThat(responseFlow.getDrain(), is(equalTo(Boolean.TRUE)));
}
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow in project qpid-broker-j by apache.
the class FlowTest method emptyFlow.
@Test
@SpecificationTest(section = "1.3.4", description = "mandatory [...] a non null value for the field is always encoded.")
public void emptyFlow() throws Exception {
getBrokerAdmin().createQueue(BrokerAdmin.TEST_QUEUE_NAME);
try (FrameTransport transport = new FrameTransport(getBrokerAdmin()).connect()) {
final Response<?> response = transport.newInteraction().negotiateOpen().begin().consumeResponse(Begin.class).flowIncomingWindow(null).flowNextIncomingId(null).flowOutgoingWindow(null).flowNextOutgoingId(null).flow().consumeResponse().getLatestResponse();
assertThat(response, is(notNullValue()));
assertThat(response.getBody(), is(instanceOf(ErrorCarryingFrameBody.class)));
final Error error = ((ErrorCarryingFrameBody) response.getBody()).getError();
if (error != null) {
assertThat(error.getCondition(), anyOf(equalTo(AmqpError.DECODE_ERROR), equalTo(AmqpError.INVALID_FIELD)));
}
}
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow in project qpid-broker-j by apache.
the class FlowTest method sessionEchoFlow.
@Test
@SpecificationTest(section = "2.7.4", description = "If set to true then the receiver SHOULD send its state at the earliest convenient opportunity.")
public void sessionEchoFlow() throws Exception {
try (FrameTransport transport = new FrameTransport(getBrokerAdmin()).connect()) {
Flow responseFlow = transport.newInteraction().negotiateOpen().begin().consumeResponse(Begin.class).flowEcho(true).flowOutgoingWindow(UnsignedInteger.ZERO).flowNextOutgoingId(UnsignedInteger.ZERO).flowNextIncomingIdFromPeerLatestSessionBeginAndDeliveryCount().flowIncomingWindow(UnsignedInteger.ONE).flowHandle(null).flow().consumeResponse().getLatestResponse(Flow.class);
assertThat(responseFlow.getEcho(), not(equalTo(Boolean.TRUE)));
assertThat(responseFlow.getHandle(), is(nullValue()));
}
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow in project qpid-broker-j by apache.
the class FlowTest method flowWithUnknownHandle.
@Test
@SpecificationTest(section = "2.7.4", description = "If set to a handle that is not currently associated with an attached link, the recipient" + " MUST respond by ending the session with an unattached-handle session error.")
public void flowWithUnknownHandle() throws Exception {
try (FrameTransport transport = new FrameTransport(getBrokerAdmin()).connect()) {
End responseEnd = transport.newInteraction().negotiateOpen().begin().consumeResponse(Begin.class).flowEcho(true).flowIncomingWindow(UnsignedInteger.ONE).flowNextIncomingIdFromPeerLatestSessionBeginAndDeliveryCount().flowLinkCredit(UnsignedInteger.ONE).flowHandle(UnsignedInteger.valueOf(Integer.MAX_VALUE)).flowOutgoingWindow(UnsignedInteger.ZERO).flowNextOutgoingId(UnsignedInteger.ZERO).flow().consumeResponse().getLatestResponse(End.class);
assertThat(responseEnd.getError(), is(notNullValue()));
assertThat(responseEnd.getError().getCondition(), is(equalTo(SessionError.UNATTACHED_HANDLE)));
}
}
Aggregations