You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ta...@apache.org on 2016/10/25 21:56:47 UTC

qpid-jms git commit: QPIDJMS-216 Don't send a Header when values are all defaults

Repository: qpid-jms
Updated Branches:
  refs/heads/master 89f39f1f7 -> 2fa342306


QPIDJMS-216 Don't send a Header when values are all defaults

When the values in the Message being sent map to the defaults for the
Header section we can not send it and avoid the extra overhead.


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/2fa34230
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/2fa34230
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/2fa34230

Branch: refs/heads/master
Commit: 2fa3423066bbadf502f1d65c77f2a8f4476d40f6
Parents: 89f39f1
Author: Timothy Bish <ta...@gmail.com>
Authored: Fri Oct 21 19:31:13 2016 -0400
Committer: Timothy Bish <ta...@gmail.com>
Committed: Tue Oct 25 17:54:54 2016 -0400

----------------------------------------------------------------------
 .../jms/provider/amqp/message/AmqpHeader.java   | 240 ++++++
 .../amqp/message/AmqpJmsMessageFacade.java      | 114 +--
 .../integration/ProducerIntegrationTest.java    |  43 ++
 .../provider/amqp/message/AmqpCodecTest.java    | 164 +++++
 .../provider/amqp/message/AmqpHeaderTest.java   | 737 +++++++++++++++++++
 .../amqp/message/AmqpJmsMessageFacadeTest.java  |  48 +-
 .../JmsLargeMessageSendRecvTimedTest.java       |   7 +-
 7 files changed, 1249 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/2fa34230/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpHeader.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpHeader.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpHeader.java
new file mode 100644
index 0000000..5219c28
--- /dev/null
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpHeader.java
@@ -0,0 +1,240 @@
+/*
+ * 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.jms.provider.amqp.message;
+
+import org.apache.qpid.proton.amqp.UnsignedByte;
+import org.apache.qpid.proton.amqp.UnsignedInteger;
+import org.apache.qpid.proton.amqp.messaging.Header;
+import org.apache.qpid.proton.amqp.messaging.Section;
+
+/**
+ * Wraps around the proton Header object and provides an ability to
+ * determine if the Header can be optimized out of message encodes
+ */
+public final class AmqpHeader implements Section {
+
+    private static final int DEFAULT_PRIORITY = 4;
+    private static final long UINT_MAX = 0xFFFFFFFFL;
+
+    private static byte DURABLE = 1;
+    private static byte PRIORITY = 2;
+    private static byte TIME_TO_LIVE = 4;
+    private static byte FIRST_ACQUIRER = 8;
+    private static byte DELIVERY_COUNT = 16;
+
+    private byte modified = 0;
+
+    private Boolean durable;
+    private UnsignedByte priority;
+    private UnsignedInteger timeToLive;
+    private Boolean firstAcquirer;
+    private UnsignedInteger deliveryCount;
+
+    public AmqpHeader() {}
+
+    public AmqpHeader(AmqpHeader header) {
+        setHeader(header);
+    }
+
+    public AmqpHeader(Header header) {
+        setHeader(header);
+    }
+
+    public void setHeader(Header header) {
+        if (header != null) {
+            setDurable(header.getDurable());
+            setPriority(header.getPriority());
+            setTimeToLive(header.getTtl());
+            setFirstAcquirer(header.getFirstAcquirer());
+            setDeliveryCount(header.getDeliveryCount());
+        }
+    }
+
+    public void setHeader(AmqpHeader header) {
+        if (header != null) {
+            modified = header.modified;
+            durable = header.durable;
+            priority = header.priority;
+            timeToLive = header.timeToLive;
+            firstAcquirer = header.firstAcquirer;
+            deliveryCount = header.deliveryCount;
+        }
+    }
+
+    public Header getHeader() {
+        Header result = null;
+
+        if (!isDefault()) {
+            result = new Header();
+            result.setDurable(durable);
+            result.setPriority(priority);
+            result.setFirstAcquirer(firstAcquirer);
+            result.setTtl(timeToLive);
+            result.setDeliveryCount(deliveryCount);
+        }
+
+        return result;
+    }
+
+    //----- Query the state of the Header object -----------------------------//
+
+    public boolean isDefault() {
+        return modified == 0;
+    }
+
+    public boolean nonDefaultDurable() {
+        return (modified & DURABLE) == DURABLE;
+    }
+
+    public boolean nonDefaultPriority() {
+        return (modified & PRIORITY) == PRIORITY;
+    }
+
+    public boolean nonDefaultTimeToLive() {
+        return (modified & TIME_TO_LIVE) == TIME_TO_LIVE;
+    }
+
+    public boolean nonDefaultFirstAcquirer() {
+        return (modified & FIRST_ACQUIRER) == FIRST_ACQUIRER;
+    }
+
+    public boolean nonDefaultDeliveryCount() {
+        return (modified & DELIVERY_COUNT) == DELIVERY_COUNT;
+    }
+
+    //----- Access the AMQP Header object ------------------------------------//
+
+    public boolean isDurable() {
+        return Boolean.TRUE.equals(durable);
+    }
+
+    public void setDurable(Boolean value) {
+        if (Boolean.TRUE.equals(value)) {
+            modified |= DURABLE;
+            durable = value;
+        } else {
+            modified &= ~DURABLE;
+            durable = null;
+        }
+    }
+
+    public int getPriority() {
+        if (priority != null) {
+            int scaled = priority.intValue();
+            if (scaled > 9) {
+                scaled = 9;
+            }
+
+            return scaled;
+        }
+
+        return DEFAULT_PRIORITY;
+    }
+
+    public void setPriority(UnsignedByte value) {
+        if (value == null || value.intValue() == DEFAULT_PRIORITY) {
+            modified &= ~PRIORITY;
+            priority = null;
+        } else {
+            modified |= PRIORITY;
+            priority = value;
+        }
+    }
+
+    public void setPriority(int priority) {
+        if (priority == DEFAULT_PRIORITY) {
+            setPriority(null);
+        } else {
+            byte scaled = (byte) priority;
+            if (priority < 0) {
+                scaled = 0;
+            } else if (priority > 9) {
+                scaled = 9;
+            }
+
+            setPriority(UnsignedByte.valueOf(scaled));
+        }
+    }
+
+    public long getTimeToLive() {
+        return timeToLive == null ? 0l : timeToLive.longValue();
+    }
+
+    public void setTimeToLive(UnsignedInteger value) {
+        if (value == null || UnsignedInteger.ZERO.equals(value)) {
+            modified &= ~TIME_TO_LIVE;
+            timeToLive = null;
+        } else {
+            modified |= TIME_TO_LIVE;
+            timeToLive = value;
+        }
+    }
+
+    public void setTimeToLive(long timeToLive) {
+        if (timeToLive > 0 && timeToLive < UINT_MAX) {
+            setTimeToLive(UnsignedInteger.valueOf(timeToLive));
+        } else {
+            setTimeToLive(null);
+        }
+    }
+
+    public boolean isFirstAcquirer() {
+        return Boolean.TRUE.equals(firstAcquirer);
+    }
+
+    public void setFirstAcquirer(Boolean value) {
+        if (Boolean.TRUE.equals(value)) {
+            modified |= FIRST_ACQUIRER;
+            firstAcquirer = Boolean.TRUE;
+        } else {
+            modified &= ~FIRST_ACQUIRER;
+            firstAcquirer = null;
+        }
+    }
+
+    public int getDeliveryCount() {
+        return deliveryCount == null ? 0 : deliveryCount.intValue();
+    }
+
+    public void setDeliveryCount(UnsignedInteger value) {
+        if (value == null || UnsignedInteger.ZERO.equals(value)) {
+            modified &= ~DELIVERY_COUNT;
+            deliveryCount = null;
+        } else {
+            modified |= DELIVERY_COUNT;
+            deliveryCount = value;
+        }
+    }
+
+    public void setDeliveryCount(int count) {
+        if (count == 0) {
+            setDeliveryCount(null);
+        } else {
+            setDeliveryCount(UnsignedInteger.valueOf(count));
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "AmqpHeader {" +
+               "durable=" + durable +
+               ", priority=" + priority +
+               ", ttl=" + timeToLive +
+               ", firstAcquirer=" + firstAcquirer +
+               ", deliveryCount=" + deliveryCount + " }";
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/2fa34230/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
index 13cf307..5e6aa77 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
@@ -40,7 +40,6 @@ import org.apache.qpid.jms.provider.amqp.AmqpConnection;
 import org.apache.qpid.jms.provider.amqp.AmqpConsumer;
 import org.apache.qpid.proton.amqp.Binary;
 import org.apache.qpid.proton.amqp.Symbol;
-import org.apache.qpid.proton.amqp.UnsignedByte;
 import org.apache.qpid.proton.amqp.UnsignedInteger;
 import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
 import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations;
@@ -54,13 +53,12 @@ import io.netty.buffer.ByteBuf;
 
 public class AmqpJmsMessageFacade implements JmsMessageFacade {
 
-    private static final int DEFAULT_PRIORITY = javax.jms.Message.DEFAULT_PRIORITY;
     private static final long UINT_MAX = 0xFFFFFFFFL;
 
     protected AmqpConnection connection;
 
     private Properties properties;
-    private Header header;
+    private final AmqpHeader header = new AmqpHeader();
     private Section body;
     private Map<Symbol, Object> messageAnnotationsMap;
     private Map<String, Object> applicationPropertiesMap;
@@ -89,7 +87,7 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
         this.connection = connection;
 
         setMessageAnnotation(JMS_MSG_TYPE, getJmsMsgType());
-        setPersistent(true); // TODO - Remove to avoid default Header
+        setPersistent(true);
         initializeEmptyBody();
     }
 
@@ -222,14 +220,7 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
             ttl = producerTtl;
         }
 
-        if (ttl > 0 && ttl < UINT_MAX) {
-            lazyCreateHeader();
-            header.setTtl(UnsignedInteger.valueOf(ttl));
-        } else {
-            if (header != null) {
-                header.setTtl(null);
-            }
-        }
+        header.setTimeToLive(ttl);
 
         setMessageAnnotation(JMS_MSG_TYPE, getJmsMsgType());
     }
@@ -278,17 +269,7 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
             target.userSpecifiedTTL = userSpecifiedTTL;
         }
 
