Moved packages from old io.moquette.server to new io.moquette.broker
This commit is contained in:
@@ -17,8 +17,7 @@
|
||||
package io.moquette.broker;
|
||||
|
||||
import io.moquette.interception.InterceptHandler;
|
||||
import io.moquette.spi.impl.BrokerInterceptor;
|
||||
import io.moquette.spi.impl.DebugUtils;
|
||||
import io.moquette.interception.BrokerInterceptor;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
import io.netty.handler.codec.mqtt.*;
|
||||
|
||||
|
||||
@@ -15,11 +15,10 @@
|
||||
*/
|
||||
package io.moquette.broker;
|
||||
|
||||
import io.moquette.spi.impl.MockAuthenticator;
|
||||
import io.moquette.spi.impl.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.spi.impl.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.spi.security.IAuthenticator;
|
||||
import io.moquette.broker.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.broker.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.broker.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.broker.security.IAuthenticator;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
import io.netty.handler.codec.mqtt.MqttConnectMessage;
|
||||
@@ -28,7 +27,7 @@ import io.netty.handler.codec.mqtt.MqttVersion;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static io.moquette.spi.impl.NettyChannelAssertions.assertEqualsConnAck;
|
||||
import static io.moquette.broker.NettyChannelAssertions.assertEqualsConnAck;
|
||||
import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.*;
|
||||
import static java.util.Collections.singleton;
|
||||
import static java.util.Collections.singletonMap;
|
||||
|
||||
@@ -15,11 +15,10 @@
|
||||
*/
|
||||
package io.moquette.broker;
|
||||
|
||||
import io.moquette.spi.impl.MockAuthenticator;
|
||||
import io.moquette.spi.impl.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.spi.impl.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.spi.security.IAuthenticator;
|
||||
import io.moquette.broker.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.broker.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.broker.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.broker.security.IAuthenticator;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
|
||||
+2
-2
@@ -14,11 +14,11 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.spi.impl;
|
||||
package io.moquette.broker;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import io.moquette.spi.security.IAuthenticator;
|
||||
import io.moquette.broker.security.IAuthenticator;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.spi.impl;
|
||||
package io.moquette.broker;
|
||||
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
import io.netty.handler.codec.mqtt.MqttConnAckMessage;
|
||||
@@ -15,12 +15,11 @@
|
||||
*/
|
||||
package io.moquette.broker;
|
||||
|
||||
import io.moquette.spi.impl.MockAuthenticator;
|
||||
import io.moquette.spi.impl.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.spi.impl.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.broker.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.broker.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.broker.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.broker.subscriptions.Subscription;
|
||||
import io.moquette.broker.subscriptions.Topic;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
|
||||
@@ -15,12 +15,11 @@
|
||||
*/
|
||||
package io.moquette.broker;
|
||||
|
||||
import io.moquette.spi.impl.MockAuthenticator;
|
||||
import io.moquette.spi.impl.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.spi.impl.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.broker.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.broker.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.broker.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.broker.subscriptions.Subscription;
|
||||
import io.moquette.broker.subscriptions.Topic;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.ByteBufUtil;
|
||||
import io.netty.buffer.Unpooled;
|
||||
|
||||
@@ -15,15 +15,13 @@
|
||||
*/
|
||||
package io.moquette.broker;
|
||||
|
||||
import io.moquette.server.netty.NettyUtils;
|
||||
import io.moquette.spi.impl.MockAuthenticator;
|
||||
import io.moquette.spi.impl.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.spi.impl.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.spi.security.IAuthenticator;
|
||||
import io.moquette.spi.security.IAuthorizatorPolicy;
|
||||
import io.moquette.broker.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.broker.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.broker.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.broker.subscriptions.Subscription;
|
||||
import io.moquette.broker.subscriptions.Topic;
|
||||
import io.moquette.broker.security.IAuthenticator;
|
||||
import io.moquette.broker.security.IAuthorizatorPolicy;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.Channel;
|
||||
|
||||
@@ -15,13 +15,12 @@
|
||||
*/
|
||||
package io.moquette.broker;
|
||||
|
||||
import io.moquette.spi.impl.MockAuthenticator;
|
||||
import io.moquette.spi.impl.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.spi.impl.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.spi.security.IAuthenticator;
|
||||
import io.moquette.broker.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.broker.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.broker.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.broker.subscriptions.Subscription;
|
||||
import io.moquette.broker.subscriptions.Topic;
|
||||
import io.moquette.broker.security.IAuthenticator;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.Channel;
|
||||
|
||||
@@ -15,12 +15,10 @@
|
||||
*/
|
||||
package io.moquette.broker;
|
||||
|
||||
import io.moquette.server.netty.NettyUtils;
|
||||
import io.moquette.spi.impl.MockAuthenticator;
|
||||
import io.moquette.spi.impl.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.spi.impl.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.spi.impl.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.spi.security.IAuthenticator;
|
||||
import io.moquette.broker.security.PermitAllAuthorizatorPolicy;
|
||||
import io.moquette.broker.subscriptions.CTrieSubscriptionDirectory;
|
||||
import io.moquette.broker.subscriptions.ISubscriptionsDirectory;
|
||||
import io.moquette.broker.security.IAuthenticator;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
import io.netty.handler.codec.mqtt.MqttConnectMessage;
|
||||
@@ -29,7 +27,7 @@ import io.netty.handler.codec.mqtt.MqttVersion;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static io.moquette.spi.impl.NettyChannelAssertions.assertEqualsConnAck;
|
||||
import static io.moquette.broker.NettyChannelAssertions.assertEqualsConnAck;
|
||||
import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.CONNECTION_ACCEPTED;
|
||||
import static java.util.Collections.singleton;
|
||||
import static java.util.Collections.singletonMap;
|
||||
|
||||
+4
-3
@@ -14,11 +14,12 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server.config;
|
||||
package io.moquette.broker.config;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Test;
|
||||
import io.moquette.BrokerConstants;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
public class ClasspathResourceLoaderTest {
|
||||
|
||||
+2
-1
@@ -14,8 +14,9 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server.config;
|
||||
package io.moquette.broker.config;
|
||||
|
||||
import io.moquette.broker.config.ConfigurationParser;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import java.io.Reader;
|
||||
+2
-2
@@ -14,10 +14,10 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.spi.impl.security;
|
||||
package io.moquette.broker.security;
|
||||
|
||||
import org.junit.Test;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.broker.subscriptions.Topic;
|
||||
import java.io.Reader;
|
||||
import java.io.StringReader;
|
||||
import java.text.ParseException;
|
||||
+2
-2
@@ -14,11 +14,11 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.spi.impl.security;
|
||||
package io.moquette.broker.security;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.broker.subscriptions.Topic;
|
||||
import java.text.ParseException;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.spi.impl.security;
|
||||
package io.moquette.broker.security;
|
||||
|
||||
import org.apache.commons.codec.binary.Hex;
|
||||
import org.junit.*;
|
||||
+1
-2
@@ -14,9 +14,8 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.spi.impl.security;
|
||||
package io.moquette.broker.security;
|
||||
|
||||
import io.moquette.spi.security.IAuthenticator;
|
||||
import org.junit.Test;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
+6
-9
@@ -14,17 +14,14 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.BrokerConstants;
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.server.config.MemoryConfig;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.persistence.MemoryMessagesStore;
|
||||
import io.moquette.persistence.MemoryStorageService;
|
||||
import io.moquette.persistence.MemorySessionStore;
|
||||
import io.moquette.spi.security.IAuthenticator;
|
||||
import io.moquette.spi.security.IAuthorizatorPolicy;
|
||||
import io.moquette.broker.config.IConfig;
|
||||
import io.moquette.broker.config.MemoryConfig;
|
||||
import io.moquette.broker.subscriptions.Topic;
|
||||
import io.moquette.broker.security.IAuthenticator;
|
||||
import io.moquette.broker.security.IAuthorizatorPolicy;
|
||||
import io.moquette.broker.Server;
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Properties;
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
+2
-3
@@ -14,11 +14,10 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
|
||||
import org.eclipse.paho.client.mqttv3.MqttCallback;
|
||||
import org.eclipse.paho.client.mqttv3.MqttException;
|
||||
import org.eclipse.paho.client.mqttv3.MqttMessage;
|
||||
import java.util.concurrent.*;
|
||||
|
||||
@@ -95,7 +94,7 @@ public class MessageCollector implements MqttCallback {
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when the message sent to a server is ACKED (PUBACK or PUBCOMP by the server)
|
||||
* Invoked when the message sent to a integration is ACKED (PUBACK or PUBCOMP by the integration)
|
||||
*/
|
||||
@Override
|
||||
public void deliveryComplete(IMqttDeliveryToken token) {
|
||||
+5
-5
@@ -14,14 +14,14 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.BrokerConstants;
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.broker.config.IConfig;
|
||||
import io.moquette.broker.Server;
|
||||
import io.moquette.server.config.MemoryConfig;
|
||||
import io.moquette.spi.impl.security.DBAuthenticator;
|
||||
import io.moquette.spi.impl.security.DBAuthenticatorTest;
|
||||
import io.moquette.broker.config.MemoryConfig;
|
||||
import io.moquette.broker.security.DBAuthenticator;
|
||||
import io.moquette.broker.security.DBAuthenticatorTest;
|
||||
import org.eclipse.paho.client.mqttv3.*;
|
||||
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
|
||||
import org.junit.*;
|
||||
+3
-3
@@ -14,10 +14,10 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.server.config.MemoryConfig;
|
||||
import io.moquette.broker.config.IConfig;
|
||||
import io.moquette.broker.config.MemoryConfig;
|
||||
import io.moquette.broker.Server;
|
||||
import org.fusesource.mqtt.client.*;
|
||||
import org.junit.After;
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
+6
-6
@@ -14,15 +14,15 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.BrokerConstants;
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.server.config.MemoryConfig;
|
||||
import io.moquette.broker.config.IConfig;
|
||||
import io.moquette.broker.config.MemoryConfig;
|
||||
import io.moquette.broker.Server;
|
||||
import io.moquette.spi.impl.security.AcceptAllAuthenticator;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.spi.security.IAuthorizatorPolicy;
|
||||
import io.moquette.broker.security.AcceptAllAuthenticator;
|
||||
import io.moquette.broker.subscriptions.Topic;
|
||||
import io.moquette.broker.security.IAuthorizatorPolicy;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.mqtt.MqttMessageBuilders;
|
||||
import io.netty.handler.codec.mqtt.MqttPublishMessage;
|
||||
+5
-5
@@ -14,11 +14,11 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.broker.Server;
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.server.config.MemoryConfig;
|
||||
import io.moquette.broker.config.IConfig;
|
||||
import io.moquette.broker.config.MemoryConfig;
|
||||
import org.eclipse.paho.client.mqttv3.*;
|
||||
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
|
||||
import org.junit.*;
|
||||
@@ -162,10 +162,10 @@ public class ServerIntegrationPahoTest {
|
||||
clientForSubscribe1.connect();
|
||||
clientForSubscribe1.subscribe("topic", 0);
|
||||
|
||||
// server stop
|
||||
// integration stop
|
||||
m_server.stopServer();
|
||||
System.out.println("\n\n SEVER REBOOTING \n\n");
|
||||
// server start
|
||||
// integration start
|
||||
startServer();
|
||||
|
||||
// clientForSubscribe2 connect and subscribe to /topic QoS2
|
||||
+3
-3
@@ -14,11 +14,11 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.broker.Server;
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.server.config.MemoryConfig;
|
||||
import io.moquette.broker.config.IConfig;
|
||||
import io.moquette.broker.config.MemoryConfig;
|
||||
import org.eclipse.paho.client.mqttv3.IMqttClient;
|
||||
import org.eclipse.paho.client.mqttv3.MqttClient;
|
||||
import org.eclipse.paho.client.mqttv3.MqttClientPersistence;
|
||||
+9
-9
@@ -14,11 +14,11 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.broker.Server;
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.server.config.MemoryConfig;
|
||||
import io.moquette.broker.config.IConfig;
|
||||
import io.moquette.broker.config.MemoryConfig;
|
||||
import org.eclipse.paho.client.mqttv3.*;
|
||||
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
|
||||
import org.junit.After;
|
||||
@@ -91,10 +91,10 @@ public class ServerIntegrationRestartTest {
|
||||
m_subscriber.subscribe("/topic", 1);
|
||||
m_subscriber.disconnect();
|
||||
|
||||
// shutdown the server
|
||||
// shutdown the integration
|
||||
m_server.stopServer();
|
||||
|
||||
// restart the server
|
||||
// restart the integration
|
||||
m_server.startServer(IntegrationUtils.prepareTestProperties());
|
||||
|
||||
// reconnect the Subscriber subscribing to the same /topic but different QoS
|
||||
@@ -117,10 +117,10 @@ public class ServerIntegrationRestartTest {
|
||||
IMqttClient conn = subscribeAndPublish("/topic");
|
||||
conn.disconnect();
|
||||
|
||||
// shutdown the server
|
||||
// shutdown the integration
|
||||
m_server.stopServer();
|
||||
|
||||
// restart the server
|
||||
// restart the integration
|
||||
m_server.startServer(IntegrationUtils.prepareTestProperties());
|
||||
|
||||
m_publisher.connect();
|
||||
@@ -137,10 +137,10 @@ public class ServerIntegrationRestartTest {
|
||||
m_subscriber.unsubscribe("/topic");
|
||||
m_subscriber.disconnect();
|
||||
|
||||
// shutdown the server
|
||||
// shutdown the integration
|
||||
m_server.stopServer();
|
||||
|
||||
// restart the server
|
||||
// restart the integration
|
||||
m_server.startServer(IntegrationUtils.prepareTestProperties());
|
||||
// subscriber reconnects
|
||||
m_subscriber = new MqttClient("tcp://localhost:1883", "Subscriber", s_dataStore);
|
||||
+6
-6
@@ -14,7 +14,7 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.broker.Server;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
@@ -55,13 +55,13 @@ import org.slf4j.LoggerFactory;
|
||||
* Create certificates needed for client authentication
|
||||
*
|
||||
* <pre>
|
||||
* # generate server certificate chain (valid for 10000 days)
|
||||
* # generate integration certificate chain (valid for 10000 days)
|
||||
* keytool -genkeypair -alias signedtestserver -dname cn=moquette.eclipse.org -keyalg RSA -keysize 2048 \
|
||||
* -keystore signedserverkeystore.jks -keypass passw0rdsrv -storepass passw0rdsrv -validity 10000
|
||||
* keytool -genkeypair -alias signedtestserver_sub -dname cn=moquette.eclipse.org -keyalg RSA -keysize 2048 \
|
||||
* -keystore signedserverkeystore.jks -keypass passw0rdsrv -storepass passw0rdsrv
|
||||
*
|
||||
* # sign server subcertificate with server certificate (valid for 10000 days)
|
||||
* # sign integration subcertificate with integration certificate (valid for 10000 days)
|
||||
* keytool -certreq -alias signedtestserver_sub -keystore signedserverkeystore.jks -keypass passw0rdsrv \
|
||||
* -storepass passw0rdsrv | \
|
||||
* keytool -gencert -alias signedtestserver -keystore signedserverkeystore.jks -keypass passw0rdsrv \
|
||||
@@ -73,14 +73,14 @@ import org.slf4j.LoggerFactory;
|
||||
* keytool -genkeypair -alias signedtestclient -dname cn=moquette.eclipse.org -keyalg RSA -keysize 2048 \
|
||||
* -keystore signedclientkeystore.jks -keypass passw0rd -storepass passw0rd
|
||||
*
|
||||
* # create signed client certificate with server subcertificate and import to client keystore (valid for 10000 days)
|
||||
* # create signed client certificate with integration subcertificate and import to client keystore (valid for 10000 days)
|
||||
* keytool -certreq -alias signedtestclient -keystore signedclientkeystore.jks -keypass passw0rd -storepass passw0rd | \
|
||||
* keytool -gencert -alias signedtestserver_sub -keystore signedserverkeystore.jks -keypass passw0rdsrv \
|
||||
* -storepass passw0rdsrv -validity 10000 | \
|
||||
* keytool -importcert -alias signedtestclient -keystore signedclientkeystore.jks -keypass passw0rd \
|
||||
* -storepass passw0rd -noprompt
|
||||
*
|
||||
* # import server certificates into signed truststore
|
||||
* # import integration certificates into signed truststore
|
||||
* keytool -exportcert -alias signedtestserver -keystore signedserverkeystore.jks -keypass passw0rdsrv \
|
||||
* -storepass passw0rdsrv | \
|
||||
* keytool -importcert -trustcacerts -noprompt -alias signedtestserver -keystore signedclientkeystore.jks \
|
||||
@@ -94,7 +94,7 @@ import org.slf4j.LoggerFactory;
|
||||
* keytool -genkeypair -alias unsignedtestclient -dname cn=moquette.eclipse.org -validity 10000 -keyalg RSA \
|
||||
* -keysize 2048 -keystore unsignedclientkeystore.jks -keypass passw0rd -storepass passw0rd
|
||||
*
|
||||
* # import server certificates into unsigned truststore
|
||||
* # import integration certificates into unsigned truststore
|
||||
* keytool -exportcert -alias signedtestserver -keystore signedserverkeystore.jks -keypass passw0rdsrv \
|
||||
* -storepass passw0rdsrv | \
|
||||
* keytool -importcert -trustcacerts -noprompt -alias signedtestserver -keystore unsignedclientkeystore.jks \
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.broker.Server;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
+3
-3
@@ -14,14 +14,14 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.broker.Server;
|
||||
import io.moquette.BrokerConstants;
|
||||
import io.moquette.server.config.MemoryConfig;
|
||||
import io.moquette.broker.config.MemoryConfig;
|
||||
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
|
||||
import org.eclipse.jetty.websocket.client.WebSocketClient;
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.broker.config.IConfig;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
+5
-6
@@ -14,11 +14,11 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.server;
|
||||
package io.moquette.integration;
|
||||
|
||||
import io.moquette.broker.Server;
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.server.config.MemoryConfig;
|
||||
import io.moquette.broker.config.IConfig;
|
||||
import io.moquette.broker.config.MemoryConfig;
|
||||
import io.moquette.testclient.Client;
|
||||
import io.netty.handler.codec.mqtt.*;
|
||||
import io.netty.handler.codec.mqtt.MqttMessage;
|
||||
@@ -30,7 +30,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.awaitility.Awaitility;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.*;
|
||||
@@ -68,9 +67,9 @@ public class ServerLowlevelMessagesIntegrationTests {
|
||||
public void tearDown() throws Exception {
|
||||
m_client.close();
|
||||
LOG.debug("After raw client close");
|
||||
Thread.sleep(300); // to let the close event pass before server stop event
|
||||
Thread.sleep(300); // to let the close event pass before integration stop event
|
||||
m_server.stopServer();
|
||||
LOG.debug("After asked server to stop");
|
||||
LOG.debug("After asked integration to stop");
|
||||
}
|
||||
|
||||
@Test
|
||||
+3
-4
@@ -14,12 +14,11 @@
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.spi.impl;
|
||||
package io.moquette.interception;
|
||||
|
||||
import io.moquette.interception.InterceptHandler;
|
||||
import io.moquette.interception.messages.*;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.moquette.broker.subscriptions.Subscription;
|
||||
import io.moquette.broker.subscriptions.Topic;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.mqtt.MqttMessageBuilders;
|
||||
import io.netty.handler.codec.mqtt.MqttQoS;
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012-2018 The original author or authors
|
||||
* ------------------------------------------------------
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Apache License v2.0 which accompanies this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* The Apache License v2.0 is available at
|
||||
* http://www.opensource.org/licenses/apache2.0.php
|
||||
*
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
|
||||
package io.moquette.spi.impl;
|
||||
|
||||
import io.netty.handler.codec.mqtt.MqttMessage;
|
||||
import io.netty.util.AttributeKey;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* This a synchronous channel that avoid output ring buffer from Processor
|
||||
*/
|
||||
class MockReceiverChannel {
|
||||
|
||||
MqttMessage m_receivedMessage;
|
||||
private Map<Object, Object> m_attributes = new HashMap<>();
|
||||
|
||||
public Object getAttribute(AttributeKey<Object> key) {
|
||||
return m_attributes.get(key);
|
||||
}
|
||||
|
||||
public void setAttribute(AttributeKey<Object> key, Object value) {
|
||||
m_attributes.put(key, value);
|
||||
}
|
||||
|
||||
public void setIdleTime(int idleTime) {
|
||||
}
|
||||
|
||||
public void close(boolean immediately) {
|
||||
}
|
||||
|
||||
public MqttMessage getMessage() {
|
||||
return this.m_receivedMessage;
|
||||
}
|
||||
|
||||
public void write(Object value) {
|
||||
try {
|
||||
this.m_receivedMessage = (MqttMessage) value;
|
||||
} catch (Exception ex) {
|
||||
throw new AssertionError("Wrong return code");
|
||||
}
|
||||
}
|
||||
}
|
||||
-273
@@ -1,273 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012-2018 The original author or authors
|
||||
* ------------------------------------------------------
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Apache License v2.0 which accompanies this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* The Apache License v2.0 is available at
|
||||
* http://www.opensource.org/licenses/apache2.0.php
|
||||
*
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
package io.moquette.spi.impl.subscriptions;
|
||||
|
||||
import io.moquette.broker.ISubscriptionsRepository;
|
||||
import io.moquette.broker.MemorySubscriptionsRepository;
|
||||
import io.moquette.persistence.MemoryStorageService;
|
||||
import io.moquette.spi.ISessionsStore;
|
||||
import io.moquette.spi.ISubscriptionsStore;
|
||||
import io.netty.handler.codec.mqtt.MqttQoS;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
import static io.moquette.spi.impl.subscriptions.CTrieSubscriptionDirectoryTest.clientSubOnTopic;
|
||||
import static io.moquette.spi.impl.subscriptions.Topic.asTopic;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class CTrieSubscriptionDirectoryMatchingTest {
|
||||
|
||||
private CTrieSubscriptionDirectory sut;
|
||||
private ISubscriptionsRepository sessionsRepository;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
sut = new CTrieSubscriptionDirectory();
|
||||
|
||||
this.sessionsRepository = new MemorySubscriptionsRepository();
|
||||
sut.init(this.sessionsRepository);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchSimple() {
|
||||
Subscription slashSub = clientSubOnTopic("TempSensor1", "/");
|
||||
sut.add(slashSub);
|
||||
assertThat(sut.recursiveMatch(asTopic("finance"), sut.root)).isEmpty();
|
||||
|
||||
Subscription slashFinanceSub = clientSubOnTopic("TempSensor1", "/finance");
|
||||
sut.add(slashFinanceSub);
|
||||
assertThat(sut.recursiveMatch(asTopic("finance"), sut.root)).isEmpty();
|
||||
|
||||
assertThat(sut.recursiveMatch(asTopic("/finance"), sut.root)).contains(slashFinanceSub);
|
||||
assertThat(sut.recursiveMatch(asTopic("/"), sut.root)).contains(slashSub);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchSimpleMulti() {
|
||||
Subscription anySub = clientSubOnTopic("TempSensor1", "#");
|
||||
sut.add(anySub);
|
||||
assertThat(sut.recursiveMatch(asTopic("finance"), sut.root)).contains(anySub);
|
||||
|
||||
Subscription financeAnySub = clientSubOnTopic("TempSensor1", "finance/#");
|
||||
sut.add(financeAnySub);
|
||||
assertThat(sut.recursiveMatch(asTopic("finance"), sut.root)).containsExactlyInAnyOrder(financeAnySub, anySub);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchingDeepMulti_one_layer() {
|
||||
Subscription anySub = clientSubOnTopic("AllSensor1", "#");
|
||||
Subscription financeAnySub = clientSubOnTopic("FinanceSensor", "finance/#");
|
||||
sut.add(anySub);
|
||||
sut.add(financeAnySub);
|
||||
|
||||
// Verify
|
||||
assertThat(sut.recursiveMatch(asTopic("finance/stock"), sut.root))
|
||||
.containsExactlyInAnyOrder(financeAnySub, anySub);
|
||||
assertThat(sut.recursiveMatch(asTopic("finance/stock/ibm"), sut.root))
|
||||
.containsExactlyInAnyOrder(financeAnySub, anySub);
|
||||
// System.out.println(sut.dumpTree());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchingDeepMulti_two_layer() {
|
||||
Subscription financeAnySub = clientSubOnTopic("FinanceSensor", "finance/stock/#");
|
||||
sut.add(financeAnySub);
|
||||
|
||||
// Verify
|
||||
assertThat(sut.recursiveMatch(asTopic("finance/stock/ibm"), sut.root)).containsExactly(financeAnySub);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchSimpleSingle() {
|
||||
Subscription anySub = clientSubOnTopic("AnySensor", "+");
|
||||
sut.add(anySub);
|
||||
assertThat(sut.recursiveMatch(asTopic("finance"), sut.root)).containsExactly(anySub);
|
||||
|
||||
Subscription financeOne = clientSubOnTopic("AnySensor", "finance/+");
|
||||
sut.add(financeOne);
|
||||
assertThat(sut.recursiveMatch(asTopic("finance/stock"), sut.root)).containsExactly(financeOne);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchManySingle() {
|
||||
Subscription manySub = clientSubOnTopic("AnySensor", "+/+");
|
||||
sut.add(manySub);
|
||||
|
||||
// verify
|
||||
assertThat(sut.recursiveMatch(asTopic("/finance"), sut.root)).contains(manySub);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchSlashSingle() {
|
||||
Subscription slashPlusSub = clientSubOnTopic("AnySensor", "/+");
|
||||
sut.add(slashPlusSub);
|
||||
Subscription anySub = clientSubOnTopic("AnySensor", "+");
|
||||
sut.add(anySub);
|
||||
|
||||
// Verify
|
||||
assertThat(sut.recursiveMatch(asTopic("/finance"), sut.root)).containsOnly(slashPlusSub);
|
||||
assertThat(sut.recursiveMatch(asTopic("/finance"), sut.root)).doesNotContain(anySub);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchManyDeepSingle() {
|
||||
Subscription slashPlusSub = clientSubOnTopic("FinanceSensor1", "/finance/+/ibm");
|
||||
sut.add(slashPlusSub);
|
||||
Subscription slashPlusDeepSub = clientSubOnTopic("FinanceSensor2", "/+/stock/+");
|
||||
sut.add(slashPlusDeepSub);
|
||||
|
||||
// Verify
|
||||
assertThat(sut.recursiveMatch(asTopic("/finance/stock/ibm"), sut.root))
|
||||
.containsExactlyInAnyOrder(slashPlusSub, slashPlusDeepSub);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchSimpleMulti_allTheTree() {
|
||||
Subscription sub = clientSubOnTopic("AnySensor1", "#");
|
||||
sut.add(sub);
|
||||
|
||||
assertThat(sut.recursiveMatch(asTopic("finance"), sut.root)).isNotEmpty();
|
||||
assertThat(sut.recursiveMatch(asTopic("finance/ibm"), sut.root)).isNotEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void rogerLightTopicMatches() {
|
||||
assertMatch("foo/bar", "foo/bar");
|
||||
assertMatch("foo/bar", "foo/bar");
|
||||
assertMatch("foo/+", "foo/bar");
|
||||
assertMatch("foo/+/baz", "foo/bar/baz");
|
||||
assertMatch("foo/+/#", "foo/bar/baz");
|
||||
assertMatch("#", "foo/bar/baz");
|
||||
|
||||
assertNotMatch("foo/bar", "foo");
|
||||
assertNotMatch("foo/+", "foo/bar/baz");
|
||||
assertNotMatch("foo/+/baz", "foo/bar/bar");
|
||||
assertNotMatch("foo/+/#", "fo2/bar/baz");
|
||||
|
||||
assertMatch("#", "/foo/bar");
|
||||
assertMatch("/#", "/foo/bar");
|
||||
assertNotMatch("/#", "foo/bar");
|
||||
|
||||
assertMatch("foo//bar", "foo//bar");
|
||||
assertMatch("foo//+", "foo//bar");
|
||||
assertMatch("foo/+/+/baz", "foo///baz");
|
||||
assertMatch("foo/bar/+", "foo/bar/");
|
||||
}
|
||||
|
||||
private void assertMatch(String s, String t) {
|
||||
sut = new CTrieSubscriptionDirectory();
|
||||
ISubscriptionsRepository sessionsRepository = new MemorySubscriptionsRepository();
|
||||
sut.init(sessionsRepository);
|
||||
|
||||
Subscription sub = clientSubOnTopic("AnySensor1", s);
|
||||
sut.add(sub);
|
||||
|
||||
assertThat(sut.recursiveMatch(asTopic(t), sut.root)).isNotEmpty();
|
||||
}
|
||||
|
||||
private void assertNotMatch(String subscription, String topic) {
|
||||
sut = new CTrieSubscriptionDirectory();
|
||||
ISubscriptionsRepository sessionsRepository = new MemorySubscriptionsRepository();
|
||||
sut.init(sessionsRepository);
|
||||
|
||||
Subscription sub = clientSubOnTopic("AnySensor1", subscription);
|
||||
sut.add(sub);
|
||||
|
||||
assertThat(sut.recursiveMatch(asTopic(topic), sut.root)).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOverlappingSubscriptions() {
|
||||
Subscription genericSub = new Subscription("Sensor1", asTopic("a/+"), MqttQoS.AT_MOST_ONCE);
|
||||
this.sessionsRepository.addNewSubscription(genericSub);
|
||||
sut.add(genericSub);
|
||||
|
||||
Subscription specificSub = new Subscription("Sensor1", asTopic("a/b"), MqttQoS.AT_MOST_ONCE);
|
||||
this.sessionsRepository.addNewSubscription(specificSub);
|
||||
sut.add(specificSub);
|
||||
|
||||
//Exercise
|
||||
final Set<Subscription> matchingForSpecific = sut.matchQosSharpening(asTopic("a/b"));
|
||||
|
||||
// Verify
|
||||
assertThat(matchingForSpecific.size()).isEqualTo(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeSubscription_withDifferentClients_subscribedSameTopic() {
|
||||
Subscription slashSub = clientSubOnTopic("Sensor1", "/topic");
|
||||
sut.add(slashSub);
|
||||
Subscription slashSub2 = clientSubOnTopic("Sensor2", "/topic");
|
||||
sut.add(slashSub2);
|
||||
|
||||
// Exercise
|
||||
sut.removeSubscription(asTopic("/topic"), slashSub2.clientId);
|
||||
|
||||
// Verify
|
||||
Subscription remainedSubscription = sut.recursiveMatch(asTopic("/topic"), sut.root).iterator().next();
|
||||
assertThat(remainedSubscription.clientId).isEqualTo(slashSub.clientId);
|
||||
assertEquals(slashSub.clientId, remainedSubscription.clientId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeSubscription_sameClients_subscribedSameTopic() {
|
||||
Subscription slashSub = clientSubOnTopic("Sensor1", "/topic");
|
||||
sut.add(slashSub);
|
||||
|
||||
// Exercise
|
||||
sut.removeSubscription(asTopic("/topic"), slashSub.clientId);
|
||||
|
||||
// Verify
|
||||
final Set<Subscription> matchingSubscriptions = sut.recursiveMatch(asTopic("/topic"), sut.root);
|
||||
assertThat(matchingSubscriptions).isEmpty();
|
||||
}
|
||||
|
||||
/*
|
||||
* Test for Issue #49
|
||||
*/
|
||||
@Test
|
||||
public void duplicatedSubscriptionsWithDifferentQos() {
|
||||
Subscription client2Sub = new Subscription("client2", asTopic("client/test/b"), MqttQoS.AT_MOST_ONCE);
|
||||
this.sut.add(client2Sub);
|
||||
Subscription client1SubQoS0 = new Subscription("client1", asTopic("client/test/b"), MqttQoS.AT_MOST_ONCE);
|
||||
this.sut.add(client1SubQoS0);
|
||||
|
||||
Subscription client1SubQoS2 = new Subscription("client1", asTopic("client/test/b"), MqttQoS.EXACTLY_ONCE);
|
||||
this.sut.add(client1SubQoS2);
|
||||
|
||||
// Verify
|
||||
Set<Subscription> subscriptions = this.sut.matchQosSharpening(asTopic("client/test/b"));
|
||||
assertThat(subscriptions).contains(client1SubQoS2);
|
||||
assertThat(subscriptions).contains(client2Sub);
|
||||
|
||||
final Optional<Subscription> matchingClient1Sub = subscriptions
|
||||
.stream()
|
||||
.filter(s -> s.equals(client1SubQoS0))
|
||||
.findFirst();
|
||||
assertTrue(matchingClient1Sub.isPresent());
|
||||
Subscription client1Sub = matchingClient1Sub.get();
|
||||
|
||||
assertThat(client1SubQoS0.getRequestedQos()).isNotEqualTo(client1Sub.getRequestedQos());
|
||||
|
||||
// client1SubQoS2 should override client1SubQoS0
|
||||
assertThat(client1Sub.getRequestedQos()).isEqualTo(client1SubQoS2.getRequestedQos());
|
||||
}
|
||||
}
|
||||
-307
@@ -1,307 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012-2018 The original author or authors
|
||||
* ------------------------------------------------------
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Apache License v2.0 which accompanies this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* The Apache License v2.0 is available at
|
||||
* http://www.opensource.org/licenses/apache2.0.php
|
||||
*
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/package io.moquette.spi.impl.subscriptions;
|
||||
|
||||
import io.moquette.broker.ISubscriptionsRepository;
|
||||
import io.moquette.broker.MemorySubscriptionsRepository;
|
||||
import io.moquette.persistence.MemoryStorageService;
|
||||
import io.moquette.spi.ISessionsStore;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
import static io.moquette.spi.impl.subscriptions.Topic.asTopic;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class CTrieSubscriptionDirectoryTest {
|
||||
|
||||
private CTrieSubscriptionDirectory sut;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
sut = new CTrieSubscriptionDirectory();
|
||||
ISubscriptionsRepository sessionsRepository = new MemorySubscriptionsRepository();
|
||||
sut.init(sessionsRepository);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddOnSecondLayerWithEmptyTokenOnEmptyTree() {
|
||||
//Exercise
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/"));
|
||||
|
||||
//Verify
|
||||
final Optional<CNode> matchedNode = sut.lookup(asTopic("/"));
|
||||
assertTrue("Node on path / must be present", matchedNode.isPresent());
|
||||
//verify structure, only root INode and the first CNode should be present
|
||||
assertThat(this.sut.root.mainNode().subscriptions).isEmpty();
|
||||
assertThat(this.sut.root.mainNode().allChildren()).isNotEmpty();
|
||||
|
||||
INode firstLayer = this.sut.root.mainNode().allChildren().get(0);
|
||||
assertThat(firstLayer.mainNode().subscriptions).isEmpty();
|
||||
assertThat(firstLayer.mainNode().allChildren()).isNotEmpty();
|
||||
|
||||
INode secondLayer = firstLayer.mainNode().allChildren().get(0);
|
||||
assertThat(secondLayer.mainNode().subscriptions).isNotEmpty();
|
||||
assertThat(secondLayer.mainNode().allChildren()).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddFirstLayerNodeOnEmptyTree() {
|
||||
//Exercise
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/temp"));
|
||||
|
||||
//Verify
|
||||
final Optional<CNode> matchedNode = sut.lookup(asTopic("/temp"));
|
||||
assertTrue("Node on path /temp must be present", matchedNode.isPresent());
|
||||
assertFalse(matchedNode.get().subscriptions.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLookup() {
|
||||
final Subscription existingSubscription = clientSubOnTopic("TempSensor1", "/temp");
|
||||
sut.add(existingSubscription);
|
||||
|
||||
//Exercise
|
||||
final Optional<CNode> matchedNode = sut.lookup(asTopic("/humidity"));
|
||||
|
||||
//Verify
|
||||
assertFalse("Node on path /humidity can't be present", matchedNode.isPresent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddNewSubscriptionOnExistingNode() {
|
||||
final Subscription existingSubscription = clientSubOnTopic("TempSensor1", "/temp");
|
||||
sut.add(existingSubscription);
|
||||
|
||||
//Exercise
|
||||
final Subscription newSubscription = clientSubOnTopic("TempSensor2", "/temp");
|
||||
sut.add(newSubscription);
|
||||
|
||||
//Verify
|
||||
final Optional<CNode> matchedNode = sut.lookup(asTopic("/temp"));
|
||||
assertTrue("Node on path /temp must be present", matchedNode.isPresent());
|
||||
final Set<Subscription> subscriptions = matchedNode.get().subscriptions;
|
||||
assertTrue(subscriptions.contains(newSubscription));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddNewDeepNodes() {
|
||||
sut.add(clientSubOnTopic("TempSensorRM", "/italy/roma/temp"));
|
||||
sut.add(clientSubOnTopic("TempSensorFI", "/italy/firenze/temp"));
|
||||
sut.add(clientSubOnTopic("HumSensorFI", "/italy/roma/humidity"));
|
||||
final Subscription happinessSensor = clientSubOnTopic("HappinessSensor", "/italy/happiness");
|
||||
sut.add(happinessSensor);
|
||||
|
||||
//Verify
|
||||
final Optional<CNode> matchedNode = sut.lookup(asTopic("/italy/happiness"));
|
||||
assertTrue("Node on path /italy/happiness must be present", matchedNode.isPresent());
|
||||
final Set<Subscription> subscriptions = matchedNode.get().subscriptions;
|
||||
assertTrue(subscriptions.contains(happinessSensor));
|
||||
}
|
||||
|
||||
static Subscription clientSubOnTopic(String clientID, String topicName) {
|
||||
return new Subscription(clientID, asTopic(topicName), null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenTreeWithSomeNodeWhenRemoveContainedSubscriptionThenNodeIsUpdated() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/temp"));
|
||||
|
||||
//Exercise
|
||||
sut.removeSubscription(asTopic("/temp"), "TempSensor1");
|
||||
|
||||
//Verify
|
||||
final Optional<CNode> matchedNode = sut.lookup(asTopic("/temp"));
|
||||
assertFalse("Node on path /temp can't be present", matchedNode.isPresent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenTreeWithSomeNodeUnsubscribeAndResubscribeCleanTomb() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "test"));
|
||||
sut.removeSubscription(asTopic("test"), "TempSensor1");
|
||||
|
||||
sut.add(clientSubOnTopic("TempSensor1", "test"));
|
||||
assertTrue(sut.root.mainNode().allChildren().size() == 1); // looking to see if TNode is cleaned up
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenTreeWithSomeNodeWhenRemoveMultipleTimes() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "test"));
|
||||
|
||||
// make sure no TNode exceptions
|
||||
sut.removeSubscription(asTopic("test"), "TempSensor1");
|
||||
sut.removeSubscription(asTopic("test"), "TempSensor1");
|
||||
sut.removeSubscription(asTopic("test"), "TempSensor1");
|
||||
sut.removeSubscription(asTopic("test"), "TempSensor1");
|
||||
|
||||
//Verify
|
||||
final Optional<CNode> matchedNode = sut.lookup(asTopic("/temp"));
|
||||
assertFalse("Node on path /temp can't be present", matchedNode.isPresent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenTreeWithSomeDeepNodeWhenRemoveMultipleTimes() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/test/me/1/2/3"));
|
||||
|
||||
// make sure no TNode exceptions
|
||||
sut.removeSubscription(asTopic("/test/me/1/2/3"), "TempSensor1");
|
||||
sut.removeSubscription(asTopic("/test/me/1/2/3"), "TempSensor1");
|
||||
sut.removeSubscription(asTopic("/test/me/1/2/3"), "TempSensor1");
|
||||
|
||||
//Verify
|
||||
final Optional<CNode> matchedNode = sut.lookup(asTopic("/temp"));
|
||||
assertFalse("Node on path /temp can't be present", matchedNode.isPresent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenTreeWithSomeNodeHierarchWhenRemoveContainedSubscriptionThenNodeIsUpdated() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/temp/1"));
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/temp/2"));
|
||||
|
||||
//Exercise
|
||||
sut.removeSubscription(asTopic("/temp/1"), "TempSensor1");
|
||||
|
||||
sut.removeSubscription(asTopic("/temp/1"), "TempSensor1");
|
||||
final Set<Subscription> matchingSubs = sut.recursiveMatch(asTopic("/temp/2"), sut.root);
|
||||
|
||||
//Verify
|
||||
final Subscription expectedMatchingsub = new Subscription("TempSensor1", asTopic("/temp/2"));
|
||||
assertThat(matchingSubs).contains(expectedMatchingsub);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenTreeWithSomeNodeHierarchWhenRemoveContainedSubscriptionSmallerThenNodeIsNotUpdated() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/temp/1"));
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/temp/2"));
|
||||
|
||||
//Exercise
|
||||
sut.removeSubscription(asTopic("/temp"), "TempSensor1");
|
||||
|
||||
final Set<Subscription> matchingSubs1 = sut.recursiveMatch(asTopic("/temp/1"), sut.root);
|
||||
final Set<Subscription> matchingSubs2 = sut.recursiveMatch(asTopic("/temp/2"), sut.root);
|
||||
|
||||
//Verify
|
||||
// not clear to me, but I believe /temp unsubscribe should not unsub you from downstream /temp/1 or /temp/2
|
||||
final Subscription expectedMatchingsub1 = new Subscription("TempSensor1", asTopic("/temp/1"));
|
||||
assertThat(matchingSubs1).contains(expectedMatchingsub1);
|
||||
final Subscription expectedMatchingsub2 = new Subscription("TempSensor1", asTopic("/temp/2"));
|
||||
assertThat(matchingSubs2).contains(expectedMatchingsub2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenTreeWithDeepNodeWhenRemoveContainedSubscriptionThenNodeIsUpdated() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/bah/bin/bash"));
|
||||
|
||||
sut.removeSubscription(asTopic("/bah/bin/bash"), "TempSensor1");
|
||||
|
||||
//Verify
|
||||
final Optional<CNode> matchedNode = sut.lookup(asTopic("/bah/bin/bash"));
|
||||
assertFalse("Node on path /temp can't be present", matchedNode.isPresent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchSubscriptionNoWildcards() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "/temp"));
|
||||
|
||||
//Exercise
|
||||
final Set<Subscription> matchingSubs = sut.recursiveMatch(asTopic("/temp"), sut.root);
|
||||
|
||||
//Verify
|
||||
final Subscription expectedMatchingsub = new Subscription("TempSensor1", asTopic("/temp"));
|
||||
assertThat(matchingSubs).contains(expectedMatchingsub);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemovalInnerTopicOffRootSameClient() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "temp"));
|
||||
sut.add(clientSubOnTopic("TempSensor1", "temp/1"));
|
||||
|
||||
//Exercise
|
||||
final Set<Subscription> matchingSubs1 = sut.recursiveMatch(asTopic("temp"), sut.root);
|
||||
final Set<Subscription> matchingSubs2 = sut.recursiveMatch(asTopic("temp/1"), sut.root);
|
||||
|
||||
//Verify
|
||||
final Subscription expectedMatchingsub1 = new Subscription("TempSensor1", asTopic("temp"));
|
||||
final Subscription expectedMatchingsub2 = new Subscription("TempSensor1", asTopic("temp/1"));
|
||||
|
||||
assertThat(matchingSubs1).contains(expectedMatchingsub1);
|
||||
assertThat(matchingSubs2).contains(expectedMatchingsub2);
|
||||
|
||||
sut.removeSubscription(asTopic("temp"), "TempSensor1");
|
||||
|
||||
//Exercise
|
||||
final Set<Subscription> matchingSubs3 = sut.recursiveMatch(asTopic("temp"), sut.root);
|
||||
final Set<Subscription> matchingSubs4 = sut.recursiveMatch(asTopic("temp/1"), sut.root);
|
||||
|
||||
assertThat(matchingSubs3).doesNotContain(expectedMatchingsub1);
|
||||
assertThat(matchingSubs4).contains(expectedMatchingsub2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemovalInnerTopicOffRootDiffClient() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "temp"));
|
||||
sut.add(clientSubOnTopic("TempSensor2", "temp/1"));
|
||||
|
||||
//Exercise
|
||||
final Set<Subscription> matchingSubs1 = sut.recursiveMatch(asTopic("temp"), sut.root);
|
||||
final Set<Subscription> matchingSubs2 = sut.recursiveMatch(asTopic("temp/1"), sut.root);
|
||||
|
||||
//Verify
|
||||
final Subscription expectedMatchingsub1 = new Subscription("TempSensor1", asTopic("temp"));
|
||||
final Subscription expectedMatchingsub2 = new Subscription("TempSensor2", asTopic("temp/1"));
|
||||
|
||||
assertThat(matchingSubs1).contains(expectedMatchingsub1);
|
||||
assertThat(matchingSubs2).contains(expectedMatchingsub2);
|
||||
|
||||
sut.removeSubscription(asTopic("temp"), "TempSensor1");
|
||||
|
||||
//Exercise
|
||||
final Set<Subscription> matchingSubs3 = sut.recursiveMatch(asTopic("temp"), sut.root);
|
||||
final Set<Subscription> matchingSubs4 = sut.recursiveMatch(asTopic("temp/1"), sut.root);
|
||||
|
||||
assertThat(matchingSubs3).doesNotContain(expectedMatchingsub1);
|
||||
assertThat(matchingSubs4).contains(expectedMatchingsub2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemovalOuterTopicOffRootDiffClient() {
|
||||
sut.add(clientSubOnTopic("TempSensor1", "temp"));
|
||||
sut.add(clientSubOnTopic("TempSensor2", "temp/1"));
|
||||
|
||||
//Exercise
|
||||
final Set<Subscription> matchingSubs1 = sut.recursiveMatch(asTopic("temp"), sut.root);
|
||||
final Set<Subscription> matchingSubs2 = sut.recursiveMatch(asTopic("temp/1"), sut.root);
|
||||
|
||||
//Verify
|
||||
final Subscription expectedMatchingsub1 = new Subscription("TempSensor1", asTopic("temp"));
|
||||
final Subscription expectedMatchingsub2 = new Subscription("TempSensor2", asTopic("temp/1"));
|
||||
|
||||
assertThat(matchingSubs1).contains(expectedMatchingsub1);
|
||||
assertThat(matchingSubs2).contains(expectedMatchingsub2);
|
||||
|
||||
sut.removeSubscription(asTopic("temp/1"), "TempSensor2");
|
||||
|
||||
//Exercise
|
||||
final Set<Subscription> matchingSubs3 = sut.recursiveMatch(asTopic("temp"), sut.root);
|
||||
final Set<Subscription> matchingSubs4 = sut.recursiveMatch(asTopic("temp/1"), sut.root);
|
||||
|
||||
assertThat(matchingSubs3).contains(expectedMatchingsub1);
|
||||
assertThat(matchingSubs4).doesNotContain(expectedMatchingsub2);
|
||||
}
|
||||
}
|
||||
@@ -1,179 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012-2018 The original author or authors
|
||||
* ------------------------------------------------------
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Apache License v2.0 which accompanies this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* The Apache License v2.0 is available at
|
||||
* http://www.opensource.org/licenses/apache2.0.php
|
||||
*
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
package io.moquette.spi.impl.subscriptions;
|
||||
|
||||
import org.assertj.core.api.AbstractAssert;
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
public class TopicTest {
|
||||
|
||||
@Test
|
||||
public void testParseTopic() {
|
||||
assertThat(new Topic("finance/stock/ibm")).containsToken("finance", "stock", "ibm");
|
||||
|
||||
assertThat(new Topic("/finance/stock/ibm")).containsToken(Token.EMPTY, "finance", "stock", "ibm");
|
||||
|
||||
assertThat(new Topic("/")).containsToken(Token.EMPTY, Token.EMPTY);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseTopicMultiValid() {
|
||||
assertThat(new Topic("finance/stock/#")).containsToken("finance", "stock", Token.MULTI);
|
||||
|
||||
assertThat(new Topic("#")).containsToken(Token.MULTI);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidationProcess() {
|
||||
// TopicMultiInTheMiddle
|
||||
assertThat(new Topic("finance/#/closingprice")).isInValid();
|
||||
|
||||
// MultiNotAfterSeparator
|
||||
assertThat(new Topic("finance#")).isInValid();
|
||||
|
||||
// TopicMultiNotAlone
|
||||
assertThat(new Topic("/finance/#closingprice")).isInValid();
|
||||
|
||||
// SingleNotAferSeparator
|
||||
assertThat(new Topic("finance+")).isInValid();
|
||||
|
||||
assertThat(new Topic("finance/+")).isValid();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseTopicSingleValid() {
|
||||
assertThat(new Topic("finance/stock/+")).containsToken("finance", "stock", Token.SINGLE);
|
||||
|
||||
assertThat(new Topic("+")).containsToken(Token.SINGLE);
|
||||
|
||||
assertThat(new Topic("finance/+/ibm")).containsToken("finance", Token.SINGLE, "ibm");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchTopics_simple() {
|
||||
assertThat(new Topic("/")).matches("/");
|
||||
assertThat(new Topic("/finance")).matches("/finance");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchTopics_multi() {
|
||||
assertThat(new Topic("finance")).matches("#");
|
||||
assertThat(new Topic("finance")).matches("finance/#");
|
||||
assertThat(new Topic("finance/stock")).matches("finance/#");
|
||||
assertThat(new Topic("finance/stock/ibm")).matches("finance/#");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMatchTopics_single() {
|
||||
assertThat(new Topic("finance")).matches("+");
|
||||
assertThat(new Topic("finance/stock")).matches("finance/+");
|
||||
assertThat(new Topic("finance")).doesNotMatch("finance/+");
|
||||
assertThat(new Topic("/finance")).matches("/+");
|
||||
assertThat(new Topic("/finance")).doesNotMatch("+");
|
||||
assertThat(new Topic("/finance")).matches("+/+");
|
||||
assertThat(new Topic("/finance/stock/ibm")).matches("/finance/+/ibm");
|
||||
assertThat(new Topic("/")).matches("+/+");
|
||||
assertThat(new Topic("sport/")).matches("sport/+");
|
||||
assertThat(new Topic("/finance/stock")).doesNotMatch("+");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void rogerLightMatchTopics() {
|
||||
assertThat(new Topic("foo/bar")).matches("foo/bar");
|
||||
assertThat(new Topic("foo/bar")).matches("foo/+");
|
||||
assertThat(new Topic("foo/bar/baz")).matches("foo/+/baz");
|
||||
assertThat(new Topic("foo/bar/baz")).matches("foo/+/#");
|
||||
assertThat(new Topic("foo/bar/baz")).matches("#");
|
||||
|
||||
assertThat(new Topic("foo")).doesNotMatch("foo/bar");
|
||||
assertThat(new Topic("foo/bar/baz")).doesNotMatch("foo/+");
|
||||
assertThat(new Topic("foo/bar/bar")).doesNotMatch("foo/+/baz");
|
||||
assertThat(new Topic("fo2/bar/baz")).doesNotMatch("foo/+/#");
|
||||
|
||||
assertThat(new Topic("/foo/bar")).matches("#");
|
||||
assertThat(new Topic("/foo/bar")).matches("/#");
|
||||
assertThat(new Topic("foo/bar")).doesNotMatch("/#");
|
||||
|
||||
assertThat(new Topic("foo//bar")).matches("foo//bar");
|
||||
assertThat(new Topic("foo//bar")).matches("foo//+");
|
||||
assertThat(new Topic("foo///baz")).matches("foo/+/+/baz");
|
||||
assertThat(new Topic("foo/bar/")).matches("foo/bar/+");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void exceptHeadToken() {
|
||||
assertEquals(Topic.asTopic("token"), Topic.asTopic("/token").exceptHeadToken());
|
||||
assertEquals(Topic.asTopic("a/b"), Topic.asTopic("/a/b").exceptHeadToken());
|
||||
}
|
||||
|
||||
public static TopicAssert assertThat(Topic topic) {
|
||||
return new TopicAssert(topic);
|
||||
}
|
||||
|
||||
static class TopicAssert extends AbstractAssert<TopicAssert, Topic> {
|
||||
|
||||
TopicAssert(Topic actual) {
|
||||
super(actual, TopicAssert.class);
|
||||
}
|
||||
|
||||
public TopicAssert matches(String topic) {
|
||||
Assertions.assertThat(actual.match(new Topic(topic))).isTrue();
|
||||
|
||||
return myself;
|
||||
}
|
||||
|
||||
public TopicAssert doesNotMatch(String topic) {
|
||||
Assertions.assertThat(actual.match(new Topic(topic))).isFalse();
|
||||
|
||||
return myself;
|
||||
}
|
||||
|
||||
public TopicAssert containsToken(Object... tokens) {
|
||||
Assertions.assertThat(actual.getTokens()).containsExactly(asArray(tokens));
|
||||
|
||||
return myself;
|
||||
}
|
||||
|
||||
private Token[] asArray(Object... l) {
|
||||
Token[] tokens = new Token[l.length];
|
||||
for (int i = 0; i < l.length; i++) {
|
||||
Object o = l[i];
|
||||
if (o instanceof Token) {
|
||||
tokens[i] = (Token) o;
|
||||
} else {
|
||||
tokens[i] = new Token(o.toString());
|
||||
}
|
||||
}
|
||||
|
||||
return tokens;
|
||||
}
|
||||
|
||||
public TopicAssert isValid() {
|
||||
Assertions.assertThat(actual.isValid()).isTrue();
|
||||
|
||||
return myself;
|
||||
}
|
||||
|
||||
public TopicAssert isInValid() {
|
||||
Assertions.assertThat(actual.isValid()).isFalse();
|
||||
|
||||
return myself;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ import java.util.concurrent.TimeUnit;
|
||||
import static io.netty.channel.ChannelFutureListener.CLOSE_ON_FAILURE;
|
||||
|
||||
/**
|
||||
* This class is used to have a fluent interface to interact with a server. Inspired by
|
||||
* This class is used to have a fluent interface to interact with a integration. Inspired by
|
||||
* org.kaazing.robot
|
||||
*/
|
||||
public final class RawClient {
|
||||
|
||||
Reference in New Issue
Block a user