use of org.apache.qpid.server.protocol.v0_10.transport.Method in project qpid-broker-j by apache.
the class ServerSessionTest method testOverlargeMessageTest.
@Test
public void testOverlargeMessageTest() throws Exception {
final Broker<?> broker = mock(Broker.class);
when(broker.getContextValue(eq(Long.class), eq(Broker.CHANNEL_FLOW_CONTROL_ENFORCEMENT_TIMEOUT))).thenReturn(0l);
AmqpPort port = createMockPort();
final AMQPConnection_0_10 modelConnection = mock(AMQPConnection_0_10.class);
when(modelConnection.getCategoryClass()).thenReturn(Connection.class);
when(modelConnection.getTypeClass()).thenReturn(AMQPConnection_0_10.class);
when(modelConnection.closeAsync()).thenReturn(Futures.immediateFuture(null));
when(modelConnection.getAddressSpace()).thenReturn(_virtualHost);
when(modelConnection.getContextProvider()).thenReturn(_virtualHost);
when(modelConnection.getBroker()).thenReturn(broker);
when(modelConnection.getEventLogger()).thenReturn(mock(EventLogger.class));
when(modelConnection.getContextValue(Long.class, Session.PRODUCER_AUTH_CACHE_TIMEOUT)).thenReturn(Session.PRODUCER_AUTH_CACHE_TIMEOUT_DEFAULT);
when(modelConnection.getContextValue(Integer.class, Session.PRODUCER_AUTH_CACHE_SIZE)).thenReturn(Session.PRODUCER_AUTH_CACHE_SIZE_DEFAULT);
when(modelConnection.getContextValue(Long.class, Connection.MAX_UNCOMMITTED_IN_MEMORY_SIZE)).thenReturn(Connection.DEFAULT_MAX_UNCOMMITTED_IN_MEMORY_SIZE);
when(modelConnection.getChildExecutor()).thenReturn(_taskExecutor);
when(modelConnection.getModel()).thenReturn(BrokerModel.getInstance());
when(modelConnection.getPort()).thenReturn(port);
final AuthenticatedPrincipal principal = new AuthenticatedPrincipal(new UsernamePrincipal(getTestName(), mock(AuthenticationProvider.class)));
final Subject subject = new Subject(false, Collections.singleton(principal), Collections.emptySet(), Collections.emptySet());
when(modelConnection.getSubject()).thenReturn(subject);
when(modelConnection.getMaxMessageSize()).thenReturn(1024l);
when(modelConnection.getCreatedTime()).thenReturn(new Date());
ServerConnection connection = new ServerConnection(1, broker, port, Transport.TCP, modelConnection);
connection.setVirtualHost(_virtualHost);
final List<Method> invokedMethods = new ArrayList<>();
ServerSession session = new ServerSession(connection, new ServerSessionDelegate(), new Binary(getTestName().getBytes()), 0) {
@Override
public void invoke(final Method m) {
invokedMethods.add(m);
}
};
Session_0_10 modelSession = new Session_0_10(modelConnection, 1, session, getTestName());
session.setModelObject(modelSession);
ServerSessionDelegate delegate = new ServerSessionDelegate();
MessageTransfer xfr = new MessageTransfer();
byte[] body1 = new byte[2048];
xfr.setBody(QpidByteBuffer.wrap(body1));
delegate.messageTransfer(session, xfr);
assertFalse("No methods invoked - expecting at least 1", invokedMethods.isEmpty());
Method firstInvoked = invokedMethods.get(0);
final boolean condition = firstInvoked instanceof ExecutionException;
assertTrue("First invoked method not execution error", condition);
assertEquals(ExecutionErrorCode.RESOURCE_LIMIT_EXCEEDED, ((ExecutionException) firstInvoked).getErrorCode());
invokedMethods.clear();
// test the boundary condition
byte[] body = new byte[1024];
xfr.setBody(QpidByteBuffer.wrap(body));
delegate.messageTransfer(session, xfr);
assertTrue("Methods invoked when not expecting any", invokedMethods.isEmpty());
}
use of org.apache.qpid.server.protocol.v0_10.transport.Method in project qpid-broker-j by apache.
the class ServerSessionDelegateTest method testExchangeDeleteWhenIfUsedIsSetAndExchangeHasBindings.
@Test
public void testExchangeDeleteWhenIfUsedIsSetAndExchangeHasBindings() throws Exception {
Exchange<?> exchange = mock(Exchange.class);
when(exchange.hasBindings()).thenReturn(true);
doReturn(exchange).when(_host).getAttainedMessageDestination(eq(getTestName()), anyBoolean());
final ExchangeDelete method = new ExchangeDelete(getTestName(), Option.IF_UNUSED);
_delegate.exchangeDelete(_session, method);
verify(_session).invoke(argThat((ArgumentMatcher<ExecutionException>) exception -> exception.getErrorCode() == ExecutionErrorCode.PRECONDITION_FAILED && "Exchange has bindings".equals(exception.getDescription())));
}
use of org.apache.qpid.server.protocol.v0_10.transport.Method in project qpid-broker-j by apache.
the class Assembler method assemble.
private void assemble(Frame frame, ByteBuffer segment) {
BBDecoder dec = _decoder.get();
dec.init(segment);
int channel = frame.getChannel();
Method command;
switch(frame.getType()) {
case CONTROL:
int controlType = dec.readUint16();
Method control = Method.create(controlType);
control.read(dec);
emit(channel, control);
break;
case COMMAND:
int commandType = dec.readUint16();
// read in the session header, right now we don't use it
int hdr = dec.readUint16();
command = Method.create(commandType);
command.setSync((0x0001 & hdr) != 0);
command.read(dec);
if (command.hasPayload() && !frame.isLastSegment()) {
setIncompleteCommand(channel, command);
} else {
emit(channel, command);
}
break;
case HEADER:
command = getIncompleteCommand(channel);
List<Struct> structs = null;
DeliveryProperties deliveryProps = null;
MessageProperties messageProps = null;
while (dec.hasRemaining()) {
Struct struct = dec.readStruct32();
if (struct instanceof DeliveryProperties && deliveryProps == null) {
deliveryProps = (DeliveryProperties) struct;
} else if (struct instanceof MessageProperties && messageProps == null) {
messageProps = (MessageProperties) struct;
} else {
if (structs == null) {
structs = new ArrayList<>(2);
}
structs.add(struct);
}
}
command.setHeader(new Header(deliveryProps, messageProps, structs));
if (frame.isLastSegment()) {
setIncompleteCommand(channel, null);
emit(channel, command);
}
break;
case BODY:
command = getIncompleteCommand(channel);
command.setBody(QpidByteBuffer.wrap(segment));
setIncompleteCommand(channel, null);
emit(channel, command);
break;
default:
throw new IllegalStateException("unknown frame type: " + frame.getType());
}
dec.releaseBuffer();
}
use of org.apache.qpid.server.protocol.v0_10.transport.Method in project qpid-broker-j by apache.
the class ServerAssembler method assemble.
private void assemble(ServerFrame frame, QpidByteBuffer frameBuffer) {
try {
ServerDecoder dec = new ServerDecoder(frameBuffer);
int channel = frame.getChannel();
Method command;
switch(frame.getType()) {
case CONTROL:
int controlType = dec.readUint16();
Method control = Method.create(controlType);
control.read(dec);
emit(channel, control);
break;
case COMMAND:
int commandType = dec.readUint16();
// read in the session header, right now we don't use it
int hdr = dec.readUint16();
command = Method.create(commandType);
command.setSync((0x0001 & hdr) != 0);
command.read(dec);
if (command.hasPayload() && !frame.isLastSegment()) {
setIncompleteCommand(channel, command);
} else {
emit(channel, command);
}
break;
case HEADER:
command = getIncompleteCommand(channel);
List<Struct> structs = null;
DeliveryProperties deliveryProps = null;
MessageProperties messageProps = null;
while (dec.hasRemaining()) {
Struct struct = dec.readStruct32();
if (struct instanceof DeliveryProperties && deliveryProps == null) {
deliveryProps = (DeliveryProperties) struct;
} else if (struct instanceof MessageProperties && messageProps == null) {
messageProps = (MessageProperties) struct;
} else {
if (structs == null) {
structs = new ArrayList<>(2);
}
structs.add(struct);
}
}
command.setHeader(new Header(deliveryProps, messageProps, structs));
if (frame.isLastSegment()) {
setIncompleteCommand(channel, null);
emit(channel, command);
}
break;
case BODY:
command = getIncompleteCommand(channel);
command.setBody(frameBuffer);
setIncompleteCommand(channel, null);
emit(channel, command);
break;
default:
throw new IllegalStateException("unknown frame type: " + frame.getType());
}
} finally {
frameBuffer.dispose();
}
}
use of org.apache.qpid.server.protocol.v0_10.transport.Method in project qpid-broker-j by apache.
the class ServerDisassembler method method.
private void method(Method method, SegmentType type) {
ServerEncoder enc = _encoder;
enc.init();
enc.writeUint16(method.getEncodedType());
if (type == SegmentType.COMMAND) {
if (method.isSync()) {
enc.writeUint16(0x0101);
} else {
enc.writeUint16(0x0100);
}
}
method.write(enc);
int methodLimit = enc.position();
byte flags = FIRST_SEG;
boolean payload = method.hasPayload();
if (!payload) {
flags |= LAST_SEG;
}
int headerLimit = -1;
if (payload) {
final Header hdr = method.getHeader();
if (hdr != null) {
if (hdr.getDeliveryProperties() != null) {
enc.writeStruct32(hdr.getDeliveryProperties());
}
if (hdr.getMessageProperties() != null) {
enc.writeStruct32(hdr.getMessageProperties());
}
if (hdr.getNonStandardProperties() != null) {
for (Struct st : hdr.getNonStandardProperties()) {
enc.writeStruct32(st);
}
}
}
headerLimit = enc.position();
}
synchronized (_sendLock) {
try (QpidByteBuffer buf = enc.getBuffer()) {
try (QpidByteBuffer duplicate = buf.view(0, methodLimit)) {
fragment(flags, type, method, duplicate);
}
if (payload) {
QpidByteBuffer body = method.getBody();
buf.limit(headerLimit);
buf.position(methodLimit);
try (QpidByteBuffer slice = buf.slice()) {
fragment(body == null ? LAST_SEG : 0x0, SegmentType.HEADER, method, slice);
}
if (body != null) {
try (QpidByteBuffer dup = body.duplicate()) {
fragment(LAST_SEG, SegmentType.BODY, method, dup);
}
}
}
}
}
}
Aggregations