-        if (header != null) {
-            Header targetHeader = new Header();
-
-            targetHeader.setDurable(header.getDurable());
-            targetHeader.setPriority(header.getPriority());
-            targetHeader.setTtl(header.getTtl());
-            targetHeader.setFirstAcquirer(header.getFirstAcquirer());
-            targetHeader.setDeliveryCount(header.getDeliveryCount());
-
-            target.setHeader(targetHeader);
-        }
+        target.setAmqpHeader(header);
 
         if (properties != null) {
             Properties targetProperties = new Properties();
@@ -483,23 +464,11 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
 
     @Override
     public boolean isPersistent() {
-        if (header != null && header.getDurable() != null) {
-            return header.getDurable();
-        }
-
-        return false;
+        return header.isDurable();
     }
 
     @Override
     public void setPersistent(boolean value) {
-        if (header == null) {
-            if (value == false) {
-                return;
-            } else {
-                lazyCreateHeader();
-            }
-        }
-
         header.setDurable(value);
     }
 
@@ -515,26 +484,12 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
 
     @Override
     public int getRedeliveryCount() {
-        if (header != null) {
-            UnsignedInteger count = header.getDeliveryCount();
-            if (count != null) {
-                return count.intValue();
-            }
-        }
-
-        return 0;
+        return header.getDeliveryCount();
     }
 
     @Override
     public void setRedeliveryCount(int redeliveryCount) {
-        if (redeliveryCount == 0) {
-            if (header != null) {
-                header.setDeliveryCount(null);
-            }
-        } else {
-            lazyCreateHeader();
-            header.setDeliveryCount(UnsignedInteger.valueOf(redeliveryCount));
-        }
+        header.setDeliveryCount(redeliveryCount);
     }
 
     @Override
@@ -578,38 +533,12 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
 
     @Override
     public int getPriority() {
-        if (header != null) {
-            UnsignedByte priority = header.getPriority();
-            if (priority != null) {
-                int scaled = priority.intValue();
-                if (scaled > 9) {
-                    scaled = 9;
-                }
-
-                return scaled;
-            }
-        }
-
-        return DEFAULT_PRIORITY;
+        return header.getPriority();
     }
 
     @Override
     public void setPriority(int priority) {
-        if (priority == DEFAULT_PRIORITY) {
-            if (header != null) {
-                header.setPriority(null);
-            }
-        } else {
-            byte scaled = (byte) priority;
-            if (priority < 0) {
-                scaled = 0;
-            } else if (priority > 9) {
-                scaled = 9;
-            }
-
-            lazyCreateHeader();
-            header.setPriority(UnsignedByte.valueOf(scaled));
-        }
+        header.setPriority(priority);
     }
 
     @Override
@@ -987,12 +916,20 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
 
     //----- Access to AMQP Message Values ------------------------------------//
 
-    Header getHeader() {
+    AmqpHeader getAmqpHeader() {
         return header;
     }
 
+    void setAmqpHeader(AmqpHeader header) {
+        this.header.setHeader(header);
+    }
+
+    Header getHeader() {
+        return header.getHeader();
+    }
+
     void setHeader(Header header) {
-        this.header = header;
+        this.header.setHeader(header);
     }
 
     Properties getProperties() {
@@ -1087,11 +1024,8 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
 
     private Long getTtl() {
         Long result = null;
-        if (header != null) {
-            UnsignedInteger ttl = header.getTtl();
-            if (ttl != null) {
-                result = ttl.longValue();
-            }
+        if (header.nonDefaultTimeToLive()) {
+            result = header.getTimeToLive();
         }
 
         return result;
@@ -1114,12 +1048,6 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
         }
     }
 
-    private void lazyCreateHeader() {
-        if (header == null) {
-            header = new Header();
-        }
-    }
-
     private void lazyCreateMessageAnnotations() {
         if (messageAnnotationsMap == null) {
             messageAnnotationsMap = new HashMap<Symbol, Object>();

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/2fa34230/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java
index b5d6dd2..56ec81e 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java
@@ -255,6 +255,49 @@ public class ProducerIntegrationTest extends QpidJmsTestCase {
     }
 
     /**
+     * Test that when a message is sent and the producer is set to send as NON_PERSISTENT
+     * the resulting sent message has durable set to false.
+     *
+     * @throws Exception if an error occurs during the test.
+     */
+    @Test(timeout = 20000)
+    public void testSendingMessageNonPersistentSetDurableFalse() throws Exception {
+        try (TestAmqpPeer testPeer = new TestAmqpPeer();) {
+            Connection connection = testFixture.establishConnecton(testPeer);
+            testPeer.expectBegin();
+            testPeer.expectSenderAttach();
+
+            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+            String queueName = "myQueue";
+            Queue queue = session.createQueue(queueName);
+            MessageProducer producer = session.createProducer(queue);
+
+            String text = "myMessage";
+            MessageAnnotationsSectionMatcher msgAnnotationsMatcher = new MessageAnnotationsSectionMatcher(true);
+            MessagePropertiesSectionMatcher propsMatcher = new MessagePropertiesSectionMatcher(true);
+            TransferPayloadCompositeMatcher messageMatcher = new TransferPayloadCompositeMatcher();
+            messageMatcher.setMessageAnnotationsMatcher(msgAnnotationsMatcher);
+            messageMatcher.setPropertiesMatcher(propsMatcher);
+            messageMatcher.setMessageContentMatcher(new EncodedAmqpValueMatcher(text));
+            testPeer.expectTransfer(messageMatcher);
+            testPeer.expectClose();
+
+            Message message = session.createTextMessage(text);
+
+            assertNull("Should not yet have a JMSDestination", message.getJMSDestination());
+
+            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+            producer.send(message);
+
+            assertEquals("Should have NON_PERSISTENT delivery mode set", DeliveryMode.NON_PERSISTENT, message.getJMSDeliveryMode());
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(1000);
+        }
+    }
+
+    /**
      * Test that when a message is sent the JMSDestination header is set to
      * the Destination used by the producer.
      *

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/2fa34230/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpCodecTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpCodecTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpCodecTest.java
index 2d7932b..b549b28 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpCodecTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpCodecTest.java
@@ -22,6 +22,7 @@ package org.apache.qpid.jms.provider.amqp.message;
 
 import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.encodeMessage;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -35,6 +36,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import javax.jms.DeliveryMode;
+
 import org.apache.qpid.jms.message.JmsBytesMessage;
 import org.apache.qpid.jms.message.JmsMessage;
 import org.apache.qpid.jms.message.JmsObjectMessage;
@@ -48,15 +51,20 @@ import org.apache.qpid.jms.test.QpidJmsTestCase;
 import org.apache.qpid.proton.Proton;
 import org.apache.qpid.proton.amqp.Binary;
 import org.apache.qpid.proton.amqp.Symbol;
+import org.apache.qpid.proton.amqp.UnsignedInteger;
 import org.apache.qpid.proton.amqp.messaging.AmqpSequence;
 import org.apache.qpid.proton.amqp.messaging.AmqpValue;
 import org.apache.qpid.proton.amqp.messaging.Data;
+import org.apache.qpid.proton.amqp.messaging.Header;
 import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
 import org.apache.qpid.proton.message.Message;
+import org.apache.qpid.proton.message.impl.MessageImpl;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import io.netty.buffer.ByteBuf;
+
 public class AmqpCodecTest extends QpidJmsTestCase {
     private AmqpConsumer mockConsumer;
 
@@ -70,6 +78,162 @@ public class AmqpCodecTest extends QpidJmsTestCase {
         Mockito.when(mockConsumer.getResourceInfo()).thenReturn(new JmsConsumerInfo(consumerId));
     }
 
+    //----- AmqpHeader encode and decode -------------------------------------//
+
+    @Test
+    public void testEncodeEmptyHeaderAndDecode() {
+        Header empty = new Header();
+
+        ByteBuf encoded = AmqpCodec.encode(empty);
+        Header decoded = (Header) AmqpCodec.decode(encoded);
+
+        assertNotNull(decoded);
+
+        AmqpHeader header = new AmqpHeader(decoded);
+
+        assertFalse(header.isDurable());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertFalse(header.isFirstAcquirer());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testEncodeHeaderWithDurableAndDecode() {
+        AmqpHeader header = new AmqpHeader();
+        header.setDurable(true);
+
+        ByteBuf encoded = AmqpCodec.encode(header.getHeader());
+        AmqpHeader decoded = new AmqpHeader((Header) AmqpCodec.decode(encoded));
+
+        assertTrue(decoded.isDurable());
+        assertEquals(4, decoded.getPriority());
+        assertEquals(0, decoded.getTimeToLive());
+        assertFalse(decoded.isFirstAcquirer());
+        assertEquals(0, decoded.getDeliveryCount());
+    }
+
+    @Test
+    public void testEncodeHeaderWithDeliveryCountAndDecode() {
+        AmqpHeader header = new AmqpHeader();
+        header.setDeliveryCount(1);
+
+        ByteBuf encoded = AmqpCodec.encode(header.getHeader());
+        AmqpHeader decoded = new AmqpHeader((Header) AmqpCodec.decode(encoded));
+
+        assertFalse(decoded.isDurable());
+        assertEquals(4, decoded.getPriority());
+        assertEquals(0, decoded.getTimeToLive());
+        assertFalse(decoded.isFirstAcquirer());
+        assertEquals(1, decoded.getDeliveryCount());
+    }
+
+    @Test
+    public void testEncodeHeaderWithAllSetAndDecode() {
+        AmqpHeader header = new AmqpHeader();
+        header.setDurable(true);
+        header.setDeliveryCount(43);
+        header.setFirstAcquirer(true);
+        header.setPriority(9);
+        header.setTimeToLive(32768);
+
+        ByteBuf encoded = AmqpCodec.encode(header.getHeader());
+        AmqpHeader decoded = new AmqpHeader((Header) AmqpCodec.decode(encoded));
+
+        assertTrue(decoded.isDurable());
+        assertTrue(decoded.isFirstAcquirer());
+        assertEquals(43, decoded.getDeliveryCount());
+        assertEquals(9, decoded.getPriority());
+        assertEquals(32768, decoded.getTimeToLive());
+    }
+
+    //----- AmqpHeader handling on message decode ----------------------------//
+
+    @Test
+    public void testPersistentSetFromMessageWithNonDefaultValue() throws Exception {
+        MessageImpl message = (MessageImpl) Message.Factory.create();
+        message.setDurable(true);
+        message.setBody(new AmqpValue("test"));
+
+        JmsMessage jmsMessage = AmqpCodec.decodeMessage(mockConsumer, encodeMessage(message)).asJmsMessage();
+        assertNotNull("Message should not be null", jmsMessage);
+        assertEquals("Unexpected message class type", JmsTextMessage.class, jmsMessage.getClass());
+        assertEquals(DeliveryMode.PERSISTENT, jmsMessage.getJMSDeliveryMode());
+
+        JmsMessageFacade facade = jmsMessage.getFacade();
+        assertNotNull("Facade should not be null", facade);
+        assertEquals("Unexpected facade class type", AmqpJmsTextMessageFacade.class, facade.getClass());
+        assertTrue(facade.isPersistent());
+    }
+
+    @Test
+    public void testMessagePrioritySetFromMessageWithNonDefaultValue() throws Exception {
+        MessageImpl message = (MessageImpl) Message.Factory.create();
+        message.setPriority((short) 8);
+        message.setBody(new AmqpValue("test"));
+
+        JmsMessage jmsMessage = AmqpCodec.decodeMessage(mockConsumer, encodeMessage(message)).asJmsMessage();
+        assertNotNull("Message should not be null", jmsMessage);
+        assertEquals("Unexpected message class type", JmsTextMessage.class, jmsMessage.getClass());
+        assertEquals(8, jmsMessage.getJMSPriority());
+
+        JmsMessageFacade facade = jmsMessage.getFacade();
+        assertNotNull("Facade should not be null", facade);
+        assertEquals("Unexpected facade class type", AmqpJmsTextMessageFacade.class, facade.getClass());
+        assertEquals(8, facade.getPriority());
+    }
+
+    @Test
+    public void testFirstAcquirerSetFromMessageWithNonDefaultValue() throws Exception {
+        MessageImpl message = (MessageImpl) Message.Factory.create();
+        message.setFirstAcquirer(true);
+        message.setBody(new AmqpValue("test"));
+
+        JmsMessage jmsMessage = AmqpCodec.decodeMessage(mockConsumer, encodeMessage(message)).asJmsMessage();
+        assertNotNull("Message should not be null", jmsMessage);
+        assertEquals("Unexpected message class type", JmsTextMessage.class, jmsMessage.getClass());
+
+        assertEquals("Unexpected facade class type", AmqpJmsTextMessageFacade.class, jmsMessage.getFacade().getClass());
+        AmqpJmsTextMessageFacade facade = (AmqpJmsTextMessageFacade) jmsMessage.getFacade();
+        assertNotNull("Facade should not be null", facade);
+        assertTrue(facade.getAmqpHeader().isFirstAcquirer());
+    }
+
+    @Test
+    public void testTimeToLiveSetFromMessageWithNonDefaultValue() throws Exception {
+        MessageImpl message = (MessageImpl) Message.Factory.create();
+        message.setTtl(65535);
+        message.setBody(new AmqpValue("test"));
+
+        JmsMessage jmsMessage = AmqpCodec.decodeMessage(mockConsumer, encodeMessage(message)).asJmsMessage();
+        assertNotNull("Message should not be null", jmsMessage);
+        assertEquals("Unexpected message class type", JmsTextMessage.class, jmsMessage.getClass());
+
+        assertEquals("Unexpected facade class type", AmqpJmsTextMessageFacade.class, jmsMessage.getFacade().getClass());
+        AmqpJmsTextMessageFacade facade = (AmqpJmsTextMessageFacade) jmsMessage.getFacade();
+        assertNotNull("Facade should not be null", facade);
+        assertEquals(65535, facade.getAmqpHeader().getTimeToLive());
+    }
+
+    @Test
+    public void testDeliveryCountSetFromMessageWithNonDefaultValue() throws Exception {
+        MessageImpl message = (MessageImpl) Message.Factory.create();
+        message.setDeliveryCount(2);
+        message.setBody(new AmqpValue("test"));
+
+        JmsMessage jmsMessage = AmqpCodec.decodeMessage(mockConsumer, encodeMessage(message)).asJmsMessage();
+        assertNotNull("Message should not be null", jmsMessage);
+        assertEquals("Unexpected message class type", JmsTextMessage.class, jmsMessage.getClass());
+        assertTrue(jmsMessage.getJMSRedelivered());
+
+        assertEquals("Unexpected facade class type", AmqpJmsTextMessageFacade.class, jmsMessage.getFacade().getClass());
+        AmqpJmsTextMessageFacade facade = (AmqpJmsTextMessageFacade) jmsMessage.getFacade();
+        assertNotNull("Facade should not be null", facade);
+        assertEquals(2, facade.getRedeliveryCount());
+        assertEquals(2, facade.getAmqpHeader().getDeliveryCount());
+        assertEquals(UnsignedInteger.valueOf(2), facade.getHeader().getDeliveryCount());
+    }
+
     // =============== With The Message Type Annotation =========
     // ==========================================================
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/2fa34230/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpHeaderTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpHeaderTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpHeaderTest.java
new file mode 100644
index 0000000..a2752a0
--- /dev/null
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpHeaderTest.java
@@ -0,0 +1,737 @@
+/*
+ * 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.jms.provider.amqp.message;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.qpid.proton.amqp.UnsignedByte;
+import org.apache.qpid.proton.amqp.UnsignedInteger;
+import org.apache.qpid.proton.amqp.messaging.Header;
+import org.junit.Test;
+
+/**
+ * Test the AmqpHeader implementation
+ */
+public class AmqpHeaderTest {
+
+    @Test
+    public void testCreate() {
+        AmqpHeader header = new AmqpHeader();
+
+        assertTrue(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertNotNull(header.toString());
+    }
+
+    @Test
+    public void testCreateFromHeader() {
+        Header protonHeader = new Header();
+        protonHeader.setPriority(UnsignedByte.valueOf((byte) 9));
+        protonHeader.setTtl(UnsignedInteger.valueOf(10));
+        protonHeader.setDeliveryCount(UnsignedInteger.valueOf(11));
+        protonHeader.setDurable(true);
+        protonHeader.setFirstAcquirer(true);
+
+        AmqpHeader header = new AmqpHeader(protonHeader);
+
+        assertFalse(header.isDefault());
+        assertTrue(header.nonDefaultDurable());
+        assertTrue(header.nonDefaultPriority());
+        assertTrue(header.nonDefaultTimeToLive());
+        assertTrue(header.nonDefaultFirstAcquirer());
+        assertTrue(header.nonDefaultDeliveryCount());
+
+        assertEquals(true, header.isDurable());
+        assertEquals(true, header.isFirstAcquirer());
+        assertEquals(9, header.getPriority());
+        assertEquals(10, header.getTimeToLive());
+        assertEquals(11, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testCreateFromAmqpHeader() {
+        AmqpHeader amqpHeader = new AmqpHeader();
+        amqpHeader.setPriority(UnsignedByte.valueOf((byte) 9));
+        amqpHeader.setTimeToLive(UnsignedInteger.valueOf(10));
+        amqpHeader.setDeliveryCount(UnsignedInteger.valueOf(11));
+        amqpHeader.setDurable(true);
+        amqpHeader.setFirstAcquirer(true);
+
+        AmqpHeader header = new AmqpHeader(amqpHeader);
+
+        assertFalse(header.isDefault());
+        assertTrue(header.nonDefaultDurable());
+        assertTrue(header.nonDefaultPriority());
+        assertTrue(header.nonDefaultTimeToLive());
+        assertTrue(header.nonDefaultFirstAcquirer());
+        assertTrue(header.nonDefaultDeliveryCount());
+
+        assertEquals(true, header.isDurable());
+        assertEquals(true, header.isFirstAcquirer());
+        assertEquals(9, header.getPriority());
+        assertEquals(10, header.getTimeToLive());
+        assertEquals(11, header.getDeliveryCount());
+    }
+
+    //----- Test Set from Header ---------------------------------------------//
+
+    @Test
+    public void testSetHeaderWithNull() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setHeader((Header) null);
+
+        assertTrue(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithDefaultHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setHeader(new Header());
+
+        assertTrue(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithDurableHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        Header protonHeader = new Header();
+        protonHeader.setDurable(true);
+
+        header.setHeader(protonHeader);
+
+        assertFalse(header.isDefault());
+        assertTrue(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(true, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithFirstAcquirerHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        Header protonHeader = new Header();
+        protonHeader.setFirstAcquirer(true);
+
+        header.setHeader(protonHeader);
+
+        assertFalse(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertTrue(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(true, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithPriorityHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        Header protonHeader = new Header();
+        protonHeader.setPriority(UnsignedByte.valueOf((byte) 9));
+
+        header.setHeader(protonHeader);
+
+        assertFalse(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertTrue(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(9, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithDeliveryCountHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        Header protonHeader = new Header();
+        protonHeader.setDeliveryCount(UnsignedInteger.valueOf(9));
+
+        header.setHeader(protonHeader);
+
+        assertFalse(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertTrue(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(9, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithTimeToLiveHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        Header protonHeader = new Header();
+        protonHeader.setTtl(UnsignedInteger.valueOf(9));
+
+        header.setHeader(protonHeader);
+
+        assertFalse(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertTrue(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(9, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithHeaderWithAllSet() {
+        AmqpHeader header = new AmqpHeader();
+
+        Header protonHeader = new Header();
+        protonHeader.setPriority(UnsignedByte.valueOf((byte) 9));
+        protonHeader.setTtl(UnsignedInteger.valueOf(10));
+        protonHeader.setDeliveryCount(UnsignedInteger.valueOf(11));
+        protonHeader.setDurable(true);
+        protonHeader.setFirstAcquirer(true);
+
+        header.setHeader(protonHeader);
+
+        assertFalse(header.isDefault());
+        assertTrue(header.nonDefaultDurable());
+        assertTrue(header.nonDefaultPriority());
+        assertTrue(header.nonDefaultTimeToLive());
+        assertTrue(header.nonDefaultFirstAcquirer());
+        assertTrue(header.nonDefaultDeliveryCount());
+
+        assertEquals(true, header.isDurable());
+        assertEquals(true, header.isFirstAcquirer());
+        assertEquals(9, header.getPriority());
+        assertEquals(10, header.getTimeToLive());
+        assertEquals(11, header.getDeliveryCount());
+    }
+
+    //----- Test Set from AmqpHeader ---------------------------------------------//
+
+    @Test
+    public void testSetAmqpHeaderWithNull() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setHeader((AmqpHeader) null);
+
+        assertTrue(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithDefaultAmqpHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setHeader(new AmqpHeader());
+
+        assertTrue(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithDurableAmqpHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        AmqpHeader amqpHeader = new AmqpHeader();
+        amqpHeader.setDurable(true);
+
+        header.setHeader(amqpHeader);
+
+        assertFalse(header.isDefault());
+        assertTrue(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(true, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithFirstAcquirerAmqpHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        AmqpHeader amqpHeader = new AmqpHeader();
+        amqpHeader.setFirstAcquirer(true);
+
+        header.setHeader(amqpHeader);
+
+        assertFalse(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertTrue(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(true, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithPriorityAmqpHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        AmqpHeader amqpHeader = new AmqpHeader();
+        amqpHeader.setPriority(UnsignedByte.valueOf((byte) 9));
+
+        header.setHeader(amqpHeader);
+
+        assertFalse(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertTrue(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(9, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithDeliveryCountAmqpHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        AmqpHeader amqpHeader = new AmqpHeader();
+        amqpHeader.setDeliveryCount(UnsignedInteger.valueOf(9));
+
+        header.setHeader(amqpHeader);
+
+        assertFalse(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertFalse(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertTrue(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(0, header.getTimeToLive());
+        assertEquals(9, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithTimeToLiveAmqpHeader() {
+        AmqpHeader header = new AmqpHeader();
+
+        AmqpHeader amqpHeader = new AmqpHeader();
+        amqpHeader.setTimeToLive(UnsignedInteger.valueOf(9));
+
+        header.setHeader(amqpHeader);
+
+        assertFalse(header.isDefault());
+        assertFalse(header.nonDefaultDurable());
+        assertFalse(header.nonDefaultPriority());
+        assertTrue(header.nonDefaultTimeToLive());
+        assertFalse(header.nonDefaultFirstAcquirer());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertEquals(false, header.isDurable());
+        assertEquals(false, header.isFirstAcquirer());
+        assertEquals(4, header.getPriority());
+        assertEquals(9, header.getTimeToLive());
+        assertEquals(0, header.getDeliveryCount());
+    }
+
+    @Test
+    public void testSetHeaderWithAmqpHeaderWithAllSet() {
+        AmqpHeader header = new AmqpHeader();
+
+        AmqpHeader amqpHeader = new AmqpHeader();
+        amqpHeader.setPriority(UnsignedByte.valueOf((byte) 9));
+        amqpHeader.setTimeToLive(UnsignedInteger.valueOf(10));
+        amqpHeader.setDeliveryCount(UnsignedInteger.valueOf(11));
+        amqpHeader.setDurable(true);
+        amqpHeader.setFirstAcquirer(true);
+
+        header.setHeader(amqpHeader);
+
+        assertFalse(header.isDefault());
+        assertTrue(header.nonDefaultDurable());
+        assertTrue(header.nonDefaultPriority());
+        assertTrue(header.nonDefaultTimeToLive());
+        assertTrue(header.nonDefaultFirstAcquirer());
+        assertTrue(header.nonDefaultDeliveryCount());
+
+        assertEquals(true, header.isDurable());
+        assertEquals(true, header.isFirstAcquirer());
+        assertEquals(9, header.getPriority());
+        assertEquals(10, header.getTimeToLive());
+        assertEquals(11, header.getDeliveryCount());
+    }
+
+    //----- Test Durable Property --------------------------------------------//
+
+    @Test
+    public void testSetDuranleFromNull() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setDurable((Boolean) null);
+
+        assertFalse(header.isDurable());
+        assertFalse(header.nonDefaultDurable());
+
+        assertTrue(header.isDefault());
+    }
+
+    @Test
+    public void testSetDuranleFromBoolean() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setDurable(Boolean.FALSE);
+
+        assertFalse(header.isDurable());
+        assertFalse(header.nonDefaultDurable());
+
+        assertTrue(header.isDefault());
+
+        header.setDurable(Boolean.TRUE);
+
+        assertTrue(header.isDurable());
+        assertTrue(header.nonDefaultDurable());
+
+        assertFalse(header.isDefault());
+    }
+
+    @Test
+    public void testSetDuranleFromPrimitive() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setDurable(false);
+
+        assertFalse(header.isDurable());
+        assertFalse(header.nonDefaultDurable());
+
+        assertTrue(header.isDefault());
+
+        header.setDurable(true);
+
+        assertTrue(header.isDurable());
+        assertTrue(header.nonDefaultDurable());
+
+        assertFalse(header.isDefault());
+    }
+
+    //----- Test Priority Property -------------------------------------------//
+
+    @Test
+    public void testSetPriorityFromNull() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setPriority((UnsignedByte) null);
+
+        assertEquals(4, header.getPriority());
+        assertFalse(header.nonDefaultPriority());
+
+        assertTrue(header.isDefault());
+    }
+
+    @Test
+    public void testSetPriorityFromUnsigedByte() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setPriority(UnsignedByte.valueOf((byte) 9));
+
+        assertEquals(9, header.getPriority());
+        assertTrue(header.nonDefaultPriority());
+
+        assertFalse(header.isDefault());
+
+        header.setPriority(UnsignedByte.valueOf((byte) 4));
+
+        assertEquals(4, header.getPriority());
+        assertFalse(header.nonDefaultPriority());
+
+        assertTrue(header.isDefault());
+    }
+
+    @Test
+    public void testSetPriorityFromPrimitive() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setPriority(9);
+
+        assertEquals(9, header.getPriority());
+        assertTrue(header.nonDefaultPriority());
+
+        assertFalse(header.isDefault());
+
+        header.setPriority(4);
+
+        assertEquals(4, header.getPriority());
+        assertFalse(header.nonDefaultPriority());
+
+        assertTrue(header.isDefault());
+    }
+
+    //----- Test Time To Live Property ---------------------------------------//
+
+    @Test
+    public void testSetTimeToLiveFromNull() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setTimeToLive((UnsignedInteger) null);
+
+        assertEquals(0, header.getTimeToLive());
+        assertFalse(header.nonDefaultTimeToLive());
+
+        assertTrue(header.isDefault());
+    }
+
+    @Test
+    public void testSetTimeToLiveFromLongMaxValue() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setTimeToLive(Long.MAX_VALUE);
+
+        assertEquals(0, header.getTimeToLive());
+        assertFalse(header.nonDefaultTimeToLive());
+
+        assertTrue(header.isDefault());
+    }
+
+    @Test
+    public void testSetTimeToLiveFromUnsigedByte() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setTimeToLive(UnsignedInteger.valueOf((byte) 90));
+
+        assertEquals(90, header.getTimeToLive());
+        assertTrue(header.nonDefaultTimeToLive());
+
+        assertFalse(header.isDefault());
+
+        header.setTimeToLive(UnsignedInteger.valueOf((byte) 0));
+
+        assertEquals(0, header.getTimeToLive());
+        assertFalse(header.nonDefaultTimeToLive());
+
+        assertTrue(header.isDefault());
+    }
+
+    @Test
+    public void testSetTimeToLiveFromPrimitive() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setTimeToLive(9);
+
+        assertEquals(9, header.getTimeToLive());
+        assertTrue(header.nonDefaultTimeToLive());
+
+        assertFalse(header.isDefault());
+
+        header.setTimeToLive(0);
+
+        assertEquals(0, header.getTimeToLive());
+        assertFalse(header.nonDefaultTimeToLive());
+
+        assertTrue(header.isDefault());
+    }
+
+    //----- Test First Acquirer Property ---------------------------------------//
+
+    @Test
+    public void testSetFirstAcquirerFromNull() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setFirstAcquirer((Boolean) null);
+
+        assertFalse(header.isFirstAcquirer());
+        assertFalse(header.nonDefaultFirstAcquirer());
+
+        assertTrue(header.isDefault());
+    }
+
+    @Test
+    public void testSetFirstAcquirerFromBoolean() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setFirstAcquirer(Boolean.FALSE);
+
+        assertFalse(header.isFirstAcquirer());
+        assertFalse(header.nonDefaultFirstAcquirer());
+
+        assertTrue(header.isDefault());
+
+        header.setFirstAcquirer(Boolean.TRUE);
+
+        assertTrue(header.isFirstAcquirer());
+        assertTrue(header.nonDefaultFirstAcquirer());
+
+        assertFalse(header.isDefault());
+    }
+
+    @Test
+    public void testSetFirstAcquirerFromPrimitive() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setFirstAcquirer(false);
+
+        assertFalse(header.isFirstAcquirer());
+        assertFalse(header.nonDefaultFirstAcquirer());
+
+        assertTrue(header.isDefault());
+
+        header.setFirstAcquirer(true);
+
+        assertTrue(header.isFirstAcquirer());
+        assertTrue(header.nonDefaultFirstAcquirer());
+
+        assertFalse(header.isDefault());
+    }
+
+    //----- Test Delivery Count Property ---------------------------------------//
+
+    @Test
+    public void testSetDeliveryCountFromNull() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setDeliveryCount((UnsignedInteger) null);
+
+        assertEquals(0, header.getDeliveryCount());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertTrue(header.isDefault());
+    }
+
+    @Test
+    public void testSetDeliveryCountFromUnsigedInteger() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setDeliveryCount(UnsignedInteger.valueOf((byte) 90));
+
+        assertEquals(90, header.getDeliveryCount());
+        assertTrue(header.nonDefaultDeliveryCount());
+
+        assertFalse(header.isDefault());
+
+        header.setDeliveryCount(UnsignedInteger.valueOf((byte) 0));
+
+        assertEquals(0, header.getDeliveryCount());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertTrue(header.isDefault());
+    }
+
+    @Test
+    public void testSetDeliveryCountFromPrimitive() {
+        AmqpHeader header = new AmqpHeader();
+
+        header.setDeliveryCount(9);
+
+        assertEquals(9, header.getDeliveryCount());
+        assertTrue(header.nonDefaultDeliveryCount());
+
+        assertFalse(header.isDefault());
+
+        header.setDeliveryCount(0);
+
+        assertEquals(0, header.getDeliveryCount());
+        assertFalse(header.nonDefaultDeliveryCount());
+
+        assertTrue(header.isDefault());
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/2fa34230/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java
index 544b70f..c26bbe1 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java
@@ -98,13 +98,12 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
 
         assertNotNull("Expected message to have Header section", amqpMessageFacade.getHeader());
-        assertTrue("Durable not as expected", amqpMessageFacade.getHeader().getDurable());
+        assertTrue("Durable not as expected", amqpMessageFacade.getAmqpHeader().isDurable());
     }
 
     @Test
     public void testNewMessageHasUnderlyingHeaderSectionWithNoTtlSet() {
         AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
-        amqpMessageFacade.setHeader(new Header());
 
         assertNotNull("Expected message to have Header section", amqpMessageFacade.getHeader());
         assertNull("Ttl field should not be set", amqpMessageFacade.getHeader().getTtl());
@@ -162,8 +161,8 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         amqpMessageFacade.onSend(0);
 
         // check value on underlying TTL field is NOT set
-        assertEquals("TTL has not been cleared", 0, message.getTtl());
-        assertNull("TTL field on underlying message should NOT be set", amqpMessageFacade.getHeader().getTtl());
+        assertEquals("TTL has not been cleared", 0, amqpMessageFacade.getAmqpHeader().getTimeToLive());
+        assertNull("Underlying Header should be null, no values set to non-defaults", amqpMessageFacade.getHeader());
     }
 
     @Test
@@ -180,7 +179,7 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         amqpMessageFacade.onSend(newTtl);
 
         // check value on underlying TTL field is NOT set
-        assertEquals("TTL has not been overriden", newTtl, message.getTtl());
+        assertEquals("TTL has not been overriden", newTtl, amqpMessageFacade.getAmqpHeader().getTimeToLive());
         assertEquals("TTL field on underlying message should be set", UnsignedInteger.valueOf(newTtl), amqpMessageFacade.getHeader().getTtl());
     }
 
@@ -196,7 +195,7 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         amqpMessageFacade.onSend(producerTtl);
 
         // check value on underlying TTL field is set to the override
-        assertEquals("TTL has not been overriden", overrideTtl, amqpMessageFacade.getHeader().getTtl().intValue());
+        assertEquals("TTL has not been overriden", overrideTtl, amqpMessageFacade.getAmqpHeader().getTimeToLive());
     }
 
     // --- delivery count  ---
@@ -423,7 +422,7 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         amqpMessageFacade.setPriority(priority);
 
         assertEquals("expected priority value not found", priority, amqpMessageFacade.getPriority());
-        assertEquals("expected priority value not found", priority, amqpMessageFacade.getHeader().getPriority().intValue());
+        assertEquals("expected priority value not found", UnsignedByte.valueOf(priority), amqpMessageFacade.getHeader().getPriority());
     }
 
     /**
@@ -436,7 +435,7 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         amqpMessageFacade.setPriority(-1);
 
         assertEquals("expected priority value not found", 0, amqpMessageFacade.getPriority());
-        assertEquals("expected priority value not found", 0, amqpMessageFacade.getHeader().getPriority().intValue());
+        assertEquals("expected priority value not found", UnsignedByte.valueOf((byte) 0), amqpMessageFacade.getHeader().getPriority());
     }
 
     /**
@@ -449,7 +448,7 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         amqpMessageFacade.setPriority(11);
 
         assertEquals("expected priority value not found", 9, amqpMessageFacade.getPriority());
-        assertEquals("expected priority value not found", 9, amqpMessageFacade.getHeader().getPriority().intValue());
+        assertEquals("expected priority value not found", UnsignedByte.valueOf((byte) 9), amqpMessageFacade.getHeader().getPriority());
     }
 
     /**
@@ -490,7 +489,7 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         assertEquals("expected priority value not returned", Message.DEFAULT_PRIORITY, amqpMessageFacade.getPriority());
 
         //check the underlying header field was actually cleared rather than set to Message.DEFAULT_PRIORITY
-        assertNull("underlying header priority field was not cleared", amqpMessageFacade.getHeader().getPriority());
+        assertNull("underlying header priority field was not cleared", amqpMessageFacade.getHeader());
     }
 
     // ====== AMQP Properties Section =======
@@ -1843,6 +1842,35 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         assertFalse(amqpMessageFacade.propertyExists(null));
     }
 
+    // ====== AMQP Message No Header tests ===========
+    // ===============================================
+
+    @Test
+    public void testMessageWithDefaultHeaderValuesCreateNoHeaderForEncode() throws Exception {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        amqpMessageFacade.setPersistent(false);
+        amqpMessageFacade.setPriority(Message.DEFAULT_PRIORITY);
+        amqpMessageFacade.setRedelivered(false);
+
+        amqpMessageFacade.onSend(0);
+
+        assertNull(amqpMessageFacade.getHeader());
+    }
+
+    @Test
+    public void testMessageWithNonDefaultHeaderValuesCreateNoHeaderForEncode() throws Exception {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        amqpMessageFacade.setPersistent(true);
+        amqpMessageFacade.setPriority(Message.DEFAULT_PRIORITY + 1);
+        amqpMessageFacade.setRedelivered(true);
+
+        amqpMessageFacade.onSend(100);
+
+        assertNotNull(amqpMessageFacade.getHeader());
+    }
+
     // ====== AMQP Message Facade copy() tests =======
     // ===============================================
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/2fa34230/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/usecases/JmsLargeMessageSendRecvTimedTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/usecases/JmsLargeMessageSendRecvTimedTest.java b/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/usecases/JmsLargeMessageSendRecvTimedTest.java
index fb4f986..bf2ba48 100644
--- a/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/usecases/JmsLargeMessageSendRecvTimedTest.java
+++ b/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/usecases/JmsLargeMessageSendRecvTimedTest.java
@@ -25,6 +25,7 @@ import java.util.Random;
 
 import javax.jms.BytesMessage;
 import javax.jms.Connection;
+import javax.jms.DeliveryMode;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
 import javax.jms.MessageProducer;
@@ -72,7 +73,7 @@ public class JmsLargeMessageSendRecvTimedTest extends AmqpTestSupport {
     }
 
     @Test(timeout = 5 * 60 * 1000)
-    public void testSend50MBMessage() throws Exception {
+    public void testSend100MBMessage() throws Exception {
         doTestSendLargeMessage(1024 * 1024 * 100);
     }
 
@@ -89,6 +90,10 @@ public class JmsLargeMessageSendRecvTimedTest extends AmqpTestSupport {
         MessageProducer producer = session.createProducer(queue);
         BytesMessage message = session.createBytesMessage();
         message.writeBytes(payload);
+        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+
+        // Set this to non-default to get a Header in the encoded message.
+        producer.setPriority(4);
         producer.send(message);
         long endTime = System.currentTimeMillis();
 


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