You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2014/10/06 18:40:04 UTC

[2/3] git commit: add unit tests for AmqpJmsMessageFacade handling of AMQP header

add unit tests for AmqpJmsMessageFacade handling of AMQP header


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

Branch: refs/heads/master
Commit: 37871f0209562367d65134f8e2456bdc1d06193b
Parents: 375278b
Author: Robert Gemmell <ro...@apache.org>
Authored: Mon Oct 6 17:29:54 2014 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Mon Oct 6 17:32:44 2014 +0100

----------------------------------------------------------------------
 .../amqp/message/AmqpJmsMessageFacadeTest.java  | 214 +++++++++++++++++++
 1 file changed, 214 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/37871f02/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 14cefa2..80d9cff 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
@@ -22,6 +22,7 @@ package org.apache.qpid.jms.provider.amqp.message;
 
 import static org.junit.Assert.assertArrayEquals;
 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.assertSame;
@@ -46,7 +47,10 @@ import org.apache.qpid.jms.test.testpeer.describedtypes.sections.PropertiesDescr
 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.UnsignedByte;
+import org.apache.qpid.proton.amqp.UnsignedInteger;
 import org.apache.qpid.proton.amqp.UnsignedLong;
+import org.apache.qpid.proton.amqp.messaging.Header;
 import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
 import org.apache.qpid.proton.amqp.messaging.Properties;
 import org.apache.qpid.proton.codec.impl.DataImpl;
@@ -96,9 +100,219 @@ public class AmqpJmsMessageFacadeTest {
         amqpMessageFacade.setAmqpTimeToLiveOverride(0X100000000L);
     }
 
