use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow in project qpid-broker-j by apache.
the class FlowTest method linkEchoFlow.
@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 linkEchoFlow() 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).flowEcho(true).flowHandleFromLinkHandle().flowAvailable(UnsignedInteger.valueOf(10)).flowDeliveryCount(UnsignedInteger.ZERO).flowLinkCredit(UnsignedInteger.ONE).flowOutgoingWindow(UnsignedInteger.ZERO).flowNextOutgoingId(UnsignedInteger.ZERO).flowNextIncomingIdFromPeerLatestSessionBeginAndDeliveryCount().flow().consumeResponse().getLatestResponse(Flow.class);
assertThat(responseFlow.getEcho(), not(equalTo(Boolean.TRUE)));
assertThat(responseFlow.getHandle(), is(notNullValue()));
}
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow in project qpid-broker-j by apache.
the class OutcomeTest method modifiedOutcomeWithUndeliverableHere.
@Test
@SpecificationTest(section = "3.4.5", description = "If the undeliverable-here is set, then any messages released" + " MUST NOT be redelivered to the modifying link endpoint.")
public void modifiedOutcomeWithUndeliverableHere() throws Exception {
String content1 = getTestName() + "_1";
String content2 = getTestName() + "_2";
Utils.putMessageOnQueue(getBrokerAdmin(), BrokerAdmin.TEST_QUEUE_NAME, content1, content2);
try (FrameTransport transport = new FrameTransport(getBrokerAdmin()).connect()) {
final Interaction interaction = transport.newInteraction().negotiateOpen().begin().consumeResponse(Begin.class).attachRole(Role.RECEIVER).attachSourceAddress(BrokerAdmin.TEST_QUEUE_NAME).attach().consumeResponse(Attach.class).assertLatestResponse(Attach.class, this::assumeModifiedSupportedBySource).flowIncomingWindow(UnsignedInteger.ONE).flowLinkCredit(UnsignedInteger.ONE).flowHandleFromLinkHandle().flowNextIncomingIdFromPeerLatestSessionBeginAndDeliveryCount().flow().receiveDelivery().decodeLatestDelivery();
Object firstDeliveryPayload = interaction.getDecodedLatestDelivery();
assertThat(firstDeliveryPayload, is(equalTo(content1)));
Modified modifiedOutcome = new Modified();
modifiedOutcome.setUndeliverableHere(Boolean.TRUE);
interaction.dispositionSettled(true).dispositionRole(Role.RECEIVER).dispositionFirstFromLatestDelivery().dispositionState(modifiedOutcome).disposition().flowIncomingWindow(UnsignedInteger.valueOf(2)).flowLinkCredit(UnsignedInteger.valueOf(2)).flowNextIncomingIdFromPeerLatestSessionBeginAndDeliveryCount().flow().receiveDelivery(Flow.class).decodeLatestDelivery();
Object secondDeliveryPayload = interaction.getDecodedLatestDelivery();
assertThat(secondDeliveryPayload, is(equalTo(content2)));
// verify that no unexpected performative is received by closing
interaction.doCloseConnection();
}
assertThat(Utils.receiveMessage(getBrokerAdmin(), BrokerAdmin.TEST_QUEUE_NAME), is(equalTo(content1)));
assertThat(Utils.receiveMessage(getBrokerAdmin(), BrokerAdmin.TEST_QUEUE_NAME), is(equalTo(content2)));
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow in project qpid-broker-j by apache.
the class Session_1_0 method receiveFlow.
public void receiveFlow(final Flow flow) {
receivedComplete();
final SequenceNumber flowNextIncomingId = new SequenceNumber(flow.getNextIncomingId() == null ? _initialOutgoingId.intValue() : flow.getNextIncomingId().intValue());
if (flowNextIncomingId.compareTo(_nextOutgoingId) > 0) {
final End end = new End();
end.setError(new Error(SessionError.WINDOW_VIOLATION, String.format("Next incoming id '%d' exceeds next outgoing id '%d'", flowNextIncomingId.longValue(), _nextOutgoingId.longValue())));
end(end);
} else {
_remoteIncomingWindow = flowNextIncomingId.longValue() + flow.getIncomingWindow().longValue() - _nextOutgoingId.longValue();
_nextIncomingId = new SequenceNumber(flow.getNextOutgoingId().intValue());
_remoteOutgoingWindow = flow.getOutgoingWindow();
UnsignedInteger handle = flow.getHandle();
if (handle != null) {
final LinkEndpoint<? extends BaseSource, ? extends BaseTarget> endpoint = _inputHandleToEndpoint.get(handle);
if (endpoint == null) {
End end = new End();
end.setError(new Error(SessionError.UNATTACHED_HANDLE, String.format("Received Flow with unknown handle %d", handle.intValue())));
end(end);
} else {
endpoint.receiveFlow(flow);
}
} else {
final Collection<LinkEndpoint<? extends BaseSource, ? extends BaseTarget>> allLinkEndpoints = _inputHandleToEndpoint.values();
for (LinkEndpoint<? extends BaseSource, ? extends BaseTarget> le : allLinkEndpoints) {
le.flowStateChanged();
}
if (Boolean.TRUE.equals(flow.getEcho())) {
sendFlow();
}
}
}
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow in project qpid-broker-j by apache.
the class SendingLinkEndpointTest method receiveFlow.
@Test
public void receiveFlow() throws Exception {
receiveAttach(_sendingLinkEndpoint);
_sendingLinkEndpoint.setDeliveryCount(new SequenceNumber(-1));
Flow flow = new Flow();
flow.setDeliveryCount(new SequenceNumber(-1).unsignedIntegerValue());
flow.setLinkCredit(UnsignedInteger.ONE);
_sendingLinkEndpoint.receiveFlow(flow);
UnsignedInteger linkCredit = _sendingLinkEndpoint.getLinkCredit();
assertThat(linkCredit, is(equalTo(UnsignedInteger.ONE)));
}
use of org.apache.qpid.server.protocol.v1_0.type.transport.Flow in project qpid-broker-j by apache.
the class DecodeErrorTest method illegalMessage.
@Test
@SpecificationTest(section = "3.2", description = "Altogether a message consists of the following sections: Zero or one header," + " Zero or one delivery-annotations, [...]")
public void illegalMessage() throws Exception {
getBrokerAdmin().createQueue(BrokerAdmin.TEST_QUEUE_NAME);
try (FrameTransport transport = new FrameTransport(getBrokerAdmin()).connect()) {
final Interaction interaction = transport.newInteraction();
interaction.negotiateOpen().begin().consumeResponse(Begin.class).attachRole(Role.SENDER).attachTargetAddress(BrokerAdmin.TEST_QUEUE_NAME).attach().consumeResponse(Attach.class).consumeResponse(Flow.class).assertLatestResponse(Flow.class, flow -> assumeThat(flow.getLinkCredit(), is(greaterThan(UnsignedInteger.ZERO))));
try (final QpidByteBuffer payload = buildInvalidMessage()) {
interaction.transferMessageFormat(UnsignedInteger.ZERO).transferPayload(payload).transferSettled(true).transferMessageFormat(UnsignedInteger.ZERO).transfer().sync();
}
interaction.closeUnconditionally();
}
final String validMessage = getTestName() + "_2";
Utils.putMessageOnQueue(getBrokerAdmin(), BrokerAdmin.TEST_QUEUE_NAME, validMessage);
assertThat(Utils.receiveMessage(getBrokerAdmin(), BrokerAdmin.TEST_QUEUE_NAME), is(equalTo(validMessage)));
}
Aggregations