Implemented wildcards for MQTT and downgraded SQLite to the version that supports retrieving last inserted key
This commit is contained in:
parent
1de26a7240
commit
529cacfe81
5 changed files with 299 additions and 43 deletions
|
|
@ -33,6 +33,7 @@ import zutil.net.mqtt.packet.MqttPacketUnsubscribe.MqttUnsubscribePayload;
|
|||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.LinkedList;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
|
|
@ -61,6 +62,11 @@ public class MqttBrokerTest {
|
|||
receivedTopic = topic;
|
||||
receivedPayload = data;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
receivedTopic = null;
|
||||
receivedPayload = null;
|
||||
}
|
||||
};
|
||||
|
||||
//**************** Test Cases **************************
|
||||
|
|
@ -126,6 +132,191 @@ public class MqttBrokerTest {
|
|||
assertEquals(1, broker.getSubscriberCount("topic2"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void generatePatternFromTopic() {
|
||||
assertEquals("test", MqttBroker.generatePatternFromTopic("test").pattern());
|
||||
|
||||
assertEquals(".*", MqttBroker.generatePatternFromTopic("#").pattern());
|
||||
assertEquals("test($|/.*)", MqttBroker.generatePatternFromTopic("test/#").pattern());
|
||||
|
||||
assertEquals("[^/]*", MqttBroker.generatePatternFromTopic("+").pattern());
|
||||
assertEquals("test/[^/]*", MqttBroker.generatePatternFromTopic("test/+").pattern());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void subscribeMultiLevelWildcard() throws IOException {
|
||||
MqttBroker broker = new MqttBroker();
|
||||
MqttSubscriptionListenerMock subscriber = new MqttSubscriptionListenerMock();
|
||||
|
||||
/*
|
||||
Invalid subscriptions
|
||||
- "sport/tennis#" not valid. disconnect
|
||||
- "sport/tennis/#/ranking" is not valid
|
||||
- "sport/tennis/#/ranking/#" is not valid
|
||||
*/
|
||||
assertThrows(IllegalArgumentException.class, () ->
|
||||
broker.subscribe("sport/tennis#", subscriber)
|
||||
);
|
||||
assertThrows(IllegalArgumentException.class, () ->
|
||||
broker.subscribe("sport/tennis/#/ranking", subscriber)
|
||||
);
|
||||
assertThrows(IllegalArgumentException.class, () ->
|
||||
broker.subscribe("sport/tennis/#/ranking/#", subscriber)
|
||||
);
|
||||
|
||||
/*
|
||||
Global Subscriber
|
||||
- "#" valid and will receive every Application Message
|
||||
*/
|
||||
broker.subscribe("#", subscriber);
|
||||
assertEquals(1, broker.getSubscriberCount("sport/"));
|
||||
assertEquals(1, broker.getSubscriberCount("sport/tennis"));
|
||||
assertEquals(1, broker.getSubscriberCount("test/"));
|
||||
|
||||
broker.unsubscribe(subscriber);
|
||||
assertEquals(0, broker.getSubscriberCount("sport/"));
|
||||
assertEquals(0, broker.getSubscriberCount("sport/tennis"));
|
||||
assertEquals(0, broker.getSubscriberCount("test/"));
|
||||
|
||||
/*
|
||||
For example, if a Client subscribes to "sport/tennis/player1/#", it would receive messages published using these topic names:
|
||||
- "sport/tennis/player1" match
|
||||
- "sport/tennis/player1/ranking" match
|
||||
- "sport/tennis/player1/score/wimbledon" match
|
||||
*/
|
||||
broker.subscribe("sport/tennis/player1/#", subscriber);
|
||||
|
||||
broker.publish("sport/tennis/player1", "test");
|
||||
assertEquals("sport/tennis/player1", subscriber.receivedTopic);
|
||||
assertEquals("test", new String(subscriber.receivedPayload));
|
||||
|
||||
subscriber.clear();
|
||||
broker.publish("sport/tennis/player1/ranking", "test2");
|
||||
assertEquals("sport/tennis/player1/ranking", subscriber.receivedTopic);
|
||||
assertEquals("test2", new String(subscriber.receivedPayload));
|
||||
|
||||
subscriber.clear();
|
||||
broker.publish("sport/tennis/player1/score/wimbledon", "test3");
|
||||
assertEquals("sport/tennis/player1/score/wimbledon", subscriber.receivedTopic);
|
||||
assertEquals("test3", new String(subscriber.receivedPayload));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void subscribeSingleLevelWildcard() throws IOException {
|
||||
MqttBroker broker = new MqttBroker();
|
||||
MqttSubscriptionListenerMock subscriber = new MqttSubscriptionListenerMock();
|
||||
MqttSubscriptionListenerMock subscriber2 = new MqttSubscriptionListenerMock();
|
||||
MqttSubscriptionListenerMock subscriber3 = new MqttSubscriptionListenerMock();
|
||||
|
||||
/*
|
||||
Not Valid
|
||||
- "sport+" is not valid
|
||||
*/
|
||||
assertThrows(IllegalArgumentException.class, () ->
|
||||
broker.subscribe("sport+", subscriber)
|
||||
);
|
||||
assertThrows(IllegalArgumentException.class, () ->
|
||||
broker.subscribe("sport/+/test+/tennis", subscriber)
|
||||
);
|
||||
|
||||
/*
|
||||
Root Subscription
|
||||
- "+" is valid
|
||||
*/
|
||||
broker.subscribe("+", subscriber);
|
||||
|
||||
subscriber.clear();
|
||||
broker.publish("sport", "testPayload");
|
||||
assertEquals("sport", subscriber.receivedTopic);
|
||||
|
||||
subscriber.clear();
|
||||
broker.publish("test", "testPayload");
|
||||
assertEquals("test", subscriber.receivedTopic);
|
||||
|
||||
/*
|
||||
For example, "sport/tennis/+" matches:
|
||||
- "sport/tennis" no match
|
||||
- "sport/tennis/" match
|
||||
- "sport/tennis/player1" match
|
||||
- "sport/tennis/player2" match
|
||||
- "sport/tennis/player1/ranking" no match
|
||||
*/
|
||||
broker.unsubscribe(subscriber);
|
||||
broker.subscribe("sport/tennis/+", subscriber);
|
||||
|
||||
subscriber.clear();
|
||||
broker.publish("sport/tennis", "testPayload");
|
||||
assertEquals(null, subscriber.receivedTopic);
|
||||
|
||||
subscriber.clear();
|
||||
broker.publish("sport/tennis/", "testPayload");
|
||||
assertEquals("sport/tennis/", subscriber.receivedTopic);
|
||||
|
||||
subscriber.clear();
|
||||
broker.publish("sport/tennis/player1", "testPayload");
|
||||
assertEquals("sport/tennis/player1", subscriber.receivedTopic);
|
||||
|
||||
subscriber.clear();
|
||||
broker.publish("sport/tennis/player2", "testPayload");
|
||||
assertEquals("sport/tennis/player2", subscriber.receivedTopic);
|
||||
|
||||
subscriber.clear();
|
||||
broker.publish("sport/tennis/player1/ranking", "testPayload");
|
||||
assertEquals(null, subscriber.receivedTopic);
|
||||
|
||||
/*
|
||||
Special Wildcards
|
||||
- "sport/+/player1" is valid
|
||||
- "/finance" matches "+/+" and "/+", but not "+"
|
||||
*/
|
||||
broker.unsubscribe(subscriber);
|
||||
broker.subscribe("sport/+/player1", subscriber);
|
||||
subscriber.clear();
|
||||
broker.publish("sport/game/player1", "testPayload");
|
||||
assertEquals("sport/game/player1", subscriber.receivedTopic);
|
||||
|
||||
subscriber.clear();
|
||||
subscriber2.clear();
|
||||
subscriber3.clear();
|
||||
broker.unsubscribe(subscriber);
|
||||
broker.unsubscribe(subscriber2);
|
||||
broker.unsubscribe(subscriber3);
|
||||
broker.subscribe("+/+", subscriber);
|
||||
broker.subscribe("/+", subscriber2);
|
||||
broker.subscribe("+", subscriber3);
|
||||
|
||||
broker.publish("/finance", "testPayload");
|
||||
// TODO: assertEquals("/finance", subscriber.receivedTopic);
|
||||
assertEquals("/finance", subscriber2.receivedTopic);
|
||||
assertEquals(null, subscriber3.receivedTopic);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void subscribeMixedWildcard() throws IOException {
|
||||
MqttBroker broker = new MqttBroker();
|
||||
MqttSubscriptionListenerMock subscriber = new MqttSubscriptionListenerMock();
|
||||
|
||||
/*
|
||||
- "+/tennis/#" is valid
|
||||
*/
|
||||
subscriber.clear();
|
||||
broker.unsubscribe(subscriber);
|
||||
broker.subscribe("+/tennis/#", subscriber);
|
||||
|
||||
broker.publish("sport/tennis/game/one", "testPayload");
|
||||
assertEquals("sport/tennis/game/one", subscriber.receivedTopic);
|
||||
|
||||
/*
|
||||
- "/finance/+/tennis/#" is valid
|
||||
*/
|
||||
subscriber.clear();
|
||||
broker.unsubscribe(subscriber);
|
||||
broker.subscribe("/finance/+/tennis/#", subscriber);
|
||||
|
||||
broker.publish("/finance/sport/tennis/game/one", "testPayload");
|
||||
assertEquals("/finance/sport/tennis/game/one", subscriber.receivedTopic);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void publish() throws IOException {
|
||||
// Setup broker
|
||||
|
|
@ -246,7 +437,7 @@ public class MqttBrokerTest {
|
|||
assertEquals(MqttPacketUnsubscribeAck.class, responsePacket.getClass());
|
||||
assertEquals(unsubscribePacket.packetId, ((MqttPacketUnsubscribeAck)responsePacket).packetId);
|
||||
// Check broker
|
||||
assertEquals(-1, broker.getSubscriberCount("topic1"));
|
||||
assertEquals(0, broker.getSubscriberCount("topic1"));
|
||||
|
||||
//************************ New subscriber
|
||||
|
||||
|
|
@ -270,7 +461,7 @@ public class MqttBrokerTest {
|
|||
thread.handlePacket(unsubscribePacket);
|
||||
|
||||
// Check broker
|
||||
assertEquals(-1, broker.getSubscriberCount("topic1"));
|
||||
assertEquals(0, broker.getSubscriberCount("topic1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue