You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2014/05/07 17:42:07 UTC

svn commit: r1593044 - in /sling/trunk/tooling/ide/eclipse-test: META-INF/MANIFEST.MF src/org/apache/sling/ide/test/impl/ConnectionTest.java src/org/apache/sling/ide/test/impl/SimpleServlet.java.txt src/org/apache/sling/ide/test/impl/SimpleServlet.xml

Author: rombert
Date: Wed May  7 15:42:07 2014
New Revision: 1593044

URL: http://svn.apache.org/r1593044
Log:
SLING-3544 - Integration tests running against a live Sling Launchpad
instance

Added a very rough version of a test which verified that a sling bundle
module, once deployed on the server, works as expected.

Added:
    sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.java.txt   (with props)
    sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.xml   (with props)
Modified:
    sling/trunk/tooling/ide/eclipse-test/META-INF/MANIFEST.MF
    sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ConnectionTest.java

Modified: sling/trunk/tooling/ide/eclipse-test/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-test/META-INF/MANIFEST.MF?rev=1593044&r1=1593043&r2=1593044&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-test/META-INF/MANIFEST.MF (original)
+++ sling/trunk/tooling/ide/eclipse-test/META-INF/MANIFEST.MF Wed May  7 15:42:07 2014
@@ -13,4 +13,8 @@ Require-Bundle: org.junit,
  org.apache.sling.ide.eclipse-core,
  org.eclipse.debug.core,
  org.apache.commons.httpclient,
- org.json
+ org.json,
+ org.eclipse.wst.common.project.facet.core,
+ org.eclipse.m2e.core,
+ org.eclipse.m2e.maven.runtime,
+ org.apache.commons.io

Modified: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ConnectionTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ConnectionTest.java?rev=1593044&r1=1593043&r2=1593044&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ConnectionTest.java (original)
+++ sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ConnectionTest.java Wed May  7 15:42:07 2014
@@ -16,17 +16,57 @@
  */
 package org.apache.sling.ide.test.impl;
 
+import static org.junit.Assert.assertThat;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.io.IOUtils;
+import org.apache.maven.artifact.Artifact;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.core.runtime.preferences.InstanceScope;
 import org.eclipse.debug.core.DebugPlugin;
 import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IServerWorkingCopy;
+import org.eclipse.wst.server.core.ServerUtil;
+import org.hamcrest.CoreMatchers;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TestRule;
 import org.osgi.service.prefs.BackingStoreException;
 
