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,