blob: 8d2202048612698cf5f55b69b1a565328c8e722c [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.converter.v0_8_v0_10;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Map;
import java.util.UUID;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
import org.apache.qpid.server.model.NamedAddressSpace;
import org.apache.qpid.server.protocol.v0_10.MessageTransferMessage;
import org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties;
import org.apache.qpid.server.protocol.v0_10.transport.MessageDeliveryMode;
import org.apache.qpid.server.protocol.v0_10.transport.MessageProperties;
import org.apache.qpid.server.protocol.v0_8.AMQMessage;
import org.apache.qpid.server.protocol.v0_8.AMQShortString;
import org.apache.qpid.server.protocol.v0_8.FieldTable;
import org.apache.qpid.server.protocol.v0_8.MessageMetaData;
import org.apache.qpid.server.protocol.v0_8.transport.BasicContentHeaderProperties;
import org.apache.qpid.server.protocol.v0_8.transport.ContentHeaderBody;
import org.apache.qpid.server.protocol.v0_8.transport.MessagePublishInfo;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.test.utils.UnitTestBase;
@SuppressWarnings("unchecked")
class PropertyConverter_0_8_to_0_10Test extends UnitTestBase
{
private NamedAddressSpace _namedAddressSpace;
private MessageConverter_0_8_to_0_10 _messageConverter;
@BeforeAll
void setUp()
{
_namedAddressSpace = mock(NamedAddressSpace.class);
_messageConverter = new MessageConverter_0_8_to_0_10();
}
@Test
void contentTypeConversion()
{
final String contentType = "test-content-type";
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
basicContentHeaderProperties.setContentType(contentType);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals(contentType, messageProperties.getContentType(), "Unexpected content type");
}
@Test
void contentEncodingConversion()
{
final String contentEncoding = "my-test-encoding";
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
basicContentHeaderProperties.setEncoding(contentEncoding);
final AMQMessage message = createTestMessage(basicContentHeaderProperties, new byte[]{(byte) 1}, 0);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals(contentEncoding, messageProperties.getContentEncoding(), "Unexpected content encoding");
}
@Test
void headerConversion()
{
final Map<String, Object> headers = Map.of("testProperty1", "testProperty1Value", "intProperty", 1);
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
basicContentHeaderProperties.setHeaders(FieldTable.convertToFieldTable(headers));
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
final Map<String, Object> applicationProperties = messageProperties.getApplicationHeaders();
assertEquals(headers, Map.copyOf(applicationProperties), "Unexpected applicationProperties");
}
@Test
void persistentDeliveryModeConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
basicContentHeaderProperties.setDeliveryMode(BasicContentHeaderProperties.PERSISTENT);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
assertEquals(MessageDeliveryMode.PERSISTENT, deliveryProperties.getDeliveryMode(), "Unexpected deliveryMode");
}
@Test
void nonPersistentDeliveryModeConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
basicContentHeaderProperties.setDeliveryMode(BasicContentHeaderProperties.NON_PERSISTENT);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
assertEquals(MessageDeliveryMode.NON_PERSISTENT, deliveryProperties.getDeliveryMode(), "Unexpected deliveryMode");
}
@Test
void priorityConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final byte priority = 5;
basicContentHeaderProperties.setPriority(priority);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
assertEquals(priority, (long) deliveryProperties.getPriority().getValue(), "Unexpected priority");
}
@Test
void correlationIdConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String correlationId = "testCorrelationId";
basicContentHeaderProperties.setCorrelationId(AMQShortString.valueOf(correlationId));
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals(correlationId, new String(messageProperties.getCorrelationId(), UTF_8), "Unexpected correlationId");
}
@Test
void applicationIdConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String applicationId = "testApplicationId";
basicContentHeaderProperties.setAppId(applicationId);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals(applicationId, new String(messageProperties.getAppId(), UTF_8), "Unexpected applicationId");
}
@Test
void replyToConversionWhenBindingURLFormatIsUsed()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String replyTo = "direct://amq.direct/destination_name/queue_name?routingkey='test_routing_key'";
basicContentHeaderProperties.setReplyTo(replyTo);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals("amq.direct", messageProperties.getReplyTo().getExchange(), "Unexpected reply-to exchange");
assertEquals("test_routing_key", messageProperties.getReplyTo().getRoutingKey(), "Unexpected reply-to routing-key");
}
@Test
void replyToConversionWhenBindingURLFormatIsUsed2()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String replyTo = "direct://amq.direct//queue_name";
basicContentHeaderProperties.setReplyTo(replyTo);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals("amq.direct", messageProperties.getReplyTo().getExchange(), "Unexpected reply-to exchange");
assertEquals("queue_name", messageProperties.getReplyTo().getRoutingKey(), "Unexpected reply-to routing-key");
}
@Test
void replyToConversionWhenBindingURLFormatIsUsed3()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String replyTo = "direct:////queue_name";
basicContentHeaderProperties.setReplyTo(replyTo);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertNull(messageProperties.getReplyTo().getExchange(), "Unexpected reply-to exchange");
assertEquals("queue_name", messageProperties.getReplyTo().getRoutingKey(), "Unexpected reply-to routing-key");
}
@Test
void replyToConversionWhenBindingURLFormatIsUsed4()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String replyTo = "direct:////?routingkey='test_routing_key'";
basicContentHeaderProperties.setReplyTo(replyTo);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertNull(messageProperties.getReplyTo().getExchange(), "Unexpected reply-to exchange");
assertEquals("test_routing_key", messageProperties.getReplyTo().getRoutingKey(), "Unexpected reply-to routing-key");
}
@Test
void replyToConversionWhenNonBindingURLFormatIsUsed()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String replyTo = "test";
basicContentHeaderProperties.setReplyTo(replyTo);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertFalse(messageProperties.getReplyTo().hasExchange(), "Unexpected reply-to exchange");
assertEquals("test", messageProperties.getReplyTo().getRoutingKey(), "Unexpected reply-to routing-key");
}
@Test
void expirationConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final long timestamp = System.currentTimeMillis();
final int ttl = 100000;
final long expiration = timestamp + ttl;
basicContentHeaderProperties.setExpiration(expiration);
basicContentHeaderProperties.setTimestamp(timestamp);
final AMQMessage message = createTestMessage(basicContentHeaderProperties, timestamp);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
assertEquals(ttl, deliveryProperties.getTtl(), "Unexpected TTL");
assertEquals(expiration, deliveryProperties.getExpiration(), "Unexpected expiration");
}
@Test
void uuidMessageIdConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final UUID messageId = UUID.randomUUID();
basicContentHeaderProperties.setMessageId(messageId.toString());
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals(messageId, messageProperties.getMessageId(), "Unexpected messageId");
}
@Test
void uuidMessageIdWithPrefixConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final UUID messageId = UUID.randomUUID();
basicContentHeaderProperties.setMessageId("ID:" + messageId);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals(messageId, messageProperties.getMessageId(), "Unexpected messageId");
}
@Test
void nonUuidMessageIdConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String messageId = "testMessageId";
basicContentHeaderProperties.setMessageId("ID:" + messageId);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals(UUID.nameUUIDFromBytes(messageId.getBytes(UTF_8)), messageProperties.getMessageId(),
"Unexpected message id");
}
@Test
void timestampConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final long timestamp = System.currentTimeMillis() - 10000;
basicContentHeaderProperties.setTimestamp(timestamp);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
assertEquals(timestamp, deliveryProperties.getTimestamp(), "Unexpected timestamp");
}
@Test
void typeConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String type = "test-type";
basicContentHeaderProperties.setType(type);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
final Map<String, Object> applicationProperties = messageProperties.getApplicationHeaders();
assertEquals(type, applicationProperties.get("x-jms-type"), "Unexpected x-jms-type in application headers");
}
@Test
void userIdConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final String userId = "test-userId";
basicContentHeaderProperties.setUserId(userId);
final AMQMessage message = createTestMessage(basicContentHeaderProperties);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals(userId, new String(messageProperties.getUserId(), UTF_8), "Unexpected user-id");
}
@Test
void publishInfoExchangeConversion()
{
final String testExchange = "testExchange";
final AMQMessage message = createTestMessage(new BasicContentHeaderProperties());
message.getMessagePublishInfo().setExchange(AMQShortString.valueOf(testExchange));
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
assertEquals(testExchange, deliveryProperties.getExchange(), "Unexpected exchange");
}
@Test
void publishInfoRoutingKeyConversion()
{
final String testRoutingKey = "testRoutingKey";
final AMQMessage message = createTestMessage(new BasicContentHeaderProperties());
message.getMessagePublishInfo().setRoutingKey(AMQShortString.valueOf(testRoutingKey));
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
assertEquals(testRoutingKey, deliveryProperties.getRoutingKey(), "Unexpected routing-key");
}
@Test
void publishInfoImmediateTrueConversion()
{
final boolean immediate = true;
final AMQMessage message = createTestMessage(new BasicContentHeaderProperties());
message.getMessagePublishInfo().setImmediate(immediate);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
assertEquals(immediate, deliveryProperties.getImmediate(), "Unexpected immediate flag");
}
@Test
void publishInfoImmediateFalseConversion()
{
final boolean immediate = false;
final AMQMessage message = createTestMessage(new BasicContentHeaderProperties());
message.getMessagePublishInfo().setImmediate(immediate);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
assertEquals(immediate, deliveryProperties.getImmediate(), "Unexpected immediate flag");
}
@Test
void publishInfoMandatoryTrueConversion()
{
final boolean mandatory = true;
final AMQMessage message = createTestMessage(new BasicContentHeaderProperties());
message.getMessagePublishInfo().setMandatory(mandatory);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
final Object expected = !mandatory;
assertEquals(expected, deliveryProperties.getDiscardUnroutable(), "Unexpected discard-unroutable flag");
}
@Test
void publishInfoMandatoryFalseConversion()
{
final boolean mandatory = false;
final AMQMessage message = createTestMessage(new BasicContentHeaderProperties());
message.getMessagePublishInfo().setMandatory(mandatory);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final DeliveryProperties deliveryProperties =
convertedMessage.getStoredMessage().getMetaData().getDeliveryProperties();
final Object expected = !mandatory;
assertEquals(expected, deliveryProperties.getDiscardUnroutable(), "Unexpected discard-unroutable flag");
}
@Test
void contentLengthConversion()
{
final BasicContentHeaderProperties basicContentHeaderProperties = new BasicContentHeaderProperties();
final byte[] content = {(byte) 1, (byte) 2};
final AMQMessage message = createTestMessage(basicContentHeaderProperties, content, 0);
final MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
final MessageProperties messageProperties =
convertedMessage.getStoredMessage().getMetaData().getMessageProperties();
assertEquals(content.length, messageProperties.getContentLength(), "Unexpected content-length");
}
private AMQMessage createTestMessage(final BasicContentHeaderProperties basicContentHeaderProperties)
{
return createTestMessage(basicContentHeaderProperties, null, 0);
}
private AMQMessage createTestMessage(final BasicContentHeaderProperties basicContentHeaderProperties,
final long arrivalTime)
{
return createTestMessage(basicContentHeaderProperties, null, arrivalTime);
}
private AMQMessage createTestMessage(final BasicContentHeaderProperties basicContentHeaderProperties,
final byte[] content,
final long arrivalTime)
{
final ContentHeaderBody contentHeaderBody = mock(ContentHeaderBody.class);
when(contentHeaderBody.getProperties()).thenReturn(basicContentHeaderProperties);
final StoredMessage<MessageMetaData> storedMessage = mock(StoredMessage.class);
when(storedMessage.getMetaData())
.thenReturn(new MessageMetaData(new MessagePublishInfo(), contentHeaderBody, arrivalTime));
if (content != null)
{
when(storedMessage.getContentSize()).thenReturn(content.length);
when(storedMessage.getContent(0, content.length)).thenReturn(QpidByteBuffer.wrap(content));
}
else
{
when(storedMessage.getContentSize()).thenReturn(0);
when(storedMessage.getContent(0, 0)).thenReturn(QpidByteBuffer.emptyQpidByteBuffer());
}
return new AMQMessage(storedMessage);
}
}