+
+    /**
+     * To satisfy the JMS requirement that messages are durable by default, the
+     * {@link AmqpJmsMessageFacade} objects created for sending new messages are
+     * populated with a header section with durable set to true.
+     */
+    @Test
+    public void testNewMessageHasUnderlyingHeaderSectionWithDurableTrue() {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        Message underlying = amqpMessageFacade.getAmqpMessage();
+        assertNotNull("Expected message to have Header section", underlying.getHeader());
+        assertTrue("Durable not as expected", underlying.getHeader().getDurable());
+    }
+
+    @Test
+    public void testNewMessageHasUnderlyingHeaderSectionWithNoTtlSet() {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        Message underlying = amqpMessageFacade.getAmqpMessage();
+        assertNotNull("Expected message to have Header section", underlying.getHeader());
+        assertNull("Ttl field should not be set", underlying.getHeader().getTtl());
+    }
+
+    @Test
+    public void testGetTtlSynthesizedExpirationOnReceivedMessageWithTtlButNoAbsoluteExpiration() {
+        Long ttl = 123L;
+
+        Message message = Proton.message();
+        Header header = new Header();
+        header.setTtl(UnsignedInteger.valueOf(ttl));
+        message.setHeader(header);
+
+        long start = System.currentTimeMillis();
+        AmqpJmsMessageFacade amqpMessageFacade = createReceivedMessageFacade(createMockAmqpConsumer(), message);
+        long end = System.currentTimeMillis();
+
+        long expiration = amqpMessageFacade.getExpiration();
+
+        assertTrue("Should have sythesized expiration based on current time + ttl", start + ttl <= expiration);
+        assertTrue("Should have sythesized expiration based on current time + ttl", expiration <= end + ttl);
+
+        long expiration2 = amqpMessageFacade.getExpiration();
+        assertEquals("Second retrieval should return same result", expiration, expiration2);
+    }
+
+    @Test
+    public void testSetGetTtlOverrideOnNewMessage() throws Exception {
+        long ttl = 123L;
+
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        assertFalse("Should not have a ttl override", amqpMessageFacade.hasAmqpTimeToLiveOverride());
+
+        amqpMessageFacade.setAmqpTimeToLiveOverride(ttl);
+
+        assertTrue("Should have a ttl override", amqpMessageFacade.hasAmqpTimeToLiveOverride());
+        assertEquals(ttl, amqpMessageFacade.getAmqpTimeToLiveOverride());
+        // check value on underlying TTL field is NOT set
+        assertNull("TTL field on underlying message should NOT be set", amqpMessageFacade.getAmqpMessage().getHeader().getTtl());
+    }
+
+    @Test
+    public void testOnSendClearsTtlOnMessageReceivedWithTtl() throws Exception {
+        Message message = Proton.message();
+        int origTtl = 5;
+        message.setTtl(origTtl);
+
+        AmqpJmsMessageFacade amqpMessageFacade = createReceivedMessageFacade(createMockAmqpConsumer(), message);
+
+        assertEquals("TTL has been unset already", origTtl, message.getTtl());
+
+        amqpMessageFacade.onSend(false, false, 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.getAmqpMessage().getHeader().getTtl());
+    }
+
+    @Test
+    public void testOnSendOverridesTtlOnMessageReceivedWithTtl() throws Exception {
+        Message message = Proton.message();
+        int origTtl = 5;
+        int newTtl = 10;
+        message.setTtl(origTtl);
+
+        AmqpJmsMessageFacade amqpMessageFacade = createReceivedMessageFacade(createMockAmqpConsumer(), message);
+
+        assertEquals("TTL has been unset already", origTtl, message.getTtl());
+
+        amqpMessageFacade.onSend(false, false, newTtl);
+
+        // check value on underlying TTL field is NOT set
+        assertEquals("TTL has not been overriden", newTtl, message.getTtl());
+        assertEquals("TTL field on underlying message should be set", UnsignedInteger.valueOf(newTtl), amqpMessageFacade.getAmqpMessage().getHeader().getTtl());
+    }
+
+    @Test
+    public void testOnSendOverridesProviderTtlWithSpecifiedOverrideTtl() throws Exception {
+        Message message = Proton.message();
+        int overrideTtl = 5;
+        int producerTtl = 10;
+
+        AmqpJmsMessageFacade amqpMessageFacade = createReceivedMessageFacade(createMockAmqpConsumer(), message);
+        amqpMessageFacade.setAmqpTimeToLiveOverride(overrideTtl);
+
+        amqpMessageFacade.onSend(false, false, producerTtl);
+
+        // check value on underlying TTL field is set to the override
+        assertEquals("TTL has not been overriden", overrideTtl, message.getTtl());
+    }
+
+
+    @Test
+    public void testGetPriorityIs4ForNewMessage() {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        assertEquals("expected priority value not found", 4, amqpMessageFacade.getPriority());
+    }
+
+    /**
+     * When messages have no header section, the AMQP spec says the priority has default value of 4.
+     */
+    @Test
+    public void testGetPriorityIs4ForReceivedMessageWithNoHeader() {
+        Message message = Proton.message();
+        AmqpJmsMessageFacade amqpMessageFacade = createReceivedMessageFacade(createMockAmqpConsumer(), message);
+
+        assertNull("expected no header section to exist", message.getHeader());
+        assertEquals("expected priority value not found", 4, amqpMessageFacade.getPriority());
+    }
+
+    // TODO: start of section marker
+
+    /**
+     * When messages have a header section, but lack the priority field,
+     * the AMQP spec says the priority has default value of 4.
+     */
+    @Test
+    public void testGetPriorityIs4ForReceivedMessageWithHeaderButWithoutPriority() {
+        Message message = Proton.message();
+
+        Header header = new Header();
+        message.setHeader(header);
+
+        AmqpJmsMessageFacade amqpMessageFacade = createReceivedMessageFacade(createMockAmqpConsumer(), message);
+
+        assertEquals("expected priority value not found", 4, amqpMessageFacade.getPriority());
+    }
+
+    /**
+     * When messages have a header section, which have a priority value, ensure it is returned.
+     */
+    @Test
+    public void testGetPriorityForReceivedMessageWithHeaderWithPriority() {
+        // value over 10 deliberately
+        byte priority = 7;
+
+        Message message = Proton.message();
+        Header header = new Header();
+        message.setHeader(header);
+        header.setPriority(UnsignedByte.valueOf(priority));
+
+        AmqpJmsMessageFacade amqpMessageFacade = createReceivedMessageFacade(createMockAmqpConsumer(), message);
+
+        assertEquals("expected priority value not found", priority, amqpMessageFacade.getPriority());
+    }
+
+    /**
+     * When messages have a header section, which have a priority value outside the JMS range, ensure it is constrained.
+     */
+    @Test
+    public void testGetPriorityForReceivedMessageWithPriorityOutsideJmsRange() {
+        // value over 9 deliberately
+        byte priority = 11;
+
+        Message message = Proton.message();
+        Header header = new Header();
+        message.setHeader(header);
+        header.setPriority(UnsignedByte.valueOf(priority));
+
+        AmqpJmsMessageFacade amqpMessageFacade = createReceivedMessageFacade(createMockAmqpConsumer(), message);
+
+        assertEquals("expected priority value not found", 9, amqpMessageFacade.getPriority());
+    }
+
+    /**
+     * Test that setting the Priority to a non-default value results in the underlying
+     * message field being populated appropriately, and the value being returned from the Getter.
+     */
+    @Test
+    public void testSetGetNonDefaultPriorityForNewMessage() {
+        byte priority = 6;
+
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+        amqpMessageFacade.setPriority(priority);
+
+        assertEquals("expected priority value not found", priority, amqpMessageFacade.getPriority());
+
+        Message underlying = amqpMessageFacade.getAmqpMessage();
+        assertEquals("expected priority value not found", priority, underlying.getPriority());
+    }
+
     // ====== AMQP Properties Section =======
     // ======================================
 
+    @Test
+    public void testGetExpirationIsZeroForNewMessage() {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        assertEquals("Expected no expiration", 0, amqpMessageFacade.getExpiration());
+    }
+
     // --- message-id and correlation-id ---
 
     @Test


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