You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2017/07/27 14:44:38 UTC

[2/4] qpid-broker-j git commit: QPID-7434: Add missing properties conversion for message conversion layer from 0-10 to 1.0 and add unit tests

QPID-7434: Add missing properties conversion for message conversion layer from 0-10 to 1.0 and add unit tests


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/46983ff0
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/46983ff0
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/46983ff0

Branch: refs/heads/master
Commit: 46983ff02aa25598af689e024cffbd9b773b8b2b
Parents: 9d8a05c
Author: Alex Rudyy <or...@apache.org>
Authored: Wed Jul 26 16:09:13 2017 +0100
Committer: Alex Rudyy <or...@apache.org>
Committed: Thu Jul 27 15:44:03 2017 +0100

----------------------------------------------------------------------
 .../amqp-msg-conv-0-10-to-1-0/pom.xml           |   6 +
 .../MessageConverter_0_10_to_1_0.java           |  92 +++-
 .../PropertyConverter_0_10_to_1_0Test.java      | 518 +++++++++++++++++++
 3 files changed, 608 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/46983ff0/broker-plugins/amqp-msg-conv-0-10-to-1-0/pom.xml
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-msg-conv-0-10-to-1-0/pom.xml b/broker-plugins/amqp-msg-conv-0-10-to-1-0/pom.xml
index e9a9c9b..8c5fc1f 100644
--- a/broker-plugins/amqp-msg-conv-0-10-to-1-0/pom.xml
+++ b/broker-plugins/amqp-msg-conv-0-10-to-1-0/pom.xml
@@ -51,6 +51,12 @@
       <groupId>org.apache.qpid</groupId>
       <artifactId>qpid-broker-plugins-amqp-1-0-protocol</artifactId>
     </dependency>
+
+    <dependency>
+      <groupId>org.apache.qpid</groupId>
+      <artifactId>qpid-test-utils</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/46983ff0/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_0_10_to_1_0.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_0_10_to_1_0.java b/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_0_10_to_1_0.java
index 4e13258..6cc4989 100644
--- a/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_0_10_to_1_0.java
+++ b/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_0_10_to_1_0.java
@@ -21,11 +21,14 @@
 
 package org.apache.qpid.server.protocol.converter.v0_10_v1_0;
 
+import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.apache.qpid.server.plugin.PluggableService;
+import org.apache.qpid.server.protocol.converter.MessageConversionException;
 import org.apache.qpid.server.protocol.v0_10.MessageTransferMessage;
+import org.apache.qpid.server.protocol.v0_10.transport.ReplyTo;
 import org.apache.qpid.server.protocol.v1_0.MessageConverter_to_1_0;
 import org.apache.qpid.server.protocol.v1_0.MessageMetaData_1_0;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
@@ -35,6 +38,7 @@ import org.apache.qpid.server.protocol.v1_0.type.UnsignedByte;
 import org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.ApplicationProperties;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.Data;
+import org.apache.qpid.server.protocol.v1_0.type.messaging.DataSection;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.EncodingRetainingSection;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.Header;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.Properties;
@@ -58,6 +62,8 @@ public class MessageConverter_0_10_to_1_0  extends MessageConverter_to_1_0<Messa
                                                   final EncodingRetainingSection<?> bodySection,
                                                   SectionEncoder sectionEncoder)
     {
+        Properties props = new Properties();
+
         final MessageProperties msgProps = serverMessage.getHeader().getMessageProperties();
         final DeliveryProperties deliveryProps = serverMessage.getHeader().getDeliveryProperties();
 
@@ -73,9 +79,35 @@ public class MessageConverter_0_10_to_1_0  extends MessageConverter_to_1_0<Messa
             {
                 header.setTtl(UnsignedInteger.valueOf(deliveryProps.getTtl()));
             }
+
+            if(deliveryProps.hasExpiration())
+            {
+                props.setAbsoluteExpiryTime(new Date(deliveryProps.getExpiration()));
+            }
+
+            if(deliveryProps.hasTimestamp())
+            {
+                props.setCreationTime(new Date(deliveryProps.getTimestamp()));
+            }
+
+            String to = deliveryProps.getExchange();
+            if (deliveryProps.getRoutingKey() != null)
+            {
+                String routingKey = deliveryProps.getRoutingKey();
+                if (to != null && !"".equals(to))
+                {
+                    to += "/" + routingKey;
+                }
+                else
+                {
+                    to = routingKey;
+                }
+            }
+            props.setTo(to);
+
         }
 
