You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2015/12/29 14:40:58 UTC
svn commit: r1722129 - in /sling/trunk/contrib/crankstart/launcher: ./
src/main/java/org/apache/sling/crankstart/junit/
src/test/java/org/apache/sling/crankstart/launcher/
Author: bdelacretaz
Date: Tue Dec 29 13:40:58 2015
New Revision: 1722129
URL: http://svn.apache.org/viewvc?rev=1722129&view=rev
Log:
SLING-4728 - use a JUnit ClassRule for integration tests
Added:
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/
sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java
Removed:
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/CrankstartSetup.java
Modified:
sling/trunk/contrib/crankstart/launcher/pom.xml
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java
sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/U.java
Modified: sling/trunk/contrib/crankstart/launcher/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/pom.xml?rev=1722129&r1=1722128&r2=1722129&view=diff
==============================================================================
--- sling/trunk/contrib/crankstart/launcher/pom.xml (original)
+++ sling/trunk/contrib/crankstart/launcher/pom.xml Tue Dec 29 13:40:58 2015
@@ -154,8 +154,8 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
- <version>4.11</version>
- <scope>test</scope>
+ <version>4.12</version>
+ <scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
@@ -193,7 +193,7 @@
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.1</version>
- <scope>test</scope>
+ <scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
Added: sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java?rev=1722129&view=auto
==============================================================================
--- sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java (added)
+++ sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java Tue Dec 29 13:40:58 2015
@@ -0,0 +1,165 @@
+package org.apache.sling.crankstart.junit;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.ServerSocket;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.sling.crankstart.launcher.Launcher;
+import org.junit.rules.ExternalResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** Setup a Crankstart-launched instance for our tests */
+public class CrankstartSetup extends ExternalResource {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ private final int port = getAvailablePort();
+ private final String storagePath = getOsgiStoragePath();
+ private Thread crankstartThread;
+ private final String baseUrl = "http://localhost:" + port;
+
+ private static List<CrankstartSetup> toCleanup = new ArrayList<CrankstartSetup>();
+
+ private String [] modelPaths;
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + ", port " + port + ", OSGi storage " + storagePath;
+ }
+
+ public CrankstartSetup withModels(String ... modelPaths) {
+ this.modelPaths = modelPaths;
+ return this;
+ }
+
+ private static int getAvailablePort() {
+ int result = -1;
+ ServerSocket s = null;
+ try {
+ try {
+ s = new ServerSocket(0);
+ result = s.getLocalPort();
+ } finally {
+ if(s != null) {
+ s.close();
+ }
+ }
+ } catch(Exception e) {
+ throw new RuntimeException("getAvailablePort failed", e);
+ }
+ return result;
+ }
+
+ private static void mergeModelResource(Launcher launcher, String path) throws Exception {
+ final InputStream is = CrankstartSetup.class.getResourceAsStream(path);
+ assertNotNull("Expecting test resource to be found:" + path, is);
+ final Reader input = new InputStreamReader(is);
+ try {
+ Launcher.mergeModel(launcher.getModel(), input, path);
+ launcher.computeEffectiveModel();
+ } finally {
+ input.close();
+ }
+ }
+
+ public String getBaseUrl() {
+ return baseUrl;
+ }
+
+ @Override
+ protected void before() throws Throwable {
+ setup();
+ }
+
+ public synchronized void setup() throws Exception {
+ if(crankstartThread != null) {
+ return;
+ }
+
+ synchronized (toCleanup) {
+ if(!toCleanup.isEmpty()) {
+ log.info("Stopping other Crankstart instances before starting this one...");
+ }
+ for(CrankstartSetup s : toCleanup) {
+ s.stopCrankstartInstance();
+ }
+ toCleanup.clear();
+ }
+
+ log.info("Starting {}", this);
+
+ final HttpUriRequest get = new HttpGet(baseUrl);
+ System.setProperty("crankstart.model.http.port", String.valueOf(port));
+ System.setProperty("crankstart.model.osgi.storage.path", storagePath);
+
+ try {
+ new DefaultHttpClient().execute(get);
+ fail("Expecting connection to " + port + " to fail before starting HTTP service");
+ } catch(IOException expected) {
+ }
+
+ final Launcher launcher = new Launcher();
+ for(String path : modelPaths) {
+ mergeModelResource(launcher, path);
+ }
+ launcher.computeEffectiveModel();
+
+ crankstartThread = new Thread() {
+ public void run() {
+ try {
+ launcher.launch();
+ } catch(InterruptedException e) {
+ log.info("Launcher thread was interrupted, exiting");
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("Launcher exception:" + e);
+ }
+ }
+ };
+ crankstartThread.setDaemon(true);
+ crankstartThread.start();
+
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ @Override
+ public void run() {
+ stopCrankstartInstance();
+ }
+ });
+ }
+
+ private void stopCrankstartInstance() {
+ log.info("Stopping {}", this);
+ if(crankstartThread == null) {
+ return;
+ }
+ crankstartThread.interrupt();
+ try {
+ crankstartThread.join();
+ } catch(InterruptedException ignore) {
+ }
+ crankstartThread = null;
+ }
+
+ private static String getOsgiStoragePath() {
+ final File tmpRoot = new File(System.getProperty("java.io.tmpdir"));
+ final Random random = new Random();
+ final File tmpFolder = new File(tmpRoot, System.currentTimeMillis() + "_" + random.nextInt());
+ if(!tmpFolder.mkdir()) {
+ fail("Failed to create " + tmpFolder.getAbsolutePath());
+ }
+ tmpFolder.deleteOnExit();
+ return tmpFolder.getAbsolutePath();
+ }
+}
\ No newline at end of file
Modified: sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java?rev=1722129&r1=1722128&r2=1722129&view=diff
==============================================================================
--- sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java (original)
+++ sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/BasicLauncherIT.java Tue Dec 29 13:40:58 2015
@@ -14,9 +14,11 @@ import org.apache.sling.commons.json.JSO
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.commons.testing.junit.Retry;
import org.apache.sling.commons.testing.junit.RetryRule;
+import org.apache.sling.crankstart.junit.CrankstartSetup;
import org.apache.sling.testing.tools.osgi.WebconsoleClient;
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
@@ -26,7 +28,9 @@ import org.junit.Test;
*/
public class BasicLauncherIT {
- private static CrankstartSetup C;
+ @ClassRule
+ public static CrankstartSetup C = new CrankstartSetup().withModels(U.DEFAULT_MODELS);
+
private DefaultHttpClient client;
private static WebconsoleClient osgiConsole;
@@ -35,8 +39,6 @@ public class BasicLauncherIT {
@BeforeClass
public static void setupClass() throws Exception {
- C = new CrankstartSetup();
- C.setup();
osgiConsole = new WebconsoleClient(C.getBaseUrl(), U.ADMIN, U.ADMIN);
}
Modified: sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java?rev=1722129&r1=1722128&r2=1722129&view=diff
==============================================================================
--- sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java (original)
+++ sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeAIT.java Tue Dec 29 13:40:58 2015
@@ -7,18 +7,22 @@ import java.io.IOException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.sling.commons.testing.junit.Retry;
import org.apache.sling.commons.testing.junit.RetryRule;
+import org.apache.sling.crankstart.junit.CrankstartSetup;
import org.apache.sling.testing.tools.osgi.WebconsoleClient;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
/** Test our run modes support */
public class RunModeAIT {
- private static CrankstartSetup C = new CrankstartSetup();
- private static WebconsoleClient osgiConsole;
+ @ClassRule
+ public static CrankstartSetup C = new CrankstartSetup().withModels(U.DEFAULT_MODELS);
+
+ private WebconsoleClient osgiConsole;
private DefaultHttpClient client;
private static final String RUN_MODES = "foo,bar,A";
@@ -28,12 +32,11 @@ public class RunModeAIT {
@BeforeClass
public static void setupClass() throws Exception {
System.setProperty(RunModeFilter.SLING_RUN_MODES, RUN_MODES);
- C.setup();
- osgiConsole = new WebconsoleClient(C.getBaseUrl(), U.ADMIN, U.ADMIN);
}
@Before
public void setup() throws IOException {
+ osgiConsole = new WebconsoleClient(C.getBaseUrl(), U.ADMIN, U.ADMIN);
client = new DefaultHttpClient();
}
Modified: sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java?rev=1722129&r1=1722128&r2=1722129&view=diff
==============================================================================
--- sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java (original)
+++ sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/RunModeBIT.java Tue Dec 29 13:40:58 2015
@@ -7,18 +7,22 @@ import java.io.IOException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.sling.commons.testing.junit.Retry;
import org.apache.sling.commons.testing.junit.RetryRule;
+import org.apache.sling.crankstart.junit.CrankstartSetup;
import org.apache.sling.testing.tools.osgi.WebconsoleClient;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
/** Test our run modes support */
public class RunModeBIT {
- private static CrankstartSetup C = new CrankstartSetup();
- private static WebconsoleClient osgiConsole;
+ @ClassRule
+ public static CrankstartSetup C = new CrankstartSetup().withModels(U.DEFAULT_MODELS);
+
+ private WebconsoleClient osgiConsole;
private DefaultHttpClient client;
private static final String RUN_MODES = "bala,B,laika,another";
@@ -28,12 +32,11 @@ public class RunModeBIT {
@BeforeClass
public static void setupClass() throws Exception {
System.setProperty(RunModeFilter.SLING_RUN_MODES, RUN_MODES);
- C.setup();
- osgiConsole = new WebconsoleClient(C.getBaseUrl(), U.ADMIN, U.ADMIN);
}
@Before
public void setup() throws IOException {
+ osgiConsole = new WebconsoleClient(C.getBaseUrl(), U.ADMIN, U.ADMIN);
client = new DefaultHttpClient();
}
Modified: sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/U.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/U.java?rev=1722129&r1=1722128&r2=1722129&view=diff
==============================================================================
--- sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/U.java (original)
+++ sling/trunk/contrib/crankstart/launcher/src/test/java/org/apache/sling/crankstart/launcher/U.java Tue Dec 29 13:40:58 2015
@@ -16,6 +16,7 @@ import org.apache.http.impl.client.Defau
import org.apache.http.util.EntityUtils;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
+import org.apache.sling.crankstart.junit.CrankstartSetup;
import org.apache.sling.testing.tools.http.RequestBuilder;
import org.apache.sling.testing.tools.http.RequestExecutor;
@@ -28,6 +29,14 @@ public class U {
public static final int STD_INTERVAL = 250;
public static final String SLING_API_BUNDLE = "org.apache.sling.api";
+ static final String [] DEFAULT_MODELS = {
+ "/crankstart-model.txt",
+ "/provisioning-model/base.txt",
+ "/provisioning-model/sling-extensions.txt",
+ "/provisioning-model/start-level-99.txt",
+ "/provisioning-model/crankstart-tests.txt"
+ };
+
static void setAdminCredentials(DefaultHttpClient c) {
c.getCredentialsProvider().setCredentials(
AuthScope.ANY,