diff options
| author | Rajith Muditha Attapattu <rajith@apache.org> | 2013-05-23 22:27:03 +0000 |
|---|---|---|
| committer | Rajith Muditha Attapattu <rajith@apache.org> | 2013-05-23 22:27:03 +0000 |
| commit | 31572da70d4812272caca4e20a6c689fc0f7578c (patch) | |
| tree | b40b287478065639a05ac6995c85a86445311912 /qpid/java/client/src/test | |
| parent | b42553e52a45726e6d4e2148cab77784cce07947 (diff) | |
| download | qpid-python-31572da70d4812272caca4e20a6c689fc0f7578c.tar.gz | |
QPID-4873 Commiting patch by Helen Kwong.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1485878 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/client/src/test')
| -rw-r--r-- | qpid/java/client/src/test/java/org/apache/qpid/client/AMQDestinationTest.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/qpid/java/client/src/test/java/org/apache/qpid/client/AMQDestinationTest.java b/qpid/java/client/src/test/java/org/apache/qpid/client/AMQDestinationTest.java index f46623ad3b..6433c9acb7 100644 --- a/qpid/java/client/src/test/java/org/apache/qpid/client/AMQDestinationTest.java +++ b/qpid/java/client/src/test/java/org/apache/qpid/client/AMQDestinationTest.java @@ -20,6 +20,10 @@ */ package org.apache.qpid.client; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + import junit.framework.TestCase; public class AMQDestinationTest extends TestCase @@ -63,4 +67,95 @@ public class AMQDestinationTest extends TestCase assertTrue(dest7.hashCode() != dest8.hashCode()); assertTrue(dest6.hashCode() != dest9.hashCode()); } + + /** + * Tests that destinations created with the same options string will share the same address options map. + */ + public void testCacheAddressOptionsMaps() throws Exception + { + // Create destinations 1 and 3 with the same options string, and destinations 2 and 4 with a different one + String optionsStringA = "{create: always, node: {type: topic}}"; + String optionsStringB = "{}"; // empty options + AMQDestination dest1 = createDestinationWithOptions("testDest1", optionsStringA); + AMQDestination dest2 = createDestinationWithOptions("testDest2", optionsStringB); + AMQDestination dest3 = createDestinationWithOptions("testDest3", optionsStringA); + AMQDestination dest4 = createDestinationWithOptions("testDest4", optionsStringB); + + // Destinations 1 and 3 should refer to the same address options map + assertSame("Destinations 1 and 3 were created with the same options and should refer to the same options map.", + dest1.getAddress().getOptions(), dest3.getAddress().getOptions()); + // Destinations 2 and 4 should refer to the same address options map + assertSame("Destinations 2 and 4 were created with the same options and should refer to the same options map.", + dest2.getAddress().getOptions(), dest4.getAddress().getOptions()); + // Destinations 1 and 2 should have a different options map + assertNotSame("Destinations 1 and 2 should not have the same options map.", + dest1.getAddress().getOptions(), dest2.getAddress().getOptions()); + + // Verify the contents of the shared map are as expected + Map<String, Object> optionsA = new HashMap<String, Object>(); + optionsA.put("create", "always"); + optionsA.put("node", Collections.singletonMap("type", "topic")); + assertEquals("Contents of the shared address options map are not as expected.", + optionsA, dest1.getAddress().getOptions()); + assertEquals("Contents of the empty shared address options map are not as expected.", + Collections.emptyMap(), dest2.getAddress().getOptions()); + + // Verify that address options map is immutable + try + { + dest1.getAddress().getOptions().put("testKey", "testValue"); + fail("Should not be able able to modify an address's options map."); + } + catch (UnsupportedOperationException e) + { + // expected + } + } + + private AMQDestination createDestinationWithOptions(String destName, String optionsString) throws Exception + { + String addr = "ADDR:" + destName + "; " + optionsString; + return new AMQAnyDestination(addr); + } + + /** + * Tests that when a queue has no link subscription arguments and no link bindings, its Subscription + * arguments and its bindings list refer to constant empty collections. + */ + public void testEmptyLinkBindingsAndSubscriptionArgs() throws Exception + { + // no link properties + assertEmptyLinkBindingsAndSubscriptionArgs(new AMQAnyDestination("ADDR:testQueue")); + + // has link properties but no x-bindings; has link x-subscribes but no arguments + String xSubscribeAddr = "ADDR:testQueueWithXSubscribes; {link: {x-subscribes: {exclusive: true}}}"; + assertEmptyLinkBindingsAndSubscriptionArgs(new AMQAnyDestination(xSubscribeAddr)); + } + + private void assertEmptyLinkBindingsAndSubscriptionArgs(AMQDestination dest) { + assertEquals("Default link subscription arguments should be the constant Collections empty map.", + Collections.emptyMap(), dest.getLink().getSubscription().getArgs()); + assertSame("Defaultl link bindings should be the constant Collections empty list.", + Collections.emptyList(), dest.getLink().getBindings()); + } + + /** + * Tests that when a node has no bindings specified, its bindings list refers to a constant empty list, + * so that we are not consuming extra memory unnecessarily. + */ + public void testEmptyNodeBindings() throws Exception + { + // no node properties + assertEmptyNodeBindings(new AMQAnyDestination("ADDR:testDest1")); + // has node properties but no x-bindings + assertEmptyNodeBindings(new AMQAnyDestination("ADDR:testDest2; {node: {type: queue}}")); + assertEmptyNodeBindings(new AMQAnyDestination("ADDR:testDest3; {node: {type: topic}}")); + } + + private void assertEmptyNodeBindings(AMQDestination dest) + { + assertSame("Empty node bindings should refer to the constant Collections empty list.", + Collections.emptyList(), dest.getNode().getBindings()); + } + } |
