Added tests suite used by Roger Light to check SubscriptionStore.matchTopics

This commit is contained in:
andrea
2013-11-06 13:37:23 +01:00
parent 2c18ee92c7
commit 49d1b2c948
2 changed files with 33 additions and 2 deletions
@@ -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<Token> msgTokens = SubscriptionsStore.splitTopic(msgTopic);
List<Token> 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);
@@ -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];