Repository: tomee
Updated Branches:
  refs/heads/master 426e0c14f -> ea13f63f2


Added tests to ServletContext not accessible during JAX-RS app deployment.


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/ea13f63f
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/ea13f63f
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/ea13f63f

Branch: refs/heads/master
Commit: ea13f63f21d7f06388e2c54d70120a5a98e4c65f
Parents: 426e0c1
Author: Roberto Cortez <radcor...@yahoo.com>
Authored: Fri Oct 5 23:26:39 2018 +0100
Committer: Roberto Cortez <radcor...@yahoo.com>
Committed: Fri Oct 5 23:26:39 2018 +0100

----------------------------------------------------------------------
 .../embedded/ServletContextInjectionTest.java   | 230 +++++++++++++++++++
 1 file changed, 230 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/ea13f63f/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ServletContextInjectionTest.java
----------------------------------------------------------------------
diff --git 
a/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ServletContextInjectionTest.java
 
b/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ServletContextInjectionTest.java
new file mode 100644
index 0000000..a60c7f1
--- /dev/null
+++ 
b/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ServletContextInjectionTest.java
@@ -0,0 +1,230 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomee.embedded;
+
+import org.apache.openejb.loader.Files;
+import org.apache.openejb.loader.IO;
+import org.apache.openejb.loader.JarLocation;
+import org.apache.openejb.util.NetworkUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.CDI;
+import javax.inject.Inject;
+import javax.servlet.ServletContext;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class ServletContextInjectionTest {
+    @Provider
+    @ApplicationScoped
+    public static class Filter implements ContainerRequestFilter {
+        @Override
+        public void filter(final ContainerRequestContext requestContext) 
throws IOException {
+
+        }
+
+        @Context
+        public void setApplication(final Application application) {
+            final Instance<Loader> loader = CDI.current().select(Loader.class);
+            if (!loader.isUnsatisfied()) {
+                loader.iterator().next().useServletContext();
+            }
+        }
+    }
+
+    @ApplicationScoped
+    public static class Loader {
+        @Inject
+        private ServletContext servletContext;
+
+        public void useServletContext() {
+            servletContext.getResourceAsStream("/null");
+        }
+    }
+
+    @Path("path")
+    public static class Resource {
+        @GET
+        public Response get() {
+            return Response.ok("ok").build();
+        }
+    }
+
+    @Test
+    public void testWebApp() {
+        try {
+            final Container container = new Container(
+                    new Configuration()
+                            .http(NetworkUtil.getNextAvailablePort())
+                            .property("openejb.container.additional.exclude", 
"org.apache.tomee.embedded.")
+                            .property("openejb.additional.include", "tomee-"))
+                    
.deployPathsAsWebapp(JarLocation.jarLocation(Resource.class));
+
+            assertEquals("ok", IO.slurp(
+                    new URL("http://localhost:"; + 
container.getConfiguration().getHttpPort() + "/api/path")));
+        } catch (final Exception e) {
+            Assert.fail();
+        }
+    }
+
+    @Test
+    public void testEar() throws Exception {
+        final Map<String, Object> loaderContents = new HashMap<String, 
Object>();
+        loaderContents.put("WEB-INF/web.xml", 
"<web-app><module-name>loader</module-name></web-app>");
+        loaderContents.put("WEB-INF/classes/" + 
Resource.class.getName().replace('.', File.separatorChar) + ".class", 
Resource.class);
+        loaderContents.put("WEB-INF/classes/" + 
Filter.class.getName().replace('.', File.separatorChar) + ".class", 
Filter.class);
+        loaderContents.put("WEB-INF/classes/" + 
Loader.class.getName().replace('.', File.separatorChar) + ".class", 
Loader.class);
+        final File loaderApp = jarArchive(loaderContents, "loader");
+
+        final Map<String, Object> webAppContents = new HashMap<String, 
Object>();
+        webAppContents.put("WEB-INF/web.xml", 
"<web-app><module-name>webapp</module-name></web-app>");
+        webAppContents.put("WEB-INF/classes/" + 
Resource.class.getName().replace('.', File.separatorChar) + ".class", 
Resource.class);
+        final File webapp = jarArchive(webAppContents, "webapp");
+
+        final File appsDir = Files.tmpdir();
+        final File ear = new File(appsDir, "app.ear");
+        final Map<String, Object> contents = new HashMap<>();
+        contents.put("loader.war", loaderApp);
+        contents.put("webapp.war", webapp);
+        final File file = jarArchive(ear, contents);
+
+        try {
+            final Container container = new Container(
+                    new Configuration()
+                            .http(NetworkUtil.getNextAvailablePort())
+                            .property("openejb.container.additional.exclude", 
"org.apache.tomee.embedded.")
+                            .property("openejb.additional.include", "tomee-"));
+            container.deploy("app.ear", file);
+
+            assertEquals("ok", IO.slurp(
+                    new URL("http://localhost:"; + 
container.getConfiguration().getHttpPort() + "/loader/path")));
+
+            assertEquals("ok", IO.slurp(
+                    new URL("http://localhost:"; + 
container.getConfiguration().getHttpPort() + "/webapp/path")));
+        } catch (final Exception e) {
+            e.printStackTrace();
+            Assert.fail();
+        }
+    }
+
+    private static File jarArchive(final Map<String, ?> entries, final String 
archiveNamePrefix, final Class... classes) throws IOException {
+        File classpath;
+        try {
+            classpath = File.createTempFile(archiveNamePrefix, ".jar");
+        } catch (final Throwable e) {
+            final File tmp = new File("tmp");
+            if (!tmp.exists() && !tmp.mkdirs()) {
+                throw new IOException("Failed to create local tmp directory: " 
+ tmp.getAbsolutePath());
+            }
+
+            classpath = File.createTempFile(archiveNamePrefix, ".jar", tmp);
+        }
+        classpath.deleteOnExit();
+
+        return jarArchive(classpath, entries, classes);
+    }
+
+    private static File jarArchive(final File archive, final Map<String, ?> 
entries, final Class... classes) throws IOException {
+        final ClassLoader loader = 
ServletContextInjectionTest.class.getClassLoader();
+
+        // Create the ZIP file
+        final ZipOutputStream out = new ZipOutputStream(new 
BufferedOutputStream(new FileOutputStream(archive)));
+
+        for (final Class clazz : classes) {
+            final String name = clazz.getName().replace('.', 
File.separatorChar) + ".class";
+
+            final URL resource = loader.getResource(name);
+            assertNotNull(resource);
+
+            // Add ZIP entry to output stream.
+            out.putNextEntry(new ZipEntry(name));
+
+            final InputStream in = new 
BufferedInputStream(resource.openStream());
+
+            int i;
+            while ((i = in.read()) != -1) {
+                out.write(i);
+            }
+
+            // Complete the entry
+            in.close();
+            out.closeEntry();
+        }
+
+        if (entries != null) for (final Map.Entry<String, ?> entry : 
entries.entrySet()) {
+
+            out.putNextEntry(new ZipEntry(entry.getKey()));
+
+            final Object value = entry.getValue();
+
+            if (value instanceof String) {
+
+                final String s = (String) value;
+                out.write(s.getBytes());
+
+            } else if (value instanceof File) {
+
+                final File file = (File) value;
+                if (file.isDirectory())
+                    throw new IllegalArgumentException(entry.getKey() + " is a 
directory, not a file.");
+                IO.copy(file, out);
+
+            } else if (value instanceof URL) {
+
+                IO.copy((URL) value, out);
+
+            } else if (value instanceof Class) {
+                final String name = ((Class) value).getName().replace('.', 
File.separatorChar) + ".class";
+
+                final URL resource = loader.getResource(name);
+                assertNotNull(resource);
+
+                IO.copy(resource, out);
+            }
+
+            out.closeEntry();
+        }
+
+        // Complete the ZIP file
+        out.close();
+
+        return archive;
+    }
+}

Reply via email to