+// http://www.eclipse.org/forums/index.php/t/457988/
+// https://github.com/jbosstools/jbosstools-server/blob/master/as/tests/org.jboss.ide.eclipse.as.test/src/org/jboss/ide/eclipse/as/test/util/ServerRuntimeUtils.java
+// https://github.com/jbosstools/jbosstools-server/blob/master/as/tests/org.jboss.ide.eclipse.as.archives.integration.test/src/org/jboss/ide/eclipse/as/archives/integration/test/BuildDeployTest.java
+// https://stackoverflow.com/questions/6660155/eclipse-plugin-java-based-project-how-to
 public class ConnectionTest {
 
     private final SlingWstServer server = new SlingWstServer();
@@ -35,7 +75,7 @@ public class ConnectionTest {
     public TestRule chain = RuleChain.outerRule(new ExternalSlingLaunchpad()).around(server);
 
     @Test
-    public void deployBundleOnServer() throws CoreException, InterruptedException, BackingStoreException {
+    public void deployBundleOnServer() throws CoreException, InterruptedException, BackingStoreException, IOException {
 
         // prevent status prompts, since it can lead to the test Eclipse instance hanging
         // TODO - move to rule/utility class
@@ -44,5 +84,120 @@ public class ConnectionTest {
         debugPrefs.flush();
 
         server.waitForServerToStart();
+
+        // create faceted project
+        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+        IProject bundleProject = root.getProject("bundle0001");
+        bundleProject.create(new NullProgressMonitor());
+        bundleProject.open(new NullProgressMonitor());
+
+        IProjectDescription desc = bundleProject.getDescription();
+        String[] natures = desc.getNatureIds();
+        String[] newNatures = new String[natures.length + 2];
+        newNatures[newNatures.length - 2] = JavaCore.NATURE_ID;
+        newNatures[newNatures.length - 1] = "org.eclipse.wst.common.project.facet.core.nature";
+        desc.setNatureIds(newNatures);
+        bundleProject.setDescription(desc, new NullProgressMonitor());
+
+        // get dependency to required artifacts
+        Artifact slingApiJar = MavenPlugin.getMaven().resolve("org.apache.sling", "org.apache.sling.api", "2.2.0",
+                "jar", "", MavenPlugin.getMaven().getArtifactRepositories(), new NullProgressMonitor());
+        Artifact servletApiJar = MavenPlugin.getMaven().resolve("javax.servlet", "servlet-api", "2.4", "jar", "",
+                MavenPlugin.getMaven().getArtifactRepositories(), new NullProgressMonitor());
+
+        // create java project
+        IJavaProject javaProject = JavaCore.create(bundleProject);
+        Set<IClasspathEntry> entries = new HashSet<IClasspathEntry>();
+        entries.add(JavaRuntime.getDefaultJREContainerEntry());
+        entries.add(JavaCore.newLibraryEntry(Path.fromOSString(slingApiJar.getFile().getAbsolutePath()), null, null));
+        entries.add(JavaCore.newLibraryEntry(Path.fromOSString(servletApiJar.getFile().getAbsolutePath()), null, null));
+
+        IFolder src = bundleProject.getFolder("src");
+        src.create(true, true, new NullProgressMonitor());
+        entries.add(JavaCore.newSourceEntry(src.getFullPath()));
+
+        javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), new NullProgressMonitor());
+
+        IFolder bin = bundleProject.getFolder("bin");
+        if (!bin.exists()) { // TODO - not sure why this exists...
+            bin.create(true, true, new NullProgressMonitor());
+        }
+        javaProject.setOutputLocation(bin.getFullPath(), new NullProgressMonitor());
+
+        IFolder example = src.getFolder("example");
+        example.create(true, true, new NullProgressMonitor());
+        IFile servletFile = example.getFile("SimpleServlet.java");
+        InputStream simpleServlet = getClass().getResourceAsStream("SimpleServlet.java.txt");
+        try {
+            servletFile.create(simpleServlet, true, new NullProgressMonitor());
+        } finally {
+            IOUtils.closeQuietly(simpleServlet);
+            ;
+        }
+
+        IFolder osgiInf = src.getFolder("OSGI-INF");
+        osgiInf.create(true, true, new NullProgressMonitor());
+        
+        IFile servletDSDescriptor = osgiInf.getFile("SimpleServlet.xml");
+        InputStream servletDSDescriptorFile = getClass().getResourceAsStream("SimpleServlet.xml");
+        try {
+            servletDSDescriptor.create(servletDSDescriptorFile, true, new NullProgressMonitor());
+        } finally {
+            IOUtils.closeQuietly(servletDSDescriptorFile);
+        }
+
+        IFolder metaInf = src.getFolder("META-INF");
+        metaInf.create(true, true, new NullProgressMonitor());
+
+        IFile manifest = metaInf.getFile("MANIFEST.MF");
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Manifest m = new Manifest();
+        m.getMainAttributes().putValue(Attributes.Name.MANIFEST_VERSION.toString(), "1.0");
+        m.getMainAttributes().putValue("Bundle-ManifestVersion", "2");
+        m.getMainAttributes().putValue("Bundle-Name", "Test bundle");
+        m.getMainAttributes().putValue("Bundle-SymbolicName", "test.bundle001");
+        m.getMainAttributes().putValue("Bundle-Version", "1.0.0.SNAPSHOT");
+        m.getMainAttributes().putValue("Import-Package",
+                "javax.servlet,org.apache.sling.api,org.apache.sling.api.servlets");
+        m.getMainAttributes().putValue("Service-Component", "OSGI-INF/SimpleServlet.xml");
+        m.write(baos);
+
+        manifest.create(new ByteArrayInputStream(baos.toByteArray()), false, null);
+
+        // install bundle facet
+        IFacetedProject facetedProject = ProjectFacetsManager.create(bundleProject);
+        IProjectFacet slingBundleFacet = ProjectFacetsManager.getProjectFacet("sling.bundle");
+        IProjectFacetVersion projectFacetVersion = slingBundleFacet.getVersion("1.0");
+
+        facetedProject.installProjectFacet(projectFacetVersion, null, new NullProgressMonitor());
+
+        // deploy on server
+        IModule bundleModule = ServerUtil.getModule(bundleProject);
+        // TODO - why does this fail?
+        if (bundleModule == null) {
+            for (int i = 0; i < 5; i++) {
+                System.out.println("bundleModule is null!");
+                Thread.sleep(1000);
+                bundleModule = ServerUtil.getModule(bundleProject);
+                if (bundleModule != null) {
+                    break;
+                }
+            }
+        }
+
+        IServerWorkingCopy serverWorkingCopy = server.getServer().createWorkingCopy();
+        serverWorkingCopy.modifyModules(new IModule[] { bundleModule }, new IModule[0], new NullProgressMonitor());
+        serverWorkingCopy.save(false, new NullProgressMonitor());
+
+        System.out.println("You can inspect the project output " + bin.getLocation());
+
+        Thread.sleep(1000); // for good measure, make sure the output is there - TODO remove
+
+        HttpClient c = new HttpClient();
+        GetMethod gm = new GetMethod("http://localhost:" + LaunchpadUtils.getLaunchpadPort() + "/simple-servlet");
+        int status = c.executeMethod(gm);
+
+        assertThat(status, CoreMatchers.equalTo(200));
+        assertThat(gm.getResponseBodyAsString(), CoreMatchers.equalTo("Version 1"));
     }
 }

Added: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.java.txt
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.java.txt?rev=1593044&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.java.txt (added)
+++ sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.java.txt Wed May  7 15:42:07 2014
@@ -0,0 +1,18 @@
+package example;
+
+import java.io.*;
+import javax.servlet.*;
+import org.apache.sling.api.*;
+import org.apache.sling.api.servlets.*;
+
+public class SimpleServlet extends SlingSafeMethodsServlet {
+    
+    @Override
+    protected void doGet(SlingHttpServletRequest request,
+            SlingHttpServletResponse response) throws ServletException,
+            IOException {
+        
+        response.getWriter().write("Version 1");
+    }
+
+}
\ No newline at end of file

Propchange: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.java.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.xml
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.xml?rev=1593044&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.xml (added)
+++ sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.xml Wed May  7 15:42:07 2014
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+    <scr:component name="example.SimpleServlet">
+        <implementation class="example.SimpleServlet" />
+        <service servicefactory="false">
+            <provide interface="javax.servlet.Servlet" />
+        </service>
+        <property name="sling.servlet.paths">
+            /simple-servlet
+        </property>
+    </scr:component>
+</components>
\ No newline at end of file

Propchange: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/SimpleServlet.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml