You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ya...@apache.org on 2018/11/16 14:16:59 UTC

[struts] 02/02: satisfy coveralls via testing with a not URLClassLoader

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 <ya...@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);
+    }
+}