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 2019/07/04 10:05:25 UTC

[sling-whiteboard] 02/04: Using Sling OSGi mocks

This is an automated email from the ASF dual-hosted git repository.

bdelacretaz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git

commit 051fd4fbd4446c5ca8cec20b7c242557ef092096
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jul 4 11:57:46 2019 +0200

    Using Sling OSGi mocks
---
 graalvm/README.md                                  | 23 ++++++++++++++
 graalvm/pom.xml                                    | 35 +++++++++++++++++++++-
 graalvm/src/main/docker/Dockerfile.jvm             |  4 +--
 graalvm/src/main/docker/Dockerfile.native          |  4 +--
 .../java/org/apache/sling/graalvm/MsgProvider.java |  5 ++++
 .../org/apache/sling/graalvm/MsgProviderImpl.java  | 17 +++++++++++
 .../org/apache/sling/graalvm/SlingResource.java    | 29 ++++++++++++++++++
 .../main/resources/META-INF/resources/index.html   |  4 +--
 .../sling/graalvm/NativeSlingResourceIT.java       |  8 +++++
 .../apache/sling/graalvm/SlingResourceTest.java    | 21 +++++++++++++
 10 files changed, 143 insertions(+), 7 deletions(-)

diff --git a/graalvm/README.md b/graalvm/README.md
index bec2eb0..e9bf7ff 100644
--- a/graalvm/README.md
+++ b/graalvm/README.md
@@ -1,2 +1,25 @@
 # sling-graalvm
 Experimenting with GraalVM to run Apache Sling modules
+
+To build and run the native version, setup GraalVM to get something like this:
+
+    java -version
+    openjdk version "1.8.0_212"
+    OpenJDK Runtime Environment (build 1.8.0_212-20190523183630.graal2.jdk8u-src-tar-gz-b03)
+    OpenJDK 64-Bit GraalVM CE 19.0.2 (build 25.212-b03-jvmci-19-b04, mixed mode)
+
+Then build with 
+
+    export GRAALVM_HOME=$JAVA_HOME
+    mvn clean install -Pnative
+    
+And run with
+
+    ./target/org.apache.sling.graalvm.experiments-1.0-SNAPSHOT-runner
+    
+At which point the `/hello` path works:
+
+    curl http://localhost:8080/hello
+    Hello, at Mon Jul 01 17:38:00 CEST 2019
+
+To run as a Docker container see `src/main/docker/Dockerfile.native`
\ No newline at end of file
diff --git a/graalvm/pom.xml b/graalvm/pom.xml
index 3146161..23f1270 100644
--- a/graalvm/pom.xml
+++ b/graalvm/pom.xml
@@ -3,7 +3,8 @@
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.sling</groupId>
-  <artifactId>org.apache.sling.serverless.osgimocks</artifactId>
+  <artifactId>org.apache.sling.graalvm.experiments</artifactId>
+  <description>Experiment with GraalVM for running Sling modules as native code</description>
   <version>1.0-SNAPSHOT</version>
   <properties>
     <surefire-plugin.version>2.22.0</surefire-plugin.version>
@@ -39,10 +40,42 @@
       <artifactId>rest-assured</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.testing.osgi-mock.junit5</artifactId>
+      <version>2.4.8</version>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <version>6.0.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
+      <version>5.0.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+      <version>1.3.0</version>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
       <plugin>
+        <groupId>biz.aQute.bnd</groupId>
+        <artifactId>bnd-maven-plugin</artifactId>
+        <version>4.2.0</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>bnd-process</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <groupId>io.quarkus</groupId>
         <artifactId>quarkus-maven-plugin</artifactId>
         <version>${quarkus.version}</version>
diff --git a/graalvm/src/main/docker/Dockerfile.jvm b/graalvm/src/main/docker/Dockerfile.jvm
index 9aee95d..c5eec53 100644
--- a/graalvm/src/main/docker/Dockerfile.jvm
+++ b/graalvm/src/main/docker/Dockerfile.jvm
@@ -7,11 +7,11 @@
 #
 # Then, build the image with:
 #
-# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/org.apache.sling.serverless.osgimocks-jvm .
+# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/org.apache.sling.graalvm.experiments-jvm .
 #
 # Then run the container using:
 #
-# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.serverless.osgimocks-jvm
+# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.graalvm.experiments-jvm
 #
 ###
 FROM fabric8/java-alpine-openjdk8-jre
diff --git a/graalvm/src/main/docker/Dockerfile.native b/graalvm/src/main/docker/Dockerfile.native
index cac18ad..4ec89c4 100644
--- a/graalvm/src/main/docker/Dockerfile.native
+++ b/graalvm/src/main/docker/Dockerfile.native
@@ -7,11 +7,11 @@
 #
 # Then, build the image with:
 #