-        Properties props = new Properties();
+
         ApplicationProperties applicationProperties = null;
 
 
@@ -94,14 +126,14 @@ public class MessageConverter_0_10_to_1_0  extends MessageConverter_to_1_0<Messa
         {
             if(msgProps.hasContentEncoding()
                && !GZIPUtils.GZIP_CONTENT_ENCODING.equals(msgProps.getContentEncoding())
-               && bodySection instanceof Data)
+               && bodySection instanceof DataSection)
             {
                 props.setContentEncoding(Symbol.valueOf(msgProps.getContentEncoding()));
             }
 
             if(msgProps.hasCorrelationId())
             {
-                props.setCorrelationId(msgProps.getCorrelationId());
+                props.setCorrelationId(new Binary(msgProps.getCorrelationId()));
             }
 
             if(msgProps.hasMessageId())
@@ -110,7 +142,24 @@ public class MessageConverter_0_10_to_1_0  extends MessageConverter_to_1_0<Messa
             }
             if(msgProps.hasReplyTo())
             {
-                props.setReplyTo(msgProps.getReplyTo().getExchange()+"/"+msgProps.getReplyTo().getRoutingKey());
+                ReplyTo replyTo = msgProps.getReplyTo();
+                String to = null;
+                if (replyTo.hasExchange() && !"".equals(replyTo.getExchange()))
+                {
+                    to = replyTo.getExchange();
+                }
+                if (replyTo.hasRoutingKey())
+                {
+                    if (to != null)
+                    {
+                        to += "/" + replyTo.getRoutingKey();
+                    }
+                    else
+                    {
+                        to = replyTo.getRoutingKey();
+                    }
+                }
+                props.setReplyTo(to);
             }
             if(msgProps.hasContentType())
             {
@@ -123,8 +172,6 @@ public class MessageConverter_0_10_to_1_0  extends MessageConverter_to_1_0<Messa
                 }
             }
 
