This is an automated email from the ASF dual-hosted git repository. yasserzamani pushed a commit to branch struts-2-5-x in repository https://gitbox.apache.org/repos/asf/struts.git
commit 11de8810e4bd2b4077e357b684a87c6a46e4f242 Author: Yasser Zamani <yasserzam...@apache.org> AuthorDate: Wed Nov 14 16:39:44 2018 +0330 satisfy coveralls via testing with a not URLClassLoader See also WW-4845 (cherry picked from commit 02abab3) --- .../xwork2/util/ClassPathFinderTest.java | 50 +++++++++++++++++++++- .../org/apache/struts2/EmbeddedJSPResultTest.java | 27 +++++++++--- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/core/src/test/java/com/opensymphony/xwork2/util/ClassPathFinderTest.java b/core/src/test/java/com/opensymphony/xwork2/util/ClassPathFinderTest.java index 0a2d264..34c0bbe 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/ClassPathFinderTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/ClassPathFinderTest.java @@ -19,11 +19,17 @@ package com.opensymphony.xwork2.util; import com.opensymphony.xwork2.XWorkTestCase; +import org.apache.commons.io.IOUtils; +import java.io.IOException; +import java.net.URL; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; import java.util.Vector; public class ClassPathFinderTest extends XWorkTestCase { - + public void testFinder() { ClassPathFinder finder = new ClassPathFinder(); finder.setPattern("**/xwork-test-wildcard-*.xml"); @@ -52,4 +58,46 @@ public class ClassPathFinderTest extends XWorkTestCase { } + public void testFinderNotURLClassLoader() throws Exception { + NotURLClassLoader loader = new NotURLClassLoader(Thread.currentThread().getContextClassLoader()); + Thread.currentThread().setContextClassLoader(loader); + + Class<?> clazz = loader.loadClass(ClassPathFinderTest.class.getName()); + Object test = clazz.getConstructor().newInstance(); + + clazz.getMethod("testFinder").invoke(test); + + Thread.currentThread().setContextClassLoader(loader.parentClassLoader); + } + + + private class NotURLClassLoader extends ClassLoader { + private Map<String, Class<?>> loadedClasses = new HashMap<>(); + private ClassLoader parentClassLoader; + + NotURLClassLoader(ClassLoader parentClassLoader) { + super(null); + this.parentClassLoader = parentClassLoader; + } + + @Override + protected Class<?> findClass(String name) throws ClassNotFoundException { + if (!loadedClasses.containsKey(name)) { + try { + byte[] classBits = IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream( + name.replace('.', '/') + ".class")); + loadedClasses.put(name, defineClass(name, classBits, 0, classBits.length)); + } catch (IOException e) { + throw new ClassNotFoundException("class " + name + " is not findable", e); + } + } + + return loadedClasses.get(name); + } + + @Override + protected Enumeration<URL> findResources(String name) throws IOException { + return parentClassLoader.getResources(name); + } + } } diff --git a/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java b/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java index ec65539..952cd84 100644 --- a/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java +++ b/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java @@ -31,7 +31,6 @@ import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.finder.ClassLoaderInterface; import com.opensymphony.xwork2.util.finder.ClassLoaderInterfaceDelegate; import com.opensymphony.xwork2.util.fs.DefaultFileManager; -import com.sun.net.httpserver.HttpsParameters; import junit.framework.TestCase; import org.apache.commons.lang3.StringUtils; import org.apache.struts2.dispatcher.HttpParameters; @@ -46,11 +45,7 @@ import javax.servlet.Servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; @@ -231,6 +226,19 @@ public class EmbeddedJSPResultTest extends TestCase { assertEquals("WhoamI?", StringUtils.deleteWhitespace(response.getContentAsString())); } + public void testNotURLClassLoader() throws Exception { + ClassLoader parentClassLoader = Thread.currentThread().getContextClassLoader(); + NotURLClassLoader loader = new NotURLClassLoader(parentClassLoader); + Thread.currentThread().setContextClassLoader(loader); + + result.setLocation("org/apache/struts2/tag0.jsp"); + result.execute(null); + + assertEquals("Thissessionisnotsecure.OtherText", StringUtils.deleteWhitespace(response.getContentAsString())); + + Thread.currentThread().setContextClassLoader(parentClassLoader); + } + @Override protected void setUp() throws Exception { super.setUp(); @@ -374,3 +382,10 @@ class CountingClassLoaderInterface extends ClassLoaderInterfaceDelegate { return super.getResourceAsStream(name); } } + +class NotURLClassLoader extends ClassLoader { + + NotURLClassLoader(ClassLoader parentClassLoader) { + super(parentClassLoader); + } +}