-# docker build -f src/main/docker/Dockerfile.native -t quarkus/org.apache.sling.serverless.osgimocks .
+# docker build -f src/main/docker/Dockerfile.native -t quarkus/org.apache.sling.graalvm.experiments .
 #
 # Then run the container using:
 #
-# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.serverless.osgimocks
+# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.graalvm.experiments
 #
 ###
 FROM registry.access.redhat.com/ubi8/ubi-minimal
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/MsgProvider.java b/graalvm/src/main/java/org/apache/sling/graalvm/MsgProvider.java
new file mode 100644
index 0000000..bac6c06
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/MsgProvider.java
@@ -0,0 +1,5 @@
+package org.apache.sling.graalvm;
+
+public interface MsgProvider {
+    String getMsg();
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/MsgProviderImpl.java b/graalvm/src/main/java/org/apache/sling/graalvm/MsgProviderImpl.java
new file mode 100644
index 0000000..d2c2ec5
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/MsgProviderImpl.java
@@ -0,0 +1,17 @@
+package org.apache.sling.graalvm;
+
+import org.osgi.service.component.annotations.Component;
+import java.util.Date;
+
+@Component(service=MsgProvider.class)
+public class MsgProviderImpl implements MsgProvider {
+    private final String msg;
+
+    MsgProviderImpl(String msg) {
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return msg + ", at " + new Date();
+    }
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/SlingResource.java b/graalvm/src/main/java/org/apache/sling/graalvm/SlingResource.java
new file mode 100644
index 0000000..c652dbf
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/SlingResource.java
@@ -0,0 +1,29 @@
+package org.apache.sling.graalvm;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.sling.testing.mock.osgi.junit5.OsgiContext;
+
+@Path("/sling")
+public class SlingResource {
+
+    private String getMessage() {
+        // Yes this is funky, the goal is to verify that
+        // the Sling OSGi mocks context works in a
+        // native executable
+        final OsgiContext ctx = new OsgiContext();
+        ctx.registerInjectActivateService(new MsgProviderImpl("Hello"));
+        final MsgProvider svc = ctx.getService(MsgProvider.class);
+        return svc.getMsg();
+    }
+
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String hello() {
+        final String msg = getMessage();
+        return msg;
+    }
+}
\ No newline at end of file
diff --git a/graalvm/src/main/resources/META-INF/resources/index.html b/graalvm/src/main/resources/META-INF/resources/index.html
index 60a4320..75f0700 100644
--- a/graalvm/src/main/resources/META-INF/resources/index.html
+++ b/graalvm/src/main/resources/META-INF/resources/index.html
@@ -2,7 +2,7 @@
 <html lang="en">
 <head>
     <meta charset="UTF-8">
-    <title>org.apache.sling.serverless.osgimocks - 1.0-SNAPSHOT</title>
+    <title>org.apache.sling.graalvm.experiments - 1.0-SNAPSHOT</title>
     <style>
         h1, h2, h3, h4, h5, h6 {
             margin-bottom: 0.5rem;
@@ -131,7 +131,7 @@
             <h3>Application</h3>
             <ul>
                 <li>GroupId: org.apache.sling</li>
-                <li>ArtifactId: org.apache.sling.serverless.osgimocks</li>
+                <li>ArtifactId: org.apache.sling.graalvm.experiments</li>
                 <li>Version: 1.0-SNAPSHOT</li>
                 <li>Quarkus Version: 0.18.0</li>
             </ul>
diff --git a/graalvm/src/test/java/org/apache/sling/graalvm/NativeSlingResourceIT.java b/graalvm/src/test/java/org/apache/sling/graalvm/NativeSlingResourceIT.java
new file mode 100644
index 0000000..d88ff6c
--- /dev/null
+++ b/graalvm/src/test/java/org/apache/sling/graalvm/NativeSlingResourceIT.java
@@ -0,0 +1,8 @@
+package org.apache.sling.graalvm;
+
+import io.quarkus.test.junit.SubstrateTest;
+
+@SubstrateTest
+public class NativeSlingResourceIT extends SlingResourceTest {
+    // Execute the same tests but in native mode.
+}
\ No newline at end of file
diff --git a/graalvm/src/test/java/org/apache/sling/graalvm/SlingResourceTest.java b/graalvm/src/test/java/org/apache/sling/graalvm/SlingResourceTest.java
new file mode 100644
index 0000000..91a0f13
--- /dev/null
+++ b/graalvm/src/test/java/org/apache/sling/graalvm/SlingResourceTest.java
@@ -0,0 +1,21 @@
+package org.apache.sling.graalvm;
+
+import io.quarkus.test.junit.QuarkusTest;
+import org.junit.jupiter.api.Test;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.CoreMatchers.containsString;
+
+@QuarkusTest
+public class SlingResourceTest {
+
+    @Test
+    public void testHelloEndpoint() {
+        given()
+          .when().get("/sling")
+          .then()
+             .statusCode(200)
+             .body(containsString("Hello, at"));
+    }
+
+}
\ No newline at end of file