You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/09/07 14:17:26 UTC
svn commit: r1623003 -
/tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java
Author: rmannibucau
Date: Sun Sep 7 12:17:25 2014
New Revision: 1623003
URL: http://svn.apache.org/r1623003
Log:
TOMEE-1341 looking for test classes with module finders
Modified:
tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java
Modified: tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java
URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java?rev=1623003&r1=1623002&r2=1623003&view=diff
==============================================================================
--- tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java (original)
+++ tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java Sun Sep 7 12:17:25 2014
@@ -19,67 +19,132 @@ package org.apache.openejb.arquillian.co
import org.apache.openejb.config.AdditionalBeanDiscoverer;
import org.apache.openejb.config.AppModule;
+import org.apache.openejb.config.ConnectorModule;
import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.config.WebModule;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.jee.ManagedBean;
import org.apache.openejb.jee.TransactionType;
import org.apache.openejb.jee.oejb3.EjbDeployment;
import org.apache.openejb.jee.oejb3.OpenejbJar;
+import org.apache.xbean.finder.IAnnotationFinder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import static java.util.Arrays.asList;
public class TestClassDiscoverer implements AdditionalBeanDiscoverer {
@Override
public AppModule discover(final AppModule module) {
+ final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+
+ final Set<Class<? extends Annotation>> testMarkers = new HashSet<Class<? extends Annotation>>();
+ for (final String s : asList("org.junit.Test", "org.testng.annotations.Test")) {
+ try {
+ testMarkers.add((Class<? extends Annotation>) contextClassLoader.loadClass(s));
+ } catch (final Throwable e) {
+ // no-op: deployment = false
+ }
+ }
+
+ final Set<Class<?>> testClasses = new HashSet<Class<?>>();
+ if (!testMarkers.isEmpty()) {
+ addTests(testMarkers, module.getEarLibFinder(), testClasses);
+ for (final WebModule web : module.getWebModules()) {
+ addTests(testMarkers, web.getFinder(), testClasses);
+ }
+ for (final EjbModule ejb : module.getEjbModules()) {
+ addTests(testMarkers, ejb.getFinder(), testClasses);
+ }
+ for (final ConnectorModule connector : module.getConnectorModules()) {
+ addTests(testMarkers, connector.getFinder(), testClasses);
+ }
+ }
+
+ // keep it since CukeSpace doesn't rely on JUnit or TestNG @Test so it stays mandatory
final File file = module.getFile();
final String line = findTestName(file, module.getClassLoader());
- if (line == null) {
- return module;
+ if (line != null) {
+ String name;
+ final int endIndex = line.indexOf('#');
+ if (endIndex > 0) {
+ name = line.substring(0, endIndex);
+ if (file != null && !file.getName().equals(line.substring(endIndex + 1, line.length()))) {
+ name = null;
+ }
+ } else {
+ name = line;
+ }
+
+ if (name != null) {
+ try {
+ // call some reflection methods to make it fail if some dep are missing...
+ testClasses.add(module.getClassLoader().loadClass(name));
+ } catch (final Throwable e) {
+ // no-op
+ }
+ }
+ }
+
+ final Iterator<Class<?>> it = testClasses.iterator();
+ while (it.hasNext()) {
+ try {
+ // call some reflection methods to make it fail if some dep are missing...
+ Class<?> current = it.next();
+ while (current != null) {
+ current.getDeclaredFields();
+ current.getDeclaredMethods();
+ current.getCanonicalName();
+ current = current.getSuperclass();
+ // TODO: more validations
+ }
+ } catch (final NoClassDefFoundError ncdfe) {
+ it.remove();
+ }
+ }
+
+ for (final Class<?> test : testClasses) {
+ final EjbJar ejbJar = new EjbJar();
+ final OpenejbJar openejbJar = new OpenejbJar();
+ final String name = test.getName();
+ final String ejbName = module.getModuleId() + "_" + name;
+ final ManagedBean bean = ejbJar.addEnterpriseBean(new ManagedBean(ejbName, name, true));
+ bean.localBean();
+ bean.setTransactionType(TransactionType.BEAN);
+ final EjbDeployment ejbDeployment = openejbJar.addEjbDeployment(bean);
+ ejbDeployment.setDeploymentId(ejbName);
+ module.getEjbModules().add(new EjbModule(ejbJar, openejbJar));
}
- final String name;
- final int endIndex = line.indexOf('#');
- if (endIndex > 0) {
- name = line.substring(0, endIndex);
- if (file != null && !file.getName().equals(line.substring(endIndex + 1, line.length()))) {
- // skip
- return module;
- }
- } else {
- name = line;
- }
-
- try {
- // call some reflection methods to make it fail if some dep are missing...
- Class<?> current = module.getClassLoader().loadClass(name);
- while (current != null) {
- current.getDeclaredFields();
- current.getDeclaredMethods();
- current.getCanonicalName();
- current = current.getSuperclass();
- }
- } catch (final ClassNotFoundException e) {
- return module;
- } catch (final NoClassDefFoundError ncdfe) {
- return module;
- }
-
- final EjbJar ejbJar = new EjbJar();
- final OpenejbJar openejbJar = new OpenejbJar();
- final String ejbName = module.getModuleId() + "_" + name;
- final ManagedBean bean = ejbJar.addEnterpriseBean(new ManagedBean(ejbName, name, true));
- bean.localBean();
- bean.setTransactionType(TransactionType.BEAN);
- final EjbDeployment ejbDeployment = openejbJar.addEjbDeployment(bean);
- ejbDeployment.setDeploymentId(ejbName);
- module.getEjbModules().add(new EjbModule(ejbJar, openejbJar));
return module;
}
+ private static void addTests(final Set<Class<? extends Annotation>> testMarkers, final IAnnotationFinder finder, final Set<Class<?>> testClasses) {
+ if (finder == null) {
+ return;
+ }
+ for (final Class<? extends Annotation> marker : testMarkers) {
+ final List<Method> annotatedMethods = finder.findAnnotatedMethods(marker);
+ for (final Method m : annotatedMethods) {
+ try {
+ testClasses.add(m.getDeclaringClass());
+ } catch (final NoClassDefFoundError e) {
+ // no-op
+ }
+ }
+ }
+ }
+
private String findTestName(final File folder, final ClassLoader classLoader) {
InputStream is = null;