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