From 49d1b2c948ecbc9f56b8bee074c462b22eb248ff Mon Sep 17 00:00:00 2001 From: andrea Date: Wed, 6 Nov 2013 13:37:23 +0100 Subject: [PATCH] Added tests suite used by Roger Light to check SubscriptionStore.matchTopics --- .../subscriptions/SubscriptionsStore.java | 11 ++++++++- .../subscriptions/SubscriptionsStoreTest.java | 24 ++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStore.java b/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStore.java index 554c37aa..e57beec6 100644 --- a/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStore.java +++ b/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStore.java @@ -218,14 +218,19 @@ public class SubscriptionsStore { /** * Verify if the 2 topics matching respecting the rules of MQTT Appendix A */ + //TODO reimplement with iterators or with queues public static boolean matchTopics(String msgTopic, String subscriptionTopic) { try { List msgTokens = SubscriptionsStore.splitTopic(msgTopic); List subscriptionTokens = SubscriptionsStore.splitTopic(subscriptionTopic); int i = 0; + Token subToken = null; for (; i< subscriptionTokens.size(); i++) { - Token subToken = subscriptionTokens.get(i); + subToken = subscriptionTokens.get(i); if (subToken != Token.MULTI && subToken != Token.SINGLE) { + if (i >= msgTokens.size()) { + return false; + } Token msgToken = msgTokens.get(i); if (!msgToken.equals(subToken)) { return false; @@ -239,6 +244,10 @@ public class SubscriptionsStore { } } } + //if last token was a SINGLE then treat it as an empty + if (subToken == Token.SINGLE && (i - msgTokens.size() == 1)) { + i--; + } return i == msgTokens.size(); } catch (ParseException ex) { LOG.error(null, ex); diff --git a/broker/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStoreTest.java b/broker/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStoreTest.java index 61315f49..41039736 100644 --- a/broker/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStoreTest.java +++ b/broker/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStoreTest.java @@ -301,7 +301,29 @@ public class SubscriptionsStoreTest { assertTrue(SubscriptionsStore.matchTopics("/finance/stock/ibm", "/finance/+/ibm")); assertFalse(SubscriptionsStore.matchTopics("/finance/stock", "+")); } - + + @Test + public void rogerLightMatchTopics() { + assertTrue(SubscriptionsStore.matchTopics("foo/bar", "foo/bar")); + assertTrue(SubscriptionsStore.matchTopics("foo/bar", "foo/+")); + assertTrue(SubscriptionsStore.matchTopics("foo/bar/baz", "foo/+/baz")); + assertTrue(SubscriptionsStore.matchTopics("foo/bar/baz", "foo/+/#")); + assertTrue(SubscriptionsStore.matchTopics("foo/bar/baz", "#")); + + assertFalse(SubscriptionsStore.matchTopics("foo", "foo/bar")); + assertFalse(SubscriptionsStore.matchTopics("foo/bar/baz", "foo/+")); + assertFalse(SubscriptionsStore.matchTopics("foo/bar/bar", "foo/+/baz")); + assertFalse(SubscriptionsStore.matchTopics("fo2/bar/baz", "foo/+/#")); + + assertTrue(SubscriptionsStore.matchTopics("/foo/bar", "#")); + assertTrue(SubscriptionsStore.matchTopics("/foo/bar", "/#")); + assertFalse(SubscriptionsStore.matchTopics("foo/bar", "/#")); + + assertTrue(SubscriptionsStore.matchTopics("foo//bar", "foo//bar")); + assertTrue(SubscriptionsStore.matchTopics("foo//bar", "foo//+")); + assertTrue(SubscriptionsStore.matchTopics("foo///baz", "foo/+/+/baz")); + assertTrue(SubscriptionsStore.matchTopics("foo/bar/", "foo/bar/+")); + } private static Token[] asArray(Object... l) { Token[] tokens = new Token[l.length];