blob: 726adc96e9215069c76cfa844f3bf0b2272ba696 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.qpid.server.protocol.v1_0;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.apache.qpid.server.message.AMQMessageHeader;
import org.apache.qpid.server.message.internal.InternalMessage;
import org.apache.qpid.server.message.internal.InternalMessageHeader;
import org.apache.qpid.server.message.internal.InternalMessageMetaData;
import org.apache.qpid.server.message.internal.InternalMessageMetaDataType;
import org.apache.qpid.server.model.NamedAddressSpace;
import org.apache.qpid.server.protocol.converter.MessageConversionException;
import org.apache.qpid.server.protocol.v1_0.type.Binary;
import org.apache.qpid.server.protocol.v1_0.type.Symbol;
import org.apache.qpid.server.protocol.v1_0.type.UnsignedLong;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.test.utils.QpidTestCase;
public class PropertyConverter_Internal_to_v1_0Test extends QpidTestCase
{
private MessageConverter_Internal_to_v1_0 _messageConverter;
private NamedAddressSpace _addressSpace;
@Override
public void setUp() throws Exception
{
super.setUp();
_messageConverter = new MessageConverter_Internal_to_v1_0();
_addressSpace = mock(NamedAddressSpace.class);
}
public void testDurableTrueConversion()
{
final AMQMessageHeader header = mock(AMQMessageHeader.class);
InternalMessage originalMessage = createTestMessage(header, null, true);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
assertTrue("Unexpected persistence of message", convertedMessage.isPersistent());
assertTrue("Unexpected persistence of meta data",
convertedMessage.getStoredMessage().getMetaData().isPersistent());
}
public void testDurableFalseConversion()
{
final AMQMessageHeader header = mock(AMQMessageHeader.class);
InternalMessage originalMessage = createTestMessage(header, null, false);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
assertFalse("Unexpected persistence of message", convertedMessage.isPersistent());
assertFalse("Unexpected persistence of meta data",
convertedMessage.getStoredMessage().getMetaData().isPersistent());
}
public void testPriorityConversion()
{
final AMQMessageHeader header = mock(AMQMessageHeader.class);
byte priority = (byte) 7;
when(header.getPriority()).thenReturn(priority);
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
assertEquals("Unexpected priority", priority, convertedMessage.getMessageHeader().getPriority());
}
public void testExpirationConversion() throws InterruptedException
{
long ttl = 10000;
long expiryTime = System.currentTimeMillis() + ttl;
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getExpiration()).thenReturn(expiryTime);
InternalMessage originalMessage = createTestMessage(header);
Thread.sleep(1L);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Long convertedTtl = MessageConverter_from_1_0.getTtl(convertedMessage);
assertEquals("Unexpected TTL", expiryTime - originalMessage.getArrivalTime(), convertedTtl.longValue());
}
public void testContentEncodingConversion()
{
String contentEncoding = "my-test-encoding";
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getEncoding()).thenReturn(contentEncoding);
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Symbol convertedContentEncoding = MessageConverter_from_1_0.getContentEncoding(convertedMessage);
assertEquals("Unexpected content encoding", contentEncoding, convertedContentEncoding.toString());
}
public void testMessageIdStringConversion()
{
final String messageId = "testMessageId";
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getMessageId()).thenReturn(messageId);
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Object convertedMessageId = MessageConverter_from_1_0.getMessageId(convertedMessage);
assertEquals("Unexpected messageId", messageId, convertedMessageId);
}
public void testMessageIdUuidConversion()
{
final UUID messageId = UUID.randomUUID();
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getMessageId()).thenReturn(messageId.toString());
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Object convertedMessageId = MessageConverter_from_1_0.getMessageId(convertedMessage);
assertEquals("Unexpected messageId", messageId, convertedMessageId);
}
public void testMessageIdUnsignedLongConversion()
{
final UnsignedLong messageId = UnsignedLong.valueOf(-1L);
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getMessageId()).thenReturn(messageId.toString());
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Object convertedMessageId = MessageConverter_from_1_0.getMessageId(convertedMessage);
assertEquals("Unexpected messageId", messageId, convertedMessageId);
}
public void testCorrelationIdStringConversion()
{
final String correlationId = "testCorrelationId";
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getCorrelationId()).thenReturn(correlationId);
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Object convertedCorrelationId = MessageConverter_from_1_0.getCorrelationId(convertedMessage);
assertEquals("Unexpected messageId", correlationId, convertedCorrelationId);
}
public void testCorrelationIdUuidConversion()
{
final UUID correlationId = UUID.randomUUID();
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getCorrelationId()).thenReturn(correlationId.toString());
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Object convertedCorrelationId = MessageConverter_from_1_0.getCorrelationId(convertedMessage);
assertEquals("Unexpected correlationId", correlationId, convertedCorrelationId);
}
public void testCorrelationIdUnsignedLongConversion()
{
final UnsignedLong correlationId = UnsignedLong.valueOf(-1L);
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getCorrelationId()).thenReturn(correlationId.toString());
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Object convertedCorrelationId = MessageConverter_from_1_0.getCorrelationId(convertedMessage);
assertEquals("Unexpected correlationId", correlationId, convertedCorrelationId);
}
public void testUserIdConversion()
{
final String userId = "testUserId";
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getUserId()).thenReturn(userId);
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Binary convertedUserId = MessageConverter_from_1_0.getUserId(convertedMessage);
assertTrue("Unexpected userId", Arrays.equals(userId.getBytes(UTF_8), convertedUserId.getArray()));
}
public void testReplyToConversion()
{
final String replyTo = "amq.direct/test";
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getReplyTo()).thenReturn(replyTo);
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
String convertedReplyTo = MessageConverter_from_1_0.getReplyTo(convertedMessage);
assertEquals("Unexpected replyTo", replyTo, convertedReplyTo);
}
public void testToConversion() throws IOException
{
final String to = "amq.direct/test";
InternalMessage originalMessage = createTestMessage(to);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
assertEquals("Unexpected to", to, convertedMessage.getTo());
}
public void testTimestampConversion()
{
final long timestamp = System.currentTimeMillis();
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getTimestamp()).thenReturn(timestamp);
InternalMessage originalMessage = createTestMessage(header);
Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Date creationTime = MessageConverter_from_1_0.getCreationTime(convertedMessage);
assertNotNull("timestamp not converted", creationTime);
assertEquals("Unexpected timestamp", timestamp, creationTime.getTime());
}
public void testHeadersConversion()
{
final Map<String, Object> properties = new HashMap<>();
properties.put("testProperty1", "testProperty1Value");
properties.put("intProperty", 1);
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getHeaderNames()).thenReturn(properties.keySet());
doAnswer(invocation ->
{
final String originalArgument = (String) (invocation.getArguments())[0];
return properties.get(originalArgument);
}).when(header).getHeader(any(String.class));
InternalMessage originalMessage = createTestMessage(header);
final Message_1_0 convertedMessage = _messageConverter.convert(originalMessage, _addressSpace);
Map<String, Object> convertedHeaders = convertedMessage.getApplicationPropertiesSection().getValue();
assertEquals("Unexpected application properties", properties, new HashMap<>(convertedHeaders));
}
public void testHeadersConversionWithNonSimpleTypes()
{
final Map<String, Object> properties = Collections.singletonMap("listProperty", Collections.emptyList());
final AMQMessageHeader header = mock(AMQMessageHeader.class);
when(header.getHeaderNames()).thenReturn(properties.keySet());
doAnswer(invocation ->
{
final String originalArgument = (String) (invocation.getArguments())[0];
return properties.get(originalArgument);
}).when(header).getHeader(any(String.class));
InternalMessage originalMessage = createTestMessage(header);
try
{
_messageConverter.convert(originalMessage, _addressSpace);
fail("Expected exception not thrown");
}
catch (MessageConversionException e)
{
// pass
}
}
private InternalMessage createTestMessage(String to)
{
final InternalMessageHeader internalMessageHeader = new InternalMessageHeader(mock(AMQMessageHeader.class));
final StoredMessage<InternalMessageMetaData> handle =
createInternalStoredMessage(null,false, internalMessageHeader);
return new InternalMessage(handle, internalMessageHeader, null, to);
}
private InternalMessage createTestMessage(final AMQMessageHeader header)
{
return createTestMessage(header, null, false);
}
private InternalMessage createTestMessage(final AMQMessageHeader header,
byte[] content,
final boolean persistent)
{
final InternalMessageHeader internalMessageHeader = new InternalMessageHeader(header);
final StoredMessage<InternalMessageMetaData> storedMessage =
createInternalStoredMessage(content, persistent, internalMessageHeader);
return ((InternalMessage) InternalMessageMetaDataType.INSTANCE.createMessage(storedMessage));
}
private StoredMessage<InternalMessageMetaData> createInternalStoredMessage(final byte[] content,
final boolean persistent,
final InternalMessageHeader internalMessageHeader)
{
final int contentSize = content == null ? 0 : content.length;
final InternalMessageMetaData metaData =
new InternalMessageMetaData(persistent, internalMessageHeader, contentSize);
final StoredMessage<InternalMessageMetaData> storedMessage = mock(StoredMessage.class);
when(storedMessage.getMetaData()).thenReturn(metaData);
when(storedMessage.getContentSize()).thenReturn(contentSize);
return storedMessage;
}
}