diff --git a/.gitignore b/.gitignore
index 8a3e0c20..44342e67 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,7 +18,7 @@ broker/runner
/perf/target/
/mapdb_storage/target/
*~
-*log*
+*.log*
.DS_Store
.settings/
.project
diff --git a/broker/pom.xml b/broker/pom.xml
index 2e4d3e16..6d8ee53b 100644
--- a/broker/pom.xml
+++ b/broker/pom.xml
@@ -100,6 +100,12 @@
5.1.0
+
+ com.librato.metrics
+ librato-java
+ 2.1.0
+
+
com.bugsnag
bugsnag
@@ -176,6 +182,13 @@
test
+
+ org.awaitility
+ awaitility
+ 3.0.0
+ test
+
+
com.h2database
h2
@@ -241,6 +254,21 @@
+
+
+
+ io.moquette.persistence,
+ io.moquette.server.config,
+ io.moquette.spi,
+ io.moquette.spi.impl.subscriptions,
+
+
+ com.bugsnag;bugsnag,
+ com.librato.metrics;metrics-librato,
+ com.librato.metrics;librato-java,
+
+
+
diff --git a/broker/src/test/java/io/moquette/server/ServerIntegrationSSLClientAuthTest.java b/broker/src/test/java/io/moquette/server/ServerIntegrationSSLClientAuthTest.java
index 6314fc6d..7c6790c6 100644
--- a/broker/src/test/java/io/moquette/server/ServerIntegrationSSLClientAuthTest.java
+++ b/broker/src/test/java/io/moquette/server/ServerIntegrationSSLClientAuthTest.java
@@ -40,6 +40,7 @@ import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
import org.junit.After;
+import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -113,11 +114,21 @@ public class ServerIntegrationSSLClientAuthTest {
IMqttClient m_client;
MessageCollector m_callback;
+ static String backup;
@BeforeClass
public static void beforeTests() {
String tmpDir = System.getProperty("java.io.tmpdir");
s_dataStore = new MqttDefaultFilePersistence(tmpDir);
+ backup = System.getProperty("moquette.path");
+ }
+
+ @AfterClass
+ public static void afterTests() {
+ if (backup == null)
+ System.clearProperty("moquette.path");
+ else
+ System.setProperty("moquette.path", backup);
}
protected void startServer() throws IOException {
diff --git a/broker/src/test/java/io/moquette/server/ServerIntegrationSSLTest.java b/broker/src/test/java/io/moquette/server/ServerIntegrationSSLTest.java
index 4b81c2fd..2a19ee51 100644
--- a/broker/src/test/java/io/moquette/server/ServerIntegrationSSLTest.java
+++ b/broker/src/test/java/io/moquette/server/ServerIntegrationSSLTest.java
@@ -41,6 +41,7 @@ import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
import org.junit.After;
+import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -60,10 +61,21 @@ public class ServerIntegrationSSLTest {
IMqttClient m_client;
MessageCollector m_callback;
+ static String backup;
+
@BeforeClass
public static void beforeTests() {
String tmpDir = System.getProperty("java.io.tmpdir");
s_dataStore = new MqttDefaultFilePersistence(tmpDir);
+ backup = System.getProperty("moquette.path");
+ }
+
+ @AfterClass
+ public static void afterTests() {
+ if (backup == null)
+ System.clearProperty("moquette.path");
+ else
+ System.setProperty("moquette.path", backup);
}
protected void startServer() throws IOException {
diff --git a/broker/src/test/java/io/moquette/server/ServerLowlevelMessagesIntegrationTests.java b/broker/src/test/java/io/moquette/server/ServerLowlevelMessagesIntegrationTests.java
index 95b164db..1fe8de61 100644
--- a/broker/src/test/java/io/moquette/server/ServerLowlevelMessagesIntegrationTests.java
+++ b/broker/src/test/java/io/moquette/server/ServerLowlevelMessagesIntegrationTests.java
@@ -27,8 +27,11 @@ import org.junit.Before;
import org.junit.Test;
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.*;
import static org.junit.Assert.*;
@@ -81,10 +84,10 @@ public class ServerLowlevelMessagesIntegrationTests {
*/
m_client.sendMessage(connectMessage);
- // wait 2 times the keepAlive
- Thread.sleep(keepAlive * 2 * 1000);
-
- assertTrue(m_client.isConnectionLost());
+ // wait 3 times the keepAlive
+ Awaitility.await()
+ .atMost(3 * keepAlive, TimeUnit.SECONDS)
+ .until(m_client::isConnectionLost);
}
private static MqttConnectMessage createConnectMessage(String clientID, int keepAlive) {
@@ -109,14 +112,18 @@ public class ServerLowlevelMessagesIntegrationTests {
m_client.clientId("FAKECLNT").connect(willTestamentTopic, willTestamentMsg);
long connectTime = System.currentTimeMillis();
- // but after the 2 KEEP ALIVE timeout expires it gets fired,
- // NB it's 1,5 * KEEP_ALIVE so 3 secs and some millis to propagate the message
- org.eclipse.paho.client.mqttv3.MqttMessage msg = m_messageCollector.waitMessage(5);
- assertNotNull("the will message should be fired after keep alive!", msg);
- // the will message hasn't to be received before the elapsing of Keep Alive timeout
- assertTrue(System.currentTimeMillis() - connectTime > 3000);
+ Awaitility.await()
+ .atMost(7, TimeUnit.SECONDS)
+ .untilAsserted(() -> {
+ // but after the 2 KEEP ALIVE timeout expires it gets fired,
+ // NB it's 1,5 * KEEP_ALIVE so 3 secs and some millis to propagate the message
+ org.eclipse.paho.client.mqttv3.MqttMessage msg = m_messageCollector.getMessageImmediate();
+ assertNotNull("the will message should be fired after keep alive!", msg);
+ // the will message hasn't to be received before the elapsing of Keep Alive timeout
+ assertTrue(System.currentTimeMillis() - connectTime > 3000);
+ assertEquals(willTestamentMsg, new String(msg.getPayload(), StandardCharsets.UTF_8));
+ });
- assertEquals(willTestamentMsg, new String(msg.getPayload()));
m_willSubscriber.disconnect();
}
diff --git a/osgi_test/README.md b/osgi_test/README.md
new file mode 100644
index 00000000..2c6ff45d
--- /dev/null
+++ b/osgi_test/README.md
@@ -0,0 +1,5 @@
+# Development
+
+to run the osgi tests use:
+
+ mvn clean && mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V && mvn -B test -pl osgi_test
\ No newline at end of file
diff --git a/osgi_test/pom.xml b/osgi_test/pom.xml
index 6280260b..1c2da264 100644
--- a/osgi_test/pom.xml
+++ b/osgi_test/pom.xml
@@ -22,6 +22,37 @@
io.moquette
moquette-broker
${project.version}
+
+
+
+ io.moquette
+ moquette-h2-storage
+ ${project.version}
+
+
+
+ io.moquette
+ moquette-mapdb-storage
+ ${project.version}
+
+
+
+ javax.servlet
+ javax.servlet-api
+ 3.1.0
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.5
+ test
+
+
+
+ org.slf4j
+ slf4j-log4j12
+ 1.7.5
test
diff --git a/osgi_test/src/test/java/io/moquette/test/osgi/MoquetteOsgiTest.java b/osgi_test/src/test/java/io/moquette/test/osgi/MoquetteOsgiTest.java
index 48b01fb6..ad33f91d 100644
--- a/osgi_test/src/test/java/io/moquette/test/osgi/MoquetteOsgiTest.java
+++ b/osgi_test/src/test/java/io/moquette/test/osgi/MoquetteOsgiTest.java
@@ -18,7 +18,9 @@ package io.moquette.test.osgi;
import static org.junit.Assert.*;
import static org.ops4j.pax.exam.CoreOptions.*;
-
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Configuration;
@@ -26,7 +28,8 @@ import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
-
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.inject.Inject;
/**
@@ -35,6 +38,9 @@ import javax.inject.Inject;
*/
@RunWith(PaxExam.class)
public class MoquetteOsgiTest {
+
+ private static final Logger LOG = LoggerFactory.getLogger(MoquetteOsgiTest.class);
+
@Inject
private BundleContext bundleContext;
@@ -43,7 +49,42 @@ public class MoquetteOsgiTest {
return options(
junitBundles(),
- mavenBundle("io.moquette", "moquette-broker")
+
+ mavenBundle("com.google.guava", "guava").versionAsInProject(),
+ //mavenBundle("com.google.code.findbugs", "jsr305").versionAsInProject(),
+
+ mavenBundle("com.fasterxml.jackson.core", "jackson-core").versionAsInProject().start(),
+ mavenBundle("com.fasterxml.jackson.core", "jackson-databind").versionAsInProject(),
+ mavenBundle("com.fasterxml.jackson.core", "jackson-annotations").versionAsInProject(),
+ //mavenBundle("com.librato.metrics", "librato-java").versionAsInProject(),
+ //mavenBundle("com.librato.metrics", "metrics-librato").versionAsInProject(),
+ mavenBundle("io.dropwizard.metrics", "metrics-core").versionAsInProject(),
+ mavenBundle("io.dropwizard.metrics", "metrics-jvm").versionAsInProject(),
+ mavenBundle("com.hazelcast", "hazelcast").versionAsInProject(),
+
+ mavenBundle("io.netty", "netty-common").versionAsInProject(),
+ mavenBundle("io.netty", "netty-buffer").versionAsInProject(),
+ mavenBundle("io.netty", "netty-transport").versionAsInProject(),
+ mavenBundle("io.netty", "netty-resolver").versionAsInProject(),
+ mavenBundle("io.netty", "netty-handler").versionAsInProject(),
+ mavenBundle("io.netty", "netty-handler").versionAsInProject(),
+ mavenBundle("io.netty", "netty-codec").versionAsInProject(),
+ mavenBundle("io.netty", "netty-codec-http").versionAsInProject(),
+ mavenBundle("io.netty", "netty-codec-mqtt").versionAsInProject(),
+ mavenBundle("io.netty", "netty-transport-native-epoll").versionAsInProject(),
+ mavenBundle("io.netty", "netty-transport-native-unix-common").versionAsInProject(),
+
+ mavenBundle("commons-codec", "commons-codec").versionAsInProject(),
+
+ mavenBundle("javax.servlet", "javax.servlet-api").versionAsInProject(),
+
+ mavenBundle("io.moquette", "moquette-broker").versionAsInProject(),
+
+ mavenBundle("com.h2database", "h2-mvstore").versionAsInProject(),
+ mavenBundle("io.moquette", "moquette-h2-storage").versionAsInProject(),
+
+ mavenBundle("org.mapdb", "mapdb").versionAsInProject(),
+ mavenBundle("io.moquette", "moquette-mapdb-storage").versionAsInProject()
);
}
@@ -55,15 +96,23 @@ public class MoquetteOsgiTest {
*/
@Test
public void testCanFindOsgiBundle() throws Exception {
+ List list = new LinkedList<>(Arrays.asList("io.moquette.broker", "io.moquette.h2-storage",
+ "io.moquette.mapdb-storage"));
+
+ List inactive = new LinkedList<>();
+
for (Bundle b : bundleContext.getBundles()) {
String symbolicName = b.getSymbolicName();
- System.out.format("%s %d\n", symbolicName, b.getState());
- if (symbolicName != null && symbolicName.indexOf("moquette") != -1) {
- return;
+ LOG.info("{} {}", symbolicName, b.getState());
+ System.out.println("" + symbolicName);
+ if (symbolicName != null) {
+ list.remove(symbolicName);
+ if (b.getState() != Bundle.ACTIVE)
+ inactive.add(symbolicName);
}
}
- // If found no bundles with moquette in the name, fail the test.
- fail();
+ if (!inactive.isEmpty() || !list.isEmpty())
+ fail("This osgi bundles are missing: " + list + " this osgi packages are NOT active" + inactive);
}
}
diff --git a/osgi_test/src/test/resources/log4j.properties b/osgi_test/src/test/resources/log4j.properties
new file mode 100644
index 00000000..78456a64
--- /dev/null
+++ b/osgi_test/src/test/resources/log4j.properties
@@ -0,0 +1,12 @@
+# Set root logger level to DEBUG and its only appender to A1.
+log4j.rootLogger=ERROR, stdout
+
+log4j.logger.io.moquette=DEBUG
+
+# stdout appender is set to be a ConsoleAppender.
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Threshold=DEBUG
+# for debug trace
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+#log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n
+log4j.appender.stdout.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} [%t] %-5p %c{1} %M %L %x - %m%n