diff --git a/broker/pom.xml b/broker/pom.xml index 1b0ee69d..14635ee8 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -49,6 +49,12 @@ hawtdb 1.6 + + + org.fusesource.hawtbuf + hawtbuf + 1.9 + junit @@ -64,11 +70,19 @@ 1.9.0 test + + + org.fusesource.mqtt-client + mqtt-client + 1.5 + test + org.eclipse.paho mqtt-client 0.4.0 + test diff --git a/broker/src/test/java/org/dna/mqtt/moquette/server/ServerIntegrationFuseTest.java b/broker/src/test/java/org/dna/mqtt/moquette/server/ServerIntegrationFuseTest.java new file mode 100644 index 00000000..f6231a0d --- /dev/null +++ b/broker/src/test/java/org/dna/mqtt/moquette/server/ServerIntegrationFuseTest.java @@ -0,0 +1,108 @@ +package org.dna.mqtt.moquette.server; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import org.fusesource.mqtt.client.BlockingConnection; +import org.fusesource.mqtt.client.MQTT; +import org.fusesource.mqtt.client.QoS; +import org.fusesource.mqtt.client.Topic; +import org.fusesource.mqtt.client.Message; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author andrea + */ +public class ServerIntegrationFuseTest { + private static final Logger LOG = LoggerFactory.getLogger(ServerIntegrationPahoTest.class); + + Server m_server; + MQTT m_mqtt; + +//mqtt.setHost("test.mosquitto.org", 1883); + + + protected void startServer() throws IOException { + m_server = new Server(); + m_server.startServer(); + } + + @Before + public void setUp() throws Exception { + startServer(); + + m_mqtt = new MQTT(); + m_mqtt.setHost("localhost", 1883); + } + + @After + public void tearDown() throws Exception { +// if (m_mqtt.isConnected()) { +// m_mqtt.disconnect(); +// } + + m_server.stopServer(); + File dbFile = new File(Server.STORAGE_FILE_PATH); + if (dbFile.exists()) { + dbFile.delete(); + } + } + + @Test + public void checkReplayofStoredPublishResumeAfter_a_disconnect_cleanSessionFalseQoS1() throws Exception { + LOG.info("*** checkReplayofStoredPublishResumeAfter_a_disconnect_cleanSessionFalseQoS1 ***"); + MQTT mqtt = new MQTT(); + mqtt.setHost("localhost", 1883); + mqtt.setClientId("Publisher"); + BlockingConnection publisher = mqtt.blockingConnection(); + publisher.connect(); + + m_mqtt.setHost("localhost", 1883); + m_mqtt.setCleanSession(false); + m_mqtt.setClientId("Subscriber"); + BlockingConnection subscriber = m_mqtt.blockingConnection(); + subscriber.connect(); + Topic[] topics = new Topic[]{new Topic("/topic", QoS.AT_LEAST_ONCE)}; + byte[] qoses = subscriber.subscribe(topics); + + //force the publisher to send + publisher.publish("/topic", "Hello world MQTT!!-1".getBytes(), QoS.AT_LEAST_ONCE, false); + + //read the first message and drop the connection + Message msg = subscriber.receive(); + msg.ack(); + assertEquals("Hello world MQTT!!-1", new String(msg.getPayload())); + subscriber.disconnect(); + + publisher.publish("/topic", "Hello world MQTT!!-2".getBytes(), QoS.AT_LEAST_ONCE, false); + publisher.publish("/topic", "Hello world MQTT!!-3".getBytes(), QoS.AT_LEAST_ONCE, false); + + //reconnect and expect to receive the hello 2 message + subscriber = m_mqtt.blockingConnection(); + subscriber.connect(); + topics = new Topic[]{new Topic("/topic", QoS.AT_LEAST_ONCE)}; + qoses = subscriber.subscribe(topics); + msg = subscriber.receive(); + msg.ack(); + assertEquals("Hello world MQTT!!-2", new String(msg.getPayload())); + subscriber.disconnect(); + + subscriber = m_mqtt.blockingConnection(); + subscriber.connect(); + topics = new Topic[]{new Topic("/topic", QoS.AT_LEAST_ONCE)}; + qoses = subscriber.subscribe(topics); + msg = subscriber.receive(); + assertEquals("Hello world MQTT!!-3", new String(msg.getPayload())); + msg.ack(); + //TODO check topic and content + subscriber.disconnect(); + } +} diff --git a/broker/src/test/java/org/dna/mqtt/moquette/server/ServerIntegrationPahoTest.java b/broker/src/test/java/org/dna/mqtt/moquette/server/ServerIntegrationPahoTest.java index fc971ac6..5d857d07 100644 --- a/broker/src/test/java/org/dna/mqtt/moquette/server/ServerIntegrationPahoTest.java +++ b/broker/src/test/java/org/dna/mqtt/moquette/server/ServerIntegrationPahoTest.java @@ -334,7 +334,7 @@ public class ServerIntegrationPahoTest { m_client.subscribe("/topic", 2); m_client.disconnect(); - //publish a QoS 1 message another client publish a message on the topic + //publish a QoS 2 message another client publish a message on the topic publishFromAnotherClient("/topic", "Hello MQTT".getBytes(), 2); m_callback.reinit(); m_client.connect(options); @@ -343,7 +343,34 @@ public class ServerIntegrationPahoTest { assertNotNull(m_callback.getMessage()); assertEquals("Hello MQTT", m_callback.getMessage().toString()); } - + + @Test + public void avoidMultipleNotificationsAfterMultipleReconnection_cleanSessionFalseQoS1() throws Exception { + LOG.info("*** avoidMultipleNotificationsAfterMultipleReconnection_cleanSessionFalseQoS1, issue #16 ***"); + MqttConnectOptions options = new MqttConnectOptions(); + options.setCleanSession(false); + m_client.connect(options); + m_client.subscribe("/topic", 1); + m_client.disconnect(); + + publishFromAnotherClient("/topic", "Hello MQTT 1".getBytes(), 1); + m_callback.reinit(); + m_client.connect(options); + + assertNotNull(m_callback); + assertNotNull(m_callback.getMessage()); + assertEquals("Hello MQTT 1", m_callback.getMessage().toString()); + m_client.disconnect(); + + //publish other message + publishFromAnotherClient("/topic", "Hello MQTT 2".getBytes(), 1); + + //reconnect the second time + m_callback.reinit(); + m_client.connect(options); + assertNotNull(m_callback); + assertNotNull(m_callback.getMessage()); + assertEquals("Hello MQTT 2", m_callback.getMessage().toString()); + } } -