-            props.setSubject(serverMessage.getInitialRoutingAddress());
-
             if(msgProps.hasUserId())
             {
                 props.setUserId(new Binary(msgProps.getUserId()));
@@ -133,14 +180,43 @@ public class MessageConverter_0_10_to_1_0  extends MessageConverter_to_1_0<Messa
             Map<String, Object> applicationPropertiesMap = msgProps.getApplicationHeaders();
             if(applicationPropertiesMap != null)
             {
+                applicationPropertiesMap = new LinkedHashMap<>(applicationPropertiesMap);
+                if (applicationPropertiesMap.containsKey("x-jms-type"))
+                {
+                    props.setSubject(String.valueOf(applicationPropertiesMap.get("x-jms-type")));
+                    applicationPropertiesMap.remove("x-jms-type");
+                }
+
                 if(applicationPropertiesMap.containsKey("qpid.subject"))
                 {
                     props.setSubject(String.valueOf(applicationPropertiesMap.get("qpid.subject")));
-                    applicationPropertiesMap = new LinkedHashMap<>(applicationPropertiesMap);
                     applicationPropertiesMap.remove("qpid.subject");
                 }
-                applicationProperties = new ApplicationProperties(applicationPropertiesMap);
 
+                if(applicationPropertiesMap.containsKey("JMSXGroupID"))
+                {
+                    props.setGroupId(String.valueOf(applicationPropertiesMap.get("JMSXGroupID")));
+                    applicationPropertiesMap.remove("JMSXGroupID");
+                }
+
+                if(applicationPropertiesMap.containsKey("JMSXGroupSeq"))
+                {
+                    Object jmsxGroupSeq = applicationPropertiesMap.get("JMSXGroupSeq");
+                    if (jmsxGroupSeq instanceof Integer)
+                    {
+                        props.setGroupSequence(UnsignedInteger.valueOf((Integer)jmsxGroupSeq));
+                        applicationPropertiesMap.remove("JMSXGroupSeq");
+                    }
+                }
+
+                try
+                {
+                    applicationProperties = new ApplicationProperties(applicationPropertiesMap);
+                }
+                catch (IllegalArgumentException e)
+                {
+                    throw new MessageConversionException("Could not convert message from 0-10 to 1.0 because application headers conversion failed.", e);
+                }
             }
         }
         return new MessageMetaData_1_0(header.createEncodingRetainingSection(),

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/46983ff0/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/test/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/PropertyConverter_0_10_to_1_0Test.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/test/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/PropertyConverter_0_10_to_1_0Test.java b/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/test/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/PropertyConverter_0_10_to_1_0Test.java
new file mode 100644
index 0000000..0b7883d
--- /dev/null
+++ b/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/test/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/PropertyConverter_0_10_to_1_0Test.java
@@ -0,0 +1,518 @@
+/*
+ *
+ * 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_10_v1_0;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.mockito.Matchers.booleanThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.model.NamedAddressSpace;
+import org.apache.qpid.server.protocol.converter.MessageConversionException;
+import org.apache.qpid.server.protocol.v0_10.MessageMetaData_0_10;
+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.MessageDeliveryPriority;
+import org.apache.qpid.server.protocol.v0_10.transport.MessageProperties;
+import org.apache.qpid.server.protocol.v0_10.transport.ReplyTo;
+import org.apache.qpid.server.protocol.v1_0.Message_1_0;
+import org.apache.qpid.server.protocol.v1_0.type.Binary;
+import org.apache.qpid.server.protocol.v1_0.type.messaging.Header;
+import org.apache.qpid.server.protocol.v1_0.type.messaging.Properties;
+import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class PropertyConverter_0_10_to_1_0Test extends QpidTestCase
+{
+    private NamedAddressSpace _namedAddressSpace;
+    private MessageConverter_0_10_to_1_0 _messageConverter;
+
+    @Override
+    public void setUp() throws Exception
+    {
+        super.setUp();
+        _namedAddressSpace = mock(NamedAddressSpace.class);
+        _messageConverter = new MessageConverter_0_10_to_1_0();
+    }
+
+    public void testContentTypeConversion()
+    {
+        String contentType = "test-content-type";
+
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setContentType(contentType);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected content type", contentType, properties.getContentType().toString());
+    }
+
+
+    public void testContentTypeJavaObjectStreamConversion()
+    {
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setContentType("application/java-object-stream");
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected content type",
+                     "application/x-java-serialized-object",
+                     properties.getContentType().toString());
+    }
+
+    public void testContentEncodingConversion()
+    {
+        String contentEncoding = "my-test-encoding";
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setContentEncoding(contentEncoding);
+        MessageTransferMessage message = createTestMessage(new DeliveryProperties(), messageProperties, new byte[]{(byte)1}, 0);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected content encoding", contentEncoding, properties.getContentEncoding().toString());
+    }
+
+    public void testHeaderConversion()
+    {
+        Map<String, Object> headers = new HashMap<>();
+        headers.put("testProperty1", "testProperty1Value");
+        headers.put("intProperty", 1);
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Map<String, Object> applicationProperties = convertedMessage.getApplicationPropertiesSection().getValue();
+        assertEquals("Unexpected application applicationProperties", headers, new HashMap<>(applicationProperties));
+    }
+
+    public void testHeaderConversionWhenQpidSubjectIsPresent()
+    {
+        String testSubject = "testSubject";
+        Map<String, Object> headers = new HashMap<>();
+        headers.put("testProperty1", "testProperty1Value");
+        headers.put("qpid.subject", testSubject);
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected subject", testSubject, properties.getSubject());
+        Map<String, Object> applicationProperties = convertedMessage.getApplicationPropertiesSection().getValue();
+        assertFalse("Unexpected subject in application properties", applicationProperties.containsKey("qpid.subject"));
+    }
+
+
+    public void testPersistentDeliveryModeConversion()
+    {
+        final DeliveryProperties deliveryProperties = new DeliveryProperties();
+        deliveryProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
+        MessageTransferMessage message = createTestMessage(deliveryProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Header header = convertedMessage.getHeaderSection().getValue();
+        assertTrue("Unexpected durable header", header.getDurable());
+    }
+
+    public void testNonPersistentDeliveryModeConversion()
+    {
+        final DeliveryProperties deliveryProperties = new DeliveryProperties();
+        deliveryProperties.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);
+        MessageTransferMessage message = createTestMessage(deliveryProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Header header = convertedMessage.getHeaderSection().getValue();
+        assertFalse("Unexpected durable header", header.getDurable());
+    }
+
+    public void testPriorityConversion()
+    {
+        final byte priority = 5;
+        final DeliveryProperties deliveryProperties = new DeliveryProperties();
+        deliveryProperties.setPriority(MessageDeliveryPriority.get(priority));
+        MessageTransferMessage message = createTestMessage(deliveryProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Header header = convertedMessage.getHeaderSection().getValue();
+        assertEquals("Unexpected priority", priority, header.getPriority().byteValue());
+    }
+
+    public void testCorrelationIdConversion()
+    {
+        final String correlationId = "testCorrelationId";
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setCorrelationId(correlationId.getBytes());
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected correlationId", correlationId, new String(((Binary)properties.getCorrelationId()).getArray(), UTF_8));
+    }
+
+    public void testReplyToConversionWhenExchangeAndRoutingKeySpecified()
+    {
+        final String exchangeName = "amq.direct";
+        final String routingKey = "test_routing_key";
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setReplyTo(new ReplyTo(exchangeName, routingKey));
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected reply-to", "amq.direct/test_routing_key", properties.getReplyTo());
+    }
+
+    public void testReplyToConversionWhenExchangeSpecified()
+    {
+        final String exchangeName = "amq.direct";
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setReplyTo(new ReplyTo(exchangeName, null));
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected reply-to", exchangeName, properties.getReplyTo());
+    }
+
+    public void testReplyToConversionWhenRoutingKeySpecified()
+    {
+        final String routingKey = "test_routing_key";
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setReplyTo(new ReplyTo(null, routingKey));
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected reply-to", routingKey, properties.getReplyTo());
+    }
+
+    public void testReplyToConversionWhenExchangeIsEmptyStringAndRoutingKeySpecified()
+    {
+        final String routingKey = "test_routing_key";
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setReplyTo(new ReplyTo("", routingKey));
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected reply-to", "test_routing_key", properties.getReplyTo());
+    }
+
+    public void testReplyToConversionWhenExchangeAndRoutingKeyAreNull()
+    {
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setReplyTo(new ReplyTo(null, null));
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertNull("Unexpected reply-to", properties.getReplyTo());
+    }
+
+        public void testExpirationConversion()
+        {
+            long timestamp = System.currentTimeMillis();
+            int ttl = 100000;
+            final long expiration = timestamp + ttl;
+
+            final DeliveryProperties deliveryProperties = new DeliveryProperties();
+            deliveryProperties.setExpiration(expiration);
+            MessageTransferMessage message = createTestMessage(deliveryProperties, new MessageProperties(), null, timestamp);
+
+            final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+            Properties properties = convertedMessage.getPropertiesSection().getValue();
+            assertEquals("Unexpected expiration", expiration, properties.getAbsoluteExpiryTime().getTime());
+        }
+
+    public void testTTLConversion()
+    {
+        long timestamp = System.currentTimeMillis();
+        int ttl = 100000;
+
+        final DeliveryProperties deliveryProperties = new DeliveryProperties();
+        deliveryProperties.setTtl(ttl);
+        MessageTransferMessage message = createTestMessage(deliveryProperties, new MessageProperties(), null, timestamp);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Header header = convertedMessage.getHeaderSection().getValue();
+        assertEquals("Unexpected TTL", ttl, header.getTtl().longValue());
+    }
+
+    public void testMessageIdConversion()
+    {
+        UUID messageId = UUID.randomUUID();
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setMessageId(messageId);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected messageId", messageId, properties.getMessageId());
+    }
+
+    public void testTimestampConversion()
+    {
+        final DeliveryProperties deliveryProperties = new DeliveryProperties();
+        final long timestamp = System.currentTimeMillis() - 1000;
+        deliveryProperties.setTimestamp(timestamp);
+        MessageTransferMessage message = createTestMessage(deliveryProperties);
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected creation timestamp", timestamp, properties.getCreationTime().getTime());
+    }
+
+    public void testJmsTypeConversion()
+    {
+        final String type = "test-type";
+        final Map<String, Object> headers = Collections.singletonMap("x-jms-type", type);
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected subject", type, properties.getSubject());
+        Map<String, Object> applicationProperties = convertedMessage.getApplicationPropertiesSection().getValue();
+        assertFalse("Unexpected x-jms-type in application properties", applicationProperties.containsKey("x-jms-type"));
+    }
+
+    public void testQpidSubjectTakesPrecedenceOverJmsType()
+    {
+        final String jmsType = "test-jms-type";
+        final String qpidSubjectType = "test-qpid-type";
+        final Map<String, Object> headers = new HashMap<>();
+        headers.put("x-jms-type", jmsType);
+        headers.put("qpid.subject", qpidSubjectType);
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected subject", qpidSubjectType, properties.getSubject());
+        Map<String, Object> applicationProperties = convertedMessage.getApplicationPropertiesSection().getValue();
+        assertTrue("Unexpected entries in application properties", applicationProperties.isEmpty());
+    }
+
+    public void testUserIdConversion()
+    {
+        final String userId = "test-userId";
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setUserId(userId.getBytes());
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+        assertEquals("Unexpected user-id", userId, new String(properties.getUserId().getArray(), UTF_8));
+    }
+
+    public void testHeaderJMSXGroupIdConversion()
+    {
+        String testGroupId = "testGroupId";
+        Map<String, Object> headers = Collections.singletonMap("JMSXGroupID", testGroupId);
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+
+        assertEquals("Unexpected group-id", testGroupId, properties.getGroupId());
+
+        Map<String, Object> applicationProperties = convertedMessage.getApplicationPropertiesSection().getValue();
+        assertFalse("Unexpected JMSXGroupID in application properties",
+                    applicationProperties.containsKey("JMSXGroupID"));
+    }
+
+    public void testHeaderJMSXGroupSeqConversion()
+    {
+        int testGroupSequenceNumber = 1;
+        Map<String, Object> headers = Collections.singletonMap("JMSXGroupSeq", testGroupSequenceNumber);
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+
+        assertEquals("Unexpected group-sequence", testGroupSequenceNumber, properties.getGroupSequence().intValue());
+
+        Map<String, Object> applicationProperties = convertedMessage.getApplicationPropertiesSection().getValue();
+        assertFalse("Unexpected JMSXGroupSeq in application properties",
+                    applicationProperties.containsKey("JMSXGroupSeq"));
+    }
+
+    public void testHeaderJMSXGroupSeqConversionWhenWrongType()
+    {
+        short testGroupSequenceNumber = (short) 1;
+        Map<String, Object> headers = Collections.singletonMap("JMSXGroupSeq", testGroupSequenceNumber);
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+
+        assertEquals("Unexpected group-sequence", null, properties.getGroupSequence());
+
+        Map<String, Object> applicationProperties = convertedMessage.getApplicationPropertiesSection().getValue();
+
+        assertTrue("JMSXGroupSeq was removed from application properties",
+                   applicationProperties.containsKey("JMSXGroupSeq"));
+    }
+
+    public void testHeaderWithMapValueConversionFails()
+    {
+        Map<String, Object> headers = Collections.singletonMap("mapHeader", Collections.emptyMap());
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        try
+        {
+            _messageConverter.convert(message, _namedAddressSpace);
+            fail("Exception is expected");
+        }
+        catch (MessageConversionException e)
+        {
+            // pass
+        }
+    }
+
+    public void testHeaderWithListValueConversionFails()
+    {
+        Map<String, Object> headers = Collections.singletonMap("listHeader", Collections.emptyList());
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        try
+        {
+            _messageConverter.convert(message, _namedAddressSpace);
+            fail("Exception is expected");
+        }
+        catch (MessageConversionException e)
+        {
+            // pass
+        }
+    }
+
+    public void testHeaderWithArrayValueConversionFails()
+    {
+        Map<String, Object> headers = Collections.singletonMap("listHeader", new int[]{1});
+        final MessageProperties messageProperties = new MessageProperties();
+        messageProperties.setApplicationHeaders(headers);
+        MessageTransferMessage message = createTestMessage(messageProperties);
+
+        try
+        {
+            _messageConverter.convert(message, _namedAddressSpace);
+            fail("Exception is expected");
+        }
+        catch (MessageConversionException e)
+        {
+            // pass
+        }
+    }
+
+    public void testExchangeRoutingKeyConversion()
+    {
+        final String testExchange = "testExchange";
+        final String testRoutingKey = "testRoutingKey";
+        final DeliveryProperties deliveryProperties = new DeliveryProperties();
+        deliveryProperties.setExchange(testExchange);
+        deliveryProperties.setRoutingKey(testRoutingKey);
+        MessageTransferMessage message = createTestMessage(deliveryProperties);
+
+        final Message_1_0 convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
+
+        Properties properties = convertedMessage.getPropertiesSection().getValue();
+
+        assertEquals("Unexpected to", testExchange + "/" + testRoutingKey, properties.getTo());
+    }
+
+    private MessageTransferMessage createTestMessage(final DeliveryProperties deliveryProperties)
+    {
+        return createTestMessage(deliveryProperties, new MessageProperties(), null, 0);
+    }
+
+    private MessageTransferMessage createTestMessage(final MessageProperties messageProperties)
+    {
+        return createTestMessage(new DeliveryProperties(), messageProperties, null, 0);
+    }
+
+    private MessageTransferMessage createTestMessage(final DeliveryProperties deliveryProperties,
+                                                     final MessageProperties messageProperties,
+                                                     final byte[] content,
+                                                     final long arrivalTime)
+    {
+        int bodySize = content == null ? 0 : content.length;
+        final org.apache.qpid.server.protocol.v0_10.transport.Header header = new org.apache.qpid.server.protocol.v0_10.transport.Header(deliveryProperties, messageProperties);
+        final MessageMetaData_0_10 metaData = new MessageMetaData_0_10(header, bodySize, arrivalTime);
+
+        final StoredMessage<MessageMetaData_0_10> storedMessage = mock(StoredMessage.class);
+        when(storedMessage.getMetaData()).thenReturn(metaData);
+
+        if (content != null)
+        {
+            when(storedMessage.getContentSize()).thenReturn(content.length);
+            when(storedMessage.getContent(0, content.length)).thenReturn(Collections.singleton(QpidByteBuffer.wrap(
+                    content)));
+        }
+        return new MessageTransferMessage(storedMessage, null);
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org