satisfy coveralls via testing with a not URLClassLoader

See also WW-4845
This commit is contained in:
Yasser Zamani
2018-11-14 16:39:44 +03:30
parent 7763156f4e
commit 02abab365a
2 changed files with 70 additions and 7 deletions
@@ -19,7 +19,13 @@
package com.opensymphony.xwork2.util; package com.opensymphony.xwork2.util;
import com.opensymphony.xwork2.XWorkTestCase; 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; import java.util.Vector;
public class ClassPathFinderTest extends XWorkTestCase { public class ClassPathFinderTest extends XWorkTestCase {
@@ -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);
}
}
} }
@@ -31,7 +31,6 @@ import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.finder.ClassLoaderInterface; import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
import com.opensymphony.xwork2.util.finder.ClassLoaderInterfaceDelegate; import com.opensymphony.xwork2.util.finder.ClassLoaderInterfaceDelegate;
import com.opensymphony.xwork2.util.fs.DefaultFileManager; import com.opensymphony.xwork2.util.fs.DefaultFileManager;
import com.sun.net.httpserver.HttpsParameters;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.dispatcher.HttpParameters; import org.apache.struts2.dispatcher.HttpParameters;
@@ -46,11 +45,7 @@ import javax.servlet.Servlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; import java.util.concurrent.CyclicBarrier;
@@ -231,6 +226,19 @@ public class EmbeddedJSPResultTest extends TestCase {
assertEquals("WhoamI?", StringUtils.deleteWhitespace(response.getContentAsString())); 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 @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
@@ -374,3 +382,10 @@ class CountingClassLoaderInterface extends ClassLoaderInterfaceDelegate {
return super.getResourceAsStream(name); return super.getResourceAsStream(name);
} }
} }
class NotURLClassLoader extends ClassLoader {
NotURLClassLoader(ClassLoader parentClassLoader) {
super(parentClassLoader);
}
}