package org.etk.java5.reflection.test;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import junit.framework.TestCase;
public abstract class AbstractReflectTestCase extends TestCase {
protected final Set<Class<?>> classes = new HashSet<Class<?>>();
protected abstract void configure();
protected abstract ReflectUnitTest getUnitTest();
/**
* Adds class to resolve which provides for UnitTesting
* @param clazz
*/
protected final void add(Class clazz) {
classes.add(clazz);
}
private static List<UnitTestPlugin> plugins;
/**
* Loading the class form META-INF/services/plugins
* @return
* @throws Exception
*/
private static List<UnitTestPlugin> getPlugins() throws Exception {
if (plugins == null) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
String path = "META-INF/services" + UnitTestPlugin.class.getName();
Enumeration<URL> e = cl.getResources(path);
List<UnitTestPlugin> list = new ArrayList<UnitTestPlugin>();
while(e.hasMoreElements()) {
URL url = e.nextElement();
InputStream in = new BufferedInputStream(url.openStream());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int i = in.read();i != -1;i = in.read()) {
baos.write(i);
}
in.close();
baos.close();
String fqn = baos.toString().trim();
Class<?> clazz = cl.loadClass(fqn);
UnitTestPlugin plugin = (UnitTestPlugin)clazz.newInstance();
list.add(plugin);
plugins = list;
}
}
return plugins;
}
public void testExecute() throws Exception {
//
configure();
//
ReflectUnitTest unitTest = getUnitTest();
//
for (UnitTestPlugin plugin : getPlugins()) {
plugin.execute(unitTest, classes);
}
}
}