Merged topic subscription search and publish into single MessagePublisher method
First step on implementing H2 storage Minor, fixed not imported class Cleaned MessageStore interface to avoid duplication of methods used in couple. Switched from guid + message to move messages Separated ISubscriptionsStore from ISessionStore Implemented H2 queue
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
package io.moquette.persistence;
|
||||
|
||||
import io.moquette.spi.*;
|
||||
import io.moquette.spi.IMessagesStore.StoredMessage;
|
||||
import io.moquette.spi.ISubscriptionsStore.ClientTopicCouple;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.handler.codec.mqtt.MqttQoS;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static io.moquette.spi.impl.subscriptions.Topic.asTopic;
|
||||
import static io.netty.handler.codec.mqtt.MqttQoS.AT_MOST_ONCE;
|
||||
import static io.netty.handler.codec.mqtt.MqttQoS.EXACTLY_ONCE;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
/**
|
||||
* Defines all test that an implementation of a IMessageStore should satisfy.
|
||||
* */
|
||||
public abstract class MessageStoreTCK {
|
||||
|
||||
public static final String TEST_CLIENT = "TestClient";
|
||||
protected ISessionsStore sessionsStore;
|
||||
protected IMessagesStore messagesStore;
|
||||
|
||||
@Test
|
||||
public void testDropMessagesInSessionDoesntCleanAnyRetainedStoredMessages() {
|
||||
final ClientSession session = sessionsStore.createNewSession(TEST_CLIENT, true);
|
||||
StoredMessage publishToStore = new StoredMessage("Hello".getBytes(), EXACTLY_ONCE, "/topic");
|
||||
publishToStore.setClientID(TEST_CLIENT);
|
||||
publishToStore.setRetained(true);
|
||||
messagesStore.storeRetained(new Topic("/topic"), publishToStore);
|
||||
|
||||
// Exercise
|
||||
session.cleanSession();
|
||||
|
||||
// Verify the message store for session is empty.
|
||||
StoredMessage storedPublish = messagesStore.searchMatching(new IMatchingCondition() {
|
||||
|
||||
@Override
|
||||
public boolean match(Topic key) {
|
||||
return key.match(new Topic("/topic"));
|
||||
}
|
||||
}).iterator().next();
|
||||
assertNotNull("The stored retained message must be present after client's session drop", storedPublish);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStoreRetained() {
|
||||
StoredMessage msgStored = new StoredMessage("Hello".getBytes(), MqttQoS.AT_LEAST_ONCE, "/topic");
|
||||
msgStored.setClientID(TEST_CLIENT);
|
||||
|
||||
messagesStore.storeRetained(asTopic("/topic"), msgStored);
|
||||
|
||||
//Verify the message is in the store
|
||||
StoredMessage msgRetrieved = messagesStore.searchMatching(new IMatchingCondition() {
|
||||
|
||||
@Override
|
||||
public boolean match(Topic key) {
|
||||
return key.match(new Topic("/topic"));
|
||||
}
|
||||
}).iterator().next();
|
||||
|
||||
final ByteBuf payload = msgRetrieved.getPayload();
|
||||
byte[] content = new byte[payload.readableBytes()];
|
||||
payload.readBytes(content);
|
||||
assertEquals("Hello", new String(content));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenSubscriptionAlreadyStoredIsOverwrittenByAnotherWithSameTopic() {
|
||||
ClientSession session1 = sessionsStore.createNewSession("SESSION_ID_1", true);
|
||||
|
||||
// Subscribe on /topic with QOSType.MOST_ONE
|
||||
Subscription oldSubscription = new Subscription(session1.clientID, new Topic("/topic"), AT_MOST_ONCE);
|
||||
session1.subscribe(oldSubscription);
|
||||
|
||||
// Subscribe on /topic again that overrides the previous subscription.
|
||||
Subscription overridingSubscription = new Subscription(session1.clientID, new Topic("/topic"), EXACTLY_ONCE);
|
||||
session1.subscribe(overridingSubscription);
|
||||
|
||||
// Verify
|
||||
final ISubscriptionsStore subscriptionsStore = sessionsStore.subscriptionStore();
|
||||
List<ClientTopicCouple> subscriptions = subscriptionsStore.listAllSubscriptions();
|
||||
assertEquals(1, subscriptions.size());
|
||||
Subscription sub = subscriptionsStore.getSubscription(subscriptions.get(0));
|
||||
assertEquals(overridingSubscription.getRequestedQos(), sub.getRequestedQos());
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ package io.moquette.spi;
|
||||
|
||||
import io.moquette.persistence.MemoryStorageService;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.impl.subscriptions.SubscriptionsStore;
|
||||
import io.moquette.spi.impl.subscriptions.SubscriptionsDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import static io.netty.handler.codec.mqtt.MqttQoS.*;
|
||||
import org.junit.Before;
|
||||
@@ -31,11 +31,11 @@ public class ClientSessionTest {
|
||||
ClientSession session1;
|
||||
ClientSession session2;
|
||||
ISessionsStore sessionsStore;
|
||||
SubscriptionsStore store;
|
||||
SubscriptionsDirectory store;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
store = new SubscriptionsStore();
|
||||
store = new SubscriptionsDirectory();
|
||||
MemoryStorageService storageService = new MemoryStorageService();
|
||||
this.sessionsStore = storageService.sessionsStore();
|
||||
store.init(sessionsStore);
|
||||
|
||||
@@ -26,7 +26,7 @@ import io.moquette.spi.IMessagesStore.StoredMessage;
|
||||
import io.moquette.spi.ISessionsStore;
|
||||
import io.moquette.spi.impl.security.PermitAllAuthorizator;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.impl.subscriptions.SubscriptionsStore;
|
||||
import io.moquette.spi.impl.subscriptions.SubscriptionsDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.spi.security.IAuthorizator;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
@@ -62,7 +62,7 @@ public class ProtocolProcessorTest {
|
||||
|
||||
IMessagesStore m_messagesStore;
|
||||
ISessionsStore m_sessionStore;
|
||||
SubscriptionsStore subscriptions;
|
||||
SubscriptionsDirectory subscriptions;
|
||||
MockAuthenticator m_mockAuthenticator;
|
||||
|
||||
@Before
|
||||
@@ -92,7 +92,7 @@ public class ProtocolProcessorTest {
|
||||
users.put(TEST_USER, TEST_PWD);
|
||||
m_mockAuthenticator = new MockAuthenticator(clientIds, users);
|
||||
|
||||
subscriptions = new SubscriptionsStore();
|
||||
subscriptions = new SubscriptionsDirectory();
|
||||
subscriptions.init(memStorage.sessionsStore());
|
||||
m_processor = new ProtocolProcessor();
|
||||
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, true,
|
||||
@@ -104,7 +104,7 @@ public class ProtocolProcessorTest {
|
||||
final Subscription subscription = new Subscription(FAKE_CLIENT_ID, new Topic(FAKE_TOPIC), MqttQoS.AT_MOST_ONCE);
|
||||
|
||||
// subscriptions.matches(topic) redefine the method to return true
|
||||
SubscriptionsStore subs = new SubscriptionsStore() {
|
||||
SubscriptionsDirectory subs = new SubscriptionsDirectory() {
|
||||
|
||||
@Override
|
||||
public List<Subscription> matches(Topic topic) {
|
||||
@@ -152,7 +152,7 @@ public class ProtocolProcessorTest {
|
||||
MqttQoS.AT_MOST_ONCE);
|
||||
|
||||
// subscriptions.matches(topic) redefine the method to return true
|
||||
SubscriptionsStore subs = new SubscriptionsStore() {
|
||||
SubscriptionsDirectory subs = new SubscriptionsDirectory() {
|
||||
|
||||
@Override
|
||||
public List<Subscription> matches(Topic topic) {
|
||||
@@ -311,7 +311,7 @@ public class ProtocolProcessorTest {
|
||||
new Subscription(FAKE_PUBLISHER_ID, new Topic(FAKE_TOPIC), MqttQoS.AT_MOST_ONCE);
|
||||
|
||||
// subscriptions.matches(topic) redefine the method to return true
|
||||
SubscriptionsStore subs = new SubscriptionsStore() {
|
||||
SubscriptionsDirectory subs = new SubscriptionsDirectory() {
|
||||
|
||||
@Override
|
||||
public List<Subscription> matches(Topic topic) {
|
||||
@@ -355,14 +355,14 @@ public class ProtocolProcessorTest {
|
||||
|
||||
@Test
|
||||
public void testRepublishAndConsumePersistedMessages_onReconnect() {
|
||||
SubscriptionsStore subs = mock(SubscriptionsStore.class);
|
||||
SubscriptionsDirectory subs = mock(SubscriptionsDirectory.class);
|
||||
List<Subscription> emptySubs = Collections.emptyList();
|
||||
when(subs.matches(any(Topic.class))).thenReturn(emptySubs);
|
||||
|
||||
StoredMessage retainedMessage = new StoredMessage("Hello".getBytes(), MqttQoS.EXACTLY_ONCE, "/topic");
|
||||
retainedMessage.setRetained(true);
|
||||
retainedMessage.setClientID(FAKE_PUBLISHER_ID);
|
||||
m_messagesStore.storePublishForFuture(retainedMessage);
|
||||
m_messagesStore.storeRetained(new Topic("/topic"), retainedMessage);
|
||||
|
||||
m_processor.init(subs, m_messagesStore, m_sessionStore, null, true, new PermitAllAuthorizator(),
|
||||
NO_OBSERVERS_INTERCEPTOR);
|
||||
@@ -382,7 +382,7 @@ public class ProtocolProcessorTest {
|
||||
// create an inactive session for Subscriber
|
||||
m_sessionStore.createNewSession("Subscriber", false);
|
||||
|
||||
SubscriptionsStore mockedSubscriptions = mock(SubscriptionsStore.class);
|
||||
SubscriptionsDirectory mockedSubscriptions = mock(SubscriptionsDirectory.class);
|
||||
Subscription inactiveSub = new Subscription("Subscriber", new Topic("/topic"), MqttQoS.AT_LEAST_ONCE);
|
||||
List<Subscription> inactiveSubscriptions = Collections.singletonList(inactiveSub);
|
||||
when(mockedSubscriptions.matches(eq(new Topic("/topic")))).thenReturn(inactiveSubscriptions);
|
||||
|
||||
@@ -24,7 +24,7 @@ import io.moquette.spi.IMessagesStore;
|
||||
import io.moquette.spi.ISessionsStore;
|
||||
import io.moquette.spi.impl.security.PermitAllAuthorizator;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.impl.subscriptions.SubscriptionsStore;
|
||||
import io.moquette.spi.impl.subscriptions.SubscriptionsDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
import io.netty.handler.codec.mqtt.MqttConnectMessage;
|
||||
@@ -51,7 +51,7 @@ public class ProtocolProcessor_CONNECT_Test {
|
||||
|
||||
IMessagesStore m_messagesStore;
|
||||
ISessionsStore m_sessionStore;
|
||||
SubscriptionsStore subscriptions;
|
||||
SubscriptionsDirectory subscriptions;
|
||||
MockAuthenticator m_mockAuthenticator;
|
||||
|
||||
@Before
|
||||
@@ -73,7 +73,7 @@ public class ProtocolProcessor_CONNECT_Test {
|
||||
users.put(ProtocolProcessorTest.TEST_USER, ProtocolProcessorTest.TEST_PWD);
|
||||
m_mockAuthenticator = new MockAuthenticator(clientIds, users);
|
||||
|
||||
subscriptions = new SubscriptionsStore();
|
||||
subscriptions = new SubscriptionsDirectory();
|
||||
subscriptions.init(m_sessionStore);
|
||||
m_processor = new ProtocolProcessor();
|
||||
m_processor.init(
|
||||
|
||||
+43
-37
@@ -16,42 +16,48 @@
|
||||
|
||||
package io.moquette.spi.impl.subscriptions;
|
||||
|
||||
import io.moquette.persistence.MemoryStorageService;
|
||||
import io.moquette.spi.ClientSession;
|
||||
import io.moquette.spi.ISessionsStore;
|
||||
import io.moquette.spi.ISessionsStore.ClientTopicCouple;
|
||||
import io.moquette.persistence.MemoryStorageService;
|
||||
import io.moquette.spi.ISubscriptionsStore;
|
||||
import io.moquette.spi.ISubscriptionsStore.ClientTopicCouple;
|
||||
import io.netty.handler.codec.mqtt.MqttQoS;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
|
||||
public class SubscriptionsStoreTest {
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
private SubscriptionsStore store;
|
||||
public class SubscriptionsDirectoryTest {
|
||||
|
||||
private SubscriptionsDirectory store;
|
||||
private ISessionsStore sessionsStore;
|
||||
private ISubscriptionsStore subscriptionsStore;
|
||||
|
||||
public SubscriptionsStoreTest() {
|
||||
public SubscriptionsDirectoryTest() {
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUp() throws IOException {
|
||||
store = new SubscriptionsStore();
|
||||
store = new SubscriptionsDirectory();
|
||||
MemoryStorageService storageService = new MemoryStorageService();
|
||||
this.sessionsStore = storageService.sessionsStore();
|
||||
store.init(sessionsStore);
|
||||
|
||||
this.subscriptionsStore = this.sessionsStore.subscriptionStore();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchSimple() {
|
||||
Subscription slashSub = new Subscription("FAKE_CLI_ID_1", new Topic("/"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(slashSub);
|
||||
this.subscriptionsStore.addNewSubscription(slashSub);
|
||||
store.add(slashSub.asClientTopicCouple());
|
||||
assertThat(store.matches(new Topic("finance"))).isEmpty();
|
||||
|
||||
Subscription slashFinanceSub = new Subscription("FAKE_CLI_ID_1", new Topic("/finance"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(slashFinanceSub);
|
||||
this.subscriptionsStore.addNewSubscription(slashFinanceSub);
|
||||
store.add(slashFinanceSub.asClientTopicCouple());
|
||||
assertThat(store.matches(new Topic("finance"))).isEmpty();
|
||||
|
||||
@@ -62,12 +68,12 @@ public class SubscriptionsStoreTest {
|
||||
@Test
|
||||
public void testMatchSimpleMulti() {
|
||||
Subscription anySub = new Subscription("FAKE_CLI_ID_1", new Topic("#"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(anySub);
|
||||
this.subscriptionsStore.addNewSubscription(anySub);
|
||||
store.add(anySub.asClientTopicCouple());
|
||||
assertThat(store.matches(new Topic("finance"))).contains(anySub);
|
||||
|
||||
Subscription financeAnySub = new Subscription("FAKE_CLI_ID_2", new Topic("finance/#"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(financeAnySub);
|
||||
this.subscriptionsStore.addNewSubscription(financeAnySub);
|
||||
store.add(financeAnySub.asClientTopicCouple());
|
||||
assertThat(store.matches(new Topic("finance"))).containsExactlyInAnyOrder(financeAnySub, anySub);
|
||||
}
|
||||
@@ -76,8 +82,8 @@ public class SubscriptionsStoreTest {
|
||||
public void testMatchingDeepMulti_one_layer() {
|
||||
Subscription anySub = new Subscription("FAKE_CLI_ID_1", new Topic("#"), MqttQoS.AT_MOST_ONCE);
|
||||
Subscription financeAnySub = new Subscription("FAKE_CLI_ID_2", new Topic("finance/#"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(anySub);
|
||||
sessionsStore.addNewSubscription(financeAnySub);
|
||||
this.subscriptionsStore.addNewSubscription(anySub);
|
||||
this.subscriptionsStore.addNewSubscription(financeAnySub);
|
||||
store.add(anySub.asClientTopicCouple());
|
||||
store.add(financeAnySub.asClientTopicCouple());
|
||||
|
||||
@@ -92,7 +98,7 @@ public class SubscriptionsStoreTest {
|
||||
"FAKE_CLI_ID_1",
|
||||
new Topic("finance/stock/#"),
|
||||
MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(financeAnySub);
|
||||
this.subscriptionsStore.addNewSubscription(financeAnySub);
|
||||
store.add(financeAnySub.asClientTopicCouple());
|
||||
|
||||
// Verify
|
||||
@@ -102,12 +108,12 @@ public class SubscriptionsStoreTest {
|
||||
@Test
|
||||
public void testMatchSimpleSingle() {
|
||||
Subscription anySub = new Subscription("FAKE_CLI_ID_1", new Topic("+"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(anySub);
|
||||
this.subscriptionsStore.addNewSubscription(anySub);
|
||||
store.add(anySub.asClientTopicCouple());
|
||||
assertThat(store.matches(new Topic("finance"))).containsExactly(anySub);
|
||||
|
||||
Subscription financeOne = new Subscription("FAKE_CLI_ID_1", new Topic("finance/+"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(financeOne);
|
||||
this.subscriptionsStore.addNewSubscription(financeOne);
|
||||
store.add(financeOne.asClientTopicCouple());
|
||||
assertThat(store.matches(new Topic("finance/stock"))).containsExactly(financeOne);
|
||||
}
|
||||
@@ -115,7 +121,7 @@ public class SubscriptionsStoreTest {
|
||||
@Test
|
||||
public void testMatchManySingle() {
|
||||
Subscription manySub = new Subscription("FAKE_CLI_ID_1", new Topic("+/+"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(manySub);
|
||||
this.subscriptionsStore.addNewSubscription(manySub);
|
||||
store.add(manySub.asClientTopicCouple());
|
||||
|
||||
// verify
|
||||
@@ -125,10 +131,10 @@ public class SubscriptionsStoreTest {
|
||||
@Test
|
||||
public void testMatchSlashSingle() {
|
||||
Subscription slashPlusSub = new Subscription("FAKE_CLI_ID_1", new Topic("/+"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(slashPlusSub);
|
||||
this.subscriptionsStore.addNewSubscription(slashPlusSub);
|
||||
store.add(slashPlusSub.asClientTopicCouple());
|
||||
Subscription anySub = new Subscription("FAKE_CLI_ID_1", new Topic("+"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(anySub);
|
||||
this.subscriptionsStore.addNewSubscription(anySub);
|
||||
store.add(anySub.asClientTopicCouple());
|
||||
|
||||
// Verify
|
||||
@@ -142,14 +148,14 @@ public class SubscriptionsStoreTest {
|
||||
"FAKE_CLI_ID_1",
|
||||
new Topic("/finance/+/ibm"),
|
||||
MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(slashPlusSub);
|
||||
this.subscriptionsStore.addNewSubscription(slashPlusSub);
|
||||
store.add(slashPlusSub.asClientTopicCouple());
|
||||
|
||||
Subscription slashPlusDeepSub = new Subscription(
|
||||
"FAKE_CLI_ID_2",
|
||||
new Topic("/+/stock/+"),
|
||||
MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(slashPlusDeepSub);
|
||||
this.subscriptionsStore.addNewSubscription(slashPlusDeepSub);
|
||||
store.add(slashPlusDeepSub.asClientTopicCouple());
|
||||
|
||||
// Verify
|
||||
@@ -160,7 +166,7 @@ public class SubscriptionsStoreTest {
|
||||
@Test
|
||||
public void testMatchSimpleMulti_allTheTree() {
|
||||
Subscription sub = new Subscription("FAKE_CLI_ID_1", new Topic("#"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(sub);
|
||||
this.subscriptionsStore.addNewSubscription(sub);
|
||||
store.add(sub.asClientTopicCouple());
|
||||
assertThat(store.matches(new Topic("finance"))).isNotEmpty();
|
||||
assertThat(store.matches(new Topic("finance/ibm"))).isNotEmpty();
|
||||
@@ -170,7 +176,7 @@ public class SubscriptionsStoreTest {
|
||||
public void testMatchSimpleMulti_zeroLevel() {
|
||||
// check MULTI in case of zero level match
|
||||
Subscription sub = new Subscription("FAKE_CLI_ID_1", new Topic("finance/#"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(sub);
|
||||
this.subscriptionsStore.addNewSubscription(sub);
|
||||
store.add(sub.asClientTopicCouple());
|
||||
assertThat(store.matches(new Topic("finance"))).isNotEmpty();
|
||||
}
|
||||
@@ -202,12 +208,12 @@ public class SubscriptionsStoreTest {
|
||||
private void assertMatch(String s, String t) {
|
||||
Topic subscription = new Topic(s);
|
||||
Topic topic = new Topic(t);
|
||||
store = new SubscriptionsStore();
|
||||
store = new SubscriptionsDirectory();
|
||||
MemoryStorageService memStore = new MemoryStorageService();
|
||||
ISessionsStore aSessionsStore = memStore.sessionsStore();
|
||||
store.init(aSessionsStore);
|
||||
Subscription sub = new Subscription("FAKE_CLI_ID_1", subscription, MqttQoS.AT_MOST_ONCE);
|
||||
aSessionsStore.addNewSubscription(sub);
|
||||
aSessionsStore.subscriptionStore().addNewSubscription(sub);
|
||||
store.add(sub.asClientTopicCouple());
|
||||
assertThat(store.matches(topic)).isNotEmpty();
|
||||
}
|
||||
@@ -215,11 +221,11 @@ public class SubscriptionsStoreTest {
|
||||
private void assertNotMatch(String s, String t) {
|
||||
Topic subscription = new Topic(s);
|
||||
Topic topic = new Topic(t);
|
||||
store = new SubscriptionsStore();
|
||||
store = new SubscriptionsDirectory();
|
||||
MemoryStorageService memStore = new MemoryStorageService();
|
||||
store.init(memStore.sessionsStore());
|
||||
Subscription sub = new Subscription("FAKE_CLI_ID_1", subscription, MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(sub);
|
||||
this.subscriptionsStore.addNewSubscription(sub);
|
||||
store.add(sub.asClientTopicCouple());
|
||||
assertThat(store.matches(topic)).isEmpty();
|
||||
}
|
||||
@@ -228,7 +234,7 @@ public class SubscriptionsStoreTest {
|
||||
public void testRemoveClientSubscriptions_existingClientID() {
|
||||
String cliendID = "FAKE_CLID_1";
|
||||
Subscription sub = new Subscription(cliendID, new Topic("finance/#"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(sub);
|
||||
this.subscriptionsStore.addNewSubscription(sub);
|
||||
store.add(sub.asClientTopicCouple());
|
||||
|
||||
// Exercise
|
||||
@@ -242,7 +248,7 @@ public class SubscriptionsStoreTest {
|
||||
public void testRemoveClientSubscriptions_notexistingClientID() {
|
||||
String clientID = "FAKE_CLID_1";
|
||||
Subscription s = new Subscription(clientID, new Topic("finance/#"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(s);
|
||||
this.subscriptionsStore.addNewSubscription(s);
|
||||
store.add(s.asClientTopicCouple());
|
||||
|
||||
// Exercise
|
||||
@@ -255,10 +261,10 @@ public class SubscriptionsStoreTest {
|
||||
@Test
|
||||
public void testOverlappingSubscriptions() {
|
||||
Subscription genericSub = new Subscription("FAKE_CLI_ID_1", new Topic("a/+"), MqttQoS.EXACTLY_ONCE);
|
||||
sessionsStore.addNewSubscription(genericSub);
|
||||
this.subscriptionsStore.addNewSubscription(genericSub);
|
||||
store.add(genericSub.asClientTopicCouple());
|
||||
Subscription specificSub = new Subscription("FAKE_CLI_ID_1", new Topic("a/b"), MqttQoS.AT_LEAST_ONCE);
|
||||
sessionsStore.addNewSubscription(specificSub);
|
||||
this.subscriptionsStore.addNewSubscription(specificSub);
|
||||
store.add(specificSub.asClientTopicCouple());
|
||||
|
||||
// Verify
|
||||
@@ -267,19 +273,19 @@ public class SubscriptionsStoreTest {
|
||||
|
||||
@Test
|
||||
public void removeSubscription_withDifferentClients_subscribedSameTopic() {
|
||||
SubscriptionsStore aStore = new SubscriptionsStore();
|
||||
SubscriptionsDirectory aStore = new SubscriptionsDirectory();
|
||||
MemoryStorageService memStore = new MemoryStorageService();
|
||||
ISessionsStore sessionsStore = memStore.sessionsStore();
|
||||
aStore.init(sessionsStore);
|
||||
// subscribe a not active clientID1 to /topic
|
||||
sessionsStore.createNewSession("FAKE_CLI_ID_1", true);
|
||||
Subscription slashSub = new Subscription("FAKE_CLI_ID_1", new Topic("/topic"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(slashSub);
|
||||
sessionsStore.subscriptionStore().addNewSubscription(slashSub);
|
||||
aStore.add(slashSub.asClientTopicCouple());
|
||||
|
||||
// subscribe an active clientID2 to /topic
|
||||
Subscription slashSub2 = new Subscription("FAKE_CLI_ID_2", new Topic("/topic"), MqttQoS.AT_MOST_ONCE);
|
||||
sessionsStore.addNewSubscription(slashSub2);
|
||||
sessionsStore.subscriptionStore().addNewSubscription(slashSub2);
|
||||
aStore.add(new ClientTopicCouple("FAKE_CLI_ID_2", new Topic("/topic")));
|
||||
|
||||
// Exercise
|
||||
@@ -325,7 +331,7 @@ public class SubscriptionsStoreTest {
|
||||
@Test
|
||||
public void testRecreatePath_emptyRoot() {
|
||||
TreeNode oldRoot = new TreeNode();
|
||||
final SubscriptionsStore.NodeCouple resp = store.recreatePath(new Topic("/finance"), oldRoot);
|
||||
final SubscriptionsDirectory.NodeCouple resp = store.recreatePath(new Topic("/finance"), oldRoot);
|
||||
|
||||
// Verify
|
||||
assertThat(resp.root).isNotNull();
|
||||
@@ -337,8 +343,8 @@ public class SubscriptionsStoreTest {
|
||||
@Test
|
||||
public void testRecreatePath_1layer_tree() {
|
||||
TreeNode oldRoot = new TreeNode();
|
||||
final SubscriptionsStore.NodeCouple respFinance = store.recreatePath(new Topic("/finance"), oldRoot);
|
||||
final SubscriptionsStore.NodeCouple respPlus = store.recreatePath(new Topic("/+"), respFinance.root);
|
||||
final SubscriptionsDirectory.NodeCouple respFinance = store.recreatePath(new Topic("/finance"), oldRoot);
|
||||
final SubscriptionsDirectory.NodeCouple respPlus = store.recreatePath(new Topic("/+"), respFinance.root);
|
||||
|
||||
// Verify
|
||||
assertThat(respPlus.root).isNotNull();
|
||||
@@ -17,6 +17,8 @@
|
||||
package io.moquette.spi.impl.subscriptions;
|
||||
|
||||
import io.moquette.spi.ISessionsStore;
|
||||
import io.moquette.spi.ISubscriptionsStore;
|
||||
import io.moquette.spi.ISubscriptionsStore.ClientTopicCouple;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
@@ -28,7 +30,7 @@ public class TreeNodeTest {
|
||||
TreeNode root = new TreeNode();
|
||||
TreeNode subNode1 = new TreeNode();
|
||||
|
||||
subNode1.addSubscription(new ISessionsStore.ClientTopicCouple("Client1", new Topic("/topic1")));
|
||||
subNode1.addSubscription(new ClientTopicCouple("Client1", new Topic("/topic1")));
|
||||
root.addChild(subNode1);
|
||||
|
||||
TreeNode updatedRoot = root.removeClientSubscriptions("Client1");
|
||||
@@ -42,7 +44,7 @@ public class TreeNodeTest {
|
||||
TreeNode intermediateEmptyNode = new TreeNode();
|
||||
TreeNode subNode1 = new TreeNode();
|
||||
|
||||
subNode1.addSubscription(new ISessionsStore.ClientTopicCouple("Client1", new Topic("/sub/topic1")));
|
||||
subNode1.addSubscription(new ClientTopicCouple("Client1", new Topic("/sub/topic1")));
|
||||
intermediateEmptyNode.addChild(subNode1);
|
||||
root.addChild(intermediateEmptyNode);
|
||||
|
||||
@@ -57,11 +59,11 @@ public class TreeNodeTest {
|
||||
TreeNode intermediateEmptyNode = new TreeNode();
|
||||
|
||||
TreeNode subNode1 = new TreeNode();
|
||||
subNode1.addSubscription(new ISessionsStore.ClientTopicCouple("Client1", new Topic("/sub/topic1")));
|
||||
subNode1.addSubscription(new ClientTopicCouple("Client1", new Topic("/sub/topic1")));
|
||||
intermediateEmptyNode.addChild(subNode1);
|
||||
|
||||
TreeNode subNode2 = new TreeNode();
|
||||
subNode2.addSubscription(new ISessionsStore.ClientTopicCouple("Client2", new Topic("/sub/topic2")));
|
||||
subNode2.addSubscription(new ClientTopicCouple("Client2", new Topic("/sub/topic2")));
|
||||
intermediateEmptyNode.addChild(subNode2);
|
||||
root.addChild(intermediateEmptyNode);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user